Skip to content

Commit

Permalink
Move from KeyCeremonyType enum to SecretSharing classes, implements m…
Browse files Browse the repository at this point in the history
…issing logic (share generation) and add related unit tests
  • Loading branch information
Maxhy committed Oct 24, 2023
1 parent 79abadc commit 1ff8486
Show file tree
Hide file tree
Showing 29 changed files with 428 additions and 134 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ private static SAMSymmetricKeyEntry CreateKeyEntry(string id, string label, bool
if (ke.Variant.KeyContainers[i] is KeyVersion keyVersion)
{
keyVersion.Version = i;
keyVersion.Key.Materials[0].Value = KeyGeneration.Random(keyVersion.Key.KeySize);
keyVersion.Key.Materials[0].SetValueBinary(KeyGeneration.Random(keyVersion.Key.KeySize));
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions KeyManager.Library.KeyStore.NXP_SAM/SAMKeyStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ public override Task Update(IChangeKeyEntry change, bool ignoreIfMissing)
};
if (!containers[1].Key.IsEmpty())
{
log.Info("Updating value for key version A.");
updateSettings.keyVa = 1;
}
if (containers[0] is KeyVersion keyVersionA)
Expand All @@ -438,6 +439,7 @@ public override Task Update(IChangeKeyEntry change, bool ignoreIfMissing)
{
if (!containers[1].Key.IsEmpty())
{
log.Info("Updating value for key version B.");
updateSettings.keyVb = 1;
}
keys.Add(new LibLogicalAccess.ByteVector(containers[1].Key.GetAggregatedValueBinary(true)));
Expand All @@ -450,6 +452,7 @@ public override Task Update(IChangeKeyEntry change, bool ignoreIfMissing)
{
if (!containers[2].Key.IsEmpty())
{
log.Info("Updating value for key version C.");
updateSettings.keyVc = 1;
}
keys.Add(new LibLogicalAccess.ByteVector(containers[2].Key.GetAggregatedValueBinary(true)));
Expand Down
61 changes: 61 additions & 0 deletions KeyManager.Library.Tests/ConcatSecretSharingTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using Leosac.KeyManager.Library.SecretSharing;

namespace Leosac.KeyManager.Library.Tests
{
[TestClass]
public class ConcatSecretSharingTests
{
private readonly ConcatSecretSharing _sharing;

public ConcatSecretSharingTests()
{
_sharing = new ConcatSecretSharing();
}

[TestMethod]
public void Test_ComputeTwoFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"0011223344556677",
"8899AABBCCDDEEFF"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_ComputeThreeFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"00112233445",
"566778899AA",
"BBCCDDEEFF"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_CreateTwoFragments()
{
var fragments = _sharing.CreateFragments(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), 2);
Assert.IsNotNull(fragments);
Assert.IsTrue(fragments.Length == 2);
Assert.AreEqual("0011223344556677", fragments[0], true);
Assert.AreEqual("8899AABBCCDDEEFF", fragments[1], true);
}

[TestMethod]
public void Test_CreateThreeFragments()
{
var fragments = _sharing.CreateFragments(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), 3);
Assert.IsNotNull(fragments);
Assert.IsTrue(fragments.Length == 3);
Assert.AreEqual("00112233445", fragments[0], true);
Assert.AreEqual("566778899AA", fragments[1], true);
Assert.AreEqual("BBCCDDEEFF", fragments[2], true);
}
}
}
4 changes: 2 additions & 2 deletions KeyManager.Library.Tests/KeyGenerationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class KeyGenerationTests
public void Test_Random(int keySize)
{
var key1 = KeyGeneration.Random((uint)keySize);
Assert.AreEqual(keySize * 2, key1.Length);
Assert.AreEqual(keySize, key1.Length);

var key2 = KeyGeneration.Random((uint)keySize);
Assert.AreNotEqual(key1, key2);
Expand All @@ -22,7 +22,7 @@ public void Test_Random(int keySize)
[DataRow(32)]
public void Test_FromPassword(int keySize)
{
var key = KeyGeneration.FromPassword("test", "Security Freedom", keySize);
var key = Convert.ToHexString(KeyGeneration.FromPassword("test", "Security Freedom", keySize));
var rkey = "E088566240571EAD486818BE1199F53EB407411014BA1E36101C242FC34DEBAF"[..(keySize * 2)];
Assert.AreEqual(rkey, key, true);
}
Expand Down
6 changes: 3 additions & 3 deletions KeyManager.Library.Tests/KeyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class KeyTests
[TestMethod]
public void OneMaterial_GetAggregatedValue_HexString()
{
var key = new Key(null, "00112233445566778899AABBCCDDEEFF");
var key = new Key(null, 16, "00112233445566778899AABBCCDDEEFF");
var v = key.GetAggregatedValueString();
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", v, true);
}
Expand All @@ -22,7 +22,7 @@ public void OneMaterial_SetAggregatedValue_HexString()
[TestMethod]
public void OneMaterial_GetAggregatedValue_Binary()
{
var key = new Key(null, "00112233445566778899AABBCCDDEEFF");
var key = new Key(null, 16, "00112233445566778899AABBCCDDEEFF");
var v = key.GetAggregatedValueBinary();
Assert.IsNotNull(v);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(v), true);
Expand All @@ -31,7 +31,7 @@ public void OneMaterial_GetAggregatedValue_Binary()
[TestMethod]
public void OneMaterial_GetAggregatedValue_HexStringWithSpace()
{
var key = new Key(null, "00112233445566778899AABBCCDDEEFF");
var key = new Key(null, 16, "00112233445566778899AABBCCDDEEFF");
var v = key.GetAggregatedValueString(KeyValueStringFormat.HexStringWithSpace);
Assert.AreEqual("00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF", v, true);
}
Expand Down
48 changes: 48 additions & 0 deletions KeyManager.Library.Tests/ShamirsSecretSharingTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Leosac.KeyManager.Library.SecretSharing;

namespace Leosac.KeyManager.Library.Tests
{
[TestClass]
public class ShamirsSecretSharingTests
{
private readonly ShamirsSecretSharing _sharing;

public ShamirsSecretSharingTests()
{
_sharing = new ShamirsSecretSharing();
}

[TestMethod]
public void Test_ComputeTwoFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"01-34E95FCCCA0B73B74DEC515D2EA4B988A582D6EF55B6EFC0638B2B3CBBE171A30BD85DC2ABEB16F93991ADCCB2107F421F2C3BAEE69EFE271CE81A93C1E1EF3D9700",
"03-9C99DBFED7788C37D891A0A0F1304F9AC48783CF0123CF422BA282B431A555EA2288194703C344EBADB3086618327DC75D84B10AB4DCFB7754B850B944A5CFB9C501"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_ComputeThreeFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"01-34E95FCCCA0B73B74DEC515D2EA4B988A582D6EF55B6EFC0638B2B3CBBE171A30BD85DC2ABEB16F93991ADCCB2107F421F2C3BAEE69EFE271CE81A93C1E1EF3D9700",
"02-68C19D6551C27FF7123FF9FE8F6A84113505ADDFAB6CDF81C716577876C3E34617B0BB8457D72DF273225B996521FE843E58765CCD3DFD4F38D0352683C3DF7B2E01",
"03-9C99DBFED7788C37D891A0A0F1304F9AC48783CF0123CF422BA282B431A555EA2288194703C344EBADB3086618327DC75D84B10AB4DCFB7754B850B944A5CFB9C501"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_CreateThreeFragments()
{
var fragments = _sharing.CreateFragments(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), 3);
Assert.IsNotNull(fragments);
Assert.IsTrue(fragments.Length == 3);
}
}
}
60 changes: 60 additions & 0 deletions KeyManager.Library.Tests/XorSecretSharingTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using Leosac.KeyManager.Library.SecretSharing;

namespace Leosac.KeyManager.Library.Tests
{
[TestClass]
public class XorSecretSharingTests
{
private readonly XorSecretSharing _sharing;

public XorSecretSharingTests()
{
_sharing = new XorSecretSharing();
}

[TestMethod]
public void Test_ComputeTwoFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"C37CAE51E95AF034DE05EEFA1AF48CF8",
"C36D8C62AD0F9643569C4441D6296207"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_ComputeThreeFragments()
{
var key = _sharing.ComputeFragments(new[]
{
"77BE07C2B01AE24B7D20E1988898107A",
"F84B15A46502C6B4589CD51579A4B23F",
"8FE43055914D4288AD259E363DE14CBA"
});
Assert.IsNotNull(key);
Assert.AreEqual("00112233445566778899AABBCCDDEEFF", Convert.ToHexString(key), true);
}

[TestMethod]
public void Test_CreateTwoFragments()
{
var fragments = _sharing.CreateFragments(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), 2);
Assert.IsNotNull(fragments);
Assert.IsTrue(fragments.Length == 2);
Assert.AreEqual(fragments[0].Length, fragments[1].Length);
Assert.AreNotEqual(fragments[0], fragments[1], true);
}

[TestMethod]
public void Test_CreateThreeFragments()
{
var fragments = _sharing.CreateFragments(Convert.FromHexString("00112233445566778899AABBCCDDEEFF"), 3);
Assert.IsNotNull(fragments);
Assert.IsTrue(fragments.Length == 3);
Assert.AreEqual(fragments[0].Length, fragments[1].Length);
Assert.AreEqual(fragments[1].Length, fragments[2].Length);
}
}
}
5 changes: 5 additions & 0 deletions KeyManager.Library.UI/Domain/KeyChecksumConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur
return Binding.DoNothing;
}

if (value2.KeySize == 0)
{
return string.Empty;
}

if (string.IsNullOrEmpty(value2.GetAggregatedValueString()))
{
return Binding.DoNothing;
Expand Down
7 changes: 7 additions & 0 deletions KeyManager.Library.UI/Domain/KeyLeakUriConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
return Binding.DoNothing;
}

if (key.KeySize == 0)
{
#pragma warning disable CS8603 // Possible null reference return.
return null;
#pragma warning restore CS8603 // Possible null reference return.
}

var checksum = new Sha256Checksum();
string uri = string.Format("https://leak.leosac.com/key/{0}", checksum.ComputeKCV(key, "53656375726974792046726565646f6d"));
if (targetType == typeof(ImageSource))
Expand Down
4 changes: 2 additions & 2 deletions KeyManager.Library.UI/KeyCeremonyBeginControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="500">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="{x:Static properties:Resources.KeyCeremonyWizardStart1}" FontSize="18" />
<TextBlock Text="{x:Static properties:Resources.KeyCeremonyWizardStart2}" FontSize="18" />
<TextBlock Text="{x:Static properties:Resources.KeyCeremonyWizardStart1}" TextWrapping="Wrap" FontSize="18" Margin="5" />
<TextBlock Text="{x:Static properties:Resources.KeyCeremonyWizardStart2}" FontSize="18" Margin="5 20 5 5" />
<Button Margin="48"
Command="{x:Static materialDesign:Transitioner.MoveNextCommand}"
Style="{StaticResource MaterialDesignFloatingActionButton}">
Expand Down
2 changes: 1 addition & 1 deletion KeyManager.Library.UI/KeyCeremonyFragmentControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
</DockPanel>
</materialDesign:Flipper.BackContent>
</materialDesign:Flipper>
<materialDesign:Flipper Style="{StaticResource MaterialDesignCardFlipper}" Visibility="{Binding IsReunification, ElementName=userControl, Converter={StaticResource ReverseBoolToVisibleConverter}}" Margin="3">
<materialDesign:Flipper Style="{StaticResource MaterialDesignCardFlipper}" Visibility="{Binding IsReunification, Converter={StaticResource ReverseBoolToVisibleConverter}}" Margin="3">
<materialDesign:Flipper.FrontContent>
<Button Width="200" MinHeight="100" Margin="8" Command="{x:Static materialDesign:Flipper.FlipCommand}" Style="{StaticResource MaterialDesignFlatButton}">
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
Expand Down
16 changes: 11 additions & 5 deletions KeyManager.Library.UI/KeyCeremonySetupControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,17 @@
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Text="{x:Static properties:Resources.KeyCeremonyHelper}" Margin="10"/>
<wpfappctrls:NumericUpDownControl Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Hint="{x:Static properties:Resources.KeyCeremonyFragments}" HelperText="{x:Static properties:Resources.KeyCeremonyFragmentsHelper}" HorizontalAlignment="Stretch" MaxValue="255" MinValue="2" CurrentValue="{Binding Fragments, Mode=TwoWay, ElementName=userControl}" VerticalAlignment="Center" Margin="10"/>
<ComboBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="10"
ItemsSource="{Binding CeremonyTypes, ElementName=userControl}"
SelectedItem="{Binding SelectedCeremonyType, ElementName=userControl}"
ItemsSource="{Binding SecretSharings, ElementName=userControl}"
SelectedItem="{Binding SelectedSecretSharing, ElementName=userControl}"
materialDesign:HintAssist.HelperText="{x:Static properties:Resources.KeyCeremonyTypeHelper}"
materialDesign:HintAssist.Hint="{x:Static properties:Resources.KeyCeremonyType}" />
<Button x:Name="btnUnionCeremony" Grid.Row="3" Grid.Column="0" Height="50" Margin="10" Click="BtnUnionCeremony_Click">
materialDesign:HintAssist.Hint="{x:Static properties:Resources.KeyCeremonyType}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button x:Name="btnUnionCeremony" Grid.Row="3" Grid.Column="0" Height="50" Margin="10" materialDesign:ButtonAssist.CornerRadius="25" Click="BtnUnionCeremony_Click">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
Expand All @@ -38,7 +44,7 @@
<TextBlock Grid.Column="1" Text="{x:Static properties:Resources.StartUnionKeyCeremony}" Width="160" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center"/>
</Grid>
</Button>
<Button x:Name="btnSharingCeremony" Grid.Row="3" Grid.Column="1" Height="50" Margin="10" Click="BtnSharingCeremony_Click">
<Button x:Name="btnSharingCeremony" Grid.Row="3" Grid.Column="1" Height="50" Margin="10" materialDesign:ButtonAssist.CornerRadius="25" Click="BtnSharingCeremony_Click">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
Expand Down
Loading

0 comments on commit 1ff8486

Please sign in to comment.