package protocol

import (
	"crypto/aes"
	"encoding/hex"
	"reflect"
	"testing"
)

func TestOMAC1_RFC4493(t *testing.T) {
	// RFC 4493 Test Vectors for AES-128-CMAC
	keyHex := "2b7e151628aed2a6abf7158809cf4f3c"
	key, _ := hex.DecodeString(keyHex)

	block, err := aes.NewCipher(key)
	if err != nil {
		t.Fatal(err)
	}

	// Example 1: Empty Message
	msg1 := []byte{}
	want1Hex := "bb1d6929e95937287fa37d129b756746"
	want1, _ := hex.DecodeString(want1Hex)

	got1 := omac1(block, msg1)
	if !reflect.DeepEqual(got1, want1) {
		t.Errorf("OMAC1 Empty Message Mismatch.\nGot:  %x\nWant: %x", got1, want1)
	}

	// Example 2: 16 bytes
	msg2Hex := "6bc1bee22e409f96e93d7e117393172a"
	msg2, _ := hex.DecodeString(msg2Hex)
	want2Hex := "070a16b46b4d4144f79bdd9dd04a287c"
	want2, _ := hex.DecodeString(want2Hex)

	got2 := omac1(block, msg2)
	if !reflect.DeepEqual(got2, want2) {
		t.Errorf("OMAC1 16-byte Message Mismatch.\nGot:  %x\nWant: %x", got2, want2)
	}

	// Example 3: 40 bytes (not multiple of 16)
	msg3Hex := "6bc1bee22e409f96e93d7e117393172a" +
		"ae2d8a571e03ac9c9eb76fac45af8e51" +
		"30c81c46a35ce411"
	msg3, _ := hex.DecodeString(msg3Hex)
	want3Hex := "dfa66747de9ae63030ca32611497c827"
	want3, _ := hex.DecodeString(want3Hex)

	got3 := omac1(block, msg3)
	if !reflect.DeepEqual(got3, want3) {
		t.Errorf("OMAC1 40-byte Message Mismatch.\nGot:  %x\nWant: %x", got3, want3)
	}
}
