github.com/status-im/status-go@v1.1.0/api/multiformat/utils_test.go (about) 1 package multiformat 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 ) 10 11 var ( 12 // secp256k1 sample public key 13 secPkB = []byte{ 14 0x04, 15 0x26, 0x1c, 0x55, 0x67, 0x5e, 0x55, 0xff, 0x25, 16 0xed, 0xb5, 0x0b, 0x34, 0x5c, 0xfb, 0x3a, 0x3f, 17 0x35, 0xf6, 0x07, 0x12, 0xd2, 0x51, 0xcb, 0xaa, 18 0xab, 0x97, 0xbd, 0x50, 0x05, 0x4c, 0x6e, 0xbc, 19 0x3c, 0xd4, 0xe2, 0x22, 0x00, 0xc6, 0x8d, 0xaf, 20 0x74, 0x93, 0xe1, 0xf8, 0xda, 0x6a, 0x19, 0x0a, 21 0x68, 0xa6, 0x71, 0xe2, 0xd3, 0x97, 0x78, 0x09, 22 0x61, 0x24, 0x24, 0xc7, 0xc3, 0x88, 0x8b, 0xc6, 23 } 24 secPk = "f" + hex.EncodeToString(secPkB) 25 secPkBt = append([]byte{0xe7, 0x01}, secPkB...) 26 secPkt = "f" + hex.EncodeToString(secPkBt) 27 28 // bls12-381 G1 sample public key 29 bls12G1PkB = []byte{ 30 0x17, 0xf1, 0xd3, 0xa7, 0x31, 0x97, 0xd7, 0x94, 31 0x26, 0x95, 0x63, 0x8c, 0x4f, 0xa9, 0xac, 0x0f, 32 0xc3, 0x68, 0x8c, 0x4f, 0x97, 0x74, 0xb9, 0x05, 33 0xa1, 0x4e, 0x3a, 0x3f, 0x17, 0x1b, 0xac, 0x58, 34 0x6c, 0x55, 0xe8, 0x3f, 0xf9, 0x7a, 0x1a, 0xef, 35 0xfb, 0x3a, 0xf0, 0x0a, 0xdb, 0x22, 0xc6, 0xbb, 36 0x08, 0xb3, 0xf4, 0x81, 0xe3, 0xaa, 0xa0, 0xf1, 37 0xa0, 0x9e, 0x30, 0xed, 0x74, 0x1d, 0x8a, 0xe4, 38 0xfc, 0xf5, 0xe0, 0x95, 0xd5, 0xd0, 0x0a, 0xf6, 39 0x00, 0xdb, 0x18, 0xcb, 0x2c, 0x04, 0xb3, 0xed, 40 0xd0, 0x3c, 0xc7, 0x44, 0xa2, 0x88, 0x8a, 0xe4, 41 0x0c, 0xaa, 0x23, 0x29, 0x46, 0xc5, 0xe7, 0xe1, 42 } 43 bls12G1Pk = "f" + hex.EncodeToString(bls12G1PkB) 44 bls12G1PkBt = append([]byte{0xea, 0x01}, bls12G1PkB...) 45 bls12G1Pkt = "f" + hex.EncodeToString(bls12G1PkBt) 46 47 // bls12 381 G2 sample public key 48 bls12G2PkB = []byte{ 49 0x13, 0xe0, 0x2b, 0x60, 0x52, 0x71, 0x9f, 0x60, 50 0x7d, 0xac, 0xd3, 0xa0, 0x88, 0x27, 0x4f, 0x65, 51 0x59, 0x6b, 0xd0, 0xd0, 0x99, 0x20, 0xb6, 0x1a, 52 0xb5, 0xda, 0x61, 0xbb, 0xdc, 0x7f, 0x50, 0x49, 53 0x33, 0x4c, 0xf1, 0x12, 0x13, 0x94, 0x5d, 0x57, 54 0xe5, 0xac, 0x7d, 0x05, 0x5d, 0x04, 0x2b, 0x7e, 55 0x02, 0x4a, 0xa2, 0xb2, 0xf0, 0x8f, 0x0a, 0x91, 56 0x26, 0x08, 0x05, 0x27, 0x2d, 0xc5, 0x10, 0x51, 57 0xc6, 0xe4, 0x7a, 0xd4, 0xfa, 0x40, 0x3b, 0x02, 58 0xb4, 0x51, 0x0b, 0x64, 0x7a, 0xe3, 0xd1, 0x77, 59 0x0b, 0xac, 0x03, 0x26, 0xa8, 0x05, 0xbb, 0xef, 60 0xd4, 0x80, 0x56, 0xc8, 0xc1, 0x21, 0xbd, 0xb8, 61 0x06, 0x06, 0xc4, 0xa0, 0x2e, 0xa7, 0x34, 0xcc, 62 0x32, 0xac, 0xd2, 0xb0, 0x2b, 0xc2, 0x8b, 0x99, 63 0xcb, 0x3e, 0x28, 0x7e, 0x85, 0xa7, 0x63, 0xaf, 64 0x26, 0x74, 0x92, 0xab, 0x57, 0x2e, 0x99, 0xab, 65 0x3f, 0x37, 0x0d, 0x27, 0x5c, 0xec, 0x1d, 0xa1, 66 0xaa, 0xa9, 0x07, 0x5f, 0xf0, 0x5f, 0x79, 0xbe, 67 0x0c, 0xe5, 0xd5, 0x27, 0x72, 0x7d, 0x6e, 0x11, 68 0x8c, 0xc9, 0xcd, 0xc6, 0xda, 0x2e, 0x35, 0x1a, 69 0xad, 0xfd, 0x9b, 0xaa, 0x8c, 0xbd, 0xd3, 0xa7, 70 0x6d, 0x42, 0x9a, 0x69, 0x51, 0x60, 0xd1, 0x2c, 71 0x92, 0x3a, 0xc9, 0xcc, 0x3b, 0xac, 0xa2, 0x89, 72 0xe1, 0x93, 0x54, 0x86, 0x08, 0xb8, 0x28, 0x01, 73 } 74 bls12G2Pk = "f" + hex.EncodeToString(bls12G2PkB) 75 bls12G2PkBt = append([]byte{0xeb, 0x01}, bls12G2PkB...) 76 bls12G2Pkt = "f" + hex.EncodeToString(bls12G2PkBt) 77 ) 78 79 func TestSerialisePublicKey(t *testing.T) { 80 cs := []struct { 81 Description string 82 OutBase string 83 Key string 84 Expected string 85 Error error 86 }{ 87 { 88 "invalid key, with valid key type", 89 "z", 90 "0xe701ff42ea", 91 "", 92 fmt.Errorf("invalid public key format, '[11111111 1000010 11101010]'"), 93 }, 94 { 95 "invalid key type, with invalid key", 96 "z", 97 "0xeeff42ea", 98 "", 99 fmt.Errorf("unsupported public key type '10BFEE'"), 100 }, 101 { 102 "invalid encoding type, with valid key", 103 "p", 104 secPkt, 105 "", 106 fmt.Errorf("selected encoding not supported"), 107 }, 108 { 109 "valid key, no key type defined", 110 "z", 111 secPk, 112 "", 113 fmt.Errorf("unsupported public key type '4'"), 114 }, 115 { 116 "valid key, with base58 bitcoin encoding", 117 "z", 118 secPkt, 119 "zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB", 120 nil, 121 }, 122 { 123 "valid key, with traditional hex encoding", 124 "0x", 125 secPkt, 126 "fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc", 127 nil, 128 }, 129 { 130 "valid secp256k1 key, with multiencoding hex encoding", 131 "f", 132 secPkt, 133 "fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc", 134 nil, 135 }, 136 { 137 "valid bls12-381 g1 key, with multiencoding hex encoding", 138 "f", 139 bls12G1Pkt, 140 "fea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", 141 nil, 142 }, 143 { 144 "valid bls12-381 g1 key, with base58 bitcoin encoding", 145 "z", 146 bls12G1Pkt, 147 "z3tEFUdV4D3tCMG6Fr1deVvt32DCS1Y4SxDGoELedXaMUdTdr5FfZvBnbK9bWMhAGj3RHk", 148 nil, 149 }, 150 { 151 "valid bls12-381 g1 key, with no key type", 152 "f", 153 bls12G1Pk, 154 "", 155 fmt.Errorf("unsupported public key type '17'"), 156 }, 157 { 158 "valid bls12-381 g2 key, with multiencoding hex encoding", 159 "f", 160 bls12G2Pkt, 161 "feb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", 162 nil, 163 }, 164 { 165 "valid bls12-381 g2 key, with base58 bitcoin encoding", 166 "z", 167 bls12G2Pkt, 168 "zUC77n3BqSWuoGMY7ut91NDoWzpithCd4GwPLAnv9fc7drWY4wBTvMX1y9eGSAuiBpktqGAocND2KXdu1HqNgrd6i3vCZKCLqZ3nQFaEA2FpTs7ZEChRpWReLvYyXNYUHvQjyKd", 169 nil, 170 }, 171 { 172 "valid bls12-381 g2 key, with no key type", 173 "f", 174 bls12G2Pk, 175 "", 176 fmt.Errorf("unsupported public key type '13'"), 177 }, 178 } 179 180 for _, c := range cs { 181 cpk, err := SerializePublicKey(c.Key, c.OutBase) 182 183 require.Equal(t, c.Expected, cpk, c.Description) 184 185 if c.Error != nil { 186 require.EqualError(t, err, c.Error.Error(), c.Description) 187 continue 188 } 189 190 require.NoError(t, err, c.Description) 191 } 192 } 193 194 func TestDeserialisePublicKey(t *testing.T) { 195 cs := []struct { 196 Description string 197 Key string 198 OutBase string 199 Expected string 200 Error error 201 }{ 202 { 203 "valid key with valid encoding type '0x'", 204 "0xe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc", 205 "f", 206 secPkt, 207 nil, 208 }, 209 { 210 "valid key with valid encoding type 'f'", 211 "fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc", 212 "f", 213 secPkt, 214 nil, 215 }, 216 { 217 "valid key with valid encoding type 'z'", 218 "zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB", 219 "f", 220 secPkt, 221 nil, 222 }, 223 { 224 "valid key with mismatched encoding type 'f' instead of 'z'", 225 "fQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB", 226 "f", 227 "", 228 fmt.Errorf("encoding/hex: invalid byte: U+0051 'Q'"), 229 }, 230 { 231 "valid key with no encoding type, in base58 encoding", 232 "Q3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB", 233 "f", 234 "", 235 fmt.Errorf("selected encoding not supported"), 236 }, 237 { 238 "valid bls12-381 g1 key encoding type 'z'", 239 "z3tEFUdV4D3tCMG6Fr1deVvt32DCS1Y4SxDGoELedXaMUdTdr5FfZvBnbK9bWMhAGj3RHk", 240 "f", 241 bls12G1Pkt, 242 nil, 243 }, 244 { 245 "valid bls12-381 g1 key encoding type 'f'", 246 "fea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", 247 "f", 248 bls12G1Pkt, 249 nil, 250 }, 251 { 252 "valid bls12-381 g1 key encoding type '0x'", 253 "0xea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", 254 "f", 255 bls12G1Pkt, 256 nil, 257 }, 258 { 259 "valid bls12-381 g2 key encoding type 'z'", 260 "zUC77n3BqSWuoGMY7ut91NDoWzpithCd4GwPLAnv9fc7drWY4wBTvMX1y9eGSAuiBpktqGAocND2KXdu1HqNgrd6i3vCZKCLqZ3nQFaEA2FpTs7ZEChRpWReLvYyXNYUHvQjyKd", 261 "f", 262 bls12G2Pkt, 263 nil, 264 }, 265 { 266 "valid bls12-381 g2 key encoding type 'f'", 267 "feb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", 268 "f", 269 bls12G2Pkt, 270 nil, 271 }, 272 { 273 "valid bls12-381 g2 key encoding type '0x'", 274 "0xeb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", 275 "f", 276 bls12G2Pkt, 277 nil, 278 }, 279 } 280 281 for _, c := range cs { 282 key, err := DeserializePublicKey(c.Key, c.OutBase) 283 284 require.Exactly(t, c.Expected, key, c.Description) 285 286 if c.Error != nil { 287 require.EqualError(t, err, c.Error.Error(), c.Description) 288 continue 289 } 290 291 require.NoError(t, err, c.Description) 292 } 293 } 294 295 func TestSerializeLegacyKey(t *testing.T) { 296 297 key := "0x04deaafa03e3a646e54a36ec3f6968c1d3686847d88420f00c0ab6ee517ee1893398fca28aacd2af74f2654738c21d10bad3d88dc64201ebe0de5cf1e313970d3d" 298 expected := "zQ3shudJrBctPznsRLvbsCtvZFTdi3b34uzYDuqE9Wq9m9T1C" 299 300 res, err := SerializeLegacyKey(key) 301 302 require.NoError(t, err) 303 require.Equal(t, expected, res) 304 305 wrongKey := key[3:] 306 307 _, err = SerializeLegacyKey(wrongKey) 308 309 require.Error(t, err) 310 }