age

Simple, secure encryption with UNIX-style composability.
git clone git://git.sgregoratto.me/age
Log | Files | Refs | README | LICENSE

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 }