1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
using System;
using NUnit.Framework;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pqc.Crypto.Lms;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
using PqcPrivateKeyFactory = Org.BouncyCastle.Pqc.Crypto.Utilities.PqcPrivateKeyFactory;
using PqcPrivateKeyInfoFactory = Org.BouncyCastle.Pqc.Crypto.Utilities.PqcPrivateKeyInfoFactory;
namespace Org.BouncyCastle.Pqc.Crypto.Tests
{
[TestFixture]
public class LMSTest
{
[Test]
public void TestKeyGenAndSign()
{
byte[] msg = Strings.ToByteArray("Hello, world!");
IAsymmetricCipherKeyPairGenerator kpGen = new LmsKeyPairGenerator();
kpGen.Init(new LmsKeyGenerationParameters(
new LmsParameters(LMSigParameters.lms_sha256_n32_h5, LMOtsParameters.sha256_n32_w4), new SecureRandom()));
AsymmetricCipherKeyPair kp = kpGen.GenerateKeyPair();
LmsSigner signer = new LmsSigner();
signer.Init(true, kp.Private);
byte[] sig = signer.GenerateSignature(msg);
signer.Init(false, kp.Public);
Assert.True(signer.VerifySignature(msg, sig));
}
[Test]
public void TestKeyGenAndSignTwoSigsWithShard()
{
byte[] msg1 = Strings.ToByteArray("Hello, world!");
byte[] msg2 = Strings.ToByteArray("Now is the time");
IAsymmetricCipherKeyPairGenerator kpGen = new LmsKeyPairGenerator();
kpGen.Init(new LmsKeyGenerationParameters(
new LmsParameters(LMSigParameters.lms_sha256_n32_h5, LMOtsParameters.sha256_n32_w4), new SecureRandom()));
AsymmetricCipherKeyPair kp = kpGen.GenerateKeyPair();
LmsPrivateKeyParameters privKey = ((LmsPrivateKeyParameters)kp.Private).ExtractKeyShard(2);
Assert.AreEqual(2, ((LmsPrivateKeyParameters)kp.Private).GetIndex());
LmsSigner signer = new LmsSigner();
Assert.AreEqual(2, privKey.GetUsagesRemaining());
Assert.AreEqual(0, privKey.GetIndex());
signer.Init(true, privKey);
byte[] sig1 = signer.GenerateSignature(msg1);
Assert.AreEqual(1, privKey.GetIndex());
signer.Init(false, kp.Public);
Assert.True(signer.VerifySignature(msg1, sig1));
signer.Init(true, privKey);
byte[] sig = signer.GenerateSignature(msg2);
Assert.AreEqual(2, privKey.GetIndex());
signer.Init(false, kp.Public);
Assert.True(signer.VerifySignature(msg2, sig));
try
{
sig = signer.GenerateSignature(msg2);
Assert.Fail("no exception");
}
catch (Exception e)
{
Assert.AreEqual("ots private key exhausted", e.Message);
}
signer.Init(true, ((LmsPrivateKeyParameters)kp.Private));
sig = signer.GenerateSignature(msg1);
Assert.AreEqual(3, ((LmsPrivateKeyParameters)kp.Private).GetIndex());
Assert.False(Arrays.AreEqual(sig1, sig));
signer.Init(false, kp.Public);
Assert.True(signer.VerifySignature(msg1, sig1));
PrivateKeyInfo pInfo = PqcPrivateKeyInfoFactory.CreatePrivateKeyInfo(kp.Private);//TODO
AsymmetricKeyParameter pKey = PqcPrivateKeyFactory.CreateKey(pInfo.GetEncoded());
signer.Init(false, ((LmsPrivateKeyParameters)pKey).GetPublicKey());
Assert.True(signer.VerifySignature(msg1, sig1));
}
}
}
|