From 97cbe32c3240269ae62936f30976c9be9cc3bfbf Mon Sep 17 00:00:00 2001 From: Moreno Ambrosin Date: Thu, 29 Aug 2024 05:25:42 -0700 Subject: [PATCH] Move the AES-GCM key manager into `aesgcm` This is a safe change because key managers aren't exported from `aead`. The key manager is registered by `aesgcm.init()`; `aesgcm` is "force-included" by `aead` to make sure key managers get registered. PiperOrigin-RevId: 668897500 Change-Id: Ifc11160a162ba81c0af8e1f0678fa1da6507c035 --- aead/BUILD.bazel | 3 +- aead/aead.go | 8 +- aead/aead_key_templates.go | 4 + aead/aesgcm/BUILD.bazel | 28 ++- aead/aesgcm/aesgcm.go | 179 +--------------- aead/aesgcm/key.go | 194 ++++++++++++++++++ .../key_manager.go} | 62 +++--- .../key_manager_test.go} | 2 +- aead/aesgcm/{aesgcm_test.go => key_test.go} | 0 9 files changed, 264 insertions(+), 216 deletions(-) create mode 100644 aead/aesgcm/key.go rename aead/{aes_gcm_key_manager.go => aesgcm/key_manager.go} (68%) rename aead/{aes_gcm_key_manager_test.go => aesgcm/key_manager_test.go} (99%) rename aead/aesgcm/{aesgcm_test.go => key_test.go} (100%) diff --git a/aead/BUILD.bazel b/aead/BUILD.bazel index c8502ad..ccccc42 100644 --- a/aead/BUILD.bazel +++ b/aead/BUILD.bazel @@ -11,7 +11,6 @@ go_library( "aead_factory.go", "aead_key_templates.go", "aes_ctr_hmac_aead_key_manager.go", - "aes_gcm_key_manager.go", "aes_gcm_siv_key_manager.go", "chacha20poly1305_key_manager.go", "kms_envelope_aead.go", @@ -21,6 +20,7 @@ go_library( importpath = "github.com/tink-crypto/tink-go/v2/aead", visibility = ["//visibility:public"], deps = [ + "//aead/aesgcm", "//aead/subtle", "//core/cryptofmt", "//core/primitiveset", @@ -57,7 +57,6 @@ go_test( "aead_key_templates_test.go", "aead_test.go", "aes_ctr_hmac_aead_key_manager_test.go", - "aes_gcm_key_manager_test.go", "aes_gcm_siv_key_manager_test.go", "chacha20poly1305_key_manager_test.go", "kms_envelope_aead_example_test.go", diff --git a/aead/aead.go b/aead/aead.go index b3dafd1..4fe9484 100644 --- a/aead/aead.go +++ b/aead/aead.go @@ -20,6 +20,7 @@ package aead import ( "fmt" + _ "github.com/tink-crypto/tink-go/v2/aead/aesgcm" // To register the AES-GCM key manager. "github.com/tink-crypto/tink-go/v2/core/registry" "github.com/tink-crypto/tink-go/v2/internal/internalregistry" ) @@ -29,13 +30,6 @@ func init() { panic(fmt.Sprintf("aead.init() failed: %v", err)) } - if err := registry.RegisterKeyManager(new(aesGCMKeyManager)); err != nil { - panic(fmt.Sprintf("aead.init() failed: %v", err)) - } - if err := internalregistry.AllowKeyDerivation(aesGCMTypeURL); err != nil { - panic(fmt.Sprintf("aead.init() failed: %v", err)) - } - if err := registry.RegisterKeyManager(new(chaCha20Poly1305KeyManager)); err != nil { panic(fmt.Sprintf("aead.init() failed: %v", err)) } diff --git a/aead/aead_key_templates.go b/aead/aead_key_templates.go index 0bda4ed..6ef525d 100644 --- a/aead/aead_key_templates.go +++ b/aead/aead_key_templates.go @@ -29,6 +29,10 @@ import ( tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto" ) +const ( + aesGCMTypeURL = "type.googleapis.com/google.crypto.tink.AesGcmKey" +) + // This file contains pre-generated KeyTemplates for AEAD keys. One can use these templates // to generate new Keysets. diff --git a/aead/aesgcm/BUILD.bazel b/aead/aesgcm/BUILD.bazel index ffce5e1..3d1d39c 100644 --- a/aead/aesgcm/BUILD.bazel +++ b/aead/aesgcm/BUILD.bazel @@ -2,13 +2,25 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "aesgcm", - srcs = ["aesgcm.go"], + srcs = [ + "aesgcm.go", + "key.go", + "key_manager.go", + ], importpath = "github.com/tink-crypto/tink-go/v2/aead/aesgcm", visibility = ["//visibility:public"], deps = [ + "//aead/subtle", + "//core/registry", + "//internal/internalregistry", "//internal/outputprefix", "//key", + "//keyset", + "//proto/aes_gcm_go_proto", + "//proto/tink_go_proto", "//secretdata", + "//subtle/random", + "@org_golang_google_protobuf//proto", ], ) @@ -20,11 +32,23 @@ alias( go_test( name = "aesgcm_test", - srcs = ["aesgcm_test.go"], + srcs = [ + "key_manager_test.go", + "key_test.go", + ], deps = [ ":aesgcm", + "//aead/subtle", "//core/cryptofmt", + "//core/registry", "//insecuresecretdataaccess", + "//internal/internalregistry", + "//proto/aes_gcm_go_proto", + "//proto/tink_go_proto", "//secretdata", + "//subtle/random", + "//testutil", + "@com_github_google_go_cmp//cmp", + "@org_golang_google_protobuf//proto", ], ) diff --git a/aead/aesgcm/aesgcm.go b/aead/aesgcm/aesgcm.go index d53ffff..8907a80 100644 --- a/aead/aesgcm/aesgcm.go +++ b/aead/aesgcm/aesgcm.go @@ -12,184 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package aesgcm implements AES-GCM parameters and key. +// Package aesgcm implements AES-GCM parameters and key, as well as key manager. package aesgcm import ( - "bytes" "fmt" - "github.com/tink-crypto/tink-go/v2/internal/outputprefix" - "github.com/tink-crypto/tink-go/v2/key" - "github.com/tink-crypto/tink-go/v2/secretdata" + "github.com/tink-crypto/tink-go/v2/core/registry" + "github.com/tink-crypto/tink-go/v2/internal/internalregistry" ) -// Variant is the prefix variant of AES-GCM keys. -// -// It describes how the prefix of the ciphertext is constructed. For AEAD there -// are three options: -// -// * TINK: prepends '0x01' to the ciphertext. -// * CRUNCHY: prepends '0x00' to the ciphertext. -// * NO_PREFIX: adds no prefix to the ciphertext. -type Variant int - -const ( - // VariantUnknown is the default and invalid value of Variant. - VariantUnknown Variant = iota - // VariantTink prefixes '0x01' to the ciphertext. - VariantTink - // VariantCrunchy prefixes '0x00' to the ciphertext. - VariantCrunchy - // VariantNoPrefix adds no prefix to the ciphertext. - VariantNoPrefix -) - -func (variant Variant) String() string { - switch variant { - case VariantTink: - return "TINK" - case VariantCrunchy: - return "CRUNCHY" - case VariantNoPrefix: - return "NO_PREFIX" - default: - return "UNKNOWN" - } -} - -// calculateOutputPrefix calculates the output prefix from keyID. -func calculateOutputPrefix(variant Variant, keyID uint32) ([]byte, error) { - switch variant { - case VariantTink: - return outputprefix.Tink(keyID), nil - case VariantCrunchy: - return outputprefix.Legacy(keyID), nil - case VariantNoPrefix: - return nil, nil - default: - return nil, fmt.Errorf("invalid output prefix variant: %v", variant) - } -} - -// Parameters specifies an AES-GCM key. -type Parameters struct { - keySizeInBytes int - ivSizeInBytes int - tagSizeInBytes int - variant Variant -} - -var _ key.Parameters = (*Parameters)(nil) - -// KeySizeInBytes returns the size of the key in bytes. -func (p *Parameters) KeySizeInBytes() int { return p.keySizeInBytes } - -// IVSizeInBytes returns the size of the IV in bytes. -func (p *Parameters) IVSizeInBytes() int { return p.ivSizeInBytes } - -// TagSizeInBytes returns the size of the tag in bytes. -func (p *Parameters) TagSizeInBytes() int { return p.tagSizeInBytes } - -// Variant returns the variant of the key. -func (p *Parameters) Variant() Variant { return p.variant } - -// ParametersOpts specifies options for creating AES-GCM parameters. -type ParametersOpts struct { - KeySizeInBytes int - IVSizeInBytes int - TagSizeInBytes int - Variant Variant -} - -// NewParameters creates a new AES-GCM Parameters object. -func NewParameters(opts ParametersOpts) (*Parameters, error) { - if opts.KeySizeInBytes != 16 && opts.KeySizeInBytes != 24 && opts.KeySizeInBytes != 32 { - return nil, fmt.Errorf("aesgcm.Parameters: unsupported key size; want 16, 24, or 32, got: %v", opts.KeySizeInBytes) - } - if opts.IVSizeInBytes <= 0 { - return nil, fmt.Errorf("aesgcm.Parameters: unsupported IV size; want > 0, got: %v", opts.IVSizeInBytes) +func init() { + if err := registry.RegisterKeyManager(new(keyManager)); err != nil { + panic(fmt.Sprintf("aesgcm.init() failed: %v", err)) } - if opts.TagSizeInBytes < 12 || opts.TagSizeInBytes > 16 { - return nil, fmt.Errorf("aesgcm.Parameters: unsupported tag size; want >= 12 and <= 16, got: %v", opts.TagSizeInBytes) + if err := internalregistry.AllowKeyDerivation(typeURL); err != nil { + panic(fmt.Sprintf("aesgcm.init() failed: %v", err)) } - if opts.Variant == VariantUnknown { - return nil, fmt.Errorf("aesgcm.Parameters: unsupported variant: %v", opts.Variant) - } - return &Parameters{ - keySizeInBytes: opts.KeySizeInBytes, - ivSizeInBytes: opts.IVSizeInBytes, - tagSizeInBytes: opts.TagSizeInBytes, - variant: opts.Variant, - }, nil -} - -// HasIDRequirement returns whether the key has an ID requirement. -func (p *Parameters) HasIDRequirement() bool { return p.variant != VariantNoPrefix } - -// Equals returns whether this Parameters object is equal to other. -func (p *Parameters) Equals(other key.Parameters) bool { - actualParams, ok := other.(*Parameters) - return ok && p.HasIDRequirement() == actualParams.HasIDRequirement() && - p.keySizeInBytes == actualParams.keySizeInBytes && - p.ivSizeInBytes == actualParams.ivSizeInBytes && - p.tagSizeInBytes == actualParams.tagSizeInBytes && - p.variant == actualParams.variant -} - -// Key represents an AES-GCM key. -type Key struct { - keyBytes secretdata.Bytes - id uint32 - outputPrefix []byte - parameters *Parameters -} - -var _ key.Key = (*Key)(nil) - -// NewKey creates a new AES-GCM key with key, keyID and parameters. -func NewKey(keyBytes secretdata.Bytes, keyID uint32, parameters *Parameters) (*Key, error) { - if parameters == nil { - return nil, fmt.Errorf("aesgcm.NewKey: parameters is nil") - } - if keyBytes.Len() != int(parameters.KeySizeInBytes()) { - return nil, fmt.Errorf("aesgcm.NewKey: key.Len() = %v, want %v", keyBytes.Len(), parameters.KeySizeInBytes()) - } - outputPrefix, err := calculateOutputPrefix(parameters.Variant(), keyID) - if err != nil { - return nil, fmt.Errorf("aesgcm.NewKey: %v", err) - } - return &Key{ - keyBytes: keyBytes, - id: keyID, - outputPrefix: outputPrefix, - parameters: parameters, - }, nil -} - -// KeyBytes returns the key material. -// -// This function provides access to partial key material. See -// https://developers.google.com/tink/design/access_control#access_of_parts_of_a_key -// for more information. -func (k *Key) KeyBytes() secretdata.Bytes { return k.keyBytes } - -// Parameters returns the parameters of this key. -func (k *Key) Parameters() key.Parameters { return k.parameters } - -// IDRequirement returns whether the key ID and whether it is required -// -// If not required, the returned key ID is not usable. -func (k *Key) IDRequirement() (uint32, bool) { return k.id, k.Parameters().HasIDRequirement() } - -// OutputPrefix returns the output prefix. -func (k *Key) OutputPrefix() []byte { return bytes.Clone(k.outputPrefix) } - -// Equals returns whether this key object is equal to other. -func (k *Key) Equals(other key.Key) bool { - that, ok := other.(*Key) - return ok && k.Parameters().Equals(that.Parameters()) && - k.id == that.id && - k.keyBytes.Equals(&that.keyBytes) && - bytes.Equal(k.outputPrefix, that.outputPrefix) } diff --git a/aead/aesgcm/key.go b/aead/aesgcm/key.go new file mode 100644 index 0000000..8edeebc --- /dev/null +++ b/aead/aesgcm/key.go @@ -0,0 +1,194 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aesgcm + +import ( + "bytes" + "fmt" + + "github.com/tink-crypto/tink-go/v2/internal/outputprefix" + "github.com/tink-crypto/tink-go/v2/key" + "github.com/tink-crypto/tink-go/v2/secretdata" +) + +// Variant is the prefix variant of AES-GCM keys. +// +// It describes how the prefix of the ciphertext is constructed. For AEAD there +// are three options: +// +// * TINK: prepends '0x01' to the ciphertext. +// * CRUNCHY: prepends '0x00' to the ciphertext. +// * NO_PREFIX: adds no prefix to the ciphertext. +type Variant int + +const ( + // VariantUnknown is the default and invalid value of Variant. + VariantUnknown Variant = iota + // VariantTink prefixes '0x01' to the ciphertext. + VariantTink + // VariantCrunchy prefixes '0x00' to the ciphertext. + VariantCrunchy + // VariantNoPrefix adds no prefix to the ciphertext. + VariantNoPrefix +) + +func (variant Variant) String() string { + switch variant { + case VariantTink: + return "TINK" + case VariantCrunchy: + return "CRUNCHY" + case VariantNoPrefix: + return "NO_PREFIX" + default: + return "UNKNOWN" + } +} + +// calculateOutputPrefix calculates the output prefix from keyID. +func calculateOutputPrefix(variant Variant, keyID uint32) ([]byte, error) { + switch variant { + case VariantTink: + return outputprefix.Tink(keyID), nil + case VariantCrunchy: + return outputprefix.Legacy(keyID), nil + case VariantNoPrefix: + return nil, nil + default: + return nil, fmt.Errorf("invalid output prefix variant: %v", variant) + } +} + +// Parameters specifies an AES-GCM key. +type Parameters struct { + keySizeInBytes int + ivSizeInBytes int + tagSizeInBytes int + variant Variant +} + +var _ key.Parameters = (*Parameters)(nil) + +// KeySizeInBytes returns the size of the key in bytes. +func (p *Parameters) KeySizeInBytes() int { return p.keySizeInBytes } + +// IVSizeInBytes returns the size of the IV in bytes. +func (p *Parameters) IVSizeInBytes() int { return p.ivSizeInBytes } + +// TagSizeInBytes returns the size of the tag in bytes. +func (p *Parameters) TagSizeInBytes() int { return p.tagSizeInBytes } + +// Variant returns the variant of the key. +func (p *Parameters) Variant() Variant { return p.variant } + +// ParametersOpts specifies options for creating AES-GCM parameters. +type ParametersOpts struct { + KeySizeInBytes int + IVSizeInBytes int + TagSizeInBytes int + Variant Variant +} + +// NewParameters creates a new AES-GCM Parameters object. +func NewParameters(opts ParametersOpts) (*Parameters, error) { + if opts.KeySizeInBytes != 16 && opts.KeySizeInBytes != 24 && opts.KeySizeInBytes != 32 { + return nil, fmt.Errorf("aesgcm.Parameters: unsupported key size; want 16, 24, or 32, got: %v", opts.KeySizeInBytes) + } + if opts.IVSizeInBytes <= 0 { + return nil, fmt.Errorf("aesgcm.Parameters: unsupported IV size; want > 0, got: %v", opts.IVSizeInBytes) + } + if opts.TagSizeInBytes < 12 || opts.TagSizeInBytes > 16 { + return nil, fmt.Errorf("aesgcm.Parameters: unsupported tag size; want >= 12 and <= 16, got: %v", opts.TagSizeInBytes) + } + if opts.Variant == VariantUnknown { + return nil, fmt.Errorf("aesgcm.Parameters: unsupported variant: %v", opts.Variant) + } + return &Parameters{ + keySizeInBytes: opts.KeySizeInBytes, + ivSizeInBytes: opts.IVSizeInBytes, + tagSizeInBytes: opts.TagSizeInBytes, + variant: opts.Variant, + }, nil +} + +// HasIDRequirement returns whether the key has an ID requirement. +func (p *Parameters) HasIDRequirement() bool { return p.variant != VariantNoPrefix } + +// Equals returns whether this Parameters object is equal to other. +func (p *Parameters) Equals(other key.Parameters) bool { + actualParams, ok := other.(*Parameters) + return ok && p.HasIDRequirement() == actualParams.HasIDRequirement() && + p.keySizeInBytes == actualParams.keySizeInBytes && + p.ivSizeInBytes == actualParams.ivSizeInBytes && + p.tagSizeInBytes == actualParams.tagSizeInBytes && + p.variant == actualParams.variant +} + +// Key represents an AES-GCM key. +type Key struct { + keyBytes secretdata.Bytes + id uint32 + outputPrefix []byte + parameters *Parameters +} + +var _ key.Key = (*Key)(nil) + +// NewKey creates a new AES-GCM key with key, keyID and parameters. +func NewKey(keyBytes secretdata.Bytes, keyID uint32, parameters *Parameters) (*Key, error) { + if parameters == nil { + return nil, fmt.Errorf("aesgcm.NewKey: parameters is nil") + } + if keyBytes.Len() != int(parameters.KeySizeInBytes()) { + return nil, fmt.Errorf("aesgcm.NewKey: key.Len() = %v, want %v", keyBytes.Len(), parameters.KeySizeInBytes()) + } + outputPrefix, err := calculateOutputPrefix(parameters.Variant(), keyID) + if err != nil { + return nil, fmt.Errorf("aesgcm.NewKey: %v", err) + } + return &Key{ + keyBytes: keyBytes, + id: keyID, + outputPrefix: outputPrefix, + parameters: parameters, + }, nil +} + +// KeyBytes returns the key material. +// +// This function provides access to partial key material. See +// https://developers.google.com/tink/design/access_control#access_of_parts_of_a_key +// for more information. +func (k *Key) KeyBytes() secretdata.Bytes { return k.keyBytes } + +// Parameters returns the parameters of this key. +func (k *Key) Parameters() key.Parameters { return k.parameters } + +// IDRequirement returns whether the key ID and whether it is required +// +// If not required, the returned key ID is not usable. +func (k *Key) IDRequirement() (uint32, bool) { return k.id, k.Parameters().HasIDRequirement() } + +// OutputPrefix returns the output prefix. +func (k *Key) OutputPrefix() []byte { return bytes.Clone(k.outputPrefix) } + +// Equals returns whether this key object is equal to other. +func (k *Key) Equals(other key.Key) bool { + that, ok := other.(*Key) + return ok && k.Parameters().Equals(that.Parameters()) && + k.id == that.id && + k.keyBytes.Equals(&that.keyBytes) && + bytes.Equal(k.outputPrefix, that.outputPrefix) +} diff --git a/aead/aes_gcm_key_manager.go b/aead/aesgcm/key_manager.go similarity index 68% rename from aead/aes_gcm_key_manager.go rename to aead/aesgcm/key_manager.go index 679cc0c..87c23e3 100644 --- a/aead/aes_gcm_key_manager.go +++ b/aead/aesgcm/key_manager.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package aead +package aesgcm import ( "fmt" @@ -28,29 +28,29 @@ import ( ) const ( - aesGCMKeyVersion = 0 - aesGCMTypeURL = "type.googleapis.com/google.crypto.tink.AesGcmKey" + keyVersion = 0 + typeURL = "type.googleapis.com/google.crypto.tink.AesGcmKey" ) // common errors -var errInvalidAESGCMKey = fmt.Errorf("aes_gcm_key_manager: invalid key") -var errInvalidAESGCMKeyFormat = fmt.Errorf("aes_gcm_key_manager: invalid key format") +var errInvalidKey = fmt.Errorf("aes_gcm_key_manager: invalid key") +var errInvalidKeyFormat = fmt.Errorf("aes_gcm_key_manager: invalid key format") -// aesGCMKeyManager is an implementation of KeyManager interface. +// keyManager is an implementation of KeyManager interface. // It generates new AESGCMKey keys and produces new instances of AESGCM subtle. -type aesGCMKeyManager struct{} +type keyManager struct{} -// Assert that aesGCMKeyManager implements the KeyManager interface. -var _ registry.KeyManager = (*aesGCMKeyManager)(nil) +// Assert that keyManager implements the KeyManager interface. +var _ registry.KeyManager = (*keyManager)(nil) // Primitive creates an AESGCM subtle for the given serialized AESGCMKey proto. -func (km *aesGCMKeyManager) Primitive(serializedKey []byte) (any, error) { +func (km *keyManager) Primitive(serializedKey []byte) (any, error) { if len(serializedKey) == 0 { - return nil, errInvalidAESGCMKey + return nil, errInvalidKey } key := new(gcmpb.AesGcmKey) if err := proto.Unmarshal(serializedKey, key); err != nil { - return nil, errInvalidAESGCMKey + return nil, errInvalidKey } if err := km.validateKey(key); err != nil { return nil, err @@ -63,20 +63,20 @@ func (km *aesGCMKeyManager) Primitive(serializedKey []byte) (any, error) { } // NewKey creates a new key according to specification the given serialized AESGCMKeyFormat. -func (km *aesGCMKeyManager) NewKey(serializedKeyFormat []byte) (proto.Message, error) { +func (km *keyManager) NewKey(serializedKeyFormat []byte) (proto.Message, error) { if len(serializedKeyFormat) == 0 { - return nil, errInvalidAESGCMKeyFormat + return nil, errInvalidKeyFormat } keyFormat := new(gcmpb.AesGcmKeyFormat) if err := proto.Unmarshal(serializedKeyFormat, keyFormat); err != nil { - return nil, errInvalidAESGCMKeyFormat + return nil, errInvalidKeyFormat } if err := km.validateKeyFormat(keyFormat); err != nil { return nil, fmt.Errorf("aes_gcm_key_manager: invalid key format: %s", err) } keyValue := random.GetRandomBytes(keyFormat.KeySize) return &gcmpb.AesGcmKey{ - Version: aesGCMKeyVersion, + Version: keyVersion, KeyValue: keyValue, }, nil } @@ -84,7 +84,7 @@ func (km *aesGCMKeyManager) NewKey(serializedKeyFormat []byte) (proto.Message, e // NewKeyData creates a new KeyData according to specification in the given serialized // AESGCMKeyFormat. // It should be used solely by the key management API. -func (km *aesGCMKeyManager) NewKeyData(serializedKeyFormat []byte) (*tinkpb.KeyData, error) { +func (km *keyManager) NewKeyData(serializedKeyFormat []byte) (*tinkpb.KeyData, error) { key, err := km.NewKey(serializedKeyFormat) if err != nil { return nil, err @@ -94,40 +94,36 @@ func (km *aesGCMKeyManager) NewKeyData(serializedKeyFormat []byte) (*tinkpb.KeyD return nil, err } return &tinkpb.KeyData{ - TypeUrl: aesGCMTypeURL, + TypeUrl: typeURL, Value: serializedKey, KeyMaterialType: km.KeyMaterialType(), }, nil } // DoesSupport indicates if this key manager supports the given key type. -func (km *aesGCMKeyManager) DoesSupport(typeURL string) bool { - return typeURL == aesGCMTypeURL -} +func (km *keyManager) DoesSupport(typeURL string) bool { return typeURL == km.TypeURL() } // TypeURL returns the key type of keys managed by this key manager. -func (km *aesGCMKeyManager) TypeURL() string { - return aesGCMTypeURL -} +func (km *keyManager) TypeURL() string { return typeURL } // KeyMaterialType returns the key material type of the key manager. -func (km *aesGCMKeyManager) KeyMaterialType() tinkpb.KeyData_KeyMaterialType { +func (km *keyManager) KeyMaterialType() tinkpb.KeyData_KeyMaterialType { return tinkpb.KeyData_SYMMETRIC } // DeriveKey derives a new key from serializedKeyFormat and pseudorandomness. -func (km *aesGCMKeyManager) DeriveKey(serializedKeyFormat []byte, pseudorandomness io.Reader) (proto.Message, error) { +func (km *keyManager) DeriveKey(serializedKeyFormat []byte, pseudorandomness io.Reader) (proto.Message, error) { if len(serializedKeyFormat) == 0 { - return nil, errInvalidAESGCMKeyFormat + return nil, errInvalidKeyFormat } keyFormat := new(gcmpb.AesGcmKeyFormat) if err := proto.Unmarshal(serializedKeyFormat, keyFormat); err != nil { - return nil, errInvalidAESGCMKeyFormat + return nil, errInvalidKeyFormat } if err := km.validateKeyFormat(keyFormat); err != nil { return nil, fmt.Errorf("aes_gcm_key_manager: invalid key format: %s", err) } - if err := keyset.ValidateKeyVersion(keyFormat.GetVersion(), aesGCMKeyVersion); err != nil { + if err := keyset.ValidateKeyVersion(keyFormat.GetVersion(), keyVersion); err != nil { return nil, fmt.Errorf("aes_gcm_key_manager: invalid key version: %s", err) } @@ -137,14 +133,14 @@ func (km *aesGCMKeyManager) DeriveKey(serializedKeyFormat []byte, pseudorandomne } return &gcmpb.AesGcmKey{ - Version: aesGCMKeyVersion, + Version: keyVersion, KeyValue: keyValue, }, nil } // validateKey validates the given AESGCMKey. -func (km *aesGCMKeyManager) validateKey(key *gcmpb.AesGcmKey) error { - if err := keyset.ValidateKeyVersion(key.Version, aesGCMKeyVersion); err != nil { +func (km *keyManager) validateKey(key *gcmpb.AesGcmKey) error { + if err := keyset.ValidateKeyVersion(key.Version, keyVersion); err != nil { return fmt.Errorf("aes_gcm_key_manager: %s", err) } keySize := uint32(len(key.KeyValue)) @@ -155,7 +151,7 @@ func (km *aesGCMKeyManager) validateKey(key *gcmpb.AesGcmKey) error { } // validateKeyFormat validates the given AESGCMKeyFormat. -func (km *aesGCMKeyManager) validateKeyFormat(format *gcmpb.AesGcmKeyFormat) error { +func (km *keyManager) validateKeyFormat(format *gcmpb.AesGcmKeyFormat) error { if err := subtle.ValidateAESKeySize(format.KeySize); err != nil { return fmt.Errorf("aes_gcm_key_manager: %s", err) } diff --git a/aead/aes_gcm_key_manager_test.go b/aead/aesgcm/key_manager_test.go similarity index 99% rename from aead/aes_gcm_key_manager_test.go rename to aead/aesgcm/key_manager_test.go index 8a02a1f..4a064c3 100644 --- a/aead/aes_gcm_key_manager_test.go +++ b/aead/aesgcm/key_manager_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package aead_test +package aesgcm_test import ( "bytes" diff --git a/aead/aesgcm/aesgcm_test.go b/aead/aesgcm/key_test.go similarity index 100% rename from aead/aesgcm/aesgcm_test.go rename to aead/aesgcm/key_test.go