aliquot-pay 3.0.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aliquot-pay.rb +66 -32
  3. metadata +9 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eca8987a342cb9d4c72a68b9c45ec9431f7aa383b5688e20dd85ef8a2ba267c0
4
- data.tar.gz: 4cf2a6489569dbe2edd79330aa74ac349ef1a765f954c6b1753cecda206bc006
3
+ metadata.gz: 900a3ab50c572b86accb200902899275239c68e2951792467be905fa8495f796
4
+ data.tar.gz: ed4476fc237b67d49ea342bdca9db82782332ccf06be65de0d06ac6cf106b19f
5
5
  SHA512:
6
- metadata.gz: 63cafaccc975cfb2f6b9d0986209f95c5aee30074392380008d573c1bcfa1400b9ef545434f6f62d511f8fe8f3f96132af2780891789bcc080f6c1496e6bf40f
7
- data.tar.gz: 145ce9d75ad93e496d98945af3f27964ddc46fb3723ef13951eda851bbf88a32ad0f27d353cc5ab5da2406055944aff8de93138cec7c9fb5674d94441d7dec28
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
100
  'expirationYear' => @expiration_year || Time.now.year + 1,
95
- 'expirationMonth' => @expiration_month || 12,
96
- 'authMethod' => @auth_method || 'PAN_ONLY',
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.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clearhaus
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-04 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
@@ -52,7 +52,7 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3'
55
- description:
55
+ description:
56
56
  email: hello@clearhaus.com
57
57
  executables: []
58
58
  extensions: []
@@ -64,7 +64,7 @@ homepage: https://github.com/clearhaus/aliquot-pay
64
64
  licenses:
65
65
  - MIT
66
66
  metadata: {}
67
- post_install_message:
67
+ post_install_message:
68
68
  rdoc_options: []
69
69
  require_paths:
70
70
  - lib
@@ -79,8 +79,8 @@ 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.5
83
- signing_key:
82
+ rubygems_version: 3.1.6
83
+ signing_key:
84
84
  specification_version: 4
85
85
  summary: Generates Google Pay test dummy tokens
86
86
  test_files: []