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  }