Skip to content

Commit 842b8ae

Browse files
parkerramParker Ram
andauthored
Add SHA256 Verification to SNS (#2743)
* Add SHA256 Verification to SNS * Adding to SNS unit tests Co-authored-by: Parker Ram <[email protected]>
1 parent d2cf492 commit 842b8ae

File tree

3 files changed

+160
-105
lines changed

3 files changed

+160
-105
lines changed

gems/aws-sdk-sns/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Unreleased Changes
22
------------------
33

4+
* Feature - Adding SHA256 message verification
5+
46
1.53.0 (2022-02-24)
57
------------------
68

gems/aws-sdk-sns/lib/aws-sdk-sns/message_verifier.rb

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,15 @@ def authentic?(message_body)
6565
def authenticate!(message_body)
6666
msg = Json.load(message_body)
6767
msg = convert_lambda_msg(msg) if is_from_lambda(msg)
68-
if public_key(msg).verify(sha1, signature(msg), canonical_string(msg))
69-
true
68+
69+
case msg['SignatureVersion']
70+
when '1'
71+
verify!(msg, sha1)
72+
when '2'
73+
verify!(msg, sha256)
7074
else
71-
msg = 'the authenticity of the message cannot be verified'
72-
raise VerificationError, msg
75+
error_msg = 'Invalid SignatureVersion'
76+
raise VerificationError, error_msg
7377
end
7478
end
7579

@@ -88,10 +92,23 @@ def convert_lambda_msg(message)
8892
message
8993
end
9094

95+
def verify!(msg, hash_alg)
96+
if public_key(msg).verify(hash_alg, signature(msg), canonical_string(msg))
97+
true
98+
else
99+
msg = 'the authenticity of the message cannot be verified'
100+
raise VerificationError, msg
101+
end
102+
end
103+
91104
def sha1
92105
OpenSSL::Digest::SHA1.new
93106
end
94107

108+
def sha256
109+
OpenSSL::Digest::SHA256.new
110+
end
111+
95112
def signature(message)
96113
Base64.decode64(message['Signature'])
97114
end

gems/aws-sdk-sns/spec/message_verifier_spec.rb

Lines changed: 137 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -7,67 +7,85 @@ module SNS
77
describe MessageVerifier do
88

99
let(:signing_cert_url) {
10-
"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
10+
"https://sns.us-east-2.amazonaws.com/SimpleNotificationService-7ff5318490ec183fbaddaa2a969abfda.pem"
1111
}
1212

13-
let(:message) { <<-JSON.strip }
13+
let(:message_SHA1) { <<-JSON.strip }
1414
{
1515
"Type" : "Notification",
16-
"MessageId" : "5b324425-3d5e-4fdf-a3f6-f46b8f93df79",
17-
"TopicArn" : "arn:aws:sns:eu-west-1:382739154790:for_justeat_aws_specs",
18-
"Subject" : "sdfghdsfg",
19-
"Message" : "dfgdsfg",
20-
"Timestamp" : "2012-04-30T11:07:54.008Z",
16+
"MessageId" : "792cda85-518f-5dd3-9163-81d851212f3a",
17+
"TopicArn" : "arn:aws:sns:us-east-2:295079676684:publish-and-verify-892f85fe-4836-424d-8188-ab85bef0f362",
18+
"Message" : "Hello world",
19+
"Timestamp" : "2022-07-28T21:23:58.317Z",
2120
"SignatureVersion" : "1",
22-
"Signature" : "CTbst0fA37gbKnC0fiWK6HB0nQOr767MSLCJaWb0GyXc7283m1gozU3lRvOBaKP5Cwcj+clhR+rAN1m0Cp6W63oxBEu9n1Z50oyWx/tWtQd2j+MPaes+tNJSGohjHSe5qAqMwvYFYTZkbgFDFoWuVQLQuRj9I53hR1Eo3waHkJQ=",
21+
"Signature" : "ghtf+deOBAzHJJZ6s6CdRLfTQAlcGzq9naoFM1wi0CJiq//uVRuZnamrkWNF0fhouMFvuLVRwcz8PZLUMSfnmd5VpdTKpTyiKmy1qJAZXma0w+yi7G+I33hD1Jyk1Nbym2n0kqp3fVu2aoooiN2ZeLAT2bH0/BtjLSfN1yAOKNoprco4qV9gGUZinXJdj9a1YdNhDR2jKi33ldlsVtEXAtiaDklGEk7DgRKX38GerBPiLg3FdtgY6KC7cdeGpU/dGK+4hjc83Ive1HoFkAwqhpgInM2sMytBosoiXfCmOKmU4xeGD0gHDNZTlJUJQDlzw8Eag0H9f/5zXF9d3uy0YQ==",
2322
"SigningCertURL" : #{signing_cert_url.inspect},
24-
"UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:382739154790:for_justeat_aws_specs:674f4ab3-2d1d-4df9-b411-b8a336f0ef7d"
23+
"UnsubscribeURL" : "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:295079676684:publish-and-verify-892f85fe-4836-424d-8188-ab85bef0f362:2296bc94-7992-4be1-b15f-b97229b5c1d8"
24+
}
25+
JSON
26+
27+
let(:message_SHA256) { <<-JSON.strip }
28+
{
29+
"Type" : "Notification",
30+
"MessageId" : "17dea24b-55c2-540b-8362-f916557af765",
31+
"TopicArn" : "arn:aws:sns:us-east-2:295079676684:publish-and-verify-62674b1d-4295-426b-88e7-5fb75652a04e",
32+
"Message" : "Hello world",
33+
"Timestamp" : "2022-07-28T21:24:08.324Z",
34+
"SignatureVersion" : "2",
35+
"Signature" : "CXVqp9PfZAL+4JHS3Zxo1PFbQsvnOjvmYhtIf17TWpwc+iIVas8kZ8GopuzVzVMdatE7rCl/O4P91Zp05Dwz8lk8dLhfp8gSu3Njlzxlyrmzo9x3va3Jb7zFnedgS2GKnZWHGBdwTXho+TosNUE+3e10OMSlwN5XGDwX7+R3WL+rn+AXmFAqp3alg27sYa55h1dLE9cGszGPjScPdtF3BmZsUDMx9wSdNKsCk+vSvE8yBjnCmUl7laSFj3LzPVrlSwgNYCF3kYnNAkah7NplK4SFhJYLwS0HCVCQJKa8rVbQLf9cBTu60U402mrgy0bN8xWoyimzbYbrOMJjalqkUg==",
36+
"SigningCertURL" : #{signing_cert_url.inspect},
37+
"UnsubscribeURL" : "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:295079676684:publish-and-verify-62674b1d-4295-426b-88e7-5fb75652a04e:ad7d16e3-0a7c-46aa-b23e-ffaf02250cbe"
2538
}
2639
JSON
2740

2841
let(:lambda_message) { <<-JSON.strip }
2942
{
3043
"Type" : "Notification",
31-
"MessageId" : "5b324425-3d5e-4fdf-a3f6-f46b8f93df79",
32-
"TopicArn" : "arn:aws:sns:eu-west-1:382739154790:for_justeat_aws_specs",
33-
"Subject" : "sdfghdsfg",
34-
"Message" : "dfgdsfg",
35-
"Timestamp" : "2012-04-30T11:07:54.008Z",
44+
"MessageId" : "792cda85-518f-5dd3-9163-81d851212f3a",
45+
"TopicArn" : "arn:aws:sns:us-east-2:295079676684:publish-and-verify-892f85fe-4836-424d-8188-ab85bef0f362",
46+
"Message" : "Hello world",
47+
"Timestamp" : "2022-07-28T21:23:58.317Z",
3648
"SignatureVersion" : "1",
37-
"Signature" : "CTbst0fA37gbKnC0fiWK6HB0nQOr767MSLCJaWb0GyXc7283m1gozU3lRvOBaKP5Cwcj+clhR+rAN1m0Cp6W63oxBEu9n1Z50oyWx/tWtQd2j+MPaes+tNJSGohjHSe5qAqMwvYFYTZkbgFDFoWuVQLQuRj9I53hR1Eo3waHkJQ=",
49+
"Signature" : "ghtf+deOBAzHJJZ6s6CdRLfTQAlcGzq9naoFM1wi0CJiq//uVRuZnamrkWNF0fhouMFvuLVRwcz8PZLUMSfnmd5VpdTKpTyiKmy1qJAZXma0w+yi7G+I33hD1Jyk1Nbym2n0kqp3fVu2aoooiN2ZeLAT2bH0/BtjLSfN1yAOKNoprco4qV9gGUZinXJdj9a1YdNhDR2jKi33ldlsVtEXAtiaDklGEk7DgRKX38GerBPiLg3FdtgY6KC7cdeGpU/dGK+4hjc83Ive1HoFkAwqhpgInM2sMytBosoiXfCmOKmU4xeGD0gHDNZTlJUJQDlzw8Eag0H9f/5zXF9d3uy0YQ==",
3850
"SigningCertUrl" : #{signing_cert_url.inspect},
39-
"UnsubscribeUrl" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:382739154790:for_justeat_aws_specs:674f4ab3-2d1d-4df9-b411-b8a336f0ef7d"
51+
"UnsubscribeUrl" : "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:295079676684:publish-and-verify-892f85fe-4836-424d-8188-ab85bef0f362:2296bc94-7992-4be1-b15f-b97229b5c1d8"
4052
}
4153
JSON
54+
4255
let(:cert) { <<-CERT.strip }
4356
-----BEGIN CERTIFICATE-----
44-
MIIE+TCCA+GgAwIBAgIQax6zU8p9DAWTsa4uy9uF1jANBgkqhkiG9w0BAQUFADCB
45-
tTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
46-
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug
47-
YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwOTEvMC0GA1UEAxMm
48-
VmVyaVNpZ24gQ2xhc3MgMyBTZWN1cmUgU2VydmVyIENBIC0gRzIwHhcNMTAxMDA4
49-
MDAwMDAwWhcNMTMxMDA3MjM1OTU5WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
50-
V2FzaGluZ3RvbjEQMA4GA1UEBxQHU2VhdHRsZTEYMBYGA1UEChQPQW1hem9uLmNv
51-
bSBJbmMuMRowGAYDVQQDFBFzbnMuYW1hem9uYXdzLmNvbTCBnzANBgkqhkiG9w0B
52-
AQEFAAOBjQAwgYkCgYEAv8OHcwOX+SpVUpdS6OtB0FbmX6w7FQIXLJyChbcYQ3Ck
53-
gJnrVJ5OFIMYAc+YMbkikXnvu9+MvZx38ZV8hIYBK4y4YSR/fLMzTIqsQXKW7myq
54-
mIeEGGqGrCVVhs0xusCgfNBi64/zczJ3z/KLLzSXZ2Ln18MCCjQ3A8EcuwFeMTsC
55-
AwEAAaOCAdEwggHNMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMEUGA1UdHwQ+MDww
56-
OqA4oDaGNGh0dHA6Ly9TVlJTZWN1cmUtRzItY3JsLnZlcmlzaWduLmNvbS9TVlJT
57-
ZWN1cmVHMi5jcmwwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcXAzAqMCgGCCsGAQUF
58-
BwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMB0GA1UdJQQWMBQGCCsG
59-
AQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBSl7wsRzsBBA6NKZZBIshzgVy19
60-
RzB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlz
61-
aWduLmNvbTBABggrBgEFBQcwAoY0aHR0cDovL1NWUlNlY3VyZS1HMi1haWEudmVy
62-
aXNpZ24uY29tL1NWUlNlY3VyZUcyLmNlcjBuBggrBgEFBQcBDARiMGChXqBcMFow
63-
WDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRLa7kolgYMu9BSOJsprEsHiyEF
64-
GDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvMS5naWYwDQYJKoZI
65-
hvcNAQEFBQADggEBAKcmdO9iRCChdO21L0NaB24f2BFuUZO/y9tsTgC6NJ8p0sJU
66-
+/dKc4p33pnmDE8EGDbImMd/HdVnqQ4nngurjzu7z/mv7247FGaUL/BnqLgOQJiM
67-
YBJtskNd2vKN4kk4I6Z7e2mp2+4tzBL9Sk/x3b297oy4ZXILrBKxr9s9MhyPO1rQ
68-
Mda9v2L3qcjPj38zbNoohEIpu/ilArbbFOUMOqdh7jomDoE3cyBDWMOOBh+t6QQD
69-
kMFvPxlw0XwWsvjTGPFCBIR7NZXnwQfVYbdFu88TjT10wTCZ/E3yCp77aDWD1JLV
70-
2V2EF3v1wPCPCbvEKZKVR5rLVYl2djU9j9d+H30=
57+
MIIF1zCCBL+gAwIBAgIQB9pYWG3Mi7xej22g9pobJTANBgkqhkiG9w0BAQsFADBG
58+
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg
59+
Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0yMTA5MDcwMDAwMDBaFw0yMjA4MTcy
60+
MzU5NTlaMBwxGjAYBgNVBAMTEXNucy5hbWF6b25hd3MuY29tMIIBIjANBgkqhkiG
61+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAutFqueT3XgP13udzxE6UpbdjOtVO5DwoMpSM
62+
iDNMnGzF1TYH5/R2LPUOBeTB0SkKnR4kpNcUZhicpGD4aKciz/GEZ6wu65xncfT9
63+
H/KBOQwoXYTuClHwp6fYpGzcGFaFoEYMnijL/o4qmTSd+ukglQUgKpsDw4ofw6rU
64+
m2CttJo+GQSNQ9NfGR1h/0J+zsApkeSYrXRx5wNlu87z8os1C/6PBrUHwt3xXeaf
65+
Xzfwut8aRRYsS8BySOA9DAgLfNHlfdQCjKPXKrG/ussgReyWD6n/HH+j7Uha3xos
66+
TzQqJifcxlTq6MxWdPR6fDaJNvqw6DOE7UjUNxHguXHlVfxhlQIDAQABo4IC6TCC
67+
AuUwHwYDVR0jBBgwFoAUWaRmBlKge5WSPKOUByeWdFv5PdAwHQYDVR0OBBYEFAqz
68+
C+vyouneE7mWWLbi9i0UsWUbMBwGA1UdEQQVMBOCEXNucy5hbWF6b25hd3MuY29t
69+
MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
70+
OwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zY2ExYi5hbWF6b250cnVzdC5j
71+
b20vc2NhMWIuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMHUGCCsGAQUFBwEBBGkw
72+
ZzAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Auc2NhMWIuYW1hem9udHJ1c3QuY29t
73+
MDYGCCsGAQUFBzAChipodHRwOi8vY3J0LnNjYTFiLmFtYXpvbnRydXN0LmNvbS9z
74+
Y2ExYi5jcnQwDAYDVR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFn
75+
AHYAKXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4QAAAF7vfDVkQAABAMA
76+
RzBFAiEA2XfHuy36aqRFiaL8c3md2mH451go8707+fRE0pEdSRACIE/g5FXTUXUZ
77+
PFcmOhm9TZ+uMY1i4CIQ/CKVWln6C3t+AHYAUaOw9f0BeZxWbbg3eI8MpHrMGyfL
78+
956IQpoN/tSLBeUAAAF7vfDVjAAABAMARzBFAiBF1MhhFP0+FQt3daDFfMYoWwnr
79+
muTInrjNpwfzlvQBugIhAPYadFzr+LaxSJoiZEbEHBvTts7bT0M3eCQONA2O7w6n
80+
AHUAQcjKsd8iRkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYAAAF7vfDVdAAABAMA
81+
RjBEAiAtPapmFAuA71ih4NoSd5hJelzAltNQpxDMcDfDyHyU8gIgWxmaa6+2KbBu
82+
9xdv379zvnJACFR7jc+4asl08Dn4aagwDQYJKoZIhvcNAQELBQADggEBAA54QX0u
83+
oFWXfMmv02CGZv4NWo5TapyeeixQ2kKpZHRdVZjxZrw+hoF6HD7P3kGjH8ztyJll
84+
tDxB0qgMltbPhQdScwhA6iTgoaBYqEUC/VHKd4PmmPT6yIsM36NBZVmkGlzl5uNo
85+
/dBgBaG0SsVJnhr5zro3c2quC7n6fVGEZhf/UgQwRnnvThnvbNKguglDMq4uEqv8
86+
njKyleht+glkcmXO0m9qLKt6BOS0amy6U2GlAwRn0Wx02ndJtnRCSC6kPuRWK/SQ
87+
FEjB7gCK4hdKaAOuWdZpI55vF6ifOeM8toC3g7ofO8qLTnJupAG+ZitY5J3cvHWr
88+
HqOUdKigPDHYLRo=
7189
-----END CERTIFICATE-----
7290
CERT
7391

@@ -79,60 +97,72 @@ module SNS
7997

8098
describe '#authenticate!' do
8199

82-
it 'returns true for a valid message' do
83-
expect(verifier.authenticate!(message)).to be(true)
84-
end
85-
86-
it 'returns true for a valid lambda message' do
87-
expect(verifier.authenticate!(lambda_message)).to be(true)
88-
end
89-
90-
it 'raises when the SigningCertURL is not https' do
91-
msg = Json.load(message)
92-
msg['SigningCertURL'] = msg['SigningCertURL'].sub(/https/, 'http')
93-
msg = Json.dump(msg)
94-
expect {
95-
verifier.authenticate!(msg)
96-
}.to raise_error(MessageVerifier::VerificationError, /must be https/)
97-
end
98-
99-
it 'raises when the SigningCertURL is not AWS hosted' do
100-
msg = Json.load(message)
101-
msg['SigningCertURL'] = 'https://internetbadguys.com/cert.pem'
102-
msg = Json.dump(msg)
103-
expect {
104-
verifier.authenticate!(msg)
105-
}.to raise_error(MessageVerifier::VerificationError, /hosted by AWS/)
106-
end
107-
108-
it 'raises when the SigningCertURL is not a pem file' do
109-
msg = Json.load(message)
110-
msg['SigningCertURL'] = msg['SigningCertURL'].sub(/pem$/, 'key')
111-
msg = Json.dump(msg)
112-
expect {
113-
verifier.authenticate!(msg)
114-
}.to raise_error(MessageVerifier::VerificationError, /a \.pem file/)
115-
end
116-
117-
it 'raises when the message signature fails validation' do
118-
msg = Json.load(message)
119-
msg['Signature'] = 'bad'
120-
msg = Json.dump(msg)
121-
expect {
122-
verifier.authenticate!(msg)
123-
}.to raise_error(MessageVerifier::VerificationError, /cannot be verified/)
100+
[:message_sha1, :message_sha256, :lambda_message].each do |message_type|
101+
let(:message) { send(message_type) }
102+
let(:cert_url_key) { message_type == :lambda_message ? 'SigningCertUrl' : 'SigningCertURL' }
103+
104+
context "message type is #{message_type}" do
105+
it 'returns true for a valid message' do
106+
expect(verifier.authenticate!(message)).to be(true)
107+
end
108+
109+
it 'raises when the message signature fails validation' do
110+
msg = Json.load(message)
111+
msg['Signature'] = 'bad'
112+
msg = Json.dump(msg)
113+
expect {
114+
verifier.authenticate!(msg)
115+
}.to raise_error(MessageVerifier::VerificationError, /cannot be verified/)
116+
end
117+
118+
it 'raises when SignatureVersion is not a valid value' do
119+
msg = Json.load(message)
120+
msg['SignatureVersion'] = '3'
121+
msg = Json.dump(msg)
122+
expect {
123+
verifier.authenticate!(msg)
124+
}.to raise_error(MessageVerifier::VerificationError, /Invalid SignatureVersion/)
125+
end
126+
127+
it 'raises when the SigningCertURL is not https' do
128+
msg = Json.load(message)
129+
msg[cert_url_key] = msg[cert_url_key].sub(/https/, 'http')
130+
msg = Json.dump(msg)
131+
expect {
132+
verifier.authenticate!(msg)
133+
}.to raise_error(MessageVerifier::VerificationError, /must be https/)
134+
end
135+
136+
it 'raises when the SigningCertURL is not AWS hosted' do
137+
msg = Json.load(message)
138+
msg[cert_url_key] = 'https://internetbadguys.com/cert.pem'
139+
msg = Json.dump(msg)
140+
expect {
141+
verifier.authenticate!(msg)
142+
}.to raise_error(MessageVerifier::VerificationError, /hosted by AWS/)
143+
end
144+
145+
it 'raises when the SigningCertURL is not a pem file' do
146+
msg = Json.load(message)
147+
msg[cert_url_key] = msg[cert_url_key].sub(/pem$/, 'key')
148+
msg = Json.dump(msg)
149+
expect {
150+
verifier.authenticate!(msg)
151+
}.to raise_error(MessageVerifier::VerificationError, /a \.pem file/)
152+
end
153+
end
124154
end
125155

126156
it 'can use a configured :http_proxy' do
127157
proxy_url = 'https://peccy:[email protected]:12345'
128158
verifier = MessageVerifier.new(http_proxy: proxy_url)
129-
verifier.authenticate!(message)
159+
verifier.authenticate!(message_SHA1)
130160
expect(a_request(:get, signing_cert_url)).to have_been_made
131161
end
132162

133163
it 'caches the pem file' do
134-
verifier.authenticate!(message)
135-
verifier.authenticate!(message)
164+
verifier.authenticate!(message_SHA1)
165+
verifier.authenticate!(message_SHA1)
136166
expect(a_request(:get, signing_cert_url)).to have_been_made.once
137167
end
138168

@@ -141,29 +171,29 @@ module SNS
141171
to_return(status: 500, body: '').
142172
to_return(status: 500, body: '').
143173
to_return(status: 200, body: cert)
144-
verifier.authenticate!(message)
174+
verifier.authenticate!(message_SHA1)
145175
expect(a_request(:get, signing_cert_url)).to have_been_made.times(3)
146176
end
147177

148178
it 'raises when the signing cert can not be downloaded due to networking errors' do
149179
stub_request(:get, signing_cert_url).to_raise(StandardError, 'oops')
150180
expect {
151-
verifier.authenticate!(message)
181+
verifier.authenticate!(message_SHA1)
152182
}.to raise_error(MessageVerifier::VerificationError, 'oops')
153183
end
154184

155185
it 'raises when the signing cert can not be downloaded' do
156186
stub_request(:get, signing_cert_url).to_return(status:500, body:'bad')
157187
expect {
158-
verifier.authenticate!(message)
188+
verifier.authenticate!(message_SHA1)
159189
}.to raise_error(MessageVerifier::VerificationError, 'bad')
160190
end
161191

162192
it 'raises when the signing cert contains additional characters' do
163193
cert_with_extra = "<xml><value>\n#{cert}\n<value></xml>"
164194
stub_request(:get, signing_cert_url).to_return(status:200, body: cert_with_extra)
165195
expect {
166-
verifier.authenticate!(message)
196+
verifier.authenticate!(message_SHA1)
167197
}.to raise_error(MessageVerifier::VerificationError,
168198
/certificate does not match expected X509 PEM format/)
169199
end
@@ -172,15 +202,21 @@ module SNS
172202

173203
describe '#authentic?' do
174204

175-
it 'returns true if the message can be authenticated' do
176-
expect(verifier.authentic?(message)).to be(true)
177-
end
178-
179-
it 'returns false if the message can not be authenticated' do
180-
msg = Json.load(message)
181-
msg['Signature'] = 'bad'
182-
msg = Json.dump(msg)
183-
expect(verifier.authentic?(msg)).to be(false)
205+
[:message_sha1, :message_sha256, :lambda_message].each do |message_type|
206+
let(:message) { send(message_type) }
207+
208+
context "message type is #{message_type}" do
209+
it 'returns true if the message can be authenticated' do
210+
expect(verifier.authentic?(message)).to be(true)
211+
end
212+
213+
it 'returns false if the message can not be authenticated' do
214+
msg = Json.load(message)
215+
msg['Signature'] = 'bad'
216+
msg = Json.dump(msg)
217+
expect(verifier.authentic?(msg)).to be(false)
218+
end
219+
end
184220
end
185221

186222
end

0 commit comments

Comments
 (0)