29635e240c16d3a50cd280a3e1402349b088e397
[arvados.git] / services / api / test / unit / blob_test.rb
1 require 'test_helper'
2
3 class BlobTest < ActiveSupport::TestCase
4   @@api_token = rand(2**512).to_s(36)[0..49]
5   @@key = rand(2**2048).to_s(36)
6   @@blob_data = 'foo'
7   @@blob_locator = Digest::MD5.hexdigest(@@blob_data) +
8     '+' + @@blob_data.size.to_s
9
10   @@known_locator = 'acbd18db4cc2f85cedef654fccc4a4d8+3'
11   @@known_token = 'hocfupkn2pjhrpgp2vxv8rsku7tvtx49arbc9s4bvu7p7wxqvk'
12   @@known_key = '13u9fkuccnboeewr0ne3mvapk28epf68a3bhj9q8sb4l6e4e5mkk' +
13     'p6nhj2mmpscgu1zze5h5enydxfe3j215024u16ij4hjaiqs5u4pzsl3nczmaoxnc' +
14     'ljkm4875xqn4xv058koz3vkptmzhyheiy6wzevzjmdvxhvcqsvr5abhl15c2d4o4' +
15     'jhl0s91lojy1mtrzqqvprqcverls0xvy9vai9t1l1lvvazpuadafm71jl4mrwq2y' +
16     'gokee3eamvjy8qq1fvy238838enjmy5wzy2md7yvsitp5vztft6j4q866efym7e6' +
17     'vu5wm9fpnwjyxfldw3vbo01mgjs75rgo7qioh8z8ij7jpyp8508okhgbbex3ceei' +
18     '786u5rw2a9gx743dj3fgq2irk'
19   @@known_signed_locator = 'acbd18db4cc2f85cedef654fccc4a4d8+3' +
20     '+A89118b78732c33104a4d6231e8b5a5fa1e4301e3@7fffffff'
21
22   test 'generate predictable invincible signature' do
23     original_ttl = Rails.configuration.blob_signature_ttl
24     Rails.configuration.blob_signature_ttl = 1209600
25     signed = Blob.sign_locator @@known_locator, {
26       api_token: @@known_token,
27       key: @@known_key,
28       expire: 0x7fffffff,
29     }
30     assert_equal @@known_signed_locator, signed
31     Rails.configuration.blob_signature_ttl = original_ttl
32   end
33
34   test 'verify predictable invincible signature' do
35     original_ttl = Rails.configuration.blob_signature_ttl
36     Rails.configuration.blob_signature_ttl = 1209600
37     assert_equal true, Blob.verify_signature!(@@known_signed_locator,
38                                               api_token: @@known_token,
39                                               key: @@known_key)
40     Rails.configuration.blob_signature_ttl = original_ttl
41   end
42
43   test 'correct' do
44     signed = Blob.sign_locator @@blob_locator, api_token: @@api_token, key: @@key
45     assert_equal true, Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
46   end
47
48   test 'expired' do
49     signed = Blob.sign_locator @@blob_locator, api_token: @@api_token, key: @@key, ttl: -1
50     assert_raise Blob::InvalidSignatureError do
51       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
52     end
53   end
54
55   test 'expired, but no raise' do
56     signed = Blob.sign_locator @@blob_locator, api_token: @@api_token, key: @@key, ttl: -1
57     assert_equal false, Blob.verify_signature(signed,
58                                               api_token: @@api_token,
59                                               key: @@key)
60   end
61
62   test 'bogus, wrong block hash' do
63     signed = Blob.sign_locator @@blob_locator, api_token: @@api_token, key: @@key
64     assert_raise Blob::InvalidSignatureError do
65       Blob.verify_signature!(signed.sub('acbd','abcd'), api_token: @@api_token, key: @@key)
66     end
67   end
68
69   test 'bogus, expired' do
70     signed = 'acbd18db4cc2f85cedef654fccc4a4d8+3+Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@531641bf'
71     assert_raises Blob::InvalidSignatureError do
72       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
73     end
74   end
75
76   test 'bogus, wrong key' do
77     signed = Blob.sign_locator(@@blob_locator,
78                                api_token: @@api_token,
79                                key: (@@key+'x'))
80     assert_raise Blob::InvalidSignatureError do
81       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
82     end
83   end
84
85   test 'bogus, wrong api token' do
86     signed = Blob.sign_locator(@@blob_locator,
87                                api_token: @@api_token.reverse,
88                                key: @@key)
89     assert_raise Blob::InvalidSignatureError do
90       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
91     end
92   end
93
94   test 'bogus, signature format 1' do
95     signed = 'acbd18db4cc2f85cedef654fccc4a4d8+3+Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@'
96     assert_raise Blob::InvalidSignatureError do
97       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
98     end
99   end
100
101   test 'bogus, signature format 2' do
102     signed = 'acbd18db4cc2f85cedef654fccc4a4d8+3+A@531641bf'
103     assert_raise Blob::InvalidSignatureError do
104       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
105     end
106   end
107
108   test 'bogus, signature format 3' do
109     signed = 'acbd18db4cc2f85cedef654fccc4a4d8+3+Axyzzy@531641bf'
110     assert_raise Blob::InvalidSignatureError do
111       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
112     end
113   end
114
115   test 'bogus, timestamp format' do
116     signed = 'acbd18db4cc2f85cedef654fccc4a4d8+3+Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@xyzzy'
117     assert_raise Blob::InvalidSignatureError do
118       Blob.verify_signature!(signed, api_token: @@api_token, key: @@key)
119     end
120   end
121
122   test 'no signature at all' do
123     assert_raise Blob::InvalidSignatureError do
124       Blob.verify_signature!(@@blob_locator, api_token: @@api_token, key: @@key)
125     end
126   end
127
128   test 'signature changes when ttl changes' do
129     signed = Blob.sign_locator @@known_locator, {
130       api_token: @@known_token,
131       key: @@known_key,
132       expire: 0x7fffffff,
133     }
134
135     original_ttl = Rails.configuration.blob_signature_ttl
136     Rails.configuration.blob_signature_ttl = original_ttl*2
137     signed2 = Blob.sign_locator @@known_locator, {
138       api_token: @@known_token,
139       key: @@known_key,
140       expire: 0x7fffffff,
141     }
142     Rails.configuration.blob_signature_ttl = original_ttl
143
144     assert_not_equal signed, signed2
145   end
146 end