mirror of
https://github.com/FiloSottile/age.git
synced 2026-01-06 12:06:20 +00:00
The Type() method was a mistake, as proven by the fact that I can remove it without losing any functionality. It gives special meaning to the "0th argument" of recipient stanzas, when actually it should be left up to Recipient implementations to make their own stanzas recognizable to their Identity counterparts. More importantly, there are totally reasonable Identity (and probably Recipient) implementations that don't know their own stanza type in advance. For example, a proxy plugin. Concretely, it was only used to special-case "scrypt" recipients, and to skip invoking Unwrap. The former can be done based on the returned recipient stanza, and the latter is best avoided entirely: the Identity should start by looking at the stanza and returning ErrIncorrectIdentity if it's of the wrong type. This is a breaking API change. However, we are still in beta, and none of the public downstreams look like they would be affected, as they only use Recipient and Identity implementations from this package, they only use them with the interfaces defined in this package, and they don't directly use the Type() method.
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
// Copyright 2019 Google LLC
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file or at
|
|
// https://developers.google.com/open-source/licenses/bsd
|
|
|
|
package age_test
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"testing"
|
|
|
|
"filippo.io/age"
|
|
"filippo.io/age/internal/format"
|
|
)
|
|
|
|
func TestX25519RoundTrip(t *testing.T) {
|
|
i, err := age.GenerateX25519Identity()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := i.Recipient()
|
|
|
|
if r1, err := age.ParseX25519Recipient(r.String()); err != nil {
|
|
t.Fatal(err)
|
|
} else if r1.String() != r.String() {
|
|
t.Errorf("recipient did not round-trip through parsing: got %q, want %q", r1, r)
|
|
}
|
|
if i1, err := age.ParseX25519Identity(i.String()); err != nil {
|
|
t.Fatal(err)
|
|
} else if i1.String() != i.String() {
|
|
t.Errorf("identity did not round-trip through parsing: got %q, want %q", i1, i)
|
|
}
|
|
|
|
fileKey := make([]byte, 16)
|
|
if _, err := rand.Read(fileKey); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
block, err := r.Wrap(fileKey)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := &bytes.Buffer{}
|
|
(*format.Stanza)(block).Marshal(b)
|
|
t.Logf("%s", b.Bytes())
|
|
|
|
out, err := i.Unwrap(block)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !bytes.Equal(fileKey, out) {
|
|
t.Errorf("invalid output: %x, expected %x", out, fileKey)
|
|
}
|
|
}
|
|
|
|
func TestScryptRoundTrip(t *testing.T) {
|
|
password := "twitch.tv/filosottile"
|
|
|
|
r, err := age.NewScryptRecipient(password)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r.SetWorkFactor(15)
|
|
i, err := age.NewScryptIdentity(password)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
fileKey := make([]byte, 16)
|
|
if _, err := rand.Read(fileKey); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
block, err := r.Wrap(fileKey)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := &bytes.Buffer{}
|
|
(*format.Stanza)(block).Marshal(b)
|
|
t.Logf("%s", b.Bytes())
|
|
|
|
out, err := i.Unwrap(block)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !bytes.Equal(fileKey, out) {
|
|
t.Errorf("invalid output: %x, expected %x", out, fileKey)
|
|
}
|
|
}
|