Skip to content

Commit a94c47e

Browse files
committed
"x/lib": Marshal IBE master
This CL adds methods to marshal and unmarshal the private component of an IBE Master. These methods will be used by a service that hosts an IBE master object for issuing IBE private keys. Change-Id: Iaee881fe24c5b01d6205b2b12be628e81641af88
1 parent a93b484 commit a94c47e

File tree

3 files changed

+122
-3
lines changed

3 files changed

+122
-3
lines changed

ibe/.api

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
pkg ibe, func MarshalMasterKey(Master) ([]byte, error)
12
pkg ibe, func MarshalParams(Params) ([]byte, error)
23
pkg ibe, func MarshalPrivateKey(PrivateKey) ([]byte, error)
34
pkg ibe, func SetupBB1() (Master, error)
45
pkg ibe, func SetupBB2() (Master, error)
6+
pkg ibe, func UnmarshalMasterKey(Params, []byte) (Master, error)
57
pkg ibe, func UnmarshalParams([]byte) (Params, error)
68
pkg ibe, func UnmarshalPrivateKey(Params, []byte) (PrivateKey, error)
79
pkg ibe, type Master interface { Extract, Params }

ibe/bb_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ func testMarshaling(t *testing.T, setup SetupFunc) {
153153
if err != nil {
154154
t.Fatal(err)
155155
}
156+
mkbytes, err := MarshalMasterKey(master)
157+
if err != nil {
158+
t.Fatal(err)
159+
}
156160
m := []byte("01234567899876543210123456789012")
157161
overhead := bbParams.CiphertextOverhead()
158162
var (
@@ -161,6 +165,19 @@ func testMarshaling(t *testing.T, setup SetupFunc) {
161165
m1 = make([]byte, len(m))
162166
m2 = make([]byte, len(m))
163167
)
168+
// Encrypt with the original params, decrypt with key extracted from unmarshaled
169+
// master key.
170+
if err := bbParams.Encrypt("alice", m, C1); err != nil {
171+
t.Error(err)
172+
} else if mk, err := UnmarshalMasterKey(bbParams, mkbytes); err != nil {
173+
t.Error(err)
174+
} else if bbSK, err := mk.Extract("alice"); err != nil {
175+
t.Error(err)
176+
} else if err := bbSK.Decrypt(C1, m2); err != nil {
177+
t.Error(err)
178+
} else if !bytes.Equal(m, m2) {
179+
t.Errorf("Got %q, want %q", m, m2)
180+
}
164181
// Encrypt with the original params, decrypt with the unmarshaled key.
165182
if err := bbParams.Encrypt("alice", m, C1); err != nil {
166183
t.Error(err)
@@ -189,13 +206,19 @@ func testMarshaling(t *testing.T, setup SetupFunc) {
189206
if _, err := UnmarshalPrivateKey(bbParams, skbytes[:len(skbytes)-1]); err == nil {
190207
t.Errorf("UnmarshalPrivateKey succeeded on truncated input")
191208
}
209+
if _, err := UnmarshalMasterKey(bbParams, mkbytes[:len(mkbytes)-1]); err == nil {
210+
t.Errorf("UnmarshalMasterKey succeeded on truncated input")
211+
}
192212
// Extension errors
193213
if _, err := UnmarshalParams(append(pbytes, 0)); err == nil {
194214
t.Errorf("UnmarshalParams succeeded on extended input")
195215
}
196216
if _, err := UnmarshalPrivateKey(bbParams, append(skbytes, 0)); err == nil {
197217
t.Errorf("UnmarshalPrivateKey succeeded on extended input")
198218
}
219+
if _, err := UnmarshalMasterKey(bbParams, append(mkbytes, 0)); err == nil {
220+
t.Errorf("UnmarshalMasterKey succeeded on extended input")
221+
}
199222
// Zero length (no valid header either)
200223
if _, err := UnmarshalParams(nil); err == nil {
201224
t.Errorf("UnmarshalParams succeeded on nil input")
@@ -209,6 +232,12 @@ func testMarshaling(t *testing.T, setup SetupFunc) {
209232
if _, err := UnmarshalPrivateKey(bbParams, []byte{}); err == nil {
210233
t.Errorf("UnmarshalPrivateKey succeeded on zero length input")
211234
}
235+
if _, err := UnmarshalMasterKey(bbParams, nil); err == nil {
236+
t.Errorf("UnmarshalMasterKey succeeded on nil input")
237+
}
238+
if _, err := UnmarshalMasterKey(bbParams, []byte{}); err == nil {
239+
t.Errorf("UnmarshalMasterKey succeeded on zero length input")
240+
}
212241
}
213242

214243
func TestBB1Marshaling(t *testing.T) { testMarshaling(t, SetupBB1) }

ibe/marshal.go

+91-3
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,19 @@ const (
2323
// types of encoded bytes, 1 byte
2424
typeBB1Params marshaledType = 0
2525
typeBB1PrivateKey = 1
26-
typeBB2Params = 2
27-
typeBB2PrivateKey = 3
26+
typeBB1MasterKey = 2
27+
typeBB2Params = 3
28+
typeBB2PrivateKey = 4
29+
typeBB2MasterKey = 5
2830

2931
// Sizes excluding the magic number and type header.
3032
headerSize = 3
3133
marshaledBB1ParamsSize = 2*marshaledG1Size + 2*marshaledG2Size + marshaledGTSize
3234
marshaledBB1PrivateKeySize = 2 * marshaledG2Size
35+
marshaledBB1MasterKeySize = marshaledG2Size
3336
marshaledBB2ParamsSize = 2*marshaledG1Size + marshaledGTSize
3437
marshaledBB2PrivateKeySize = fieldElemSize + marshaledG2Size
38+
marshaledBB2MasterKeySize = 2*fieldElemSize + marshaledG2Size
3539
)
3640

3741
func writeFieldElement(elem *big.Int) []byte {
@@ -174,7 +178,7 @@ func MarshalPrivateKey(k PrivateKey) ([]byte, error) {
174178
}
175179
return ret, nil
176180
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)
178182
}
179183
}
180184

@@ -235,3 +239,87 @@ func UnmarshalPrivateKey(params Params, data []byte) (PrivateKey, error) {
235239
return nil, fmt.Errorf("unrecognized private key type (%d)", typ)
236240
}
237241
}
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

Comments
 (0)