diff options
| -rw-r--r-- | types/namespace.go | 12 | ||||
| -rw-r--r-- | types/namespace_test.go | 38 | 
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)...) | 
