294 lines
8.1 KiB
Go
294 lines
8.1 KiB
Go
|
package multiformat
|
||
|
|
||
|
import (
|
||
|
"encoding/hex"
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// secp256k1 sample public key
|
||
|
secPkB = []byte{
|
||
|
0x04,
|
||
|
0x26, 0x1c, 0x55, 0x67, 0x5e, 0x55, 0xff, 0x25,
|
||
|
0xed, 0xb5, 0x0b, 0x34, 0x5c, 0xfb, 0x3a, 0x3f,
|
||
|
0x35, 0xf6, 0x07, 0x12, 0xd2, 0x51, 0xcb, 0xaa,
|
||
|
0xab, 0x97, 0xbd, 0x50, 0x05, 0x4c, 0x6e, 0xbc,
|
||
|
0x3c, 0xd4, 0xe2, 0x22, 0x00, 0xc6, 0x8d, 0xaf,
|
||
|
0x74, 0x93, 0xe1, 0xf8, 0xda, 0x6a, 0x19, 0x0a,
|
||
|
0x68, 0xa6, 0x71, 0xe2, 0xd3, 0x97, 0x78, 0x09,
|
||
|
0x61, 0x24, 0x24, 0xc7, 0xc3, 0x88, 0x8b, 0xc6,
|
||
|
}
|
||
|
secPk = "f" + hex.EncodeToString(secPkB)
|
||
|
secPkBt = append([]byte{0xe7, 0x01}, secPkB...)
|
||
|
secPkt = "f" + hex.EncodeToString(secPkBt)
|
||
|
|
||
|
// bls12-381 G1 sample public key
|
||
|
bls12G1PkB = []byte{
|
||
|
0x17, 0xf1, 0xd3, 0xa7, 0x31, 0x97, 0xd7, 0x94,
|
||
|
0x26, 0x95, 0x63, 0x8c, 0x4f, 0xa9, 0xac, 0x0f,
|
||
|
0xc3, 0x68, 0x8c, 0x4f, 0x97, 0x74, 0xb9, 0x05,
|
||
|
0xa1, 0x4e, 0x3a, 0x3f, 0x17, 0x1b, 0xac, 0x58,
|
||
|
0x6c, 0x55, 0xe8, 0x3f, 0xf9, 0x7a, 0x1a, 0xef,
|
||
|
0xfb, 0x3a, 0xf0, 0x0a, 0xdb, 0x22, 0xc6, 0xbb,
|
||
|
0x08, 0xb3, 0xf4, 0x81, 0xe3, 0xaa, 0xa0, 0xf1,
|
||
|
0xa0, 0x9e, 0x30, 0xed, 0x74, 0x1d, 0x8a, 0xe4,
|
||
|
0xfc, 0xf5, 0xe0, 0x95, 0xd5, 0xd0, 0x0a, 0xf6,
|
||
|
0x00, 0xdb, 0x18, 0xcb, 0x2c, 0x04, 0xb3, 0xed,
|
||
|
0xd0, 0x3c, 0xc7, 0x44, 0xa2, 0x88, 0x8a, 0xe4,
|
||
|
0x0c, 0xaa, 0x23, 0x29, 0x46, 0xc5, 0xe7, 0xe1,
|
||
|
}
|
||
|
bls12G1Pk = "f" + hex.EncodeToString(bls12G1PkB)
|
||
|
bls12G1PkBt = append([]byte{0xea, 0x01}, bls12G1PkB...)
|
||
|
bls12G1Pkt = "f" + hex.EncodeToString(bls12G1PkBt)
|
||
|
|
||
|
// bls12 381 G2 sample public key
|
||
|
bls12G2PkB = []byte{
|
||
|
0x13, 0xe0, 0x2b, 0x60, 0x52, 0x71, 0x9f, 0x60,
|
||
|
0x7d, 0xac, 0xd3, 0xa0, 0x88, 0x27, 0x4f, 0x65,
|
||
|
0x59, 0x6b, 0xd0, 0xd0, 0x99, 0x20, 0xb6, 0x1a,
|
||
|
0xb5, 0xda, 0x61, 0xbb, 0xdc, 0x7f, 0x50, 0x49,
|
||
|
0x33, 0x4c, 0xf1, 0x12, 0x13, 0x94, 0x5d, 0x57,
|
||
|
0xe5, 0xac, 0x7d, 0x05, 0x5d, 0x04, 0x2b, 0x7e,
|
||
|
0x02, 0x4a, 0xa2, 0xb2, 0xf0, 0x8f, 0x0a, 0x91,
|
||
|
0x26, 0x08, 0x05, 0x27, 0x2d, 0xc5, 0x10, 0x51,
|
||
|
0xc6, 0xe4, 0x7a, 0xd4, 0xfa, 0x40, 0x3b, 0x02,
|
||
|
0xb4, 0x51, 0x0b, 0x64, 0x7a, 0xe3, 0xd1, 0x77,
|
||
|
0x0b, 0xac, 0x03, 0x26, 0xa8, 0x05, 0xbb, 0xef,
|
||
|
0xd4, 0x80, 0x56, 0xc8, 0xc1, 0x21, 0xbd, 0xb8,
|
||
|
0x06, 0x06, 0xc4, 0xa0, 0x2e, 0xa7, 0x34, 0xcc,
|
||
|
0x32, 0xac, 0xd2, 0xb0, 0x2b, 0xc2, 0x8b, 0x99,
|
||
|
0xcb, 0x3e, 0x28, 0x7e, 0x85, 0xa7, 0x63, 0xaf,
|
||
|
0x26, 0x74, 0x92, 0xab, 0x57, 0x2e, 0x99, 0xab,
|
||
|
0x3f, 0x37, 0x0d, 0x27, 0x5c, 0xec, 0x1d, 0xa1,
|
||
|
0xaa, 0xa9, 0x07, 0x5f, 0xf0, 0x5f, 0x79, 0xbe,
|
||
|
0x0c, 0xe5, 0xd5, 0x27, 0x72, 0x7d, 0x6e, 0x11,
|
||
|
0x8c, 0xc9, 0xcd, 0xc6, 0xda, 0x2e, 0x35, 0x1a,
|
||
|
0xad, 0xfd, 0x9b, 0xaa, 0x8c, 0xbd, 0xd3, 0xa7,
|
||
|
0x6d, 0x42, 0x9a, 0x69, 0x51, 0x60, 0xd1, 0x2c,
|
||
|
0x92, 0x3a, 0xc9, 0xcc, 0x3b, 0xac, 0xa2, 0x89,
|
||
|
0xe1, 0x93, 0x54, 0x86, 0x08, 0xb8, 0x28, 0x01,
|
||
|
}
|
||
|
bls12G2Pk = "f" + hex.EncodeToString(bls12G2PkB)
|
||
|
bls12G2PkBt = append([]byte{0xeb, 0x01}, bls12G2PkB...)
|
||
|
bls12G2Pkt = "f" + hex.EncodeToString(bls12G2PkBt)
|
||
|
)
|
||
|
|
||
|
func TestSerialisePublicKey(t *testing.T) {
|
||
|
cs := []struct {
|
||
|
Description string
|
||
|
OutBase string
|
||
|
Key string
|
||
|
Expected string
|
||
|
Error error
|
||
|
}{
|
||
|
{
|
||
|
"invalid key, with valid key type",
|
||
|
"z",
|
||
|
"0xe701ff42ea",
|
||
|
"",
|
||
|
fmt.Errorf("invalid public key format, '[11111111 1000010 11101010]'"),
|
||
|
},
|
||
|
{
|
||
|
"invalid key type, with invalid key",
|
||
|
"z",
|
||
|
"0xeeff42ea",
|
||
|
"",
|
||
|
fmt.Errorf("unsupported public key type '10BFEE'"),
|
||
|
},
|
||
|
{
|
||
|
"invalid encoding type, with valid key",
|
||
|
"p",
|
||
|
secPkt,
|
||
|
"",
|
||
|
fmt.Errorf("selected encoding not supported"),
|
||
|
},
|
||
|
{
|
||
|
"valid key, no key type defined",
|
||
|
"z",
|
||
|
secPk,
|
||
|
"",
|
||
|
fmt.Errorf("unsupported public key type '4'"),
|
||
|
},
|
||
|
{
|
||
|
"valid key, with base58 bitcoin encoding",
|
||
|
"z",
|
||
|
secPkt,
|
||
|
"zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid key, with traditional hex encoding",
|
||
|
"0x",
|
||
|
secPkt,
|
||
|
"fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid secp256k1 key, with multiencoding hex encoding",
|
||
|
"f",
|
||
|
secPkt,
|
||
|
"fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key, with multiencoding hex encoding",
|
||
|
"f",
|
||
|
bls12G1Pkt,
|
||
|
"fea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key, with base58 bitcoin encoding",
|
||
|
"z",
|
||
|
bls12G1Pkt,
|
||
|
"z3tEFUdV4D3tCMG6Fr1deVvt32DCS1Y4SxDGoELedXaMUdTdr5FfZvBnbK9bWMhAGj3RHk",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key, with no key type",
|
||
|
"f",
|
||
|
bls12G1Pk,
|
||
|
"",
|
||
|
fmt.Errorf("unsupported public key type '17'"),
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key, with multiencoding hex encoding",
|
||
|
"f",
|
||
|
bls12G2Pkt,
|
||
|
"feb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key, with base58 bitcoin encoding",
|
||
|
"z",
|
||
|
bls12G2Pkt,
|
||
|
"zUC77n3BqSWuoGMY7ut91NDoWzpithCd4GwPLAnv9fc7drWY4wBTvMX1y9eGSAuiBpktqGAocND2KXdu1HqNgrd6i3vCZKCLqZ3nQFaEA2FpTs7ZEChRpWReLvYyXNYUHvQjyKd",
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key, with no key type",
|
||
|
"f",
|
||
|
bls12G2Pk,
|
||
|
"",
|
||
|
fmt.Errorf("unsupported public key type '13'"),
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, c := range cs {
|
||
|
cpk, err := SerializePublicKey(c.Key, c.OutBase)
|
||
|
|
||
|
require.Equal(t, c.Expected, cpk, c.Description)
|
||
|
|
||
|
if c.Error != nil {
|
||
|
require.EqualError(t, err, c.Error.Error(), c.Description)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
require.NoError(t, err, c.Description)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDeserialisePublicKey(t *testing.T) {
|
||
|
cs := []struct {
|
||
|
Description string
|
||
|
Key string
|
||
|
OutBase string
|
||
|
Expected string
|
||
|
Error error
|
||
|
}{
|
||
|
{
|
||
|
"valid key with valid encoding type '0x'",
|
||
|
"0xe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc",
|
||
|
"f",
|
||
|
secPkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid key with valid encoding type 'f'",
|
||
|
"fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc",
|
||
|
"f",
|
||
|
secPkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid key with valid encoding type 'z'",
|
||
|
"zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB",
|
||
|
"f",
|
||
|
secPkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid key with mismatched encoding type 'f' instead of 'z'",
|
||
|
"fQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB",
|
||
|
"f",
|
||
|
"",
|
||
|
fmt.Errorf("encoding/hex: invalid byte: U+0051 'Q'"),
|
||
|
},
|
||
|
{
|
||
|
"valid key with no encoding type, in base58 encoding",
|
||
|
"Q3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB",
|
||
|
"f",
|
||
|
"",
|
||
|
fmt.Errorf("selected encoding not supported"),
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key encoding type 'z'",
|
||
|
"z3tEFUdV4D3tCMG6Fr1deVvt32DCS1Y4SxDGoELedXaMUdTdr5FfZvBnbK9bWMhAGj3RHk",
|
||
|
"f",
|
||
|
bls12G1Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key encoding type 'f'",
|
||
|
"fea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb",
|
||
|
"f",
|
||
|
bls12G1Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g1 key encoding type '0x'",
|
||
|
"0xea0197f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb",
|
||
|
"f",
|
||
|
bls12G1Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key encoding type 'z'",
|
||
|
"zUC77n3BqSWuoGMY7ut91NDoWzpithCd4GwPLAnv9fc7drWY4wBTvMX1y9eGSAuiBpktqGAocND2KXdu1HqNgrd6i3vCZKCLqZ3nQFaEA2FpTs7ZEChRpWReLvYyXNYUHvQjyKd",
|
||
|
"f",
|
||
|
bls12G2Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key encoding type 'f'",
|
||
|
"feb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8",
|
||
|
"f",
|
||
|
bls12G2Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
{
|
||
|
"valid bls12-381 g2 key encoding type '0x'",
|
||
|
"0xeb0193e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8",
|
||
|
"f",
|
||
|
bls12G2Pkt,
|
||
|
nil,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, c := range cs {
|
||
|
key, err := DeserializePublicKey(c.Key, c.OutBase)
|
||
|
|
||
|
require.Exactly(t, c.Expected, key, c.Description)
|
||
|
|
||
|
if c.Error != nil {
|
||
|
require.EqualError(t, err, c.Error.Error(), c.Description)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
require.NoError(t, err, c.Description)
|
||
|
}
|
||
|
}
|