summary refs log tree commit diff
path: root/crypto/src/pqc/crypto/lms/LMSContext.cs
blob: 35c33093b91fade87dd37a9b458337f2abf9321d (plain) (blame)
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();
        }
    }
}