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