fabric-bccsp-sign实例

fabric bccsp的sign 到底是什么含义? 做了什么操作?按照下面的代码进行验证

func TestEcdsaSignerSign(t *testing.T) {
	t.Parallel()

	signer := &ecdsaSigner{}
	verifierPrivateKey := &ecdsaPrivateKeyVerifier{}
	verifierPublicKey := &ecdsaPublicKeyKeyVerifier{}

	// Generate a key
	lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
	require.NoError(t, err)
	k := &ecdsaPrivateKey{lowLevelKey}
	pk, err := k.PublicKey()
	require.NoError(t, err)

	// Sign
	msg := []byte("Hello World")
	sigma, err := signer.Sign(k, msg, nil)
	require.NoError(t, err)
	require.NotNil(t, sigma)

	// Verify
	valid, err := verifyECDSA(&lowLevelKey.PublicKey, sigma, msg, nil)
	require.NoError(t, err)
	require.True(t, valid)

	valid, err = verifierPrivateKey.Verify(k, sigma, msg, nil)
	require.NoError(t, err)
	require.True(t, valid)

	valid, err = verifierPublicKey.Verify(pk, sigma, msg, nil)
	require.NoError(t, err)
	require.True(t, valid)
}

(1) 构造实例,ecdsaSigner,ecdsaPrivateVerifier, ecdsaPublicKetKeyVerifier

type ecdsaSigner struct{}

func (s *ecdsaSigner) Sign(k bccsp.Key, digest []byte, opts bccsp.SignerOpts) ([]byte, error) {
	return signECDSA(k.(*ecdsaPrivateKey).privKey, digest, opts)
}

type ecdsaPrivateKeyVerifier struct{}

func (v *ecdsaPrivateKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (bool, error) {
	return verifyECDSA(&(k.(*ecdsaPrivateKey).privKey.PublicKey), signature, digest, opts)
}

type ecdsaPublicKeyKeyVerifier struct{}

func (v *ecdsaPublicKeyKeyVerifier) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (bool, error) {
	return verifyECDSA(k.(*ecdsaPublicKey).pubKey, signature, digest, opts)
}

(2) 生成一个Key

lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)

(3) 用这个key构造ecdsaPrivateKey

k := &ecdsaPrivateKey{lowLevelKey}

(4) 用私钥对信息进行签名

参数是私钥和信息

msg := []byte("Hello World")
sigma, err := signer.Sign(k, msg, nil)

   

(5) 验证公钥,签名和信息

valid, err := verifyECDSA(&lowLevelKey.PublicKey, sigma, msg, nil)



func verifyECDSA(k *ecdsa.PublicKey, signature, digest []byte, opts bccsp.SignerOpts) (bool, error) {
	r, s, err := utils.UnmarshalECDSASignature(signature)
	if err != nil {
		return false, fmt.Errorf("Failed unmashalling signature [%s]", err)
	}

	lowS, err := utils.IsLowS(k, s)
	if err != nil {
		return false, err
	}

	if !lowS {
		return false, fmt.Errorf("Invalid S. Must be smaller than half the order [%s][%s].", s, utils.GetCurveHalfOrdersAt(k.Curve))
	}

	return ecdsa.Verify(k, digest, r, s), nil
}

(5-1) 验证过程

r, s, err := utils.UnmarshalECDSASignature(signature)

就是从签名中解码出信息

 

(5-2) 检查k 是否是low-s,lowS返回true

lowS, err := utils.IsLowS(k, s)

(5-3) 调用ecdsa的verify方法

Verify使用公钥pub验证哈希的r, s中的签名。它的返回值记录签名是否有效。具体的方法有点复杂,再不细看。

return ecdsa.Verify(k, digest, r, s), nil

(6)验证私钥和签名、信息之间

valid, err = verifierPrivateKey.Verify(k, sigma, msg, nil)

同样调用的是verifyECDSA,但是参数不同

return verifyECDSA(&(k.(*ecdsaPrivateKey).privKey.PublicKey), signature, digest, opts)

(7) 验证公钥和签名、信息之间的关系

valid, err = verifierPublicKey.Verify(pk, sigma, msg, nil)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值