aliquot-pay 3.0.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aliquot-pay.rb +67 -33
  3. metadata +5 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd781c1bcf3c08449d83bdd303af4e9ea5f626edf34ef36d693e59c5046bd76d
4
- data.tar.gz: 14b8f7ca9f162cf03ff041f4a441e530b7847a13fbdc5d09de19cd3ccc8eb941
3
+ metadata.gz: 900a3ab50c572b86accb200902899275239c68e2951792467be905fa8495f796
4
+ data.tar.gz: ed4476fc237b67d49ea342bdca9db82782332ccf06be65de0d06ac6cf106b19f
5
5
  SHA512:
6
- metadata.gz: be990eb9f8bce95b200b8c9be5fa88ec3fb24aaa8f91be448a76e0758f04a7717679bde3447c3a82fb42a63b1a7b257ba8a3d06ec296df9b685154f1b0233579
7
- data.tar.gz: c635f9118731166e62d49ba5cedff290f78e28233303e92a07d562002a3b91c57e882e151ac46724da142ac5506452c71dcdd81e5eeef2da710d950fe82fe30b
6
+ metadata.gz: 6ddea3d61ed2dc2e2b35a3ddcb4e2afc329707af26a823efd55ba54d2491264e1af0e02a9a08e5b3efa005b69ffee15bc07b8a5566bad0b614acdb3b4a4d68f2
7
+ data.tar.gz: fd98206c62e82c6bda44e15c7bc9ac9ca2e279bbd0bb1e7ea78d671d1886ac917f5aba05fb7581832ab148f8577ec867eab9a8b1908d3ebbf3ce1de016ae70a0
data/lib/aliquot-pay.rb CHANGED
@@ -25,11 +25,10 @@ class AliquotPay
25
25
  attr_accessor :recipient, :info, :root_key, :intermediate_key
26
26
  attr_writer :recipient_id, :shared_secret, :token, :signed_key_string
27
27
 
28
- def initialize(protocol_version = :ECv2, root_key = nil)
28
+ def initialize(protocol_version: :ECv2, root_key: nil, type: :browser)
29
29
  @protocol_version = protocol_version
30
- if root_key
31
- @root_key = root_key
32
- end
30
+ @root_key = root_key
31
+ @type = type
33
32
  end
34
33
 
35
34
  def token
@@ -39,10 +38,10 @@ class AliquotPay
39
38
  def extract_root_signing_keys
40
39
  key = Base64.strict_encode64(ensure_root_key.to_der)
41
40
  {
42
- 'keys' => [
41
+ 'keys' => [{
43
42
  'protocolVersion' => @protocol_version,
44
- 'keyValue' => key,
45
- ]
43
+ 'keyValue' => key
44
+ }]
46
45
  }.to_json
47
46
  end
48
47
 
@@ -68,7 +67,7 @@ class AliquotPay
68
67
  when :ECv2
69
68
  cipher = OpenSSL::Cipher::AES256.new(:CTR)
70
69
  else
71
- raise StandardError, "Invalid protocol_version #{protocol_version}"
70
+ raise StandardError, "Invalid protocol_version #{@protocol_version}"
72
71
  end
73
72
 
74
73
  keys = AliquotPay::Util.derive_keys(eph.public_key.to_bn.to_s(2), ss, @info, @protocol_version)
@@ -83,29 +82,54 @@ class AliquotPay
83
82
  {
84
83
  'encryptedMessage' => Base64.strict_encode64(encrypted_message),
85
84
  'ephemeralPublicKey' => Base64.strict_encode64(eph.public_key.to_bn.to_s(2)),
86
- 'tag' => Base64.strict_encode64(tag),
85
+ 'tag' => Base64.strict_encode64(tag)
87
86
  }
88
87
  end
89
88
 
90
89
  def build_payment_method_details
91
90
  return @payment_method_details if @payment_method_details
91
+
92
+ return build_payment_method_details_non_tokenized if @type == :browser
93
+
94
+ build_payment_method_details_tokenized
95
+ end
96
+
97
+ def build_payment_method_details_non_tokenized
92
98
  value = {
93
99
  'pan' => @pan || '4111111111111111',
94
- 'expirationYear' => @expiration_year || 2023,
95
- 'expirationMonth' => @expiration_month || 12,
96
- 'authMethod' => @auth_method || 'PAN_ONLY',
100
+ 'expirationYear' => @expiration_year || Time.now.year + 1,
101
+ 'expirationMonth' => @expiration_month || 12
97
102
  }
98
103
 
99
- if @auth_method == 'CRYPTOGRAM_3DS'
104
+ if @protocol_version == :ECv2 && @type == :browser
100
105
  value.merge!(
101
- 'cryptogram' => @cryptogram || 'SOME CRYPTOGRAM',
102
- 'eciIndicator' => @eci_indicator || '05'
106
+ 'authMethod' => @auth_method || 'PAN_ONLY'
103
107
  )
104
108
  end
105
-
106
109
  value
107
110
  end
108
111
 
112
+ def build_payment_method_details_tokenized
113
+ value = {
114
+ 'expirationYear' => @expiration_year || Time.now.year + 1,
115
+ 'expirationMonth' => @expiration_month || 12,
116
+ 'eciIndicator' => @eci_indicator || '05'
117
+ }
118
+ if @protocol_version == :ECv1
119
+ value.merge!(
120
+ 'dpan' => @pan || '4111111111111111',
121
+ 'authMethod' => @auth_method || '3DS',
122
+ '3dsCryptogram' => @cryptogram || Base64.strict_encode64(OpenSSL::Random.random_bytes(20))
123
+ )
124
+ else
125
+ value.merge!(
126
+ 'pan' => @pan || '4111111111111111',
127
+ 'authMethod' => @auth_method || 'CRYPTOGRAM_3DS',
128
+ 'cryptogram' => @cryptogram || Base64.strict_encode64(OpenSSL::Random.random_bytes(20))
129
+ )
130
+ end
131
+ end
132
+
109
133
  def build_cleartext_message
110
134
  return @cleartext_message if @cleartext_message
111
135
 
@@ -114,8 +138,8 @@ class AliquotPay
114
138
 
115
139
  @cleartext_message = {
116
140
  'messageExpiration' => @message_expiration || default_message_expiration,
117
- 'messageId' => @message_id || default_message_id,
118
- 'paymentMethod' => @payment_method || 'CARD',
141
+ 'messageId' => @message_id || default_message_id,
142
+ 'paymentMethod' => @payment_method || 'CARD',
119
143
  'paymentMethodDetails' => build_payment_method_details
120
144
  }
121
145
 
@@ -140,11 +164,12 @@ class AliquotPay
140
164
  end
141
165
 
142
166
  def signed_message_string
143
- @signed_message_string ||= build_signed_message.to_json
167
+ build_signed_message.to_json
144
168
  end
145
169
 
146
170
  def build_signed_key
147
171
  return @signed_key if @signed_key
172
+
148
173
  ensure_intermediate_key
149
174
 
150
175
  if !@intermediate_key.private_key? && !@intermediate_key.public_key?
@@ -156,7 +181,7 @@ class AliquotPay
156
181
 
157
182
  @signed_key = {
158
183
  'keyExpiration' => @key_expiration || default_key_expiration,
159
- 'keyValue' => @key_value || default_key_value,
184
+ 'keyValue' => @key_value || default_key_value
160
185
  }
161
186
  end
162
187
 
@@ -181,40 +206,49 @@ class AliquotPay
181
206
  ensure_intermediate_key
182
207
  end
183
208
 
184
- signature_string =
185
- signed_string_message = ['Google',
186
- recipient_id,
187
- @protocol_version.to_s,
188
- signed_message_string].map do |str|
189
- [str.length].pack('V') + str
190
- end.join
209
+ signature_elements = [
210
+ 'Google',
211
+ recipient_id,
212
+ @protocol_version.to_s,
213
+ signed_message_string
214
+ ]
215
+
216
+ signature_string = signature_elements.map { |e| [e.length].pack('V') + e }.join
191
217
  @signature = sign(key, signature_string)
192
218
  end
193
219
 
194
220
  def build_signatures
195
221
  return @signatures if @signatures
196
222
 
197
- signature_string =
198
- signed_key_signature = ['Google', 'ECv2', signed_key_string].map do |str|
199
- [str.to_s.length].pack('V') + str.to_s
200
- end.join
223
+ signature_string = ['Google', 'ECv2', signed_key_string].map do |str|
224
+ [str.to_s.length].pack('V') + str.to_s
225
+ end.join
201
226
 
202
227
  @signatures = [sign(ensure_root_key, signature_string)]
203
228
  end
204
229
 
205
230
  def build_token
206
231
  return @token if @token
232
+
233
+ if @type == :app
234
+ @auth_method = 'CRYPTOGRAM_3DS'
235
+ if @protocol_version == :ECv1
236
+ @auth_method = '3DS'
237
+ @payment_method = 'TOKENIZED_CARD'
238
+ end
239
+ end
240
+
207
241
  res = {
208
242
  'protocolVersion' => @protocol_version.to_s,
209
243
  'signedMessage' => @signed_message || signed_message_string,
210
- 'signature' => build_signature,
244
+ 'signature' => build_signature
211
245
  }
212
246
 
213
247
  if @protocol_version == :ECv2
214
248
  intermediate = {
215
249
  'intermediateSigningKey' => @intermediate_signing_key || {
216
250
  'signedKey' => signed_key_string,
217
- 'signatures' => build_signatures,
251
+ 'signatures' => build_signatures
218
252
  }
219
253
  }
220
254
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aliquot-pay
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clearhaus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-20 00:00:00.000000000 Z
11
+ date: 2024-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hkdf
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.1'
33
+ version: '3.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.1'
40
+ version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  - !ruby/object:Gem::Version
80
80
  version: '0'
81
81
  requirements: []
82
- rubygems_version: 3.3.26
82
+ rubygems_version: 3.1.6
83
83
  signing_key:
84
84
  specification_version: 4
85
85
  summary: Generates Google Pay test dummy tokens