aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--types/namespace.go12
-rw-r--r--types/namespace_test.go38
2 files changed, 50 insertions, 0 deletions
diff --git a/types/namespace.go b/types/namespace.go
index 8a2ad17..f221960 100644
--- a/types/namespace.go
+++ b/types/namespace.go
@@ -14,6 +14,8 @@ type NamespaceFormat tls.Enum
const (
NamespaceFormatReserved NamespaceFormat = 0
NamespaceFormatEd25519V1 NamespaceFormat = 1
+
+ NamespaceFingerprintSize = 32
)
// Namespace references a versioned namespace based on a given format specifier
@@ -50,6 +52,16 @@ func (n Namespace) String() string {
}
}
+// Fingerprint returns a fixed-size namespace fingerprint that is unique.
+func (n *Namespace) Fingerprint() (*[NamespaceFingerprintSize]byte, error) {
+ switch n.Format {
+ case NamespaceFormatEd25519V1:
+ return &n.Ed25519V1.Namespace, nil
+ default:
+ return nil, fmt.Errorf("unsupported NamespaceFormat: %v", n.Format)
+ }
+}
+
// NewNamespaceEd25519V1 returns an new Ed25519V1 namespace based on a
// verification key.
func NewNamespaceEd25519V1(vk []byte) (*Namespace, error) {
diff --git a/types/namespace_test.go b/types/namespace_test.go
index da18b13..e7e89ad 100644
--- a/types/namespace_test.go
+++ b/types/namespace_test.go
@@ -97,6 +97,44 @@ func TestNamespaceString(t *testing.T) {
}
}
+func TestFingerprint(t *testing.T) {
+ for _, table := range []struct {
+ description string
+ namespace *Namespace
+ wantErr bool
+ wantFpr [NamespaceFingerprintSize]byte
+ }{
+ {
+ description: "invalid: no fingerprint for type",
+ namespace: &Namespace{
+ Format: NamespaceFormatReserved,
+ },
+ wantErr: true,
+ },
+ {
+ description: "valid: ed25519_v1",
+ namespace: mustInitNamespaceEd25519V1(t, 0xaf),
+ wantFpr: func() (ret [NamespaceFingerprintSize]byte) {
+ for i, _ := range ret {
+ ret[i] = 0xaf
+ }
+ return
+ }(),
+ },
+ } {
+ fpr, err := table.namespace.Fingerprint()
+ if got, want := err != nil, table.wantErr; got != want {
+ t.Errorf("got error %v but wanted %v in test %q: %v", got, want, table.description, err)
+ }
+ if err != nil {
+ continue
+ }
+ if got, want := *fpr, table.wantFpr; !bytes.Equal(got[:], want[:]) {
+ t.Errorf("got fpr %v but wanted %v in test %q", got, want, table.description)
+ }
+ }
+}
+
func TestVerify(t *testing.T) {
var tests []testCaseNamespace
tests = append(tests, test_cases_verify(t)...)