Skip to content

Commit 8db25b5

Browse files
committed
Serializing ciphertext with 32-bit prefixes.
Previously, tkn20 ciphertext was encoding the ciphertext header `C1`, the envelope `env` (containing inner ciphertext), and macData using 16-bit prefixes, which caused a limitation on the maximum size allowed for encrypting plaintexts. With this change, the encoding now uses 32-bit prefixes for these three elements allowing to encrypt plaintexts longer than 2^16 bytes. So, ciphertexts produced by tkn20 package are now 6 bytes longer. Only testdata/ciphertext golden file was updated.
1 parent 9252f3f commit 8db25b5

File tree

4 files changed

+36
-13
lines changed

4 files changed

+36
-13
lines changed

abe/cpabe/tkn20/example_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,6 @@ func Example() {
132132
// Output:
133133
// (occupation:doctor and country:US)
134134
// plaintext size: 27 bytes
135-
// ciphertext size: 2735 bytes
135+
// ciphertext size: 2741 bytes
136136
// Successfully recovered plaintext
137137
}

abe/cpabe/tkn20/internal/tkn/bk.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,16 @@ func EncryptCCA(rand io.Reader, public *PublicParams, policy *Policy, msg []byte
117117
if err != nil {
118118
return nil, err
119119
}
120-
macData := appendLenPrefixed(nil, C1)
121-
macData = appendLenPrefixed(macData, env)
120+
macData := appendLen32Prefixed(nil, C1)
121+
macData = appendLen32Prefixed(macData, env)
122122

123123
tag, err := blakeMac(macKey, macData)
124124
if err != nil {
125125
return nil, err
126126
}
127127

128128
ret := appendLenPrefixed(nil, id)
129-
ret = appendLenPrefixed(ret, macData)
129+
ret = appendLen32Prefixed(ret, macData)
130130
ret = appendLenPrefixed(ret, tag)
131131

132132
return ret, nil
@@ -137,19 +137,19 @@ func DecryptCCA(ciphertext []byte, key *AttributesKey) ([]byte, error) {
137137
if err != nil {
138138
return nil, err
139139
}
140-
macData, rest, err := removeLenPrefixed(rest)
140+
macData, rest, err := removeLen32Prefixed(rest)
141141
if err != nil {
142142
return nil, err
143143
}
144144
tag, _, err := removeLenPrefixed(rest)
145145
if err != nil {
146146
return nil, err
147147
}
148-
C1, envRaw, err := removeLenPrefixed(macData)
148+
C1, envRaw, err := removeLen32Prefixed(macData)
149149
if err != nil {
150150
return nil, err
151151
}
152-
env, _, err := removeLenPrefixed(envRaw)
152+
env, _, err := removeLen32Prefixed(envRaw)
153153
if err != nil {
154154
return nil, err
155155
}
@@ -212,11 +212,11 @@ func CouldDecrypt(ciphertext []byte, a *Attributes) bool {
212212
if err != nil {
213213
return false
214214
}
215-
macData, _, err := removeLenPrefixed(rest)
215+
macData, _, err := removeLen32Prefixed(rest)
216216
if err != nil {
217217
return false
218218
}
219-
C1, _, err := removeLenPrefixed(macData)
219+
C1, _, err := removeLen32Prefixed(macData)
220220
if err != nil {
221221
return false
222222
}
@@ -241,11 +241,11 @@ func (p *Policy) ExtractFromCiphertext(ct []byte) error {
241241
if err != nil {
242242
return fmt.Errorf("invalid ciphertext")
243243
}
244-
macData, _, err := removeLenPrefixed(rest)
244+
macData, _, err := removeLen32Prefixed(rest)
245245
if err != nil {
246246
return fmt.Errorf("invalid ciphertext")
247247
}
248-
C1, _, err := removeLenPrefixed(macData)
248+
C1, _, err := removeLen32Prefixed(macData)
249249
if err != nil {
250250
return fmt.Errorf("invalid ciphertext")
251251
}

abe/cpabe/tkn20/internal/tkn/util.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ func HashStringToScalar(key []byte, value string) *pairing.Scalar {
4242
return s
4343
}
4444

45-
func appendLenPrefixed(a []byte, b []byte) []byte {
45+
func appendLen16Prefixed(a []byte, b []byte) []byte {
4646
a = append(a, 0, 0)
4747
binary.LittleEndian.PutUint16(a[len(a)-2:], uint16(len(b)))
4848
a = append(a, b...)
4949
return a
5050
}
5151

52-
func removeLenPrefixed(data []byte) (next []byte, remainder []byte, err error) {
52+
func removeLen16Prefixed(data []byte) (next []byte, remainder []byte, err error) {
5353
if len(data) < 2 {
5454
return nil, nil, fmt.Errorf("data too short")
5555
}
@@ -60,6 +60,29 @@ func removeLenPrefixed(data []byte) (next []byte, remainder []byte, err error) {
6060
return data[2 : 2+itemLen], data[2+itemLen:], nil
6161
}
6262

63+
var (
64+
appendLenPrefixed = appendLen16Prefixed
65+
removeLenPrefixed = removeLen16Prefixed
66+
)
67+
68+
func appendLen32Prefixed(a []byte, b []byte) []byte {
69+
a = append(a, 0, 0, 0, 0)
70+
binary.LittleEndian.PutUint32(a[len(a)-4:], uint32(len(b)))
71+
a = append(a, b...)
72+
return a
73+
}
74+
75+
func removeLen32Prefixed(data []byte) (next []byte, remainder []byte, err error) {
76+
if len(data) < 4 {
77+
return nil, nil, fmt.Errorf("data too short")
78+
}
79+
itemLen := int(binary.LittleEndian.Uint32(data))
80+
if (4 + itemLen) > len(data) {
81+
return nil, nil, fmt.Errorf("data too short")
82+
}
83+
return data[4 : 4+itemLen], data[4+itemLen:], nil
84+
}
85+
6386
func marshalBinarySortedMapMatrixG1(m map[string]*matrixG1) ([]byte, error) {
6487
sortedKeys := make([]string, 0, len(m))
6588
for key := range m {

abe/cpabe/tkn20/testdata/ciphertext

6 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)