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}