gitee.com/lh-her-team/common@v1.5.1/crypto/sdf/crypto.go (about) 1 package sdf 2 3 import ( 4 "encoding/asn1" 5 "fmt" 6 "math/big" 7 8 "github.com/pkg/errors" 9 10 "gitee.com/lh-her-team/common/crypto/hsm" 11 12 "gitee.com/lh-her-team/common/crypto/sdf/base" 13 "github.com/tjfoc/gmsm/sm2" 14 ) 15 16 type SDFKey struct { 17 KeyId uint 18 KeyPwd []byte 19 KeyType SDFKeyType 20 } 21 22 func (h *SDFHandle) GenerateRandom(length int) ([]byte, error) { 23 session, err := h.getSession() 24 if err != nil { 25 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 26 } 27 defer h.returnSession(err, session) 28 return h.ctx.SDFGenerateRandom(session, uint(length)) 29 } 30 31 // Sign signs the input with a given mechanism. 32 func (h *SDFHandle) ECCInternalSign(key SDFKey, msg []byte) ([]byte, error) { 33 session, err := h.getSession() 34 if err != nil { 35 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 36 } 37 defer h.returnSession(err, session) 38 { 39 /* 40 check pwd 41 this depends on HSM vendors :-( 42 */ 43 accessKeyId, need := hsm.GetHSMAdapter("").SDF_GetSM2KeyAccessRight(int(key.KeyId)) 44 if need { 45 err = h.ctx.SDFGetPrivateKeyAccessRight(session, uint(accessKeyId), key.KeyPwd, uint(len(key.KeyPwd))) 46 if err != nil { 47 return nil, errors.WithMessage(err, "failed to SDFGetPrivateKeyAccessRight before sign") 48 } 49 } 50 } 51 sign, err := h.ctx.SDFInternalSign_ECC(session, key.KeyId, msg, uint(len(msg))) 52 if err != nil { 53 return nil, errors.WithMessage(err, "failed to SDFInternalSign_ECC") 54 } 55 r := big.NewInt(0).SetBytes([]byte(sign.R)) 56 s := big.NewInt(0).SetBytes([]byte(sign.S)) 57 return asn1.Marshal(ECCSignature{r, s}) 58 } 59 60 // Verify verifies a signature over a message with a given mechanism. 61 func (h *SDFHandle) Verify(key SDFKey, msg []byte, sig base.ECCSignature) error { 62 session, err := h.getSession() 63 if err != nil { 64 return fmt.Errorf("[SDF] error: fail to get session [%s]", err) 65 } 66 defer h.returnSession(err, session) 67 err = h.ctx.SDFInternalVerify_ECC(session, key.KeyId, msg, uint(len(msg)), sig) 68 if err != nil { 69 return err 70 } 71 return nil 72 } 73 74 // Encrypt encrypts a plaintext with a given mechanism. 75 func (h *SDFHandle) Encrypt(key SDFKey, plain []byte) ([]byte, error) { 76 session, err := h.getSession() 77 if err != nil { 78 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 79 } 80 defer h.returnSession(err, session) 81 { 82 /* 83 check pwd 84 this depends on HSM vendors :-( 85 */ 86 accessKeyId, need := hsm.GetHSMAdapter("").SDF_GetSM2KeyAccessRight(int(key.KeyId)) 87 if need { 88 err = h.ctx.SDFGetPrivateKeyAccessRight(session, uint(accessKeyId), key.KeyPwd, uint(len(key.KeyPwd))) 89 if err != nil { 90 return nil, err 91 } 92 } 93 } 94 out, err := h.ctx.SDFInternalEncrypt_ECC(session, key.KeyId, base.SGD_SM2_3, plain, uint(len(plain))) 95 if err != nil { 96 return nil, errors.WithMessagef(err, "failed to execute sm2 encrypt") 97 } 98 return asn1.Marshal(out) 99 } 100 101 // Encrypt encrypts a plaintext with a given mechanism. 102 func (h *SDFHandle) Decrypt(key SDFKey, cipher []byte) ([]byte, error) { 103 session, err := h.getSession() 104 if err != nil { 105 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 106 } 107 defer h.returnSession(err, session) 108 { 109 /* 110 check pwd 111 this depends on HSM vendors :-( 112 */ 113 accessKeyId, need := hsm.GetHSMAdapter("").SDF_GetSM2KeyAccessRight(int(key.KeyId)) 114 if need { 115 err = h.ctx.SDFGetPrivateKeyAccessRight(session, uint(accessKeyId), key.KeyPwd, uint(len(key.KeyPwd))) 116 if err != nil { 117 return nil, err 118 } 119 } 120 } 121 return nil, nil 122 } 123 124 // GenKeyPair returns asym keypair 125 func (h *SDFHandle) GenKeyPair() (pri *base.ECCrefPrivateKey, pub *base.ECCrefPublicKey, err error) { 126 session, err := h.getSession() 127 if err != nil { 128 return nil, nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 129 } 130 defer h.returnSession(err, session) 131 pubHandle, privHandle, err := h.ctx.SDFGenerateKeyPair_ECC(session, base.SGD_SM2, 256) 132 if err != nil { 133 return nil, nil, err 134 } 135 return &privHandle, &pubHandle, nil 136 } 137 138 // GenerateKey returns sym key 139 func (h *SDFHandle) GenerateKey(length int) ([]byte, error) { 140 session, err := h.getSession() 141 if err != nil { 142 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 143 } 144 defer h.returnSession(err, session) 145 randomBytes, err := h.ctx.SDFGenerateRandom(session, uint(length)) 146 if err != nil { 147 return nil, err 148 } 149 return randomBytes, nil 150 } 151 152 // ExportECDSAPublicKey export a ecdsa/sm2 public key of pkcs11 ecdsa/sm2 private key 153 func (h *SDFHandle) ExportECDSAPublicKey(key SDFKey) (interface{}, error) { 154 session, err := h.getSession() 155 if err != nil { 156 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 157 } 158 defer h.returnSession(err, session) 159 pub, err := h.ctx.SDFExportSignPublicKey_ECC(session, key.KeyId) 160 if err != nil { 161 return nil, err 162 } 163 x, y := big.NewInt(0), big.NewInt(0) 164 x.SetBytes([]byte(pub.X)) 165 y.SetBytes([]byte(pub.Y)) 166 sm2PubKey := &sm2.PublicKey{ 167 Curve: sm2.P256Sm2(), 168 X: x, 169 Y: y, 170 } 171 return sm2PubKey, err 172 } 173 174 // Encrypt encrypts a plaintext with a given mechanism. 175 func (h *SDFHandle) SymEncrypt(keyHandle base.SessionHandle, mode uint, iv []byte, plain []byte) ([]byte, error) { 176 session, err := h.getSession() 177 if err != nil { 178 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 179 } 180 defer h.returnSession(err, session) 181 iv2 := make([]byte, len(iv)) 182 copy(iv2, iv) 183 encData, encDataLength, err := h.ctx.SDFEncrypt(session, keyHandle, mode, iv2, plain, uint(len(plain))) 184 if err != nil { 185 return nil, errors.WithMessage(err, "failed to encrypt") 186 } 187 return encData[:encDataLength], nil 188 } 189 190 // Encrypt encrypts a plaintext with a given mechanism. 191 func (h *SDFHandle) SymDecrypt(keyHandle base.SessionHandle, mode uint, iv []byte, cipher []byte) ([]byte, error) { 192 session, err := h.getSession() 193 if err != nil { 194 return nil, fmt.Errorf("[SDF] error: fail to get session [%s]", err) 195 } 196 defer h.returnSession(err, session) 197 iv2 := make([]byte, len(iv)) 198 copy(iv2, iv) 199 decdata, decdataLength, err := h.ctx.SDFDecrypt(session, keyHandle, mode, iv2, cipher, uint(len(cipher))) 200 if err != nil { 201 return nil, errors.WithMessage(err, "failed to decrypt") 202 } 203 return decdata[:decdataLength], nil 204 }