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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
using System;
using Org.BouncyCastle.Crypto;
using static Org.BouncyCastle.Pqc.Crypto.Lms.LM_OTS;
namespace Org.BouncyCastle.Pqc.Crypto.Lms
{
public class LMSContext
: IDigest
{
private byte[] c;
private LMOtsPrivateKey key;
private LMSigParameters sigParams;
private byte[][] path;
private LMOtsPublicKey publicKey;
private Object signature;
private LMSSignedPubKey[] signedPubKeys;
private volatile IDigest digest;
public LMSContext(LMOtsPrivateKey key, LMSigParameters sigParams, IDigest digest, byte[] C, byte[][] path)
{
this.key = key;
this.sigParams = sigParams;
this.digest = digest;
this.c = C;
this.path = path;
this.publicKey = null;
this.signature = null;
}
public LMSContext(LMOtsPublicKey publicKey, Object signature, IDigest digest)
{
this.publicKey = publicKey;
this.signature = signature;
this.digest = digest;
this.c = null;
this.key = null;
this.sigParams = null;
this.path = null;
}
public byte[] C => c;
public byte[] GetQ()
{
byte[] Q = new byte[MAX_HASH + 2];
digest.DoFinal(Q, 0);
digest = null;
return Q;
}
internal byte[][] GetPath()
{
return path;
}
internal LMOtsPrivateKey GetPrivateKey()
{
return key;
}
public LMOtsPublicKey GetPublicKey()
{
return publicKey;
}
internal LMSigParameters GetSigParams()
{
return sigParams;
}
public Object GetSignature()
{
return signature;
}
internal LMSSignedPubKey[] GetSignedPubKeys()
{
return signedPubKeys;
}
internal LMSContext WithSignedPublicKeys(LMSSignedPubKey[] signedPubKeys)
{
this.signedPubKeys = signedPubKeys;
return this;
}
public string AlgorithmName
{
get => digest.AlgorithmName;
}
public int GetDigestSize()
{
return digest.GetDigestSize();
}
public int GetByteLength()
{
return digest.GetByteLength();
}
public void Update(byte input)
{
digest.Update(input);
}
public void BlockUpdate(byte[] input, int inOff, int len)
{
digest.BlockUpdate(input, inOff, len);
}
public int DoFinal(byte[] output, int outOff)
{
return digest.DoFinal(output, outOff);
}
public void Reset()
{
digest.Reset();
}
}
}
|