recipients_test.go (3635B)
1 // Copyright 2019 Google LLC 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file or at 5 // https://developers.google.com/open-source/licenses/bsd 6 7 package age_test 8 9 import ( 10 "bytes" 11 "crypto/ed25519" 12 "crypto/rand" 13 "crypto/rsa" 14 "testing" 15 16 "github.com/FiloSottile/age/internal/age" 17 "golang.org/x/crypto/curve25519" 18 "golang.org/x/crypto/ssh" 19 ) 20 21 func TestX25519RoundTrip(t *testing.T) { 22 var secretKey, publicKey, fileKey [32]byte 23 if _, err := rand.Read(secretKey[:]); err != nil { 24 t.Fatal(err) 25 } 26 if _, err := rand.Read(fileKey[:]); err != nil { 27 t.Fatal(err) 28 } 29 curve25519.ScalarBaseMult(&publicKey, &secretKey) 30 31 r, err := age.NewX25519Recipient(publicKey[:]) 32 if err != nil { 33 t.Fatal(err) 34 } 35 i, err := age.NewX25519Identity(secretKey[:]) 36 if err != nil { 37 t.Fatal(err) 38 } 39 40 if r.Type() != i.Type() || r.Type() != "X25519" { 41 t.Errorf("invalid Type values: %v, %v", r.Type(), i.Type()) 42 } 43 44 block, err := r.Wrap(fileKey[:]) 45 if err != nil { 46 t.Fatal(err) 47 } 48 t.Logf("%#v", block) 49 50 out, err := i.Unwrap(block) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 if !bytes.Equal(fileKey[:], out) { 56 t.Errorf("invalid output: %x, expected %x", out, fileKey[:]) 57 } 58 } 59 60 func TestScryptRoundTrip(t *testing.T) { 61 password := "twitch.tv/filosottile" 62 63 r, err := age.NewScryptRecipient(password) 64 if err != nil { 65 t.Fatal(err) 66 } 67 r.SetWorkFactor(15) 68 i, err := age.NewScryptIdentity(password) 69 if err != nil { 70 t.Fatal(err) 71 } 72 73 if r.Type() != i.Type() || r.Type() != "scrypt" { 74 t.Errorf("invalid Type values: %v, %v", r.Type(), i.Type()) 75 } 76 77 fileKey := make([]byte, 16) 78 if _, err := rand.Read(fileKey[:]); err != nil { 79 t.Fatal(err) 80 } 81 block, err := r.Wrap(fileKey[:]) 82 if err != nil { 83 t.Fatal(err) 84 } 85 t.Logf("%#v", block) 86 87 out, err := i.Unwrap(block) 88 if err != nil { 89 t.Fatal(err) 90 } 91 92 if !bytes.Equal(fileKey[:], out) { 93 t.Errorf("invalid output: %x, expected %x", out, fileKey[:]) 94 } 95 } 96 97 func TestSSHRSARoundTrip(t *testing.T) { 98 pk, err := rsa.GenerateKey(rand.Reader, 768) 99 if err != nil { 100 t.Fatal(err) 101 } 102 pub, err := ssh.NewPublicKey(&pk.PublicKey) 103 if err != nil { 104 t.Fatal(err) 105 } 106 107 r, err := age.NewSSHRSARecipient(pub) 108 if err != nil { 109 t.Fatal(err) 110 } 111 i, err := age.NewSSHRSAIdentity(pk) 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 if r.Type() != i.Type() || r.Type() != "ssh-rsa" { 117 t.Errorf("invalid Type values: %v, %v", r.Type(), i.Type()) 118 } 119 120 fileKey := make([]byte, 16) 121 if _, err := rand.Read(fileKey[:]); err != nil { 122 t.Fatal(err) 123 } 124 block, err := r.Wrap(fileKey[:]) 125 if err != nil { 126 t.Fatal(err) 127 } 128 t.Logf("%#v", block) 129 130 out, err := i.Unwrap(block) 131 if err != nil { 132 t.Fatal(err) 133 } 134 135 if !bytes.Equal(fileKey[:], out) { 136 t.Errorf("invalid output: %x, expected %x", out, fileKey[:]) 137 } 138 } 139 140 func TestSSHEd25519RoundTrip(t *testing.T) { 141 pub, priv, err := ed25519.GenerateKey(rand.Reader) 142 if err != nil { 143 t.Fatal(err) 144 } 145 sshPubKey, err := ssh.NewPublicKey(pub) 146 if err != nil { 147 t.Fatal(err) 148 } 149 150 r, err := age.NewSSHEd25519Recipient(sshPubKey) 151 if err != nil { 152 t.Fatal(err) 153 } 154 i, err := age.NewSSHEd25519Identity(priv) 155 if err != nil { 156 t.Fatal(err) 157 } 158 159 if r.Type() != i.Type() || r.Type() != "ssh-ed25519" { 160 t.Errorf("invalid Type values: %v, %v", r.Type(), i.Type()) 161 } 162 163 fileKey := make([]byte, 16) 164 if _, err := rand.Read(fileKey[:]); err != nil { 165 t.Fatal(err) 166 } 167 block, err := r.Wrap(fileKey[:]) 168 if err != nil { 169 t.Fatal(err) 170 } 171 t.Logf("%#v", block) 172 173 out, err := i.Unwrap(block) 174 if err != nil { 175 t.Fatal(err) 176 } 177 178 if !bytes.Equal(fileKey[:], out) { 179 t.Errorf("invalid output: %x, expected %x", out, fileKey[:]) 180 } 181 }