github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/sm4soft/sm4_gcm_test.go (about)

     1  // Copyright 2022 s1ren@github.com/hxx258456.
     2  
     3  /*
     4  sm4soft 是sm4的纯软实现,基于tjfoc国密算法库`tjfoc/gmsm`做了少量修改。
     5  对应版权声明: thrid_licenses/github.com/tjfoc/gmsm/版权声明
     6  */
     7  
     8  package sm4soft
     9  
    10  import (
    11  	"bytes"
    12  	"fmt"
    13  	"testing"
    14  )
    15  
    16  func TestSM4GCM(t *testing.T) {
    17  	// 定义key,16字节
    18  	key := []byte("1234567890abcdef")
    19  	fmt.Printf("key字节数组 : %v\n", key)
    20  	fmt.Printf("key字符串 : %s\n", key)
    21  	// 定义IV,16字节
    22  	IV := []byte("1234def567890abc")
    23  	// IV := make([]byte, BlockSize)
    24  	fmt.Printf("iv字节数组 : %v\n", IV)
    25  	fmt.Printf("iv16进制 : %x\n", IV)
    26  	fmt.Printf("iv字符串 : %s\n", IV)
    27  
    28  	// 定义数据,长度必须是16字节的倍数
    29  	// data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
    30  	data := []byte("天行健君子以自强不息12")
    31  	fmt.Printf("data字节数组 : %v\n", data)
    32  	fmt.Printf("data十六进制 : %x\n", data)
    33  	fmt.Printf("data字符串 : %s\n", data)
    34  
    35  	testA := [][]byte{ // the length of the A can be random
    36  		{},
    37  		{0x01, 0x23, 0x45, 0x67, 0x89},
    38  		{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
    39  	}
    40  	for _, A := range testA {
    41  		fmt.Printf("====== 附加鉴别数据 A : %x\n", A)
    42  		// gcm模式加密
    43  		gcmMsg, T, err := Sm4GCM(key, IV, data, A, true)
    44  		if err != nil {
    45  			t.Errorf("sm4 enc error:%s", err)
    46  		}
    47  		fmt.Printf("gcmMsg 16进制 : %x\n", gcmMsg)
    48  		// gcm模式解密
    49  		gcmDec, T_, err := Sm4GCM(key, IV, gcmMsg, A, false)
    50  		if err != nil {
    51  			t.Errorf("sm4 dec error:%s", err)
    52  		}
    53  		fmt.Printf("gcmDec : %s\n", gcmDec)
    54  
    55  		if bytes.Equal(T, T_) {
    56  			fmt.Println("鉴别成功")
    57  		}
    58  
    59  		//Failed Test : if we input the different A , that will be a falied result.
    60  		A = []byte{0x01, 0x32, 0x45, 0x67, 0xba, 0xab, 0xcd}
    61  		gcmDec, T_, err = Sm4GCM(key, IV, gcmMsg, A, false)
    62  		if err != nil {
    63  			t.Errorf("使用不同的附加鉴别数据后,Sm4GCM 解密失败 : %s", err)
    64  		} else {
    65  			fmt.Printf("使用不同的附加鉴别数据后,gcmDec : %s\n", gcmDec)
    66  		}
    67  		if !bytes.Equal(T, T_) {
    68  			fmt.Println("鉴别失败")
    69  		}
    70  	}
    71  
    72  }
    73  
    74  func BenchmarkSm4(t *testing.B) {
    75  	key := []byte("1234567890abcdef")
    76  	IV := []byte("1234def567890abc")
    77  	A := []byte{0x01, 0x23, 0x45, 0x67, 0x89}
    78  	data := []byte("天行健君子以自强不息12")
    79  	t.ReportAllocs()
    80  	for i := 0; i < t.N; i++ {
    81  		gcmMsg, _, _ := Sm4GCM(key, IV, data, A, true)
    82  		_, _, err := Sm4GCM(key, IV, gcmMsg, A, false)
    83  		if err != nil {
    84  			t.Fatal(err)
    85  		}
    86  	}
    87  }