@@ -23,15 +23,19 @@ const (
23
23
// types of encoded bytes, 1 byte
24
24
typeBB1Params marshaledType = 0
25
25
typeBB1PrivateKey = 1
26
- typeBB2Params = 2
27
- typeBB2PrivateKey = 3
26
+ typeBB1MasterKey = 2
27
+ typeBB2Params = 3
28
+ typeBB2PrivateKey = 4
29
+ typeBB2MasterKey = 5
28
30
29
31
// Sizes excluding the magic number and type header.
30
32
headerSize = 3
31
33
marshaledBB1ParamsSize = 2 * marshaledG1Size + 2 * marshaledG2Size + marshaledGTSize
32
34
marshaledBB1PrivateKeySize = 2 * marshaledG2Size
35
+ marshaledBB1MasterKeySize = marshaledG2Size
33
36
marshaledBB2ParamsSize = 2 * marshaledG1Size + marshaledGTSize
34
37
marshaledBB2PrivateKeySize = fieldElemSize + marshaledG2Size
38
+ marshaledBB2MasterKeySize = 2 * fieldElemSize + marshaledG2Size
35
39
)
36
40
37
41
func writeFieldElement (elem * big.Int ) []byte {
@@ -174,7 +178,7 @@ func MarshalPrivateKey(k PrivateKey) ([]byte, error) {
174
178
}
175
179
return ret , nil
176
180
default :
177
- return nil , fmt .Errorf ("MarshalPrivateKey for %T for implemented yet" , k )
181
+ return nil , fmt .Errorf ("MarshalPrivateKey for %T not implemented yet" , k )
178
182
}
179
183
}
180
184
@@ -235,3 +239,87 @@ func UnmarshalPrivateKey(params Params, data []byte) (PrivateKey, error) {
235
239
return nil , fmt .Errorf ("unrecognized private key type (%d)" , typ )
236
240
}
237
241
}
242
+
243
+ // MarshalMasterKey encodes the private component of m into a byte slice.
244
+ func MarshalMasterKey (m Master ) ([]byte , error ) {
245
+ switch m := m .(type ) {
246
+ case * bb1master :
247
+ ret := make ([]byte , 0 , headerSize + marshaledBB1MasterKeySize )
248
+ for _ , field := range [][]byte {
249
+ writeHeader (typeBB1MasterKey ),
250
+ m .g0Hat .Marshal (),
251
+ } {
252
+ ret = append (ret , field ... )
253
+ }
254
+ return ret , nil
255
+ case * bb2master :
256
+ ret := make ([]byte , 0 , headerSize + marshaledBB2MasterKeySize )
257
+ for _ , field := range [][]byte {
258
+ writeHeader (typeBB2MasterKey ),
259
+ writeFieldElement (m .x ),
260
+ writeFieldElement (m .y ),
261
+ m .hHat .Marshal (),
262
+ } {
263
+ ret = append (ret , field ... )
264
+ }
265
+ return ret , nil
266
+ default :
267
+ return nil , fmt .Errorf ("MarshalMasterKey for %T not implemented yet" , m )
268
+ }
269
+ }
270
+
271
+ // UnmarshalMasterKey parses an encoded Master object.
272
+ func UnmarshalMasterKey (params Params , data []byte ) (Master , error ) {
273
+ var typ marshaledType
274
+ var err error
275
+ if typ , data , err = readHeader (data ); err != nil {
276
+ return nil , err
277
+ }
278
+ advance := func (n int ) []byte {
279
+ ret := data [0 :n ]
280
+ data = data [n :]
281
+ return ret
282
+ }
283
+ switch typ {
284
+ case typeBB1MasterKey :
285
+ if len (data ) != marshaledBB1MasterKeySize {
286
+ return nil , fmt .Errorf ("invalid size" )
287
+ }
288
+ m := & bb1master {
289
+ g0Hat : new (bn256.G2 ),
290
+ }
291
+ if _ , ok := m .g0Hat .Unmarshal (advance (marshaledG2Size )); ! ok {
292
+ return nil , fmt .Errorf ("failed to unmarshal g0Hat" )
293
+ }
294
+ p , ok := params .(* bb1params )
295
+ if ! ok {
296
+ return nil , fmt .Errorf ("params type %T incompatible with %T" , params , m )
297
+ }
298
+ m .params = new (bb1params )
299
+ * (m .params ) = * p
300
+ return m , nil
301
+ case typeBB2MasterKey :
302
+ if len (data ) != marshaledBB2MasterKeySize {
303
+ return nil , fmt .Errorf ("invalid size" )
304
+ }
305
+ m := & bb2master {
306
+ x : new (big.Int ),
307
+ y : new (big.Int ),
308
+ hHat : new (bn256.G2 ),
309
+ }
310
+ m .x .SetBytes (advance (fieldElemSize ))
311
+ m .y .SetBytes (advance (fieldElemSize ))
312
+ if _ , ok := m .hHat .Unmarshal (advance (marshaledG2Size )); ! ok {
313
+ return nil , fmt .Errorf ("failed to unmarshal hHat" )
314
+ }
315
+ p , ok := params .(* bb2params )
316
+ if ! ok {
317
+ return nil , fmt .Errorf ("params type %T incompatible with %T" , params , m )
318
+ }
319
+ m .params = new (bb2params )
320
+ * (m .params ) = * p
321
+ return m , nil
322
+ default :
323
+ return nil , fmt .Errorf ("unrecognized master key type (%d)" , typ )
324
+ }
325
+ }
0 commit comments