envelope_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package kms
  2. import (
  3. "encoding/json"
  4. "testing"
  5. )
  6. func TestCiphertextEnvelope_CreateAndParse(t *testing.T) {
  7. // Test basic envelope creation and parsing
  8. provider := "openbao"
  9. keyID := "test-key-123"
  10. ciphertext := "vault:v1:abcd1234encrypted"
  11. providerSpecific := map[string]interface{}{
  12. "transit_path": "transit",
  13. "version": 1,
  14. }
  15. // Create envelope
  16. envelopeBlob, err := CreateEnvelope(provider, keyID, ciphertext, providerSpecific)
  17. if err != nil {
  18. t.Fatalf("CreateEnvelope failed: %v", err)
  19. }
  20. // Verify it's valid JSON
  21. var jsonCheck map[string]interface{}
  22. if err := json.Unmarshal(envelopeBlob, &jsonCheck); err != nil {
  23. t.Fatalf("Envelope is not valid JSON: %v", err)
  24. }
  25. // Parse envelope back
  26. envelope, err := ParseEnvelope(envelopeBlob)
  27. if err != nil {
  28. t.Fatalf("ParseEnvelope failed: %v", err)
  29. }
  30. // Verify fields
  31. if envelope.Provider != provider {
  32. t.Errorf("Provider mismatch: expected %s, got %s", provider, envelope.Provider)
  33. }
  34. if envelope.KeyID != keyID {
  35. t.Errorf("KeyID mismatch: expected %s, got %s", keyID, envelope.KeyID)
  36. }
  37. if envelope.Ciphertext != ciphertext {
  38. t.Errorf("Ciphertext mismatch: expected %s, got %s", ciphertext, envelope.Ciphertext)
  39. }
  40. if envelope.Version != 1 {
  41. t.Errorf("Version mismatch: expected 1, got %d", envelope.Version)
  42. }
  43. if envelope.ProviderSpecific == nil {
  44. t.Error("ProviderSpecific is nil")
  45. }
  46. }
  47. func TestCiphertextEnvelope_InvalidFormat(t *testing.T) {
  48. // Test parsing invalid (non-envelope) ciphertext should fail
  49. rawCiphertext := []byte("some-raw-data-not-json")
  50. _, err := ParseEnvelope(rawCiphertext)
  51. if err == nil {
  52. t.Fatal("Expected error for invalid format, got none")
  53. }
  54. }
  55. func TestCiphertextEnvelope_ValidationErrors(t *testing.T) {
  56. // Test validation errors
  57. testCases := []struct {
  58. name string
  59. provider string
  60. keyID string
  61. ciphertext string
  62. expectError bool
  63. }{
  64. {"Valid", "openbao", "key1", "cipher1", false},
  65. {"Empty provider", "", "key1", "cipher1", true},
  66. {"Empty keyID", "openbao", "", "cipher1", true},
  67. {"Empty ciphertext", "openbao", "key1", "", true},
  68. }
  69. for _, tc := range testCases {
  70. t.Run(tc.name, func(t *testing.T) {
  71. envelopeBlob, err := CreateEnvelope(tc.provider, tc.keyID, tc.ciphertext, nil)
  72. if err != nil && !tc.expectError {
  73. t.Fatalf("Unexpected error in CreateEnvelope: %v", err)
  74. }
  75. if err == nil && tc.expectError {
  76. t.Fatal("Expected error in CreateEnvelope but got none")
  77. }
  78. if !tc.expectError {
  79. // Test parsing as well
  80. _, err = ParseEnvelope(envelopeBlob)
  81. if err != nil {
  82. t.Fatalf("ParseEnvelope failed: %v", err)
  83. }
  84. }
  85. })
  86. }
  87. }
  88. func TestCiphertextEnvelope_MultipleProviders(t *testing.T) {
  89. // Test with different providers to ensure API consistency
  90. providers := []struct {
  91. name string
  92. keyID string
  93. ciphertext string
  94. }{
  95. {"openbao", "transit/test-key", "vault:v1:encrypted123"},
  96. {"gcp", "projects/test/locations/us/keyRings/ring/cryptoKeys/key", "gcp-encrypted-data"},
  97. {"azure", "https://vault.vault.azure.net/keys/test/123", "azure-encrypted-bytes"},
  98. {"aws", "arn:aws:kms:us-east-1:123:key/abc", "aws-encrypted-blob"},
  99. }
  100. for _, provider := range providers {
  101. t.Run(provider.name, func(t *testing.T) {
  102. // Create envelope
  103. envelopeBlob, err := CreateEnvelope(provider.name, provider.keyID, provider.ciphertext, nil)
  104. if err != nil {
  105. t.Fatalf("CreateEnvelope failed for %s: %v", provider.name, err)
  106. }
  107. // Parse envelope
  108. envelope, err := ParseEnvelope(envelopeBlob)
  109. if err != nil {
  110. t.Fatalf("ParseEnvelope failed for %s: %v", provider.name, err)
  111. }
  112. // Verify consistency
  113. if envelope.Provider != provider.name {
  114. t.Errorf("Provider mismatch for %s: expected %s, got %s",
  115. provider.name, provider.name, envelope.Provider)
  116. }
  117. if envelope.KeyID != provider.keyID {
  118. t.Errorf("KeyID mismatch for %s: expected %s, got %s",
  119. provider.name, provider.keyID, envelope.KeyID)
  120. }
  121. })
  122. }
  123. }