package sm2m import ( "math/big" "xdx.jelly/xgcl/gmath" "xdx.jelly/xgcl/sm/sm2" ) /* 导入加密密钥de,由sm2签名密钥来解密sm2加密密钥保护结构。 解密de后拆分也同签名密钥拆分 (1+de)^{-1} = de_c*de_s 为了加解密函数一致 */ // ServerDec 服务端计算(serverKey)^(-1)*C1,使用签名密钥解密加密密钥保护结构 func ServerImportKey(serverKey *sm2.PrivateKey, in []byte) ([]byte, error) { if len(in) < 2*sm2.ByteSize() { return []byte{}, ErrIndataError } x := new(big.Int) x.SetBytes(in[:sm2.ByteSize()]) y := new(big.Int) y.SetBytes(in[sm2.ByteSize() : 2*sm2.ByteSize()]) sInv := new(big.Int) sInv.Set(serverKey.D) sInv.ModInverse(sInv, sm2.OrderN()) x, y = sm2.Curve256.ScalarMult(x, y, sInv.Bytes()) out := make([]byte, 0, 2*sm2.ByteSize()) out = append(out, gmath.BigIntToNByte(x, sm2.ByteSize())...) out = append(out, gmath.BigIntToNByte(y, sm2.ByteSize())...) return out, nil }