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 package blindrsa
26
27 import (
28 "crypto"
29 "crypto/rand"
30 "crypto/rsa"
31 "hash"
32 "io"
33 "math/big"
34
35 "github.com/cloudflare/circl/blindsign/blindrsa/internal/common"
36 "github.com/cloudflare/circl/blindsign/blindrsa/internal/keys"
37 )
38
39
40
41
42 type randomBRSAVerifier struct {
43
44 pk *rsa.PublicKey
45
46
47 cryptoHash crypto.Hash
48
49
50 hash hash.Hash
51 }
52
53
54 type deterministicBRSAVerifier struct {
55
56 pk *rsa.PublicKey
57
58
59 cryptoHash crypto.Hash
60
61
62 hash hash.Hash
63 }
64
65
66
67 type Verifier interface {
68
69
70 Blind(random io.Reader, message []byte) ([]byte, VerifierState, error)
71
72
73 FixedBlind(message, blind, salt []byte) ([]byte, VerifierState, error)
74
75
76 Verify(message, signature []byte) error
77
78
79 Hash() hash.Hash
80 }
81
82
83
84
85 func NewDeterministicVerifier(pk *rsa.PublicKey, hash crypto.Hash) Verifier {
86 h := common.ConvertHashFunction(hash)
87 return deterministicBRSAVerifier{
88 pk: pk,
89 cryptoHash: hash,
90 hash: h,
91 }
92 }
93
94
95 func (v deterministicBRSAVerifier) Hash() hash.Hash {
96 return v.hash
97 }
98
99
100
101
102 func NewVerifier(pk *rsa.PublicKey, hash crypto.Hash) Verifier {
103 h := common.ConvertHashFunction(hash)
104 return randomBRSAVerifier{
105 pk: pk,
106 cryptoHash: hash,
107 hash: h,
108 }
109 }
110
111
112 func (v randomBRSAVerifier) Hash() hash.Hash {
113 return v.hash
114 }
115
116 func prepareMsg(message, prefix []byte) []byte {
117 return append(prefix, message...)
118 }
119
120 func fixedBlind(message, salt []byte, r, rInv *big.Int, pk *rsa.PublicKey, hash hash.Hash) ([]byte, VerifierState, error) {
121 encodedMsg, err := common.EncodeMessageEMSAPSS(message, pk.N, hash, salt)
122 if err != nil {
123 return nil, VerifierState{}, err
124 }
125
126 m := new(big.Int).SetBytes(encodedMsg)
127
128 bigE := big.NewInt(int64(pk.E))
129 x := new(big.Int).Exp(r, bigE, pk.N)
130 z := new(big.Int).Set(m)
131 z.Mul(z, x)
132 z.Mod(z, pk.N)
133
134 kLen := (pk.N.BitLen() + 7) / 8
135 blindedMsg := make([]byte, kLen)
136 z.FillBytes(blindedMsg)
137
138 return blindedMsg, VerifierState{
139 encodedMsg: encodedMsg,
140 pk: pk,
141 hash: hash,
142 salt: salt,
143 rInv: rInv,
144 }, nil
145 }
146
147
148
149
150
151
152 func (v deterministicBRSAVerifier) Blind(random io.Reader, message []byte) ([]byte, VerifierState, error) {
153 if random == nil {
154 return nil, VerifierState{}, common.ErrInvalidRandomness
155 }
156
157 r, rInv, err := common.GenerateBlindingFactor(random, v.pk.N)
158 if err != nil {
159 return nil, VerifierState{}, err
160 }
161
162 return fixedBlind(message, nil, r, rInv, v.pk, v.hash)
163 }
164
165
166 func (v deterministicBRSAVerifier) FixedBlind(message, blind, salt []byte) ([]byte, VerifierState, error) {
167 if blind == nil {
168 return nil, VerifierState{}, common.ErrInvalidRandomness
169 }
170
171 r := new(big.Int).SetBytes(blind)
172 if r.Cmp(v.pk.N) >= 0 {
173 return nil, VerifierState{}, common.ErrInvalidBlind
174 }
175 rInv := new(big.Int).ModInverse(r, v.pk.N)
176 if rInv == nil {
177 return nil, VerifierState{}, common.ErrInvalidBlind
178 }
179
180 return fixedBlind(message, salt, r, rInv, v.pk, v.hash)
181 }
182
183
184 func (v deterministicBRSAVerifier) Verify(message, signature []byte) error {
185 return common.VerifyMessageSignature(message, signature, 0, keys.NewBigPublicKey(v.pk), v.cryptoHash)
186 }
187
188
189
190
191
192
193
194 func (v randomBRSAVerifier) Blind(random io.Reader, message []byte) ([]byte, VerifierState, error) {
195 if random == nil {
196 return nil, VerifierState{}, common.ErrInvalidRandomness
197 }
198
199 salt := make([]byte, v.hash.Size())
200 _, err := io.ReadFull(random, salt)
201 if err != nil {
202 return nil, VerifierState{}, err
203 }
204
205 r, rInv, err := common.GenerateBlindingFactor(random, v.pk.N)
206 if err != nil {
207 return nil, VerifierState{}, err
208 }
209
210 return fixedBlind(message, salt, r, rInv, v.pk, v.hash)
211 }
212
213
214 func (v randomBRSAVerifier) FixedBlind(message, blind, salt []byte) ([]byte, VerifierState, error) {
215 if blind == nil {
216 return nil, VerifierState{}, common.ErrInvalidRandomness
217 }
218
219 r := new(big.Int).SetBytes(blind)
220 if r.Cmp(v.pk.N) >= 0 {
221 return nil, VerifierState{}, common.ErrInvalidBlind
222 }
223
224 rInv := new(big.Int).ModInverse(r, v.pk.N)
225 if rInv == nil {
226 return nil, VerifierState{}, common.ErrInvalidBlind
227 }
228
229 return fixedBlind(message, salt, r, rInv, v.pk, v.hash)
230 }
231
232
233 func (v randomBRSAVerifier) Verify(message, signature []byte) error {
234 return common.VerifyMessageSignature(message, signature, v.hash.Size(), keys.NewBigPublicKey(v.pk), v.cryptoHash)
235 }
236
237
238
239 type VerifierState struct {
240
241 pk *rsa.PublicKey
242
243
244 hash hash.Hash
245
246
247 encodedMsg []byte
248
249
250 salt []byte
251
252
253 rInv *big.Int
254 }
255
256
257
258
259
260 func (state VerifierState) Finalize(data []byte) ([]byte, error) {
261 kLen := (state.pk.N.BitLen() + 7) / 8
262 if len(data) != kLen {
263 return nil, common.ErrUnexpectedSize
264 }
265
266 z := new(big.Int).SetBytes(data)
267 s := new(big.Int).Set(state.rInv)
268 s.Mul(s, z)
269 s.Mod(s, state.pk.N)
270
271 sig := make([]byte, kLen)
272 s.FillBytes(sig)
273
274 err := common.VerifyBlindSignature(keys.NewBigPublicKey(state.pk), state.encodedMsg, sig)
275 if err != nil {
276 return nil, err
277 }
278
279 return sig, nil
280 }
281
282
283 func (state VerifierState) CopyBlind() []byte {
284 r := new(big.Int).ModInverse(state.rInv, state.pk.N)
285 return r.Bytes()
286 }
287
288
289 func (state VerifierState) CopySalt() []byte {
290 salt := make([]byte, len(state.salt))
291 copy(salt, state.salt)
292 return salt
293 }
294
295
296
297 type Signer struct {
298
299 sk *rsa.PrivateKey
300 }
301
302
303 func NewSigner(sk *rsa.PrivateKey) Signer {
304 return Signer{
305 sk: sk,
306 }
307 }
308
309
310
311
312
313
314 func (signer Signer) BlindSign(data []byte) ([]byte, error) {
315 kLen := (signer.sk.N.BitLen() + 7) / 8
316 if len(data) != kLen {
317 return nil, common.ErrUnexpectedSize
318 }
319
320 m := new(big.Int).SetBytes(data)
321 if m.Cmp(signer.sk.N) > 0 {
322 return nil, common.ErrInvalidMessageLength
323 }
324
325 s, err := common.DecryptAndCheck(rand.Reader, keys.NewBigPrivateKey(signer.sk), m)
326 if err != nil {
327 return nil, err
328 }
329
330 blindSig := make([]byte, kLen)
331 s.FillBytes(blindSig)
332
333 return blindSig, nil
334 }
335
336 var (
337 ErrUnexpectedSize = common.ErrUnexpectedSize
338 ErrInvalidMessageLength = common.ErrInvalidMessageLength
339 ErrInvalidBlind = common.ErrInvalidBlind
340 ErrInvalidRandomness = common.ErrInvalidRandomness
341 ErrUnsupportedHashFunction = common.ErrUnsupportedHashFunction
342 )
343
View as plain text