File: marshal_test.go

package info (click to toggle)
golang-github-cloudflare-circl 1.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 18,064 kB
  • sloc: asm: 20,492; ansic: 1,292; makefile: 68
file content (84 lines) | stat: -rw-r--r-- 1,994 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package hpke

import (
	"bytes"
	"crypto/rand"
	"testing"
)

func contextEqual(a, b *encdecContext) bool {
	an := make([]byte, a.NonceSize())
	bn := make([]byte, b.NonceSize())
	ac := a.AEAD.Seal(nil, an, nil, nil)
	bc := b.AEAD.Seal(nil, bn, nil, nil)
	return a.suite == b.suite &&
		bytes.Equal(a.exporterSecret, b.exporterSecret) &&
		bytes.Equal(a.key, b.key) &&
		bytes.Equal(a.baseNonce, b.baseNonce) &&
		bytes.Equal(a.sequenceNumber, b.sequenceNumber) &&
		bytes.Equal(ac, bc) &&
		len(a.nonce) == len(b.nonce) &&
		len(a.nonce) == len(a.baseNonce)
}

func TestContextSerialization(t *testing.T) {
	s := NewSuite(KEM_P384_HKDF_SHA384, KDF_HKDF_SHA384, AEAD_AES256GCM)
	info := []byte("some info string")

	pk, sk, err := s.kemID.Scheme().GenerateKeyPair()
	if err != nil {
		t.Fatal(err)
	}
	receiver, err := s.NewReceiver(sk, info)
	if err != nil {
		t.Fatal(err)
	}
	sender, err := s.NewSender(pk, info)
	if err != nil {
		t.Fatal(err)
	}
	enc, sealer, err := sender.Setup(rand.Reader)
	if err != nil {
		t.Fatal(err)
	}
	opener, err := receiver.Setup(enc)
	if err != nil {
		t.Fatal(err)
	}

	rawSealer, err := sealer.MarshalBinary()
	if err != nil {
		t.Fatal(err)
	}
	parsedSealer, err := UnmarshalSealer(rawSealer)
	if err != nil {
		t.Fatal(err)
	}
	if !contextEqual(
		sealer.(*sealContext).encdecContext,
		parsedSealer.(*sealContext).encdecContext) {
		t.Error("parsed sealer does not match original")
	}
	_, err = UnmarshalOpener(rawSealer)
	if err == nil {
		t.Error("parsing a sealer as an opener succeeded; want failure")
	}

	rawOpener, err := opener.MarshalBinary()
	if err != nil {
		t.Fatal(err)
	}
	parsedOpener, err := UnmarshalOpener(rawOpener)
	if err != nil {
		t.Fatal(err)
	}
	if !contextEqual(
		opener.(*openContext).encdecContext,
		parsedOpener.(*openContext).encdecContext) {
		t.Error("parsed opener does not match original")
	}
	_, err = UnmarshalSealer(rawOpener)
	if err == nil {
		t.Error("parsing an opener as a sealer succeeded; want failure")
	}
}