github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/merkle/encoder_test.go (about)

     1  package merkle
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/keybase/client/go/protocol/keybase1"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func dummy(i int) []byte {
    12  	return bytes.Repeat([]byte{byte(i)}, 32)
    13  }
    14  func dummy16(i int) (ret [16]byte) {
    15  	x := dummy(i)
    16  	copy(ret[:], x)
    17  	return ret
    18  }
    19  func dummy32(i int) (ret [32]byte) {
    20  	x := dummy(i)
    21  	copy(ret[:], x)
    22  	return ret
    23  }
    24  
    25  func TestEncode(t *testing.T) {
    26  	var tests = []struct {
    27  		desc            string
    28  		encodingType    EncodingType
    29  		leaf            Leaf
    30  		key             []byte
    31  		secret          []byte
    32  		expectedBlinder []byte
    33  	}{
    34  		{
    35  			desc:         "basic",
    36  			encodingType: EncodingTypeBlindedSHA512_256v1,
    37  			leaf: Teamv1Leaf{
    38  				TeamID: dummy16(0),
    39  				Tails: map[keybase1.SeqType]Teamv1HiddenTail{
    40  					0: {
    41  						SigID:  dummy(1),
    42  						LinkID: dummy32(2),
    43  						Seqno:  123,
    44  					},
    45  				},
    46  			},
    47  			key:    dummy(3),
    48  			secret: dummy(4),
    49  			expectedBlinder: []byte{0xed, 0x81, 0x7b, 0x7a, 0x7, 0xec, 0x6,
    50  				0x5f, 0x1a, 0x93, 0x4c, 0xf8, 0x6f, 0x9f, 0xf9, 0x53, 0xdd, 0xff,
    51  				0x3, 0x26, 0x63, 0xcd, 0x15, 0xf2, 0x9e, 0x2e, 0x55, 0x3e, 0x25,
    52  				0x67, 0x22, 0xd6},
    53  		},
    54  		{
    55  			desc:         "ensure different secret produces different blinder with same leaf",
    56  			encodingType: EncodingTypeBlindedSHA512_256v1,
    57  			leaf: Teamv1Leaf{
    58  				Tails: map[keybase1.SeqType]Teamv1HiddenTail{
    59  					0: {
    60  						SigID:  dummy(1),
    61  						LinkID: dummy32(2),
    62  						Seqno:  123,
    63  					},
    64  				},
    65  			},
    66  			key:    dummy(3),
    67  			secret: dummy(5),
    68  			expectedBlinder: []byte{0xca, 0xb7, 0xd3, 0x13, 0x3f, 0xb0, 0xb8,
    69  				0x24, 0x8e, 0xe6, 0xad, 0x70, 0xa9, 0x1c, 0x4, 0x62, 0x8f, 0x11,
    70  				0x35, 0x85, 0x6a, 0xea, 0x1f, 0x7c, 0x41, 0xb3, 0x33, 0xbd, 0x8b,
    71  				0x9b, 0xa8, 0xf8},
    72  		},
    73  		{
    74  			desc:         "ensure different leaf produces different blinder with same secret",
    75  			encodingType: EncodingTypeBlindedSHA512_256v1,
    76  			leaf: Teamv1Leaf{
    77  				TeamID: dummy16(0),
    78  				Tails: map[keybase1.SeqType]Teamv1HiddenTail{
    79  					0: {
    80  						SigID:  dummy(1),
    81  						LinkID: dummy32(3),
    82  						Seqno:  123,
    83  					},
    84  				},
    85  			},
    86  			key:    dummy(3),
    87  			secret: dummy(4),
    88  			expectedBlinder: []byte{0x8c, 0x9b, 0x7e, 0xdf, 0xc4, 0x3d, 0xdd,
    89  				0xa8, 0xcf, 0xb2, 0x20, 0xe0, 0x11, 0x7c, 0x6a, 0x65, 0x59, 0x38,
    90  				0x18, 0x43, 0x8a, 0x2e, 0x16, 0xc1, 0xbc, 0xa9, 0xa, 0xac, 0xd2,
    91  				0xdb, 0xd5, 0x58},
    92  		},
    93  	}
    94  	for _, tt := range tests {
    95  		e := NewEncoder(tt.encodingType)
    96  		t.Run(tt.desc, func(t *testing.T) {
    97  			blinder, err := e.Encode(tt.leaf, NewKey(tt.key), NewSecret(tt.secret))
    98  			require.NoError(t, err)
    99  			require.Equal(t, tt.expectedBlinder, blinder)
   100  
   101  			preimage, err := e.BlindedPreimage(tt.leaf, NewKey(tt.key), NewSecret(tt.secret))
   102  			require.NoError(t, err)
   103  			blinder2, err := e.Hash(preimage)
   104  			require.NoError(t, err)
   105  			require.Equal(t, blinder, blinder2, "got same blinder via validation route")
   106  		})
   107  	}
   108  
   109  }
   110  
   111  func TestGenerateSecret(t *testing.T) {
   112  	e := NewEncoder(EncodingTypeBlindedSHA512_256v1)
   113  	x, err := e.GenerateSecret()
   114  	require.NoError(t, err)
   115  	y, err := e.GenerateSecret()
   116  	require.NoError(t, err)
   117  
   118  	require.NotEqual(t, x, y)
   119  }