123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package master
- import (
- "crypto/aes"
- "crypto/cipher"
- "encoding/base64"
- "fmt"
- "testing"
- apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1"
- "k8s.io/apiserver/pkg/storage/value"
- aestransformer "k8s.io/apiserver/pkg/storage/value/encrypt/aes"
- )
- const (
- aesGCMPrefix = "k8s:enc:aesgcm:v1:key1:"
- aesCBCPrefix = "k8s:enc:aescbc:v1:key1:"
- aesGCMConfigYAML = `
- kind: EncryptionConfiguration
- apiVersion: apiserver.config.k8s.io/v1
- resources:
- - resources:
- - secrets
- providers:
- - aesgcm:
- keys:
- - name: key1
- secret: c2VjcmV0IGlzIHNlY3VyZQ==
- `
- aesCBCConfigYAML = `
- kind: EncryptionConfiguration
- apiVersion: apiserver.config.k8s.io/v1
- resources:
- - resources:
- - secrets
- providers:
- - aescbc:
- keys:
- - name: key1
- secret: c2VjcmV0IGlzIHNlY3VyZQ==
- `
- identityConfigYAML = `
- kind: EncryptionConfiguration
- apiVersion: apiserver.config.k8s.io/v1
- resources:
- - resources:
- - secrets
- providers:
- - identity: {}
- `
- )
- func TestSecretsShouldBeTransformed(t *testing.T) {
- var testCases = []struct {
- transformerConfigContent string
- transformerPrefix string
- unSealFunc unSealSecret
- }{
- {aesGCMConfigYAML, aesGCMPrefix, unSealWithGCMTransformer},
- {aesCBCConfigYAML, aesCBCPrefix, unSealWithCBCTransformer},
-
- }
- for _, tt := range testCases {
- test, err := newTransformTest(t, tt.transformerConfigContent)
- if err != nil {
- test.cleanUp()
- t.Errorf("failed to setup test for envelop %s, error was %v", tt.transformerPrefix, err)
- continue
- }
- test.run(tt.unSealFunc, tt.transformerPrefix)
- test.cleanUp()
- }
- }
- func BenchmarkBase(b *testing.B) {
- runBenchmark(b, "")
- }
- func BenchmarkIdentityWrite(b *testing.B) {
- runBenchmark(b, identityConfigYAML)
- }
- func BenchmarkAESGCMEnvelopeWrite(b *testing.B) {
- runBenchmark(b, aesGCMConfigYAML)
- }
- func BenchmarkAESCBCEnvelopeWrite(b *testing.B) {
- runBenchmark(b, aesCBCConfigYAML)
- }
- func runBenchmark(b *testing.B, transformerConfig string) {
- b.StopTimer()
- test, err := newTransformTest(b, transformerConfig)
- defer test.cleanUp()
- if err != nil {
- b.Fatalf("failed to setup benchmark for config %s, error was %v", transformerConfig, err)
- }
- b.StartTimer()
- test.benchmark(b)
- b.StopTimer()
- test.printMetrics()
- }
- func unSealWithGCMTransformer(cipherText []byte, ctx value.Context,
- transformerConfig apiserverconfigv1.ProviderConfiguration) ([]byte, error) {
- block, err := newAESCipher(transformerConfig.AESGCM.Keys[0].Secret)
- if err != nil {
- return nil, fmt.Errorf("failed to create block cipher: %v", err)
- }
- gcmTransformer := aestransformer.NewGCMTransformer(block)
- clearText, _, err := gcmTransformer.TransformFromStorage(cipherText, ctx)
- if err != nil {
- return nil, fmt.Errorf("failed to decypt secret: %v", err)
- }
- return clearText, nil
- }
- func unSealWithCBCTransformer(cipherText []byte, ctx value.Context,
- transformerConfig apiserverconfigv1.ProviderConfiguration) ([]byte, error) {
- block, err := newAESCipher(transformerConfig.AESCBC.Keys[0].Secret)
- if err != nil {
- return nil, err
- }
- cbcTransformer := aestransformer.NewCBCTransformer(block)
- clearText, _, err := cbcTransformer.TransformFromStorage(cipherText, ctx)
- if err != nil {
- return nil, fmt.Errorf("failed to decypt secret: %v", err)
- }
- return clearText, nil
- }
- func newAESCipher(key string) (cipher.Block, error) {
- k, err := base64.StdEncoding.DecodeString(key)
- if err != nil {
- return nil, fmt.Errorf("failed to decode config secret: %v", err)
- }
- block, err := aes.NewCipher(k)
- if err != nil {
- return nil, fmt.Errorf("failed to create AES cipher: %v", err)
- }
- return block, nil
- }
|