sha256withrsa_pubkey_verifier.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // Copyright 2024 Tencent Inc. All rights reserved.
  2. // Package verifiers 微信支付 API v3 Go SDK 数字签名验证器
  3. package verifiers
  4. import (
  5. "context"
  6. "crypto"
  7. "crypto/rsa"
  8. "crypto/sha256"
  9. "encoding/base64"
  10. "fmt"
  11. )
  12. // SHA256WithRSAPubkeyVerifier 数字签名验证器,使用微信支付提供的公钥验证签名
  13. type SHA256WithRSAPubkeyVerifier struct {
  14. keyID string
  15. publicKey rsa.PublicKey
  16. }
  17. // Verify 使用微信支付提供的公钥验证签名
  18. func (v *SHA256WithRSAPubkeyVerifier) Verify(ctx context.Context, serialNumber, message, signature string) error {
  19. if ctx == nil {
  20. return fmt.Errorf("verify failed: context is nil")
  21. }
  22. if v.keyID != serialNumber {
  23. return fmt.Errorf("verify failed: key-id[%s] does not match serial number[%s]", v.keyID, serialNumber)
  24. }
  25. sigBytes, err := base64.StdEncoding.DecodeString(signature)
  26. if err != nil {
  27. return fmt.Errorf("verify failed: signature is not base64 encoded")
  28. }
  29. hashed := sha256.Sum256([]byte(message))
  30. err = rsa.VerifyPKCS1v15(&v.publicKey, crypto.SHA256, hashed[:], sigBytes)
  31. if err != nil {
  32. return fmt.Errorf("verify signature with public key error:%s", err.Error())
  33. }
  34. return nil
  35. }
  36. // GetSerial 获取可验签的公钥序列号
  37. func (v *SHA256WithRSAPubkeyVerifier) GetSerial(ctx context.Context) (string, error) {
  38. return v.keyID, nil
  39. }
  40. // NewSHA256WithRSAPubkeyVerifier 使用 rsa.PublicKey 初始化验签器
  41. func NewSHA256WithRSAPubkeyVerifier(keyID string, publicKey rsa.PublicKey) *SHA256WithRSAPubkeyVerifier {
  42. return &SHA256WithRSAPubkeyVerifier{keyID: keyID, publicKey: publicKey}
  43. }