81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package cryptography
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateHMACKey(t *testing.T) {
|
|
testSizes := []int{16, 32, 64}
|
|
for _, size := range testSizes {
|
|
t.Run("Size"+string(rune(size)), func(t *testing.T) { // Simple name conversion
|
|
key, err := GenerateHMACKey(size)
|
|
if err != nil {
|
|
t.Fatalf("GenerateHMACKey(%d) failed: %v", size, err)
|
|
}
|
|
if len(key) != size {
|
|
t.Errorf("GenerateHMACKey(%d) returned key of length %d; want %d", size, len(key), size)
|
|
}
|
|
|
|
// Check if key is not all zeros (basic check for randomness)
|
|
isZero := true
|
|
for _, b := range key {
|
|
if b != 0 {
|
|
isZero = false
|
|
break
|
|
}
|
|
}
|
|
if isZero {
|
|
t.Errorf("GenerateHMACKey(%d) returned an all-zero key", size)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestComputeAndValidateHMAC(t *testing.T) {
|
|
key, err := GenerateHMACKey(32) // Use SHA256 key size
|
|
if err != nil {
|
|
t.Fatalf("Failed to generate HMAC key: %v", err)
|
|
}
|
|
|
|
message := []byte("This is a test message.")
|
|
|
|
// Compute HMAC
|
|
computedHMAC := ComputeHMAC(key, message)
|
|
if len(computedHMAC) != 32 { // SHA256 output size
|
|
t.Errorf("ComputeHMAC returned HMAC of length %d; want 32", len(computedHMAC))
|
|
}
|
|
|
|
// Validate correct HMAC
|
|
if !ValidateHMAC(key, message, computedHMAC) {
|
|
t.Errorf("ValidateHMAC failed for correctly computed HMAC")
|
|
}
|
|
|
|
// Validate incorrect HMAC (tampered message)
|
|
tamperedMessage := append(message, byte('!'))
|
|
if ValidateHMAC(key, tamperedMessage, computedHMAC) {
|
|
t.Errorf("ValidateHMAC succeeded for tampered message")
|
|
}
|
|
|
|
// Validate incorrect HMAC (tampered key)
|
|
wrongKey, _ := GenerateHMACKey(32)
|
|
if ValidateHMAC(wrongKey, message, computedHMAC) {
|
|
t.Errorf("ValidateHMAC succeeded for incorrect key")
|
|
}
|
|
|
|
// Validate incorrect HMAC (tampered HMAC)
|
|
tamperedHMAC := append(computedHMAC[:len(computedHMAC)-1], ^computedHMAC[len(computedHMAC)-1])
|
|
if ValidateHMAC(key, message, tamperedHMAC) {
|
|
t.Errorf("ValidateHMAC succeeded for tampered HMAC")
|
|
}
|
|
|
|
// Validate empty message
|
|
emptyMessage := []byte("")
|
|
emptyHMAC := ComputeHMAC(key, emptyMessage)
|
|
if !ValidateHMAC(key, emptyMessage, emptyHMAC) {
|
|
t.Errorf("ValidateHMAC failed for empty message")
|
|
}
|
|
if ValidateHMAC(key, message, emptyHMAC) {
|
|
t.Errorf("ValidateHMAC succeeded comparing non-empty message with empty HMAC")
|
|
}
|
|
}
|