1 // Copyright (c) 2015-2016 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
13 func TestGenerateSharedSecret(t *testing.T) {
14 privKey1, err := NewPrivateKey(S256())
16 t.Errorf("private key generation error: %s", err)
19 privKey2, err := NewPrivateKey(S256())
21 t.Errorf("private key generation error: %s", err)
25 secret1 := GenerateSharedSecret(privKey1, privKey2.PubKey())
26 secret2 := GenerateSharedSecret(privKey2, privKey1.PubKey())
28 if !bytes.Equal(secret1, secret2) {
29 t.Errorf("ECDH failed, secrets mismatch - first: %x, second: %x",
34 // Test 1: Encryption and decryption
35 func TestCipheringBasic(t *testing.T) {
36 privkey, err := NewPrivateKey(S256())
38 t.Fatal("failed to generate private key")
41 in := []byte("Hey there dude. How are you doing? This is a test.")
43 out, err := Encrypt(privkey.PubKey(), in)
45 t.Fatal("failed to encrypt:", err)
48 dec, err := Decrypt(privkey, out)
50 t.Fatal("failed to decrypt:", err)
53 if !bytes.Equal(in, dec) {
54 t.Error("decrypted data doesn't match original")
58 // Test 2: Byte compatibility with Pyelliptic
59 func TestCiphering(t *testing.T) {
60 pb, _ := hex.DecodeString("fe38240982f313ae5afb3e904fb8215fb11af1200592b" +
61 "fca26c96c4738e4bf8f")
62 privkey, _ := PrivKeyFromBytes(S256(), pb)
64 in := []byte("This is just a test.")
65 out, _ := hex.DecodeString("b0d66e5adaa5ed4e2f0ca68e17b8f2fc02ca002009e3" +
66 "3487e7fa4ab505cf34d98f131be7bd258391588ca7804acb30251e71a04e0020ecf" +
67 "df0f84608f8add82d7353af780fbb28868c713b7813eb4d4e61f7b75d7534dd9856" +
68 "9b0ba77cf14348fcff80fee10e11981f1b4be372d93923e9178972f69937ec850ed" +
69 "6c3f11ff572ddd5b2bedf9f9c0b327c54da02a28fcdce1f8369ffec")
71 dec, err := Decrypt(privkey, out)
73 t.Fatal("failed to decrypt:", err)
76 if !bytes.Equal(in, dec) {
77 t.Error("decrypted data doesn't match original")
81 func TestCipheringErrors(t *testing.T) {
82 privkey, err := NewPrivateKey(S256())
84 t.Fatal("failed to generate private key")
88 ciphertext []byte // input ciphertext
90 {bytes.Repeat([]byte{0x00}, 133)}, // errInputTooShort
91 {bytes.Repeat([]byte{0x00}, 134)}, // errUnsupportedCurve
92 {bytes.Repeat([]byte{0x02, 0xCA}, 134)}, // errInvalidXLength
93 {bytes.Repeat([]byte{0x02, 0xCA, 0x00, 0x20}, 134)}, // errInvalidYLength
94 {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x02, 0xCA, 0x00, 0x20, // curve and X length
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x20, // Y length
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Y
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 }}, // invalid pubkey
113 {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x02, 0xCA, 0x00, 0x20, // curve and X length
116 0x11, 0x5C, 0x42, 0xE7, 0x57, 0xB2, 0xEF, 0xB7, // X
117 0x67, 0x1C, 0x57, 0x85, 0x30, 0xEC, 0x19, 0x1A,
118 0x13, 0x59, 0x38, 0x1E, 0x6A, 0x71, 0x12, 0x7A,
119 0x9D, 0x37, 0xC4, 0x86, 0xFD, 0x30, 0xDA, 0xE5,
120 0x00, 0x20, // Y length
121 0x7E, 0x76, 0xDC, 0x58, 0xF6, 0x93, 0xBD, 0x7E, // Y
122 0x70, 0x10, 0x35, 0x8C, 0xE6, 0xB1, 0x65, 0xE4,
123 0x83, 0xA2, 0x92, 0x10, 0x10, 0xDB, 0x67, 0xAC,
124 0x11, 0xB1, 0xB5, 0x1B, 0x65, 0x19, 0x53, 0xD2,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext
126 // padding not aligned to 16 bytes
127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 }}, // errInvalidPadding
133 {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV
134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135 0x02, 0xCA, 0x00, 0x20, // curve and X length
136 0x11, 0x5C, 0x42, 0xE7, 0x57, 0xB2, 0xEF, 0xB7, // X
137 0x67, 0x1C, 0x57, 0x85, 0x30, 0xEC, 0x19, 0x1A,
138 0x13, 0x59, 0x38, 0x1E, 0x6A, 0x71, 0x12, 0x7A,
139 0x9D, 0x37, 0xC4, 0x86, 0xFD, 0x30, 0xDA, 0xE5,
140 0x00, 0x20, // Y length
141 0x7E, 0x76, 0xDC, 0x58, 0xF6, 0x93, 0xBD, 0x7E, // Y
142 0x70, 0x10, 0x35, 0x8C, 0xE6, 0xB1, 0x65, 0xE4,
143 0x83, 0xA2, 0x92, 0x10, 0x10, 0xDB, 0x67, 0xAC,
144 0x11, 0xB1, 0xB5, 0x1B, 0x65, 0x19, 0x53, 0xD2,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC
148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 for i, test := range tests1 {
155 _, err = Decrypt(privkey, test.ciphertext)
157 t.Errorf("Decrypt #%d did not get error", i)
161 // test error from removePKCSPadding
163 in []byte // input data
165 {bytes.Repeat([]byte{0x11}, 17)},
166 {bytes.Repeat([]byte{0x07}, 15)},
168 for i, test := range tests2 {
169 _, err = removePKCSPadding(test.in)
171 t.Errorf("removePKCSPadding #%d did not get error", i)