aliquot-pay 0.13.0 → 1.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 +1 -126
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efe2c37b1391901980795e2bf48846eb753b5189e9d6a9158b399eb13be452dc
4
- data.tar.gz: bb99c1418c9c3f83cce4a940c9d3983b4ba227eff8e88be729409a33a4e0a8f7
3
+ metadata.gz: a52570068b0b6f57550e57a2c10abef65e06ab5ba4f37988cae74ac5a97f8c85
4
+ data.tar.gz: 3a26fe4ac93a160960ecaf57951d5bb5d6b3977c913057f0edbed0ed7bbe756b
5
5
  SHA512:
6
- metadata.gz: ef84809aaec9b3e8e4d88268f3daf6c96288150daf67cbda6e02066d1b61cfc1baf4cae8e8c541f9c320d309a431216081e7c2960382dcfb08ef3f54e570b490
7
- data.tar.gz: 2a6bef39650b08231597b420f4227877cd017b0544ff857a6b0c373634a0a7a260ea6d2da5b3682963b136b015aa488f85f8e37f9a98840ed33e217fb8d12c29
6
+ metadata.gz: 983bf42c16fc65c840c0e65b3eeafba6148edfb8d4be67f5b94a4348619aa61e07323ad0419116ad4df1f37562427e51a97bab64573f06a68e271a5fa7f513e6
7
+ data.tar.gz: 1feed4a38dc29a91554fa272c492e84a9941454a10ebfbf11058254e06cc9993778961c424d4564d5861e6be025e9a0675f5e1dd5779bf7d175c65e72ba4cee0
data/lib/aliquot-pay.rb CHANGED
@@ -29,131 +29,6 @@ class AliquotPay
29
29
  @protocol_version = protocol_version
30
30
  end
31
31
 
32
- def self.sign(key, message)
33
- d = OpenSSL::Digest::SHA256.new
34
- def key.private?; private_key?; end
35
- Base64.strict_encode64(key.sign(d, message))
36
- end
37
-
38
- def self.encrypt(cleartext_message, recipient, protocol_version, info = 'Google')
39
- eph = AliquotPay::Util.generate_ephemeral_key
40
- ss = AliquotPay::Util.generate_shared_secret(eph, recipient.public_key)
41
-
42
- case protocol_version
43
- when :ECv1
44
- cipher = OpenSSL::Cipher::AES128.new(:CTR)
45
- when :ECv2
46
- cipher = OpenSSL::Cipher::AES256.new(:CTR)
47
- else
48
- raise StandardError, "Invalid protocol_version #{protocol_version}"
49
- end
50
-
51
- keys = AliquotPay::Util.derive_keys(eph.public_key.to_bn.to_s(2), ss, info, protocol_version)
52
-
53
- cipher.encrypt
54
- cipher.key = keys[:aes_key]
55
-
56
- encrypted_message = cipher.update(cleartext_message) + cipher.final
57
-
58
- tag = AliquotPay::Util.calculate_tag(keys[:mac_key], encrypted_message)
59
-
60
- {
61
- 'encryptedMessage' => Base64.strict_encode64(encrypted_message),
62
- 'ephemeralPublicKey' => Base64.strict_encode64(eph.public_key.to_bn.to_s(2)),
63
- 'tag' => Base64.strict_encode64(tag),
64
- }
65
- end
66
-
67
- # Return a default payment
68
- def self.payment(
69
- auth_method: :PAN_ONLY,
70
- expiration: ((Time.now.to_f + 60 * 5) * 1000).round.to_s
71
- )
72
- id = Base64.strict_encode64(OpenSSL::Random.random_bytes(24))
73
- p = {
74
- 'messageExpiration' => expiration,
75
- 'messageId' => id,
76
- 'paymentMethod' => 'CARD',
77
- 'paymentMethodDetails' => {
78
- 'expirationYear' => 2023,
79
- 'expirationMonth' => 12,
80
- 'pan' => '4111111111111111',
81
- 'authMethod' => 'PAN_ONLY',
82
- },
83
- }
84
-
85
- if auth_method == :CRYPTOGRAM_3DS
86
- p['paymentMethodDetails']['authMethod'] = 'CRYPTOGRAM_3DS'
87
- p['paymentMethodDetails']['cryptogram'] = 'SOME CRYPTOGRAM'
88
- p['paymentMethodDetails']['eciIndicator'] = '05'
89
- end
90
-
91
- p
92
- end
93
-
94
- # Return a string length as a 4byte little-endian integer, as a string
95
- def self.four_byte_length(str)
96
- [str.length].pack('V')
97
- end
98
-
99
- def self.generate_signature(*args)
100
- args.map do |s|
101
- four_byte_length(s) + s
102
- end.join
103
- end
104
-
105
- def self.signature_string(
106
- message,
107
- merchant_id: DEFAULTS[:merchant_id],
108
- sender_id: DEFAULTS[:info],
109
- protocol_version: 'ECv1'
110
- )
111
-
112
- generate_signature(sender_id, "merchant:#{merchant_id}", protocol_version, message)
113
- end
114
-
115
- # payment:: Google Pay token as a ruby Hash
116
- # signing_key:: OpenSSL::PKEY::EC
117
- # recipient:: OpenSSL::PKey::EC
118
- # signed_message:: Pass a customized message to sign as signed messaged.
119
- def self.generate_token_ecv1(payment, signing_key, recipient, signed_message = nil)
120
- signed_message ||= encrypt(payment.to_json, recipient, :ECv1).to_json
121
- signature_string = signature_string(signed_message)
122
-
123
- {
124
- 'protocolVersion' => 'ECv1',
125
- 'signature' => sign(signing_key, signature_string),
126
- 'signedMessage' => signed_message,
127
- }
128
- end
129
-
130
- def self.generate_token_ecv2(payment, signing_key, intermediate_key, recipient,
131
- signed_message: nil, expire_time: "#{Time.now.to_i + 3600}000")
132
- signed_message ||= encrypt(payment.to_json, recipient, :ECv2).to_json
133
- sig = signature_string(signed_message, protocol_version: 'ECv2')
134
-
135
- intermediate_pub = OpenSSL::PKey::EC.new(EC_CURVE)
136
- intermediate_pub.public_key = intermediate_key.public_key
137
-
138
- signed_key = {
139
- 'keyExpiration' => expire_time,
140
- 'keyValue' => Base64.strict_encode64(intermediate_pub.to_der)
141
- }.to_json
142
-
143
- ik_signature_string = generate_signature('Google', 'ECv2', signed_key)
144
- signatures = [sign(signing_key, ik_signature_string)]
145
-
146
- {
147
- 'protocolVersion' => 'ECv2',
148
- 'signature' => sign(intermediate_key, sig),
149
- 'signedMessage' => signed_message,
150
- 'intermediateSigningKey' => {
151
- 'signedKey' => signed_key,
152
- 'signatures' => signatures,
153
- },
154
- }
155
- end
156
-
157
32
  def token
158
33
  build_token
159
34
  end
@@ -223,7 +98,7 @@ class AliquotPay
223
98
  'pan' => @pan || '4111111111111111',
224
99
  'expirationYear' => @expiration_year || 2023,
225
100
  'expirationMonth' => @expiration_month || 12,
226
- 'authMethod' => @auth_method || 'PAN_ONLY',
101
+ 'authMethod' => @auth_method || 'PAN_ONLY',
227
102
  }
228
103
 
229
104
  if @auth_method == 'CRYPTOGRAM_3DS'
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: 0.13.0
4
+ version: 1.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: 2019-01-24 00:00:00.000000000 Z
11
+ date: 2019-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hkdf