github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/merkletree2/util_for_test.go (about) 1 package merkletree2 2 3 import ( 4 "crypto/sha512" 5 "errors" 6 "fmt" 7 "math/big" 8 "math/rand" 9 "sort" 10 "strconv" 11 "testing" 12 13 "github.com/keybase/client/go/msgpack" 14 15 "github.com/stretchr/testify/require" 16 ) 17 18 func makePositionFromStringForTesting(s string) (Position, error) { 19 posInt, err := strconv.ParseInt(s, 2, 64) 20 if err != nil { 21 return Position{}, err 22 } 23 return (Position)(*big.NewInt(posInt)), nil 24 } 25 26 func getTreeCfgsWith1_2_3BitsPerIndexBlinded(t *testing.T) (config1bit, config2bits, config3bits Config) { 27 config1bit, err := NewConfig(IdentityHasherBlinded{}, true, 1, 1, 1, ConstructStringValueContainer) 28 require.NoError(t, err) 29 30 config2bits, err = NewConfig(IdentityHasherBlinded{}, true, 2, 1, 1, ConstructStringValueContainer) 31 require.NoError(t, err) 32 33 config3bits, err = NewConfig(IdentityHasherBlinded{}, true, 3, 1, 3, ConstructStringValueContainer) 34 require.NoError(t, err) 35 36 return config1bit, config2bits, config3bits 37 } 38 39 func getTreeCfgsWith1_2_3BitsPerIndexUnblinded(t *testing.T) (config1bit, config2bits, config3bits Config) { 40 config1bit, err := NewConfig(IdentityHasher{}, false, 1, 1, 1, ConstructStringValueContainer) 41 require.NoError(t, err) 42 43 config2bits, err = NewConfig(IdentityHasher{}, false, 2, 1, 1, ConstructStringValueContainer) 44 require.NoError(t, err) 45 46 config3bits, err = NewConfig(IdentityHasher{}, false, 3, 1, 3, ConstructStringValueContainer) 47 require.NoError(t, err) 48 49 return config1bit, config2bits, config3bits 50 } 51 52 func getSampleKVPS3bits() (kvps1, kvps2, kvps3 []KeyValuePair) { 53 kvps1 = []KeyValuePair{ 54 {Key: []byte{0x00, 0x00, 0x00}, Value: "key0x000000Seqno1"}, 55 {Key: []byte{0x00, 0x00, 0x01}, Value: "key0x000001Seqno1"}, 56 {Key: []byte{0x00, 0x10, 0x00}, Value: "key0x001000Seqno1"}, 57 {Key: []byte{0xff, 0xff, 0xff}, Value: "key0xffffffSeqno1"}, 58 } 59 60 kvps2 = []KeyValuePair{ 61 {Key: []byte{0x00, 0x00, 0x00}, Value: "key0x000000Seqno2"}, 62 {Key: []byte{0x00, 0x00, 0x01}, Value: "key0x000001Seqno2"}, 63 {Key: []byte{0x00, 0x10, 0x00}, Value: "key0x001000Seqno2"}, 64 {Key: []byte{0xff, 0xff, 0xfe}, Value: "key0xfffffeSeqno2"}, 65 {Key: []byte{0xff, 0xff, 0xff}, Value: "key0xffffffSeqno2"}, 66 } 67 68 kvps3 = []KeyValuePair{ 69 {Key: []byte{0x00, 0x00, 0x00}, Value: "key0x000000Seqno3"}, 70 {Key: []byte{0x00, 0x00, 0x01}, Value: "key0x000001Seqno3"}, 71 {Key: []byte{0x00, 0x10, 0x00}, Value: "key0x001000Seqno3"}, 72 {Key: []byte{0xff, 0xff, 0xfd}, Value: "key0xfffffdSeqno3"}, 73 {Key: []byte{0xff, 0xff, 0xfe}, Value: "key0xfffffeSeqno3"}, 74 {Key: []byte{0xff, 0xff, 0xff}, Value: "key0xffffffSeqno3"}, 75 } 76 return kvps1, kvps2, kvps3 77 } 78 79 func getSampleKVPS1bit() (kvps1, kvps2, kvps3 []KeyValuePair) { 80 kvps1 = []KeyValuePair{ 81 {Key: []byte{0x00}, Value: "key0x00Seqno1"}, 82 {Key: []byte{0x01}, Value: "key0x01Seqno1"}, 83 {Key: []byte{0x10}, Value: "key0x10Seqno1"}, 84 {Key: []byte{0xff}, Value: "key0xffSeqno1"}} 85 86 kvps2 = []KeyValuePair{ 87 {Key: []byte{0x00}, Value: "key0x00Seqno2"}, 88 {Key: []byte{0x01}, Value: "key0x01Seqno2"}, 89 {Key: []byte{0x10}, Value: "key0x10Seqno2"}, 90 {Key: []byte{0xfe}, Value: "key0xfeSeqno2"}, 91 {Key: []byte{0xff}, Value: "key0xffSeqno2"}, 92 } 93 94 kvps3 = []KeyValuePair{ 95 {Key: []byte{0x00}, Value: "key0x00Seqno3"}, 96 {Key: []byte{0x01}, Value: "key0x01Seqno3"}, 97 {Key: []byte{0x10}, Value: "key0x10Seqno3"}, 98 {Key: []byte{0xfd}, Value: "key0xfdSeqno3"}, 99 {Key: []byte{0xfe}, Value: "key0xfeSeqno3"}, 100 {Key: []byte{0xff}, Value: "key0xffSeqno3"}, 101 } 102 103 return kvps1, kvps2, kvps3 104 } 105 106 // Useful to debug tests. Hash(b) == b 107 type IdentityHasher struct{} 108 109 var _ Encoder = IdentityHasher{} 110 111 func (i IdentityHasher) Encode(o interface{}) (dst []byte, err error) { 112 return dst, i.EncodeTo(o, &dst) 113 } 114 115 func (i IdentityHasher) EncodeTo(o interface{}, out *[]byte) (err error) { 116 enc, err := msgpack.EncodeCanonical(o) 117 if err != nil { 118 return err 119 } 120 *out = append((*out)[:0], enc...) 121 return nil 122 } 123 124 func (i IdentityHasher) GetEncodingType() EncodingType { 125 return EncodingTypeForTesting 126 } 127 128 func (i IdentityHasher) Decode(dest interface{}, src []byte) error { 129 return msgpack.Decode(dest, src) 130 } 131 132 func (i IdentityHasher) HashKeyEncodedValuePairWithKeySpecificSecret(kevp KeyEncodedValuePair, _ KeySpecificSecret) (Hash, error) { 133 return i.Encode(kevp) 134 } 135 136 func (i IdentityHasher) HashKeyEncodedValuePairWithKeySpecificSecretTo(kevp KeyEncodedValuePair, _ KeySpecificSecret, h *Hash) (err error) { 137 *h, err = i.Encode(kevp) 138 return err 139 } 140 141 func (i IdentityHasher) EncodeAndHashGeneric(o interface{}) ([]byte, Hash, error) { 142 enc, err := i.Encode(o) 143 if err != nil { 144 return nil, nil, fmt.Errorf("Encoding error in IdentityHasher for %v: %v", o, err) 145 } 146 return enc, Hash(enc), nil 147 } 148 149 func (i IdentityHasher) HashGeneric(o interface{}, h *Hash) (err error) { 150 _, *h, err = i.EncodeAndHashGeneric(o) 151 return err 152 } 153 154 func (i IdentityHasher) HashKeyValuePairWithKeySpecificSecret(kvp KeyValuePair, kss KeySpecificSecret) (Hash, error) { 155 encVal, err := i.Encode(kvp.Value) 156 if err != nil { 157 return nil, err 158 } 159 return i.HashKeyEncodedValuePairWithKeySpecificSecret(KeyEncodedValuePair{Key: kvp.Key, Value: encVal}, kss) 160 } 161 162 func (i IdentityHasher) GenerateMasterSecret(Seqno) (MasterSecret, error) { 163 return nil, errors.New("Should not call GenerateMasterSecret on an unblinded hasher") 164 } 165 166 func (i IdentityHasher) ComputeKeySpecificSecret(ms MasterSecret, k Key) KeySpecificSecret { 167 return nil 168 } 169 170 func (i IdentityHasher) ComputeKeySpecificSecretTo(ms MasterSecret, k Key, kss *KeySpecificSecret) { 171 } 172 173 // Useful to debug tests. Hash(b) == b, with extra blinding fields injected as appropriate 174 type IdentityHasherBlinded struct{} 175 176 var _ Encoder = IdentityHasherBlinded{} 177 178 func (i IdentityHasherBlinded) GetEncodingType() EncodingType { 179 return EncodingTypeForTesting 180 } 181 182 func (i IdentityHasherBlinded) EncodeAndHashGeneric(o interface{}) ([]byte, Hash, error) { 183 enc, err := msgpack.EncodeCanonical(o) 184 if err != nil { 185 return nil, nil, fmt.Errorf("Msgpack error in IdentityHasher for %v: %v", o, err) 186 } 187 return enc, Hash(enc), nil 188 } 189 190 func (i IdentityHasherBlinded) HashGeneric(o interface{}, h *Hash) (err error) { 191 _, *h, err = i.EncodeAndHashGeneric(o) 192 return err 193 } 194 195 func (i IdentityHasherBlinded) Encode(o interface{}) (dst []byte, err error) { 196 return dst, i.EncodeTo(o, &dst) 197 } 198 199 func (i IdentityHasherBlinded) EncodeTo(o interface{}, out *[]byte) (err error) { 200 enc, err := msgpack.EncodeCanonical(o) 201 if err != nil { 202 return err 203 } 204 *out = append((*out)[:0], enc...) 205 return nil 206 } 207 208 func (i IdentityHasherBlinded) Decode(dest interface{}, src []byte) error { 209 return msgpack.Decode(dest, src) 210 } 211 212 func (i IdentityHasherBlinded) HashKeyValuePairWithKeySpecificSecret(kvp KeyValuePair, kss KeySpecificSecret) (Hash, error) { 213 encVal, err := i.Encode(kvp.Value) 214 if err != nil { 215 return nil, err 216 } 217 return i.HashKeyEncodedValuePairWithKeySpecificSecret(KeyEncodedValuePair{Key: kvp.Key, Value: encVal}, kss) 218 } 219 220 func (i IdentityHasherBlinded) HashKeyEncodedValuePairWithKeySpecificSecret(kevp KeyEncodedValuePair, kss KeySpecificSecret) (Hash, error) { 221 enc, err := i.Encode(struct { 222 Kevp KeyEncodedValuePair 223 Kss KeySpecificSecret 224 }{Kevp: kevp, Kss: kss}) 225 if err != nil { 226 panic(err) 227 } 228 return Hash(enc), nil 229 } 230 231 func (i IdentityHasherBlinded) HashKeyEncodedValuePairWithKeySpecificSecretTo(kevp KeyEncodedValuePair, kss KeySpecificSecret, h *Hash) (err error) { 232 *h, err = i.HashKeyEncodedValuePairWithKeySpecificSecret(kevp, kss) 233 return err 234 } 235 236 func (i IdentityHasherBlinded) GenerateMasterSecret(Seqno) (MasterSecret, error) { 237 ms := make([]byte, 1) 238 _, err := rand.Read(ms) 239 return MasterSecret(ms), err 240 } 241 242 func (i IdentityHasherBlinded) ComputeKeySpecificSecret(ms MasterSecret, k Key) KeySpecificSecret { 243 kss, err := msgpack.EncodeCanonical(struct { 244 Ms MasterSecret 245 K Key 246 }{Ms: ms, K: k}) 247 if err != nil { 248 panic(err) 249 } 250 return KeySpecificSecret(kss) 251 } 252 253 func (i IdentityHasherBlinded) ComputeKeySpecificSecretTo(ms MasterSecret, k Key, kss *KeySpecificSecret) { 254 var err error 255 *kss, err = msgpack.EncodeCanonical(struct { 256 Ms MasterSecret 257 K Key 258 }{Ms: ms, K: k}) 259 if err != nil { 260 panic(err) 261 } 262 } 263 264 // returns two disjoint lists of sorted and unique keys of size numPairs1, numPairs2 265 func makeRandomKeysForTesting(keysByteLength uint, numPairs1, numPairs2 int) ([]Key, []Key, error) { 266 numPairs := numPairs1 + numPairs2 267 268 if keysByteLength < 8 && numPairs > 1<<(keysByteLength*8) { 269 return nil, nil, fmt.Errorf("too many keys requested !") 270 } 271 272 keyMap := make(map[string]bool, numPairs) 273 for len(keyMap) < numPairs { 274 key := make([]byte, keysByteLength) 275 _, err := rand.Read(key) 276 if err != nil { 277 return nil, nil, err 278 } 279 keyMap[string(key)] = true 280 } 281 282 keyStrings1 := make([]string, 0, numPairs1) 283 keyStrings2 := make([]string, 0, numPairs2) 284 285 i := 0 286 for k := range keyMap { 287 if i < numPairs1 { 288 keyStrings1 = append(keyStrings1, k) 289 i++ 290 } else { 291 keyStrings2 = append(keyStrings2, k) 292 } 293 } 294 295 sort.Strings(keyStrings1) 296 sort.Strings(keyStrings2) 297 298 keys1 := make([]Key, numPairs1) 299 for i, k := range keyStrings1 { 300 keys1[i] = Key(k) 301 } 302 303 keys2 := make([]Key, numPairs2) 304 for i, k := range keyStrings2 { 305 keys2[i] = Key(k) 306 } 307 308 return keys1, keys2, nil 309 } 310 311 func makeRandomKVPFromKeysForTesting(keys []Key) ([]KeyValuePair, error) { 312 kvps := make([]KeyValuePair, len(keys)) 313 valBuffer := make([]byte, 10) 314 for i, key := range keys { 315 kvps[i].Key = key 316 _, err := rand.Read(valBuffer) 317 if err != nil { 318 return nil, err 319 } 320 kvps[i].Value = string(valBuffer) 321 } 322 return kvps, nil 323 } 324 325 func ConstructStringValueContainer() interface{} { 326 return "" 327 } 328 329 type SHA512_256Encoder struct{} 330 331 var _ Encoder = SHA512_256Encoder{} 332 333 func (e SHA512_256Encoder) GetEncodingType() EncodingType { 334 return EncodingTypeForTesting 335 } 336 337 func (e SHA512_256Encoder) Encode(o interface{}) (dst []byte, err error) { 338 return dst, e.EncodeTo(o, &dst) 339 } 340 341 func (e SHA512_256Encoder) EncodeTo(o interface{}, out *[]byte) (err error) { 342 enc, err := msgpack.EncodeCanonical(o) 343 if err != nil { 344 return err 345 } 346 *out = append((*out)[:0], enc...) 347 return nil 348 } 349 350 func (e SHA512_256Encoder) Decode(dest interface{}, src []byte) error { 351 return msgpack.Decode(dest, src) 352 } 353 354 func (e SHA512_256Encoder) EncodeAndHashGeneric(o interface{}) ([]byte, Hash, error) { 355 enc, err := e.Encode(o) 356 if err != nil { 357 return nil, nil, err 358 } 359 hasher := sha512.New512_256() 360 _, err = hasher.Write(enc) 361 if err != nil { 362 return nil, nil, err 363 } 364 return enc, hasher.Sum(nil), nil 365 } 366 367 func (e SHA512_256Encoder) HashGeneric(o interface{}, h *Hash) (err error) { 368 _, *h, err = e.EncodeAndHashGeneric(o) 369 return err 370 } 371 372 func (e SHA512_256Encoder) HashKeyValuePairWithKeySpecificSecret(kvp KeyValuePair, kss KeySpecificSecret) (Hash, error) { 373 encVal, err := e.Encode(kvp.Value) 374 if err != nil { 375 return nil, err 376 } 377 return e.HashKeyEncodedValuePairWithKeySpecificSecret(KeyEncodedValuePair{Key: kvp.Key, Value: encVal}, kss) 378 } 379 380 func (e SHA512_256Encoder) HashKeyEncodedValuePairWithKeySpecificSecret(kevp KeyEncodedValuePair, kss KeySpecificSecret) (Hash, error) { 381 if len(kss) > 0 { 382 panic("This encoder does not support blinding with secrets.") 383 } 384 // TODO this double encoding is unnecessary. Consider removing. 385 enc, err := e.Encode(kevp) 386 if err != nil { 387 return nil, err 388 } 389 hasher := sha512.New512_256() 390 _, err = hasher.Write(enc) 391 if err != nil { 392 return nil, err 393 } 394 return hasher.Sum(nil), nil 395 } 396 397 func (e SHA512_256Encoder) HashKeyEncodedValuePairWithKeySpecificSecretTo(kevp KeyEncodedValuePair, kss KeySpecificSecret, h *Hash) (err error) { 398 *h, err = e.HashKeyEncodedValuePairWithKeySpecificSecret(kevp, kss) 399 return err 400 } 401 402 func (e SHA512_256Encoder) GenerateMasterSecret(_ Seqno) (MasterSecret, error) { 403 return nil, fmt.Errorf("This encoder does not support blinding") 404 } 405 406 func (e SHA512_256Encoder) ComputeKeySpecificSecret(_ MasterSecret, _ Key) KeySpecificSecret { 407 return nil 408 } 409 410 func (e SHA512_256Encoder) ComputeKeySpecificSecretTo(ms MasterSecret, k Key, kss *KeySpecificSecret) { 411 }