sha256withrsa_verifier_test.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. package verifiers
  3. import (
  4. "context"
  5. "crypto/x509"
  6. "git.nanodreamtech.com/sg/wechatpay-go/core/auth"
  7. "testing"
  8. "git.nanodreamtech.com/sg/wechatpay-go/core"
  9. "git.nanodreamtech.com/sg/wechatpay-go/utils"
  10. )
  11. const (
  12. testWechatPayVerifierPlatformSerialNumber = "F5765756002FDD77"
  13. testWechatPayVerifierPlatformCertificate = `-----BEGIN CERTIFICATE-----
  14. MIIDVzCCAj+gAwIBAgIJAPV2V1YAL913MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV
  15. BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
  16. Q29tcGFueSBMdGQwHhcNMjEwNDI3MDg0MDMyWhcNMzEwNDI1MDg0MDMyWjBCMQsw
  17. CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
  18. dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
  19. 2VCTd91fnUn73Xy9DLvt/V62TVxRTEEstVdeRaZ3B3leO0pldE806mXO4RwdHXag
  20. HQ4vGeZN0yqm++rDsGK+U3AH7kejyD2pXshNP9Cq5YwbptiLGtjcquw4HNxJQUOm
  21. DeJf2vg6byms9RUipiq4SzbJKqJFlUpbuIPDpSpWz10PYmyCNeDGUUK65E5h2B83
  22. 4uxl1zNLYQCrkdBzb8oUxwYeP5a2DNxmjL5lsJML7DGr5znsevnoqGRwTm9fxCGf
  23. y8wus7hwKz6clt3Whmmda7UAdb1c08hEQFVRbF14AR73xbnd8N0obCWJPCbzMCtk
  24. aSef4FdEEgEXJiw0VAJT8wIDAQABo1AwTjAdBgNVHQ4EFgQUT1c7nd/SUO76HSoZ
  25. umNUJv1R5PwwHwYDVR0jBBgwFoAUT1c7nd/SUO76HSoZumNUJv1R5PwwDAYDVR0T
  26. BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAM+tslqBxYwqL9fdvGG6hfy69sjfX
  27. UhBtBLWYugKKQCOWWLeq5dDWm3i5Cx2Rgiy9uc7RfmJNxQfIKlcoCNP85BjDoG1B
  28. YnVc6znlcrT9uHgseha3987WwZsFAQbcy8TLUYHzVB8gmDgq8O08xdIe0eczatI8
  29. t3Rg8WXO6Gs66JJ4JR+rD01o3FiSOQCRWhn19NSyDydsgPlOR2t9B9L+MkJwlsMG
  30. Krn85TnwL3qcInzRnU8X86faXXJrI0IJi44tECKw8ftngCl6vyNwNNKPDwdkcuuV
  31. 8y3iBixO5IuKxEKEp2wGPV/4W1AXO73Z3Gb7z/1oxdgeO0hVqz1hBasTCQ==
  32. -----END CERTIFICATE-----`
  33. testExpectedSignature = "BKyAfU4iMCuvXMXS0Wzam3V/cnxZ+JaqigPM5OhljS2iOT95OO6Fsuml2JkFANJU9" +
  34. "K6q9bLlDhPXuoVz+pp4hAm6pHU4ld815U4jsKu1RkyaII+1CYBUYC8TK0XtJ8FwUXXz8vZHh58rrAVN1XwNyv" +
  35. "D1vfpxrMT4SL536GLwvpUHlCqIMzoZUguLli/K8V29QiOhuH6IEqLNJn8e9b3nwNcQ7be3CzYGpDAKBfDGPCq" +
  36. "Cv8Rw5zndhlffk2FEA70G4hvMwe51qMN/RAJbknXG23bSlObuTCN7Ndj1aJGH6/L+hdwfLpUtJm4QYVazzW7D" +
  37. "FD27EpSQEqA8bX9+8m1rLg=="
  38. )
  39. var (
  40. certificate *x509.Certificate
  41. )
  42. func init() {
  43. certificate, _ = utils.LoadCertificate(testWechatPayVerifierPlatformCertificate)
  44. }
  45. func TestWechatPayVerifier_Verify(t *testing.T) {
  46. type fields struct {
  47. Certificates map[string]*x509.Certificate
  48. }
  49. type args struct {
  50. ctx context.Context
  51. serialNumber string
  52. message string
  53. signature string
  54. }
  55. tests := []struct {
  56. name string
  57. fields fields
  58. args args
  59. wantErr bool
  60. }{
  61. {
  62. name: "verify success",
  63. fields: fields{
  64. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  65. },
  66. args: args{
  67. ctx: context.Background(),
  68. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  69. signature: testExpectedSignature,
  70. message: "source",
  71. },
  72. wantErr: false,
  73. },
  74. {
  75. name: "verify failed",
  76. fields: fields{
  77. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  78. },
  79. args: args{
  80. ctx: context.Background(),
  81. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  82. signature: testExpectedSignature,
  83. message: "wrong source",
  84. },
  85. wantErr: true,
  86. },
  87. {
  88. name: "verify failed with null context",
  89. fields: fields{
  90. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  91. },
  92. args: args{
  93. ctx: nil,
  94. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  95. signature: testExpectedSignature,
  96. message: "source",
  97. },
  98. wantErr: true,
  99. },
  100. {
  101. name: "verify failed with empty serialNumber",
  102. fields: fields{
  103. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  104. },
  105. args: args{
  106. ctx: context.Background(),
  107. serialNumber: "",
  108. signature: testExpectedSignature,
  109. message: "source",
  110. },
  111. wantErr: true,
  112. },
  113. {
  114. name: "verify failed with empty message",
  115. fields: fields{
  116. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  117. },
  118. args: args{
  119. ctx: context.Background(),
  120. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  121. signature: testExpectedSignature,
  122. message: "",
  123. },
  124. wantErr: true,
  125. },
  126. {
  127. name: "verify failed with empty signature",
  128. fields: fields{
  129. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  130. },
  131. args: args{
  132. ctx: context.Background(),
  133. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  134. signature: "",
  135. message: "source",
  136. },
  137. wantErr: true,
  138. },
  139. {
  140. name: "verify failed with no cert getter",
  141. fields: fields{
  142. Certificates: nil,
  143. },
  144. args: args{
  145. ctx: context.Background(),
  146. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  147. signature: testExpectedSignature,
  148. message: "source",
  149. },
  150. wantErr: true,
  151. },
  152. {
  153. name: "verify failed with non-base64 signature",
  154. fields: fields{
  155. Certificates: map[string]*x509.Certificate{testWechatPayVerifierPlatformSerialNumber: certificate},
  156. },
  157. args: args{
  158. ctx: context.Background(),
  159. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  160. signature: "invalid base64 signature",
  161. message: "source",
  162. },
  163. wantErr: true,
  164. },
  165. {
  166. name: "verify failed with no corresponding certificate",
  167. fields: fields{Certificates: map[string]*x509.Certificate{}},
  168. args: args{
  169. ctx: context.Background(),
  170. serialNumber: testWechatPayVerifierPlatformSerialNumber,
  171. signature: testExpectedSignature,
  172. message: "source",
  173. },
  174. wantErr: true,
  175. },
  176. }
  177. for _, tt := range tests {
  178. t.Run(tt.name, func(t *testing.T) {
  179. var verifier auth.Verifier
  180. if tt.fields.Certificates == nil {
  181. verifier = NewSHA256WithRSAVerifier(nil)
  182. } else {
  183. verifier = NewSHA256WithRSAVerifier(core.NewCertificateMap(tt.fields.Certificates))
  184. }
  185. if err := verifier.Verify(tt.args.ctx, tt.args.serialNumber, tt.args.message,
  186. tt.args.signature); (err != nil) != tt.wantErr {
  187. t.Errorf("Verify() error = %v, wantErr %v", err, tt.wantErr)
  188. }
  189. })
  190. }
  191. }