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}