From 2830478a2af382ed945ac022a69e5995dbc734d0 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 19 Dec 2022 15:28:34 -0800 Subject: [PATCH] Make golden files for cpabe. --- abe/cpabe/tkn20/gen_testdata.go | 72 +++++++++++++++++++++++++ abe/cpabe/tkn20/internal/tkn/policy.go | 13 +++-- abe/cpabe/tkn20/internal/tkn/tk.go | 24 ++++----- abe/cpabe/tkn20/internal/tkn/util.go | 44 +++++++++++++++ abe/cpabe/tkn20/testdata/attributeKey | Bin 2788 -> 2788 bytes abe/cpabe/tkn20/testdata/ciphertext | Bin 2320 -> 2320 bytes abe/cpabe/tkn20/testdata/publicKey | Bin 3282 -> 3282 bytes abe/cpabe/tkn20/testdata/secretKey | Bin 1136 -> 1136 bytes abe/cpabe/tkn20/testdata/serialize.go | 55 ------------------- abe/cpabe/tkn20/tkn20.go | 2 + 10 files changed, 134 insertions(+), 76 deletions(-) create mode 100644 abe/cpabe/tkn20/gen_testdata.go delete mode 100644 abe/cpabe/tkn20/testdata/serialize.go diff --git a/abe/cpabe/tkn20/gen_testdata.go b/abe/cpabe/tkn20/gen_testdata.go new file mode 100644 index 00000000..9629efcb --- /dev/null +++ b/abe/cpabe/tkn20/gen_testdata.go @@ -0,0 +1,72 @@ +//go:build ignore +// +build ignore + +// Generates golden files for tests. +package main + +import ( + "encoding" + mrand "math/rand" + "os" + "path/filepath" + + cpabe "github.com/cloudflare/circl/abe/cpabe/tkn20" +) + +func writeToFile(name string, data []byte) { + err := os.WriteFile("testdata/"+name, data, 0o644) + if err != nil { + panic(err) + } +} + +func dumpToFile(name string, m encoding.BinaryMarshaler) { + data, err := m.MarshalBinary() + if err != nil { + panic(err) + } + writeToFile(name, data) +} + +func main() { + // Using fixed PRNG for reproducibility, + fixedSeed := int64(0xC1C1C1C1) + prng := mrand.New(mrand.NewSource(fixedSeed)) + if prng == nil { + panic("failed to create PRNG") + } + + err := os.MkdirAll(filepath.Join(".", "testdata"), 0o755) + if err != nil { + panic(err) + } + + publicParams, secretParams, err := cpabe.Setup(prng) + if err != nil { + panic(err) + } + + dumpToFile("publicKey", &publicParams) + dumpToFile("secretKey", &secretParams) + + attrs := cpabe.Attributes{} + attrs.FromMap(map[string]string{"country": "NL", "EU": "true"}) + + policy := cpabe.Policy{} + err = policy.FromString("EU: true") + if err != nil { + panic(err) + } + msg := []byte("Be sure to drink your ovaltine!") + ciphertext, err := publicParams.Encrypt(prng, policy, msg) + if err != nil { + panic(err) + } + writeToFile("ciphertext", ciphertext) + + key, err := secretParams.KeyGen(prng, attrs) + if err != nil { + panic(err) + } + dumpToFile("attributeKey", &key) +} diff --git a/abe/cpabe/tkn20/internal/tkn/policy.go b/abe/cpabe/tkn20/internal/tkn/policy.go index 50292fe7..8e24ad86 100644 --- a/abe/cpabe/tkn20/internal/tkn/policy.go +++ b/abe/cpabe/tkn20/internal/tkn/policy.go @@ -76,14 +76,13 @@ type Attributes map[string]Attribute func (a *Attributes) marshalBinary() ([]byte, error) { ret := make([]byte, 2) binary.LittleEndian.PutUint16(ret[0:], uint16(len(*a))) - for label, attr := range *a { - ret = appendLenPrefixed(ret, []byte(label)) - attrBytes, err := attr.marshalBinary() - if err != nil { - return nil, fmt.Errorf("marshalling Attributes failed: %w", err) - } - ret = append(ret, attrBytes...) + + aBytes, err := marshalBinarySortedMapAttribute(*a) + if err != nil { + return nil, fmt.Errorf("marshalling Attributes failed: %w", err) } + ret = append(ret, aBytes...) + return ret, nil } diff --git a/abe/cpabe/tkn20/internal/tkn/tk.go b/abe/cpabe/tkn20/internal/tkn/tk.go index d6b8c330..606c80f5 100644 --- a/abe/cpabe/tkn20/internal/tkn/tk.go +++ b/abe/cpabe/tkn20/internal/tkn/tk.go @@ -210,24 +210,20 @@ func (a *AttributesKey) MarshalBinary() ([]byte, error) { ret = appendLenPrefixed(ret, k2Bytes) ret = append(ret, 0, 0) binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(a.k3))) - for s, m := range a.k3 { - ret = appendLenPrefixed(ret, []byte(s)) - g1Bytes, err := m.marshalBinary() - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, g1Bytes) + k3Bytes, err := marshalBinarySortedMapMatrixG1(a.k3) + if err != nil { + return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) } + ret = append(ret, k3Bytes...) + ret = append(ret, 0, 0) binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(a.k3wild))) - for s, m := range a.k3wild { - ret = appendLenPrefixed(ret, []byte(s)) - g1Bytes, err := m.marshalBinary() - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, g1Bytes) + k3wildBytes, err := marshalBinarySortedMapMatrixG1(a.k3wild) + if err != nil { + return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) } + ret = append(ret, k3wildBytes...) + return ret, nil } diff --git a/abe/cpabe/tkn20/internal/tkn/util.go b/abe/cpabe/tkn20/internal/tkn/util.go index aa9423bf..69a31f18 100644 --- a/abe/cpabe/tkn20/internal/tkn/util.go +++ b/abe/cpabe/tkn20/internal/tkn/util.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "errors" "fmt" + "sort" pairing "github.com/cloudflare/circl/ecc/bls12381" "golang.org/x/crypto/blake2b" @@ -60,6 +61,49 @@ func removeLenPrefixed(data []byte) (next []byte, remainder []byte, err error) { return data[2 : 2+itemLen], data[2+itemLen:], nil } +func marshalBinarySortedMapMatrixG1(m map[string]*matrixG1) ([]byte, error) { + sortedKeys := make([]string, 0, len(m)) + for key := range m { + sortedKeys = append(sortedKeys, key) + } + sort.Strings(sortedKeys) + + ret := []byte{} + for _, key := range sortedKeys { + b, err := m[key].marshalBinary() + if err != nil { + return nil, err + } + + ret = appendLenPrefixed(ret, []byte(key)) + ret = appendLenPrefixed(ret, b) + } + + return ret, nil +} + +func marshalBinarySortedMapAttribute(m map[string]Attribute) ([]byte, error) { + sortedKeys := make([]string, 0, len(m)) + for key := range m { + sortedKeys = append(sortedKeys, key) + } + sort.Strings(sortedKeys) + + ret := []byte{} + for _, key := range sortedKeys { + a := m[key] + b, err := a.marshalBinary() + if err != nil { + return nil, err + } + + ret = appendLenPrefixed(ret, []byte(key)) + ret = append(ret, b...) + } + + return ret, nil +} + var ( errBadMatrixSize = errors.New("matrix inputs do not conform") errMatrixNonInvertible = errors.New("matrix has no inverse") diff --git a/abe/cpabe/tkn20/testdata/attributeKey b/abe/cpabe/tkn20/testdata/attributeKey index 3f6ea037d96707fca676e54492eac06e00862aa1..4b37c6f0d41b56f4a0079332e180d1505d81d94a 100644 GIT binary patch delta 2599 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 diff --git a/abe/cpabe/tkn20/testdata/ciphertext b/abe/cpabe/tkn20/testdata/ciphertext index 75974fd9a9f6d652b602eb5401045f34e6221938..a7404fe134bc95f1c8a96de2205ee1a2f008af71 100644 GIT binary patch delta 2281 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 D!W&rW diff --git a/abe/cpabe/tkn20/testdata/publicKey b/abe/cpabe/tkn20/testdata/publicKey index f9866f562c39ff712995de03d94d6217590fb664..dbe323dbd4c89fd60239c78a31ae994bf2dfeec3 100644 GIT binary patch literal 3282 zcmV;@3@!5n1_S^C02o(={Cwl~uU`m2v3#{V3?W|9QT*oCtD#@ZXl|OgxszZ>&mEdE z%R4iMd4qiuFb4pI^KGbF@pBY&V(SmNn4sZA&?|lEXuTxWv3aygc-B=-i+xy*+x2w) z*A&;ofCKbW6P;gqgo!YQ*q^CVaEWyqWlk{q(`yBM~P z9<}J+dA|JftQQxj9oOoT=vZ0@63t|s8SFCr=t}0D%GburK}mP6(At#2Hg5*iC>^a0R+R z6)%k0g?%W5GM5eRRQ6W*11mR%r77`mzxtrjw~!%_J-CrP@fN#|;huT$_6?7Z5fUyK zFNp*GxFYHnUeZ8w1q>9hBauPFldk#hT}gM}JW>Ek#}hasOF^7uQKL0${zAb965zui zW-gqkX#;Tbk>|H}_&ghh;TK5;=?435=+5c1tppcK4w$uTah#!D*2r$GTtc!W8rIRU ziNWv%vgs*4&j7Bzxbss5UDdqD@Ct8Yj{!FA;p9)Bel>-pV~P}4BmI!EVf{}#R(Kgw zE9w=U&m^$f2K-mLWK3DNBYCM6RDh%H%lrK{68cBuPBch^K#b|E%oGdPf&B}WYyRTo70&u-+;ZH&twXEYrHyF>6jKWI1%Q@futXX3jCVd+zFlrb1Dt+$-K$~ z9;b`j@Sd+Oafk$0FXrg^=@Za~;14^klz?*sokuNFaP^I3m3VmU<_EjuAKLC-Kxs5$1Hneo_UM+x#7;U;E6eiqNAoanx*uD8p? zLJlGuaGjf8@RwbFL|H4Ij7?Jv;mr99NFI97841LFgT)X@NE~J-le``Cpx~yJEkV4i zovs=9z(uxw(ctwPP`s(Q36#wc*-)t&V+FkFcJg%1Lruhk@Q>I-2rUW|9SuT#4^jL8h43Tpx6q?%W<;EwaUP<%q1h7YPOD42 zeRaZ2!PfVv+#Gcd+8NDh1DzF(SJIFheEAzz?0(~Yj-Yb%8J(`G*WQJ)3tG`MOijK+ zhYr)`8aZ{6s8&rk!vbiw6#7;gXP zRS3`@$&84S_4F3RGk&oqjHjUf|2O0<1|=y^2tQy=83Sq41{8SFKyjq7l+*v=P7}9L zMMw-E&Xy07Js8XLzCmCLJ9q~<;z}QLpc2Z*Z))J8k`Ijq^+pvJUqk`}00ICAijLNv zdB>(byhHVE>63puxqr{$;NMN9T?Ua+MUnG!knTNPqUq9yo-ZIauHbkFtWkxF-L)vj z#2d{WpOHHUno>$c1S6DNZq*4LSY-+b^`L6gx10Wp-#S0jyGo5PK@Zg z%p4Nxs6-D6=k_z5tB0MFv~j2|kJ3BjE^;Y=Ji5X1;J;eAZNcYBRQ`nB zJlNWtM9IB+Nb!fwmM+*A_H-4|<78_#y3kiw@7H@tIWRg_&@2v9SJJavCjP~+

Tw z!o%i+bat!tlxjXt`x|30?k za*CZPU$KQ5?TZ4S`O>#qPjK>ZJE4roC%DHiwGRdO$bEmXYIriGHSmst8eBRD@lk*B zT2#jfWAlF?Da&?WF`$NkbMNWXPbdFayoDm#5>#W^0K-#thsoPe=$k|--qZJP6c{Lk z1Ofm701w54FsjX@a+ND%KYOv84bW0lSBrQ1`7k7Hv|uz)v#X*lvRR^q60{kD6Ti4n zunN!CvNdZ&z&KF^L{@L*bkh&aMyE}{iH5BLSvG5eRM$X*aqJMR9VxCNS9BOg+P?b>oyVg%f}=fvl@`(DnmHV1vcuxH ztvIRlUJk?QN#Ihx7p5}SLGbbY!8V>A%P^xA-#h>wtlIjPRS$t^*5@e0=|B$QQkNFT zpD|Kmqq5UEjy$E1#UA=>yp_wH;Wh~7PW|cLEQ_hl9Ta{#m#;TWL~e0^L8g3|MKs^_ zoR2(YChsW^b5GuroMnTBdbzLYQviS>k zE<511{Sc8IWuLwLR{(I?J0U(-rFJEu^9ExZcCQmvr_YN(Q%KRu(98^qMEJtEhkO^( zT%^vZ8=5!D`W5v%?UhwS+w+Tpxtrh5u8aB~ryw5FQL&a`c}G{G&PE(ckOgQ}uaYts zRN4UNQWW6G46t|Dfm6MyqV{(&3pE(esqKP^?d(eq{@PKIcd*xevF%Z$iYS482K}qG zo&riT;x4e+!#UuqJBEztD~dZa)PQEsPPPLz6w$JNV9LMv3)ASX@deK5IoJf5nhe9} zcb`pPI4SbC)IkFY25J4n1-&6A&uf=F4HRSqFBMmuQ{~2_-CeS^m8}cW!x%-cl!IOu z{*%klNKo#spMpx{jv#T@*`{%6-?3B*lwtXYh<21dpXeFPwlP6p(+?wp%*jK~^Gb`j zt|R=9Wgu5GWBq_@75@=|FiiEqoi{zx$F&gG!hkw`=m7qBMGHpt`V!fX8UQ2n@}Yh6 z9Y`~F=hAjWJU+Q0+>US5B(DI}IYj>~+tTzhsINC}cnNX7R9Sv3D&=D}iP#;2S$g5B z*9vb=I(6`EM;^MW4qo{?@Q)c1rW&8757ZQ34;V;Aff&`FNrMHyTCF+W#h6RW5jBwB zEP7{j&%rfJkUy$ej?hHGD-D1iFN1WnFB0~j%N5$)$2N6&vFn#Cb^elYIrmDuE2?$m zqDs^u92%SnP7D_IjQ=^~Y?2G6-VR(Q0J&?mztAvteWIK>%;6^Bh9~eHx?T)rvyNi`vK0Sb$7Df%?X|$mBn4j5B48fR3lw)r1 QPdGRsn5gj9z=*b*4UvCZRR910 literal 3282 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 delta 1028 zcmV+f1pE8&2=E9d!~g>T0sv!O`V^NUJDIl^#);d&+AuH!N<}&1NVhUxceG9jDoT+t zHIYCIAST?+;%rMs-i&5=yhWSgB8$o|;_55;emG@}4pH9$0g*8uk)?cGk;=#;~Ug|C2!Ur2v3L@_KRCq{gK*7jF7g@I{A;-%`Z%A zC95Cp>$HiJqf1GA=>S?8tE%rcjiN&J$w1Z39$>SIjOF*S2XyE_w&PhXwO$d4W|KGV z64Vxm!cZ=!a57~znY)b(Ik0Rnj$zT=9#kFr3Q?H`S}Cp5ds zAd!$sA}yAQsREacIu2L-vip@8OIxc)Jyk_!zq(V{I>h9E&bQ4>Vp_xNrNsmR1ONg6 z6~E!ZbM+w>bEVwGEur@hH2AD)W>o3R6V@p5^c1gSD)bLx+7zzAm4)|_Pjnby6)BP< zyD5P?J^zsBL^E&S0#AeKq7lYtKEwxlQ(#vAjKRkwb@>?u=~OSbv-kGmZ%#*R(tg*X zp}?;97%z%{Sf**!x_Mj))$+&@Lap%htq{HxidBzCqOYs$(a?hq@hpSp+_xx-3s|#t zakVekD^iIP=WUDtY{BHN{=U*U>JT7QOgs|ucM>(@%DGb1P&I$uX?X_iJU4TyUpcxs zjP9}(R(jpo%^)Ie4H~x}Nnsmfdc3d`>!|QUGK?L6>km9vv$kqZ!9-*szE7ahi*bYi z1ONd5BPv-|Bb<~d+vpNM%qDz2Uvu8e>*=q%)gXqS`ppgm5j>}Ua}16zR24}Mqa1*K zy5}n-cm`+S0MJa5#H3SjMv0b0{1ZFaUMI50#Ik)TXH{GWB{t}LBWml@SImzPCi@nQ yxFy>wP>XLU0