From ce18b7d841d3fbc289d4beb26d0a49379689b8c3 Mon Sep 17 00:00:00 2001 From: Emman Date: Wed, 28 Apr 2021 13:28:06 +0800 Subject: [PATCH] MAGIC - add rfc8998 test vectors --- sm4_test/ccm_sm4_test.go | 54 ++++++++++++++++++++++++++++++++++++++++ sm4_test/gcm_sm4_test.go | 7 ++++++ 2 files changed, 61 insertions(+) create mode 100644 sm4_test/ccm_sm4_test.go diff --git a/sm4_test/ccm_sm4_test.go b/sm4_test/ccm_sm4_test.go new file mode 100644 index 0000000..08ade3d --- /dev/null +++ b/sm4_test/ccm_sm4_test.go @@ -0,0 +1,54 @@ +package sm4_test + +import ( + "encoding/hex" + "testing" + + smcipher "github.com/emmansun/gmsm/cipher" + "github.com/emmansun/gmsm/sm4" +) + +var sm4CCMTests = []struct { + key, nonce, plaintext, ad, result string +}{ + { // https://tools.ietf.org/html/rfc8998 A.2. SM4-CCM Test Vectors + "0123456789abcdeffedcba9876543210", + "00001234567800000000abcd", + "aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccddddddddddddddddeeeeeeeeeeeeeeeeffffffffffffffffeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaa", + "feedfacedeadbeeffeedfacedeadbeefabaddad2", + "48af93501fa62adbcd414cce6034d895dda1bf8f132f042098661572e7483094fd12e518ce062c98acee28d95df4416bed31a2f04476c18bb40c84a74b97dc5b16842d4fa186f56ab33256971fa110f4", + }, +} + +func TestCCM(t *testing.T) { + for i, tt := range sm4CCMTests { + nonce, _ := hex.DecodeString(tt.nonce) + plaintext, _ := hex.DecodeString(tt.plaintext) + ad, _ := hex.DecodeString(tt.ad) + key, _ := hex.DecodeString(tt.key) + tagSize := (len(tt.result) - len(tt.plaintext)) / 2 + c, err := sm4.NewCipher(key) + if err != nil { + t.Fatal(err) + } + sm4ccm, err := smcipher.NewCCMWithNonceAndTagSize(c, len(nonce), tagSize) + if err != nil { + t.Fatal(err) + } + ct := sm4ccm.Seal(nil, nonce, plaintext, ad) + if ctHex := hex.EncodeToString(ct); ctHex != tt.result { + t.Errorf("#%d: got %s, want %s", i, ctHex, tt.result) + continue + } + + //func (c *ccm) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) + pt, err := sm4ccm.Open(nil, nonce, ct, ad) + if err != nil { + t.Fatal(err) + } + if ptHex := hex.EncodeToString(pt); ptHex != tt.plaintext { + t.Errorf("#%d: got %s, want %s", i, ptHex, tt.plaintext) + continue + } + } +} diff --git a/sm4_test/gcm_sm4_test.go b/sm4_test/gcm_sm4_test.go index 67040d2..e7c74a2 100644 --- a/sm4_test/gcm_sm4_test.go +++ b/sm4_test/gcm_sm4_test.go @@ -203,6 +203,13 @@ var sm4GCMTests = []struct { "", "250327c674aaf477aef2675748cf6971", }, + { // https://tools.ietf.org/html/rfc8998 A.1. SM4-GCM Test Vectors + "0123456789abcdeffedcba9876543210", + "00001234567800000000abcd", + "aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccddddddddddddddddeeeeeeeeeeeeeeeeffffffffffffffffeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaa", + "feedfacedeadbeeffeedfacedeadbeefabaddad2", + "17f399f08c67d5ee19d0dc9969c4bb7d5fd46fd3756489069157b282bb200735d82710ca5c22f0ccfa7cbf93d496ac15a56834cbcf98c397b4024a2691233b8d83de3541e4c2b58177e065a9bf7b62ec", + }, } func TestSM4GCM(t *testing.T) {