@@ -21,11 +21,112 @@ import (
2121 "crypto/aes"
2222 "crypto/cipher"
2323 "crypto/rand"
24+ "fmt"
25+ "github.com/pkg/errors"
26+ "github.com/tjfoc/gmsm/sm4"
2427 "io"
28+ )
2529
26- "github.com/pkg/errors"
30+ type CryptoType int
31+
32+ const (
33+ CryptoAESGCM CryptoType = iota
34+ CryptoAESCBC
35+ CryptoAESECB
36+ CryptoAESCFB
37+ CryptoSM4GCM
38+ CryptoSM4ECB
39+ CryptoSM4CBC
40+ CryptoSM4CFB
41+ CryptoSM4OFB
2742)
2843
44+ func (c * CryptoType ) UnmarshalText (text []byte ) error {
45+ if c == nil {
46+ return errors .New ("can't unmarshal a nil *CryptoType" )
47+ }
48+ if ! c .unmarshalText (bytes .ToLower (text )) {
49+ return fmt .Errorf ("unrecognized protocol type: %q" , text )
50+ }
51+ return nil
52+ }
53+
54+ func (c * CryptoType ) unmarshalText (text []byte ) bool {
55+ switch string (text ) {
56+ case "aesgcm" :
57+ * c = CryptoAESGCM
58+ case "aescbc" :
59+ * c = CryptoAESCBC
60+ case "aesecb" :
61+ * c = CryptoAESECB
62+ case "aescfb" :
63+ * c = CryptoAESCFB
64+ case "sm4gcm" :
65+ * c = CryptoSM4GCM
66+ case "sm4ecb" :
67+ * c = CryptoSM4ECB
68+ case "sm4cbc" :
69+ * c = CryptoSM4CBC
70+ case "sm4cfb" :
71+ * c = CryptoSM4CFB
72+ case "sm4ofb" :
73+ * c = CryptoSM4OFB
74+ default :
75+ return false
76+ }
77+ return true
78+ }
79+
80+ func CryptoEncrypt (data []byte , key []byte , iv []byte , cryptoType CryptoType ) ([]byte , error ) {
81+ switch cryptoType {
82+ case CryptoAESGCM :
83+ return AesEncryptGCM (data , key , iv )
84+ case CryptoAESCBC :
85+ return AesEncryptCBC (data , key , iv )
86+ case CryptoAESECB :
87+ return AesEncryptECB (data , key )
88+ case CryptoAESCFB :
89+ return AesEncryptCFB (data , key )
90+ case CryptoSM4GCM :
91+ return Sm4EncryptGCM (data , key , iv )
92+ case CryptoSM4ECB :
93+ return Sm4EncryptECB (data , key )
94+ case CryptoSM4CBC :
95+ return Sm4EncryptCBC (data , key , iv )
96+ case CryptoSM4CFB :
97+ return Sm4EncryptCFB (data , key , iv )
98+ case CryptoSM4OFB :
99+ return Sm4EncryptOFB (data , key , iv )
100+ default :
101+ return AesEncryptGCM (data , key , iv )
102+ }
103+ }
104+
105+ func CryptoDecrypt (encrypted []byte , key []byte , iv []byte , cryptoType CryptoType ) ([]byte , error ) {
106+ switch cryptoType {
107+ case CryptoAESGCM :
108+ return AesDecryptGCM (encrypted , key , iv )
109+ case CryptoAESCBC :
110+ return AesDecryptCBC (encrypted , key , iv )
111+ case CryptoAESECB :
112+ return AesDecryptECB (encrypted , key )
113+ case CryptoAESCFB :
114+ return AesDecryptCFB (encrypted , key )
115+ case CryptoSM4GCM :
116+ return Sm4DecryptGCM (encrypted , key , iv )
117+ case CryptoSM4ECB :
118+ return Sm4DecryptECB (encrypted , key )
119+ case CryptoSM4CBC :
120+ return Sm4DecryptCBC (encrypted , key , iv )
121+ case CryptoSM4CFB :
122+ return Sm4DecryptCFB (encrypted , key , iv )
123+ case CryptoSM4OFB :
124+ return Sm4DecryptOFB (encrypted , key , iv )
125+ default :
126+ return AesDecryptGCM (encrypted , key , iv )
127+ }
128+ }
129+
29130func AesEncryptGCM (origData []byte , key []byte , iv []byte ) (encrypted []byte , err error ) {
30131 var block cipher.Block
31132 block , err = aes .NewCipher (key )
@@ -178,3 +279,88 @@ func AesDecryptCFB(encrypted []byte, key []byte) (decrypted []byte, err error) {
178279 stream .XORKeyStream (encrypted , encrypted )
179280 return encrypted , err
180281}
282+
283+ func Sm4EncryptGCM (origData , key []byte , iv []byte ) (encrypted []byte , err error ) {
284+ // Sm4GCM /**
285+ // key: 对称加密密钥
286+ // IV: IV向量
287+ // in:
288+ // A: 附加的可鉴别数据(ADD)
289+ // mode: true - 加密; false - 解密验证
290+ //
291+ // return: 密文C, 鉴别标签T, 错误
292+ encrypted , _ , err = sm4 .Sm4GCM (key , iv , origData , []byte {}, true )
293+ if err != nil {
294+ return nil , err
295+ }
296+ return encrypted , nil
297+ }
298+
299+ func Sm4DecryptGCM (encrypted , key []byte , iv []byte ) (decrypted []byte , err error ) {
300+ decrypted , _ , err = sm4 .Sm4GCM (key , iv , encrypted , []byte {}, true )
301+ if err != nil {
302+ return nil , err
303+ }
304+ return decrypted , nil
305+ }
306+
307+ func Sm4EncryptECB (origData , key []byte ) (encrypted []byte , err error ) {
308+ return sm4 .Sm4Ecb (key , origData , true )
309+ }
310+
311+ func Sm4DecryptECB (encrypted , key []byte ) (decrypted []byte , err error ) {
312+ return sm4 .Sm4Ecb (key , encrypted , false )
313+ }
314+
315+ func Sm4EncryptCBC (origData , key , iv []byte ) (encrypted []byte , err error ) {
316+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
317+ return nil , err
318+ }
319+ return sm4 .Sm4Cbc (key , origData , true )
320+ }
321+
322+ func Sm4DecryptCBC (encrypted , key , iv []byte ) (decrypted []byte , err error ) {
323+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
324+ return nil , err
325+ }
326+ return sm4 .Sm4Cbc (key , encrypted , false )
327+ }
328+
329+ func Sm4EncryptCFB (origData , key , iv []byte ) (encrypted []byte , err error ) {
330+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
331+ return nil , err
332+ }
333+ return sm4 .Sm4CFB (key , origData , true )
334+ }
335+
336+ func Sm4DecryptCFB (encrypted , key , iv []byte ) (decrypted []byte , err error ) {
337+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
338+ return nil , err
339+ }
340+ return sm4 .Sm4CFB (key , encrypted , false )
341+ }
342+
343+ func Sm4EncryptOFB (origData , key , iv []byte ) (encrypted []byte , err error ) {
344+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
345+ return nil , err
346+ }
347+ return sm4 .Sm4OFB (key , origData , true )
348+ }
349+
350+ func Sm4DecryptOFB (encrypted , key , iv []byte ) (decrypted []byte , err error ) {
351+ if err = sm4 .SetIV (EnsureByteArrayLength16 (iv )); err != nil {
352+ return nil , err
353+ }
354+ return sm4 .Sm4OFB (key , encrypted , false )
355+ }
356+
357+ func EnsureByteArrayLength16 (input []byte ) []byte {
358+ if len (input ) == 16 {
359+ return input
360+ }
361+ repeated := append (input , input ... )
362+ for len (repeated ) < 16 {
363+ repeated = append (repeated , input ... )
364+ }
365+ return repeated [:16 ]
366+ }
0 commit comments