sha256withrsa_signer_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. package signers
  3. import (
  4. "context"
  5. "crypto/rsa"
  6. "fmt"
  7. "strings"
  8. "testing"
  9. "github.com/agiledragon/gomonkey"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. "github.com/wechatpay-apiv3/wechatpay-go/core/auth"
  13. "github.com/wechatpay-apiv3/wechatpay-go/utils"
  14. )
  15. const (
  16. testPrivateKeyStr = `-----BEGIN TESTING KEY-----
  17. MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDZUJN33V+dSfvd
  18. fL0Mu+39XrZNXFFMQSy1V15FpncHeV47SmV0TzTqZc7hHB0ddqAdDi8Z5k3TKqb7
  19. 6sOwYr5TcAfuR6PIPaleyE0/0KrljBum2Isa2Nyq7Dgc3ElBQ6YN4l/a+DpvKaz1
  20. FSKmKrhLNskqokWVSlu4g8OlKlbPXQ9ibII14MZRQrrkTmHYHzfi7GXXM0thAKuR
  21. 0HNvyhTHBh4/lrYM3GaMvmWwkwvsMavnOex6+eioZHBOb1/EIZ/LzC6zuHArPpyW
  22. 3daGaZ1rtQB1vVzTyERAVVFsXXgBHvfFud3w3ShsJYk8JvMwK2RpJ5/gV0QSARcm
  23. LDRUAlPzAgMBAAECggEBAMc7rDeUaXiWv6bMGbZ3BTXpg1FhdddnWUnYE8HfX/km
  24. OFI7XtBHXcgYFpcjYz4D5787pcsk7ezPidAj58zqenuclmjKnUmT3pfbI5eCA2v4
  25. C9HnbYDrmUPK1ZcADtka4D6ScDccpNYNa1g2TFHzkIrEa6H+q7S3O2fqxY/DRVtN
  26. 0JIXalBb8daaqL5QVzSmM2BMVnHy+YITJWIkP2a3pKs9C0W65JGDsnG0wVrHinHF
  27. +cnhFZIbaPEI//DAFMc9NkrWOKVRTEgcCUxCFaHOZVNxDWZD7A2ZfJB2rK6eg//y
  28. gEiFDR2h6mTaDowMB4YF2n2dsIO4/dCG8vPHI20jn4ECgYEA/ZGu6lEMlO0XZnam
  29. AZGtiNgLcCfM/C2ZERZE7QTRPZH1WdK92Al9ndldsswFw4baJrJLCmghjF/iG4zi
  30. hhBvLnOLksnZUfjdumxoHDWXo2QBWbI5QsWIE7AuTiWgWj1I7X4fCXSQf6i+M/y2
  31. 6TogQ7d0ANpZFyOkTNMn/tiJvLECgYEA22XqlamG/yfAGWery5KNH2DGlTIyd6xJ
  32. WtJ9j3jU99lZ0bCQ5xhiBbU9ImxCi3zgTsoqLWgA/p00HhNFNoUcTl9ofc0G3zwT
  33. D1y0ZzcnVKxGJdZ6ohW52V0hJStAigtjYAsUgjm7//FH7PiQDBDP1Wa6xSRkDQU/
  34. aSbQxvEE8+MCgYEA3bb8krW7opyM0XL9RHH0oqsFlVO30Oit5lrqebS0oHl3Zsr2
  35. ZGgoBlWBsEzk3UqUhTFwm/DhJLTSJ/TQPRkxnhQ5/mewNhS9C7yua7wQkzVmWN+V
  36. YeUGTvDGDF6qDz12/vJAgSwDDRym8x4NcXD5tTw7mmNRcwIfL22SkysThIECgYAV
  37. BgccoEoXWS/HP2/u6fQr9ZIR6eV8Ij5FPbZacTG3LlS1Cz5XZra95UgebFFUHHtC
  38. EY1JHJY7z8SWvTH8r3Su7eWNaIAoFBGffzqqSVazfm6aYZsOvRY6BfqPHT3p/H1h
  39. Tq6AbBffxrcltgvXnCTORjHPglU0CjSxVs7awW3AEQKBgB5WtaC8VLROM7rkfVIq
  40. +RXqE5vtJfa3e3N7W3RqxKp4zHFAPfr82FK5CX2bppEaxY7SEZVvVInKDc5gKdG/
  41. jWNRBmvvftZhY59PILHO2X5vO4FXh7suEjy6VIh0gsnK36mmRboYIBGsNuDHjXLe
  42. BDa+8mDLkWu5nHEhOxy2JJZl
  43. -----END TESTING KEY-----`
  44. testCertificateSerial = `F5765756002FDD77`
  45. testExpectedSignature = "BKyAfU4iMCuvXMXS0Wzam3V/cnxZ+JaqigPM5OhljS2iOT95OO6Fsuml2JkFANJU9K6q9bLlDhPXuoVz+pp4hAm6" +
  46. "pHU4ld815U4jsKu1RkyaII+1CYBUYC8TK0XtJ8FwUXXz8vZHh58rrAVN1XwNyvD1vfpxrMT4SL536GLwvpUHlCqIMzoZUguLli/K8V29QiOh" +
  47. "uH6IEqLNJn8e9b3nwNcQ7be3CzYGpDAKBfDGPCqCv8Rw5zndhlffk2FEA70G4hvMwe51qMN/RAJbknXG23bSlObuTCN7Ndj1aJGH6/L+hdwf" +
  48. "LpUtJm4QYVazzW7DFD27EpSQEqA8bX9+8m1rLg=="
  49. testMessage = "source"
  50. testMchID = "1234567890"
  51. )
  52. func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
  53. func TestSha256WithRSASigner_Sign(t *testing.T) {
  54. privateKey, err := utils.LoadPrivateKey(testingKey(testPrivateKeyStr))
  55. require.NoError(t, err)
  56. type args struct {
  57. mchID string
  58. certSerial string
  59. privateKey *rsa.PrivateKey
  60. message string
  61. }
  62. tests := []struct {
  63. name string
  64. args args
  65. want *auth.SignatureResult
  66. wantErr bool
  67. mock func()
  68. }{
  69. {
  70. name: "Sha256WithRSASigner_Sign success",
  71. args: args{
  72. mchID: testMchID,
  73. certSerial: testCertificateSerial,
  74. privateKey: privateKey,
  75. message: testMessage,
  76. },
  77. want: &auth.SignatureResult{
  78. MchID: testMchID,
  79. CertificateSerialNo: testCertificateSerial,
  80. Signature: testExpectedSignature,
  81. },
  82. wantErr: false,
  83. },
  84. {
  85. name: "Sha256WithRSASigner_Sign err when unset certificateSerialNo",
  86. args: args{
  87. mchID: testMchID,
  88. certSerial: " ",
  89. privateKey: privateKey,
  90. message: testMessage,
  91. },
  92. wantErr: true,
  93. },
  94. {
  95. name: "Sha256WithRSASigner_Sign err when unset privateKey",
  96. args: args{
  97. mchID: testMchID,
  98. certSerial: testCertificateSerial,
  99. privateKey: nil,
  100. message: testMessage,
  101. },
  102. wantErr: true,
  103. },
  104. }
  105. for _, tt := range tests {
  106. t.Run(
  107. tt.name, func(t *testing.T) {
  108. s := &SHA256WithRSASigner{
  109. MchID: tt.args.mchID,
  110. CertificateSerialNo: tt.args.certSerial,
  111. PrivateKey: tt.args.privateKey,
  112. }
  113. got, err := s.Sign(context.Background(), tt.args.message)
  114. require.Equal(t, tt.wantErr, err != nil)
  115. if err == nil {
  116. require.NotNil(t, got)
  117. assert.Equal(t, tt.want.MchID, got.MchID)
  118. assert.Equal(t, tt.want.CertificateSerialNo, got.CertificateSerialNo)
  119. assert.Equal(t, tt.want.Signature, got.Signature)
  120. }
  121. },
  122. )
  123. }
  124. }
  125. func TestSha256WithRSASigner_SignErrorSignSHA256WithRSA(t *testing.T) {
  126. patches := gomonkey.NewPatches()
  127. defer patches.Reset()
  128. patches.ApplyFunc(
  129. utils.SignSHA256WithRSA, func(source string, privateKey *rsa.PrivateKey) (signature string, err error) {
  130. return "", fmt.Errorf("sign error")
  131. },
  132. )
  133. privateKey, err := utils.LoadPrivateKey(testingKey(testPrivateKeyStr))
  134. require.NoError(t, err)
  135. s := &SHA256WithRSASigner{
  136. MchID: testMchID,
  137. CertificateSerialNo: testCertificateSerial,
  138. PrivateKey: privateKey,
  139. }
  140. result, err := s.Sign(context.Background(), testMessage)
  141. require.Error(t, err)
  142. assert.Nil(t, result)
  143. }
  144. func TestWechatPayVerifier_Algorithm(t *testing.T) {
  145. privateKey, err := utils.LoadPrivateKey(testingKey(testPrivateKeyStr))
  146. require.NoError(t, err)
  147. s := &SHA256WithRSASigner{
  148. MchID: testMchID,
  149. CertificateSerialNo: testCertificateSerial,
  150. PrivateKey: privateKey,
  151. }
  152. assert.Equal(t, "SHA256-RSA2048", s.Algorithm())
  153. }