key_test.go

 1package identity
 2
 3import (
 4	"crypto/rsa"
 5	"encoding/json"
 6	"testing"
 7	"time"
 8
 9	"github.com/stretchr/testify/require"
10
11	"github.com/git-bug/git-bug/repository"
12)
13
14
15
16func TestPublicKeyJSON(t *testing.T) {
17	id := &mockIdentity{name: "John Smith", email: "jsmith@example.com"}
18	k := generatePublicKey(id)
19
20	dataJSON, err := json.Marshal(k)
21	require.NoError(t, err)
22
23	var read Key
24	err = json.Unmarshal(dataJSON, &read)
25	require.NoError(t, err)
26
27	// Compare public keys since entities may differ in internal structure after deserialization
28	require.Equal(t, k.public.Fingerprint[:], read.public.Fingerprint[:])
29}
30
31func TestStoreLoad(t *testing.T) {
32	repo := repository.NewMockRepoKeyring()
33
34	// public + private
35	id := &mockIdentity{name: "John Smith", email: "jsmith@example.com"}
36	k := GenerateKey(id, WithTime(time.Time{}))
37
38	// Store
39
40	dataJSON, err := json.Marshal(k)
41	require.NoError(t, err)
42
43	err = k.storePrivate(repo)
44	require.NoError(t, err)
45
46	// Load
47
48	var read Key
49	err = json.Unmarshal(dataJSON, &read)
50	require.NoError(t, err)
51
52	err = read.ensurePrivateKey(repo)
53	require.NoError(t, err)
54
55	require.Equal(t, k.public, read.public)
56
57	require.IsType(t, (*rsa.PrivateKey)(nil), k.entity.PrivateKey.PrivateKey)
58
59	// See https://github.com/golang/crypto/pull/175
60	rsaPriv := read.entity.PrivateKey.PrivateKey.(*rsa.PrivateKey)
61	rsaPriv.Primes[0], rsaPriv.Primes[1] = rsaPriv.Primes[1], rsaPriv.Primes[0]
62
63	require.True(t, k.entity.PrivateKey.PrivateKey.(*rsa.PrivateKey).Equal(read.entity.PrivateKey.PrivateKey))
64}