Skip to content

Commit abe06e9

Browse files
added support for CSP blobs; added AllBooleanToVisibilityMultiValueConverter and EqualityToBooleanValueConverter; removed EqualityToVisibilityValueConverter; incremented version build number
1 parent a314f72 commit abe06e9

File tree

7 files changed

+192
-33
lines changed

7 files changed

+192
-33
lines changed

RSAKeyPairGenerator/App.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Blue.xaml" />
1515
</ResourceDictionary.MergedDictionaries>
1616

17+
<vc:AllBooleanToVisibilityMultiValueConverter x:Key="AllBooleanToVisibilityMultiValueConverter" />
1718
<vc:BytesToCSharpValueConverter x:Key="BytesToCSharpValueConverter" />
1819
<vc:BytesToHexValueConverter x:Key="BytesToHexValueConverter" />
19-
<vc:EqualityToVisibilityValueConverter x:Key="EqualityToVisibilityValueConverter" />
20+
<vc:EqualityToBooleanValueConverter x:Key="EqualityToBooleanValueConverter" />
2021

2122
<Style x:Key="MaterialWindow" TargetType="Window">
2223
<Setter Property="Background" Value="{DynamicResource MaterialDesignPaper}" />

RSAKeyPairGenerator/KeyMode.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace RSAKeyPairGenerator
2+
{
3+
public enum KeyMode
4+
{
5+
Raw,
6+
CspBlob
7+
}
8+
}

RSAKeyPairGenerator/MainWindow.xaml

Lines changed: 126 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,20 @@
3131
<RowDefinition Height="8" />
3232
<RowDefinition Height="2*" />
3333
</Grid.RowDefinitions>
34-
<ComboBox HorizontalAlignment="Left" VerticalAlignment="Center" SelectedItem="{Binding DisplayMode, Mode=TwoWay}">
35-
<ComboBox.Items>
36-
<local:DisplayMode>Hex</local:DisplayMode>
37-
<local:DisplayMode>CSharp</local:DisplayMode>
38-
</ComboBox.Items>
39-
</ComboBox>
34+
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
35+
<ComboBox SelectedItem="{Binding DisplayMode, Mode=TwoWay}">
36+
<ComboBox.Items>
37+
<local:DisplayMode>Hex</local:DisplayMode>
38+
<local:DisplayMode>CSharp</local:DisplayMode>
39+
</ComboBox.Items>
40+
</ComboBox>
41+
<ComboBox Margin="8,0,0,0" SelectedItem="{Binding KeyMode, Mode=TwoWay}">
42+
<ComboBox.Items>
43+
<local:KeyMode>Raw</local:KeyMode>
44+
<local:KeyMode>CspBlob</local:KeyMode>
45+
</ComboBox.Items>
46+
</ComboBox>
47+
</StackPanel>
4048
<Button Grid.Column="2" Command="ApplicationCommands.New" HorizontalAlignment="Center">Generate Key Pair</Button>
4149
<GroupBox Grid.Row="2" Grid.ColumnSpan="3" Header="Public Key" Style="{StaticResource MaterialDesignCardGroupBox}">
4250
<Grid>
@@ -47,20 +55,66 @@
4755
</Grid.RowDefinitions>
4856
<TextBlock Text="{Binding PublicKey, Converter={StaticResource BytesToHexValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
4957
<TextBlock.Visibility>
50-
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToVisibilityValueConverter}">
51-
<Binding.ConverterParameter>
52-
<local:DisplayMode>Hex</local:DisplayMode>
53-
</Binding.ConverterParameter>
54-
</Binding>
58+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
59+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
60+
<Binding.ConverterParameter>
61+
<local:DisplayMode>Hex</local:DisplayMode>
62+
</Binding.ConverterParameter>
63+
</Binding>
64+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
65+
<Binding.ConverterParameter>
66+
<local:KeyMode>Raw</local:KeyMode>
67+
</Binding.ConverterParameter>
68+
</Binding>
69+
</MultiBinding>
5570
</TextBlock.Visibility>
5671
</TextBlock>
5772
<TextBlock Text="{Binding PublicKey, Converter={StaticResource BytesToCSharpValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
5873
<TextBlock.Visibility>
59-
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToVisibilityValueConverter}">
60-
<Binding.ConverterParameter>
61-
<local:DisplayMode>CSharp</local:DisplayMode>
62-
</Binding.ConverterParameter>
63-
</Binding>
74+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
75+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
76+
<Binding.ConverterParameter>
77+
<local:DisplayMode>CSharp</local:DisplayMode>
78+
</Binding.ConverterParameter>
79+
</Binding>
80+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
81+
<Binding.ConverterParameter>
82+
<local:KeyMode>Raw</local:KeyMode>
83+
</Binding.ConverterParameter>
84+
</Binding>
85+
</MultiBinding>
86+
</TextBlock.Visibility>
87+
</TextBlock>
88+
<TextBlock Text="{Binding PublicCspBlob, Converter={StaticResource BytesToHexValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
89+
<TextBlock.Visibility>
90+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
91+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
92+
<Binding.ConverterParameter>
93+
<local:DisplayMode>Hex</local:DisplayMode>
94+
</Binding.ConverterParameter>
95+
</Binding>
96+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
97+
<Binding.ConverterParameter>
98+
<local:KeyMode>CspBlob</local:KeyMode>
99+
</Binding.ConverterParameter>
100+
</Binding>
101+
</MultiBinding>
102+
</TextBlock.Visibility>
103+
</TextBlock>
104+
<TextBlock Text="{Binding PublicCspBlob, Converter={StaticResource BytesToCSharpValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
105+
<TextBlock.Visibility>
106+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
107+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
108+
<Binding.ConverterParameter>
109+
<local:DisplayMode>CSharp</local:DisplayMode>
110+
</Binding.ConverterParameter>
111+
</Binding>
112+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
113+
<Binding.ConverterParameter>
114+
<local:KeyMode>CspBlob</local:KeyMode>
115+
</Binding.ConverterParameter>
116+
</Binding>
117+
</MultiBinding>
64118
</TextBlock.Visibility>
65119
</TextBlock>
66120
<Button Grid.Row="2" HorizontalAlignment="Right" Command="ApplicationCommands.Copy" CommandParameter="PublicKey">Copy Public Key</Button>
@@ -75,20 +129,66 @@
75129
</Grid.RowDefinitions>
76130
<TextBlock Text="{Binding PrivateKey, Converter={StaticResource BytesToHexValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
77131
<TextBlock.Visibility>
78-
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToVisibilityValueConverter}">
79-
<Binding.ConverterParameter>
80-
<local:DisplayMode>Hex</local:DisplayMode>
81-
</Binding.ConverterParameter>
82-
</Binding>
132+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
133+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
134+
<Binding.ConverterParameter>
135+
<local:DisplayMode>Hex</local:DisplayMode>
136+
</Binding.ConverterParameter>
137+
</Binding>
138+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
139+
<Binding.ConverterParameter>
140+
<local:KeyMode>Raw</local:KeyMode>
141+
</Binding.ConverterParameter>
142+
</Binding>
143+
</MultiBinding>
83144
</TextBlock.Visibility>
84145
</TextBlock>
85146
<TextBlock Text="{Binding PrivateKey, Converter={StaticResource BytesToCSharpValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
86147
<TextBlock.Visibility>
87-
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToVisibilityValueConverter}">
88-
<Binding.ConverterParameter>
89-
<local:DisplayMode>CSharp</local:DisplayMode>
90-
</Binding.ConverterParameter>
91-
</Binding>
148+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
149+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
150+
<Binding.ConverterParameter>
151+
<local:DisplayMode>CSharp</local:DisplayMode>
152+
</Binding.ConverterParameter>
153+
</Binding>
154+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
155+
<Binding.ConverterParameter>
156+
<local:KeyMode>Raw</local:KeyMode>
157+
</Binding.ConverterParameter>
158+
</Binding>
159+
</MultiBinding>
160+
</TextBlock.Visibility>
161+
</TextBlock>
162+
<TextBlock Text="{Binding PrivateCspBlob, Converter={StaticResource BytesToHexValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
163+
<TextBlock.Visibility>
164+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
165+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
166+
<Binding.ConverterParameter>
167+
<local:DisplayMode>Hex</local:DisplayMode>
168+
</Binding.ConverterParameter>
169+
</Binding>
170+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
171+
<Binding.ConverterParameter>
172+
<local:KeyMode>CspBlob</local:KeyMode>
173+
</Binding.ConverterParameter>
174+
</Binding>
175+
</MultiBinding>
176+
</TextBlock.Visibility>
177+
</TextBlock>
178+
<TextBlock Text="{Binding PrivateCspBlob, Converter={StaticResource BytesToCSharpValueConverter}}" FontFamily="Courier New" TextWrapping="Wrap">
179+
<TextBlock.Visibility>
180+
<MultiBinding Mode="OneWay" Converter="{StaticResource AllBooleanToVisibilityMultiValueConverter}">
181+
<Binding Path="DisplayMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
182+
<Binding.ConverterParameter>
183+
<local:DisplayMode>CSharp</local:DisplayMode>
184+
</Binding.ConverterParameter>
185+
</Binding>
186+
<Binding Path="KeyMode" Mode="OneWay" Converter="{StaticResource EqualityToBooleanValueConverter}">
187+
<Binding.ConverterParameter>
188+
<local:KeyMode>CspBlob</local:KeyMode>
189+
</Binding.ConverterParameter>
190+
</Binding>
191+
</MultiBinding>
92192
</TextBlock.Visibility>
93193
</TextBlock>
94194
<Button Grid.Row="2" HorizontalAlignment="Right" Style="{StaticResource MaterialDesignRaisedAccentButton}" Command="ApplicationCommands.Copy" CommandParameter="PrivateKey">Copy Private Key</Button>

RSAKeyPairGenerator/MainWindowDataContext.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Cogs.Components;
22
using System;
33
using System.Collections.Generic;
4+
using System.Linq;
45
using System.Security.Cryptography;
56
using System.Threading.Tasks;
67

@@ -10,14 +11,19 @@ public class MainWindowDataContext : PropertyChangeNotifier
1011
{
1112
DisplayMode displayMode;
1213
bool isKeyPairGenerated;
14+
KeyMode keyMode;
1315
IReadOnlyCollection<byte> privateKey;
16+
IReadOnlyCollection<byte> privateCspBlob;
1417
IReadOnlyCollection<byte> publicKey;
18+
IReadOnlyCollection<byte> publicCspBlob;
1519

1620
public Task GenerateKeyPairAsync() => Task.Run(() =>
1721
{
1822
using var rsa = new RSACryptoServiceProvider();
1923
PublicKey = rsa.ExportRSAPublicKey();
24+
PublicCspBlob = rsa.ExportCspBlob(false);
2025
PrivateKey = rsa.ExportRSAPrivateKey();
26+
PrivateCspBlob = rsa.ExportCspBlob(true);
2127
IsKeyPairGenerated = true;
2228
});
2329

@@ -28,9 +34,19 @@ public Task GenerateKeyPairAsync() => Task.Run(() =>
2834
_ => throw new NotSupportedException()
2935
};
3036

31-
public string GetPrivateKeyText() => GetKeyText(PrivateKey);
37+
public string GetPrivateKeyText() => GetKeyText(KeyMode switch
38+
{
39+
KeyMode.CspBlob => PrivateCspBlob,
40+
KeyMode.Raw => PrivateKey,
41+
_ => throw new NotSupportedException()
42+
});
3243

33-
public string GetPublicKeyText() => GetKeyText(PublicKey);
44+
public string GetPublicKeyText() => GetKeyText(KeyMode switch
45+
{
46+
KeyMode.CspBlob => PublicCspBlob,
47+
KeyMode.Raw => PublicKey,
48+
_ => throw new NotSupportedException()
49+
});
3450

3551
public DisplayMode DisplayMode
3652
{
@@ -44,16 +60,34 @@ public bool IsKeyPairGenerated
4460
private set => SetBackedProperty(ref isKeyPairGenerated, in value);
4561
}
4662

63+
public KeyMode KeyMode
64+
{
65+
get => keyMode;
66+
set => SetBackedProperty(ref keyMode, in value);
67+
}
68+
4769
public IReadOnlyCollection<byte> PrivateKey
4870
{
4971
get => privateKey;
5072
private set => SetBackedProperty(ref privateKey, in value);
5173
}
5274

75+
public IReadOnlyCollection<byte> PrivateCspBlob
76+
{
77+
get => privateCspBlob;
78+
private set => SetBackedProperty(ref privateCspBlob, in value);
79+
}
80+
5381
public IReadOnlyCollection<byte> PublicKey
5482
{
5583
get => publicKey;
5684
private set => SetBackedProperty(ref publicKey, in value);
5785
}
86+
87+
public IReadOnlyCollection<byte> PublicCspBlob
88+
{
89+
get => publicCspBlob;
90+
private set => SetBackedProperty(ref publicCspBlob, in value);
91+
}
5892
}
5993
}

RSAKeyPairGenerator/RSAKeyPairGenerator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<OutputType>WinExe</OutputType>
99
<TargetFramework>netcoreapp3.1</TargetFramework>
1010
<UseWPF>true</UseWPF>
11-
<Version>1.0.1</Version>
11+
<Version>1.0.2</Version>
1212
</PropertyGroup>
1313

1414
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Linq;
4+
using System.Windows;
5+
using System.Windows.Data;
6+
7+
namespace RSAKeyPairGenerator.ValueConverters
8+
{
9+
public class AllBooleanToVisibilityMultiValueConverter : IMultiValueConverter
10+
{
11+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) =>
12+
(values?.All(value => value is bool boolean && boolean) ?? true) ? Visibility.Visible : Visibility.Collapsed;
13+
14+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) =>
15+
new object[] { DependencyProperty.UnsetValue };
16+
}
17+
}

RSAKeyPairGenerator/ValueConverters/EqualityToVisibilityValueConverter.cs renamed to RSAKeyPairGenerator/ValueConverters/EqualityToBooleanValueConverter.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
using System;
22
using System.Globalization;
3-
using System.Windows;
43
using System.Windows.Data;
54

65
namespace RSAKeyPairGenerator.ValueConverters
76
{
8-
public class EqualityToVisibilityValueConverter : IValueConverter
7+
public class EqualityToBooleanValueConverter : IValueConverter
98
{
109
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
11-
value.Equals(parameter) ? Visibility.Visible : Visibility.Collapsed;
10+
value.Equals(parameter);
1211

1312
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
1413
Binding.DoNothing;

0 commit comments

Comments
 (0)