crypto/sign/xupersign.go
(完整代码) 1KB// Package sign is the ECDSA sign and verify implementation
package sign
import (
"crypto/ecdsa"
"crypto/rand"
"encoding/json"
"fmt"
"github.com/xuperchain/xuperunion/crypto/common"
)
// XuperSign sign message using private key for all kinds of signatures
func XuperSign(k *ecdsa.PrivateKey, msg []byte) (signature []byte, err error) {
if k.D == nil || k.X == nil || k.Y == nil {
return nil, fmt.Errorf("Invalid private key")
}
r, s, err := ecdsa.Sign(rand.Reader, k, msg)
if err != nil {
return nil, err
}
// 生成ECDSA签名:(sum(S), R)
ecdsaSig := &common.ECDSASignature{
R: r,
S: s,
}
// 生成超级签名
// 转换json
sigContent, err := json.Marshal(ecdsaSig)
if err != nil {
return nil, err
}
xuperSig := &common.XuperSignature{
SigType: common.ECDSA,
SigContent: sigContent,
}
sig, err := json.Marshal(xuperSig)
if err != nil {
return nil, err
}
return sig, nil
}
// XuperVerify verify message's signature using public key for all kinds of signature
func XuperVerify(k *ecdsa.PublicKey, sig, msg []byte) (valid bool, err error) {
// r, s, err := utils.UnmarshalECDSASignature(signature)
signature := new(common.ECDSASignature)
err = json.Unmarshal(sig, signature)
if err != nil {
return false, fmt.Errorf("Failed to unmarshal the ecdsa signature [%s]", err)
}
return ecdsa.Verify(k, msg, signature.R, signature.S), nil
}
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
