You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							138 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							138 lines
						
					
					
						
							3.9 KiB
						
					
					
				| package kms | |
| 
 | |
| import ( | |
| 	"encoding/json" | |
| 	"testing" | |
| ) | |
| 
 | |
| func TestCiphertextEnvelope_CreateAndParse(t *testing.T) { | |
| 	// Test basic envelope creation and parsing | |
| 	provider := "openbao" | |
| 	keyID := "test-key-123" | |
| 	ciphertext := "vault:v1:abcd1234encrypted" | |
| 	providerSpecific := map[string]interface{}{ | |
| 		"transit_path": "transit", | |
| 		"version":      1, | |
| 	} | |
| 
 | |
| 	// Create envelope | |
| 	envelopeBlob, err := CreateEnvelope(provider, keyID, ciphertext, providerSpecific) | |
| 	if err != nil { | |
| 		t.Fatalf("CreateEnvelope failed: %v", err) | |
| 	} | |
| 
 | |
| 	// Verify it's valid JSON | |
| 	var jsonCheck map[string]interface{} | |
| 	if err := json.Unmarshal(envelopeBlob, &jsonCheck); err != nil { | |
| 		t.Fatalf("Envelope is not valid JSON: %v", err) | |
| 	} | |
| 
 | |
| 	// Parse envelope back | |
| 	envelope, err := ParseEnvelope(envelopeBlob) | |
| 	if err != nil { | |
| 		t.Fatalf("ParseEnvelope failed: %v", err) | |
| 	} | |
| 
 | |
| 	// Verify fields | |
| 	if envelope.Provider != provider { | |
| 		t.Errorf("Provider mismatch: expected %s, got %s", provider, envelope.Provider) | |
| 	} | |
| 	if envelope.KeyID != keyID { | |
| 		t.Errorf("KeyID mismatch: expected %s, got %s", keyID, envelope.KeyID) | |
| 	} | |
| 	if envelope.Ciphertext != ciphertext { | |
| 		t.Errorf("Ciphertext mismatch: expected %s, got %s", ciphertext, envelope.Ciphertext) | |
| 	} | |
| 	if envelope.Version != 1 { | |
| 		t.Errorf("Version mismatch: expected 1, got %d", envelope.Version) | |
| 	} | |
| 	if envelope.ProviderSpecific == nil { | |
| 		t.Error("ProviderSpecific is nil") | |
| 	} | |
| } | |
| 
 | |
| func TestCiphertextEnvelope_InvalidFormat(t *testing.T) { | |
| 	// Test parsing invalid (non-envelope) ciphertext should fail | |
| 	rawCiphertext := []byte("some-raw-data-not-json") | |
| 
 | |
| 	_, err := ParseEnvelope(rawCiphertext) | |
| 	if err == nil { | |
| 		t.Fatal("Expected error for invalid format, got none") | |
| 	} | |
| } | |
| 
 | |
| func TestCiphertextEnvelope_ValidationErrors(t *testing.T) { | |
| 	// Test validation errors | |
| 	testCases := []struct { | |
| 		name        string | |
| 		provider    string | |
| 		keyID       string | |
| 		ciphertext  string | |
| 		expectError bool | |
| 	}{ | |
| 		{"Valid", "openbao", "key1", "cipher1", false}, | |
| 		{"Empty provider", "", "key1", "cipher1", true}, | |
| 		{"Empty keyID", "openbao", "", "cipher1", true}, | |
| 		{"Empty ciphertext", "openbao", "key1", "", true}, | |
| 	} | |
| 
 | |
| 	for _, tc := range testCases { | |
| 		t.Run(tc.name, func(t *testing.T) { | |
| 			envelopeBlob, err := CreateEnvelope(tc.provider, tc.keyID, tc.ciphertext, nil) | |
| 			if err != nil && !tc.expectError { | |
| 				t.Fatalf("Unexpected error in CreateEnvelope: %v", err) | |
| 			} | |
| 			if err == nil && tc.expectError { | |
| 				t.Fatal("Expected error in CreateEnvelope but got none") | |
| 			} | |
| 
 | |
| 			if !tc.expectError { | |
| 				// Test parsing as well | |
| 				_, err = ParseEnvelope(envelopeBlob) | |
| 				if err != nil { | |
| 					t.Fatalf("ParseEnvelope failed: %v", err) | |
| 				} | |
| 			} | |
| 		}) | |
| 	} | |
| } | |
| 
 | |
| func TestCiphertextEnvelope_MultipleProviders(t *testing.T) { | |
| 	// Test with different providers to ensure API consistency | |
| 	providers := []struct { | |
| 		name       string | |
| 		keyID      string | |
| 		ciphertext string | |
| 	}{ | |
| 		{"openbao", "transit/test-key", "vault:v1:encrypted123"}, | |
| 		{"gcp", "projects/test/locations/us/keyRings/ring/cryptoKeys/key", "gcp-encrypted-data"}, | |
| 		{"azure", "https://vault.vault.azure.net/keys/test/123", "azure-encrypted-bytes"}, | |
| 		{"aws", "arn:aws:kms:us-east-1:123:key/abc", "aws-encrypted-blob"}, | |
| 	} | |
| 
 | |
| 	for _, provider := range providers { | |
| 		t.Run(provider.name, func(t *testing.T) { | |
| 			// Create envelope | |
| 			envelopeBlob, err := CreateEnvelope(provider.name, provider.keyID, provider.ciphertext, nil) | |
| 			if err != nil { | |
| 				t.Fatalf("CreateEnvelope failed for %s: %v", provider.name, err) | |
| 			} | |
| 
 | |
| 			// Parse envelope | |
| 			envelope, err := ParseEnvelope(envelopeBlob) | |
| 			if err != nil { | |
| 				t.Fatalf("ParseEnvelope failed for %s: %v", provider.name, err) | |
| 			} | |
| 
 | |
| 			// Verify consistency | |
| 			if envelope.Provider != provider.name { | |
| 				t.Errorf("Provider mismatch for %s: expected %s, got %s", | |
| 					provider.name, provider.name, envelope.Provider) | |
| 			} | |
| 			if envelope.KeyID != provider.keyID { | |
| 				t.Errorf("KeyID mismatch for %s: expected %s, got %s", | |
| 					provider.name, provider.keyID, envelope.KeyID) | |
| 			} | |
| 		}) | |
| 	} | |
| }
 |