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 }