oficina / home Public

Clone
git clone https://amadan.net/oficina/home

Plain git — no account needed to clone.

Download

Download this file

1package seal
2
3import (
4 "crypto/aes"
5 "crypto/cipher"
6 "crypto/hkdf"
7 "crypto/sha256"
8 "encoding/hex"
9 "testing"
10)
11
12// The fixed keys predate extraction. Verify envelopes through the old reader
13// shape so an adapter namespace change cannot hide behind a round trip.
14func TestPurposeKeyVectors(t *testing.T) {
15 s, err := New(testDEK())
16 if err != nil {
17 t.Fatal(err)
18 }
19 for purpose, want := range map[string]string{
20 "signin.address": "1c677fc03245425f809a5a8ba5fda280f745ee96babd14ac8a75857ec9c7fe00",
21 "team.name": "8cadd5d2a5921541918563b0046844c371de29743a4b9335759da8c345bfc732",
22 "queue.payload": "2d6b4e963b93489c6a9515469f274516e48014d0bdb01831a9ff65086d0cb999",
23 } {
24 key, err := hex.DecodeString(want)
25 if err != nil {
26 t.Fatal(err)
27 }
28 block, err := aes.NewCipher(key)
29 if err != nil {
30 t.Fatal(err)
31 }
32 aead, err := cipher.NewGCM(block)
33 if err != nil {
34 t.Fatal(err)
35 }
36 ct, err := s.Seal(purpose, []byte("saved Home value"))
37 if err != nil {
38 t.Fatal(err)
39 }
40 plaintext, err := aead.Open(nil, ct[:aead.NonceSize()], ct[aead.NonceSize():], nil)
41 if err != nil || string(plaintext) != "saved Home value" {
42 t.Fatal("historical Home key/envelope changed", purpose, err)
43 }
44 oldNonce := make([]byte, aead.NonceSize())
45 oldNonce[0] = 0x42
46 old := aead.Seal(append([]byte(nil), oldNonce...), oldNonce, []byte("old Home value"), nil)
47 plaintext, err = s.Open(purpose, old)
48 if err != nil || string(plaintext) != "old Home value" {
49 t.Fatal("old Home value unreadable", purpose, err)
50 }
51 }
52}
53func TestHomeInfoStringIsDistinct(t *testing.T) {
54 s, err := New(testDEK())
55 if err != nil {
56 t.Fatal(err)
57 }
58 ct, err := s.Seal("cell.input", []byte("Home only"))
59 if err != nil {
60 t.Fatal(err)
61 }
62 key, err := hkdf.Key(sha256.New, testDEK(), nil, "oficina/sheets:cell.input", 32)
63 if err != nil {
64 t.Fatal(err)
65 }
66 block, err := aes.NewCipher(key)
67 if err != nil {
68 t.Fatal(err)
69 }
70 aead, err := cipher.NewGCM(block)
71 if err != nil {
72 t.Fatal(err)
73 }
74 if _, err := aead.Open(nil, ct[:aead.NonceSize()], ct[aead.NonceSize():], nil); err == nil {
75 t.Fatal("Home and Sheets namespaces collided")
76 }
77}
78