1// Copyright 2017 Keybase Inc. All rights reserved.
2// Use of this source code is governed by a BSD
3// license that can be found in the LICENSE file.
4
5package libkb
6
7import (
8	"encoding/hex"
9	"fmt"
10	"testing"
11
12	"github.com/stretchr/testify/require"
13)
14
15func testPseudonymName(name, idStr string, keyGen KeyGen,
16	keyStr, expectedPseudonymStr string) string {
17	return fmt.Sprintf("%s,%s,%d,%s,%s", name, idStr, keyGen, keyStr, expectedPseudonymStr)
18}
19
20func testMakePseudonym(t *testing.T, name, idStr string, keyGen KeyGen,
21	keyStr, expectedPseudonymStr string) {
22	idBytes, err := hex.DecodeString(idStr)
23	require.NoError(t, err)
24	var id tlfID
25	require.Equal(t, 16, copy(id[:], idBytes))
26
27	keyBytes, err := hex.DecodeString(keyStr)
28	require.NoError(t, err)
29	require.Equal(t, 32, len(keyBytes))
30	var key [32]byte
31	copy(key[:], keyBytes)
32
33	pseudonym, err := MakePseudonym(TlfPseudonymInfo{
34		Name:    name,
35		ID:      id,
36		KeyGen:  keyGen,
37		HmacKey: key,
38	})
39	require.NoError(t, err)
40	pseudonymStr := hex.EncodeToString(pseudonym[:])
41	require.Equal(t, expectedPseudonymStr, pseudonymStr)
42}
43
44func TestMakePseudonym(t *testing.T) {
45	names := []string{"/keybase/private/a1", "/keybase/private/zz"}
46	idStrs := []string{
47		"b070f968fdc9d1c8827d7e4953659416",
48		"0d399cb03bd1b59a07f92fffaaffa516",
49	}
50	keyGens := []KeyGen{1, 50}
51	keyStrs := []string{
52		"9d13584d962bf1acebd1ccee109c8bb5d4a014e77f125302455477c53307cc14",
53		"ca7014befa7470d87129841c0f41c5b6ed548b9a6431d205b4ff44556bd51a42",
54	}
55
56	expectedPseudonymStrs := []string{
57		"dcec9bccde1b859cb355a9264bca56b91f07e7c831710ca945a0f7fe7b7e1191",
58		"66b38986a207c00b5f6b835af0ae8403f8bd07f7ef520dbbd4addf53d2b58edb",
59		"3d3cbb61788f87bfbc9d1d6c528600eccf4bbde4c3925b3f05a7692e54fd74ff",
60		"94c8152fb780041bbbb62df29a47f2579392927af73fa2dcfbccaac8718cce75",
61		"085075dc9ef14821e61c8e669286ad5031faa2ebf1b6e2b63d4f2d74fc7bb861",
62		"eeca52e9fe0b4699fe2f2baa834603ed5badc769bf99dd1f33d2863796d50142",
63		"42dcd4ce7eb97d6bea874bb2af2c7b3f5414c131decfd7e47213524dfd0c90a3",
64		"ebd2ff9eba99a09a5723f1dfab563596eef05213ab1af5f10d40ff102c4f0d69",
65		"d0e0031b1dc21fbb03312f26e6e8b4c1e5b5bed0a7b8902bffdbe467af7ee81c",
66		"2ddf845eebd66816f8f07aaf23901aa7a3ebb60b3be340573f2b05e8246d096d",
67		"4240789d970b301d3ede262f6f81f97efe42296ac83145d5c6de340188f73b2d",
68		"51786cb8605a4be7373363ed1a7a98b54df8c49e31397294996bf37de57f2f40",
69		"9046fac921597b06332a2655647f22eb7955b34a21a6d97e8e3a74e92ad9f149",
70		"529085af3111d1a64186e01f3a8b2607586060116b3db092e79b943a133ebb32",
71		"700cebb5f5e4360f12d97028e7ac96582a0f733aa54db23f9a19740efbf8d626",
72		"7531de864cbc313817c0107cfadaaddf01350f1b1cd8f1e497358166048b1a64",
73	}
74
75	i := 0
76	for _, name := range names {
77		for _, idStr := range idStrs {
78			for _, keyGen := range keyGens {
79				for _, keyStr := range keyStrs {
80					epStr := expectedPseudonymStrs[i]
81					t.Run(testPseudonymName(name, idStr, keyGen, keyStr, epStr),
82						func(t *testing.T) {
83							testMakePseudonym(t, name, idStr, keyGen, keyStr, epStr)
84						})
85					i++
86				}
87			}
88		}
89	}
90}
91