gitee.com/lh-her-team/common@v1.5.1/crypto/sym/sym_fast.go (about)

     1  //go:build linux
     2  // +build linux
     3  
     4  package sym
     5  
     6  import (
     7  	"encoding/hex"
     8  	"errors"
     9  	"fmt"
    10  
    11  	"gitee.com/lh-her-team/common/crypto/engine"
    12  	"gitee.com/lh-her-team/common/opencrypto"
    13  	gsm4 "gitee.com/lh-her-team/common/opencrypto/gmssl/sm4"
    14  
    15  	"gitee.com/lh-her-team/common/crypto"
    16  	"gitee.com/lh-her-team/common/crypto/sym/aes"
    17  	"gitee.com/lh-her-team/common/crypto/sym/sm4"
    18  )
    19  
    20  var (
    21  	errAESKeyLength = errors.New("aes key len must be 128bit,192bit,256bit")
    22  	errSM4KeyLength = errors.New("sm4 key len must be 128bit")
    23  )
    24  
    25  func GenerateSymKeyStr(keyType crypto.KeyType, keyHex string) (crypto.SymmetricKey, error) {
    26  	key, err := hex.DecodeString(keyHex)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  	return GenerateSymKey(keyType, key)
    31  }
    32  
    33  func GenerateSymKey(keyType crypto.KeyType, key []byte) (crypto.SymmetricKey, error) {
    34  	bits := len(key) * 8
    35  	switch keyType {
    36  	case crypto.AES:
    37  		if bits != int(crypto.BITS_SIZE_128) &&
    38  			bits != int(crypto.BITS_SIZE_192) && bits != int(crypto.BITS_SIZE_256) {
    39  			return nil, errAESKeyLength
    40  		}
    41  		return &aes.AESKey{Key: key}, nil
    42  	case crypto.SM4:
    43  		if bits != int(crypto.BITS_SIZE_128) {
    44  			return nil, errSM4KeyLength
    45  		}
    46  		switch engine.CryptoEngine {
    47  		case opencrypto.GmSSL:
    48  			return gsm4.SM4Key{Key: key}, nil
    49  		}
    50  		return &sm4.SM4Key{Key: key}, nil
    51  	default:
    52  		return nil, fmt.Errorf("unsupport symmetric algorithm")
    53  	}
    54  }