virgil-sdk 4.2.4 → 4.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/README.md +1 -1
- data/README_LOW_LEVEL.md +427 -0
- data/lib/virgil/sdk/client/card.rb +9 -7
- data/lib/virgil/sdk/client/http/cards_service_connection.rb +6 -0
- data/lib/virgil/sdk/client/requests.rb +4 -0
- data/lib/virgil/sdk/client/requests/add_relation_request.rb +52 -0
- data/lib/virgil/sdk/client/requests/create_card_request.rb +2 -1
- data/lib/virgil/sdk/client/requests/delete_relation_request.rb +51 -0
- data/lib/virgil/sdk/client/requests/signable_request.rb +9 -6
- data/lib/virgil/sdk/client/virgil_client.rb +45 -4
- data/lib/virgil/sdk/cryptography/virgil_crypto.rb +8 -2
- data/lib/virgil/sdk/high_level.rb +2 -2
- data/lib/virgil/sdk/high_level/virgil_buffer.rb +8 -10
- data/lib/virgil/sdk/high_level/virgil_card.rb +41 -11
- data/lib/virgil/sdk/high_level/virgil_card_manager.rb +14 -6
- data/lib/virgil/sdk/high_level/virgil_context.rb +6 -4
- data/lib/virgil/sdk/high_level/virgil_key.rb +69 -17
- data/lib/virgil/sdk/high_level/virgil_key_manager.rb +10 -0
- data/lib/virgil/sdk/version.rb +1 -1
- data/virgil-sdk.gemspec +1 -1
- metadata +7 -5
- data/lib/virgil/sdk/client/signatures_base64.rb +0 -25
@@ -71,19 +71,27 @@ module Virgil
|
|
71
71
|
# Encrypts the specified data using recipients Public keys.
|
72
72
|
#
|
73
73
|
# Args:
|
74
|
-
# buffer: The data to be encrypted.
|
74
|
+
# buffer: The data to be encrypted. It can be VirgilBuffer, utf8 String or Array of bytes
|
75
75
|
#
|
76
76
|
# Returns:
|
77
77
|
# Encrypted data for current recipients Public keys
|
78
78
|
#
|
79
79
|
# Raises:
|
80
|
-
# ArgumentError:
|
80
|
+
# ArgumentError: Buffer has unsupported type if buffer doesn't have type VirgilBuffer, String or Array of bytes
|
81
81
|
def encrypt(buffer)
|
82
|
-
|
83
|
-
raise ArgumentError.new("buffer is not valid") if !(buffer.is_a?(VirgilBuffer) || buffer.is_a?(String))
|
84
|
-
|
85
82
|
all_public_keys = self.map(&:public_key)
|
86
|
-
|
83
|
+
buffer_to_encrypt = case buffer.class.name.split("::").last
|
84
|
+
when 'VirgilBuffer'
|
85
|
+
buffer
|
86
|
+
when 'String'
|
87
|
+
VirgilBuffer.from_string(buffer)
|
88
|
+
when 'Array'
|
89
|
+
VirgilBuffer.from_bytes(buffer)
|
90
|
+
else
|
91
|
+
raise ArgumentError.new("Buffer has unsupported type")
|
92
|
+
end
|
93
|
+
|
94
|
+
VirgilBuffer.new(crypto.encrypt(buffer_to_encrypt.bytes, *all_public_keys))
|
87
95
|
end
|
88
96
|
|
89
97
|
end
|
@@ -36,18 +36,20 @@ module Virgil
|
|
36
36
|
module HighLevel
|
37
37
|
class VirgilContext
|
38
38
|
attr_reader :access_token, :client, :crypto, :credentials,
|
39
|
-
:cards_service_url, :cards_read_only_service_url,
|
39
|
+
:cards_service_url, :cards_read_only_service_url, :ra_service_url,
|
40
40
|
:identity_service_url, :key_storage
|
41
41
|
|
42
|
-
def initialize(access_token
|
42
|
+
def initialize(access_token: nil, credentials: nil, key_storage_path: Cryptography::Keys::KeyStorage.default_folder,
|
43
43
|
cards_service_url: Client::Card::SERVICE_URL,
|
44
44
|
cards_read_only_service_url: Client::Card::READ_ONLY_SERVICE_URL,
|
45
|
+
ra_service_url: Client::Card::RA_SERVICE_URL,
|
45
46
|
identity_service_url: VirgilIdentity::IDENTITY_SERVICE_URL,
|
47
|
+
crypto: Cryptography::VirgilCrypto.new,
|
46
48
|
card_verifiers: []
|
47
49
|
)
|
48
50
|
@access_token = access_token
|
49
|
-
@client = Client::VirgilClient.new(access_token, cards_service_url, cards_read_only_service_url, identity_service_url)
|
50
|
-
@crypto =
|
51
|
+
@client = Client::VirgilClient.new(access_token, cards_service_url, cards_read_only_service_url, identity_service_url, ra_service_url)
|
52
|
+
@crypto = crypto
|
51
53
|
@credentials = credentials
|
52
54
|
@key_storage = Cryptography::Keys::KeyStorage.new(key_storage_path)
|
53
55
|
|
@@ -49,18 +49,31 @@ module Virgil
|
|
49
49
|
# Decrypts the specified cipher data using Virgil key.
|
50
50
|
#
|
51
51
|
# Args:
|
52
|
-
# cipher_buffer: The encrypted data wrapped by VirgilBuffer
|
52
|
+
# cipher_buffer: The encrypted data wrapped by VirgilBuffer or
|
53
|
+
# encrypted data in base64-encoded String
|
54
|
+
# or Array of bytes of encrypted data
|
53
55
|
#
|
54
56
|
# Returns:
|
55
57
|
# A byte array containing the result from performing the operation wrapped by VirgilBuffer.
|
56
58
|
#
|
57
59
|
# Raises:
|
58
|
-
# ArgumentError: buffer is not valid if buffer doesn't have type VirgilBuffer or
|
60
|
+
# ArgumentError: buffer is not valid if buffer doesn't have type VirgilBuffer, base64-encoded String or Array of bytes
|
59
61
|
# Recipient with given identifier is not found if user tries to decrypt cipher data by private key,
|
60
62
|
# though its public key was not used for encryption
|
61
63
|
def decrypt(cipher_buffer)
|
62
|
-
|
63
|
-
|
64
|
+
|
65
|
+
buffer_to_decrypt = case cipher_buffer.class.name.split("::").last
|
66
|
+
when 'VirgilBuffer'
|
67
|
+
cipher_buffer
|
68
|
+
when 'String'
|
69
|
+
VirgilBuffer.from_base64(cipher_buffer)
|
70
|
+
when 'Array'
|
71
|
+
VirgilBuffer.from_bytes(cipher_buffer)
|
72
|
+
else
|
73
|
+
raise ArgumentError.new("Buffer has unsupported type")
|
74
|
+
end
|
75
|
+
|
76
|
+
bytes = context.crypto.decrypt(buffer_to_decrypt.bytes, private_key)
|
64
77
|
VirgilBuffer.new(bytes)
|
65
78
|
end
|
66
79
|
|
@@ -68,17 +81,27 @@ module Virgil
|
|
68
81
|
# Generates a digital signature for specified data using current Virgil key.
|
69
82
|
#
|
70
83
|
# Args:
|
71
|
-
# buffer: The data
|
84
|
+
# buffer: The data for which the digital signature will be generated.
|
85
|
+
# buffer can be VirgilBuffer, utf8-encoded String or Array of bytes
|
72
86
|
#
|
73
87
|
# Returns:
|
74
88
|
# A new buffer that containing the result from performing the operation.
|
75
89
|
#
|
76
90
|
# Raises:
|
77
|
-
# ArgumentError:
|
91
|
+
# ArgumentError: Buffer has unsupported type if buffer doesn't have type VirgilBuffer, String or Array of bytes
|
78
92
|
def sign(buffer)
|
79
|
-
|
80
|
-
|
81
|
-
|
93
|
+
buffer_to_sign = case buffer.class.name.split("::").last
|
94
|
+
when 'VirgilBuffer'
|
95
|
+
buffer
|
96
|
+
when 'String'
|
97
|
+
VirgilBuffer.from_string(buffer)
|
98
|
+
when 'Array'
|
99
|
+
VirgilBuffer.from_bytes(buffer)
|
100
|
+
else
|
101
|
+
raise ArgumentError.new("Buffer has unsupported type")
|
102
|
+
end
|
103
|
+
|
104
|
+
VirgilBuffer.new(context.crypto.sign(buffer_to_sign.bytes, private_key).to_s.bytes)
|
82
105
|
end
|
83
106
|
|
84
107
|
|
@@ -86,21 +109,31 @@ module Virgil
|
|
86
109
|
#
|
87
110
|
# Args:
|
88
111
|
# buffer: The data wrapped by VirgilBuffer to be encrypted and signed
|
89
|
-
#
|
112
|
+
# recipients: The list of VirgilCard recipients.
|
113
|
+
# buffer can be VirgilBuffer, utf8-encoded String or Array of bytes
|
90
114
|
#
|
91
115
|
# Returns:
|
92
116
|
# A new buffer that containing the encrypted and signed data
|
93
117
|
#
|
94
118
|
|
95
119
|
# Raises:
|
96
|
-
# ArgumentError:
|
120
|
+
# ArgumentError: Buffer has unsupported type if buffer doesn't have type VirgilBuffer, String or Array of bytes
|
97
121
|
# ArgumentError: recipients is not valid if recipients doesn't have type Array or empty
|
98
122
|
def sign_then_encrypt(buffer, recipients)
|
99
123
|
|
100
|
-
VirgilBuffer.validate_buffer_param(buffer)
|
101
124
|
raise ArgumentError.new("recipients is not valid") if (!recipients.is_a?(Array) || recipients.empty?)
|
125
|
+
buffer_to_sign = case buffer.class.name.split("::").last
|
126
|
+
when 'VirgilBuffer'
|
127
|
+
buffer
|
128
|
+
when 'String'
|
129
|
+
VirgilBuffer.from_string(buffer)
|
130
|
+
when 'Array'
|
131
|
+
VirgilBuffer.from_bytes(buffer)
|
132
|
+
else
|
133
|
+
raise ArgumentError.new("Buffer has unsupported type")
|
134
|
+
end
|
102
135
|
public_keys = recipients.map(&:public_key)
|
103
|
-
bytes = context.crypto.sign_then_encrypt(
|
136
|
+
bytes = context.crypto.sign_then_encrypt(buffer_to_sign.bytes, private_key, *public_keys).to_s.bytes
|
104
137
|
VirgilBuffer.new(bytes)
|
105
138
|
|
106
139
|
end
|
@@ -109,21 +142,34 @@ module Virgil
|
|
109
142
|
# Decrypts and verifies the data.
|
110
143
|
#
|
111
144
|
# Args:
|
112
|
-
# cipher_buffer: The data to be decrypted and verified
|
145
|
+
# cipher_buffer: The data to be decrypted and verified:
|
146
|
+
# The encrypted data wrapped by VirgilBuffer or
|
147
|
+
# encrypted data in base64-encoded String
|
148
|
+
# or Array of bytes of encrypted data
|
113
149
|
# card: The signer's VirgilCard
|
114
150
|
#
|
115
151
|
# Returns:
|
116
152
|
# The decrypted data, which is the original plain text before encryption The decrypted data, wrapped by VirgilBuffer
|
117
153
|
#
|
118
154
|
# Raises:
|
119
|
-
# ArgumentError: buffer is not valid if buffer doesn't have type VirgilBuffer or
|
155
|
+
# ArgumentError: buffer is not valid if buffer doesn't have type VirgilBuffer, String or Array of bytes
|
120
156
|
# ArgumentError: recipients is not valid if recipients doesn't have type Array or empty
|
121
157
|
def decrypt_then_verify(cipher_buffer, card)
|
122
158
|
|
123
|
-
VirgilBuffer.validate_buffer_param(cipher_buffer, "cipher buffer")
|
124
159
|
raise ArgumentError.new("card is not valid") unless card.is_a?(VirgilCard)
|
125
160
|
|
126
|
-
|
161
|
+
buffer_to_decrypt = case cipher_buffer.class.name.split("::").last
|
162
|
+
when 'VirgilBuffer'
|
163
|
+
cipher_buffer
|
164
|
+
when 'String'
|
165
|
+
VirgilBuffer.from_base64(cipher_buffer)
|
166
|
+
when 'Array'
|
167
|
+
VirgilBuffer.from_bytes(cipher_buffer)
|
168
|
+
else
|
169
|
+
raise ArgumentError.new("Buffer has unsupported type")
|
170
|
+
end
|
171
|
+
|
172
|
+
bytes = context.crypto.decrypt_then_verify(buffer_to_decrypt.bytes, private_key, card.public_key)
|
127
173
|
VirgilBuffer.new(bytes)
|
128
174
|
end
|
129
175
|
|
@@ -153,6 +199,12 @@ module Virgil
|
|
153
199
|
end
|
154
200
|
|
155
201
|
|
202
|
+
# Exports the VirgilKey to default format, specified in Crypto API.
|
203
|
+
def export(password=nil)
|
204
|
+
VirgilBuffer.from_bytes(context.crypto.export_private_key(private_key, password))
|
205
|
+
end
|
206
|
+
|
207
|
+
|
156
208
|
# Exports the Public key value from current VirgilKey.
|
157
209
|
#
|
158
210
|
# Returns:
|
@@ -74,6 +74,16 @@ module Virgil
|
|
74
74
|
|
75
75
|
end
|
76
76
|
|
77
|
+
# Imports the VirgilKey from buffer.
|
78
|
+
#
|
79
|
+
# Args:
|
80
|
+
# buffer: The buffer with Key
|
81
|
+
# password: The Key password
|
82
|
+
def import(buffer, password=nil)
|
83
|
+
private_key = context.crypto.import_private_key(buffer.bytes, password)
|
84
|
+
VirgilKey.new(context, private_key)
|
85
|
+
end
|
86
|
+
|
77
87
|
|
78
88
|
# Remove the VirgilKey from current storage by specified key name.
|
79
89
|
#
|
data/lib/virgil/sdk/version.rb
CHANGED
data/virgil-sdk.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.required_ruby_version = '>= 2.2.0'
|
23
|
-
spec.add_runtime_dependency "virgil-crypto", ">= 2.0.
|
23
|
+
spec.add_runtime_dependency "virgil-crypto", ">= 2.0.7"
|
24
24
|
spec.add_runtime_dependency "faraday", "~> 0.10.0"
|
25
25
|
spec.add_runtime_dependency "faraday_middleware", "~> 0.10.0"
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.12"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virgil-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitriy Dudkin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virgil-crypto
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.
|
19
|
+
version: 2.0.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.
|
26
|
+
version: 2.0.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: faraday
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- ".gitignore"
|
120
120
|
- Gemfile
|
121
121
|
- README.md
|
122
|
+
- README_LOW_LEVEL.md
|
122
123
|
- Rakefile
|
123
124
|
- bin/console
|
124
125
|
- bin/setup
|
@@ -139,13 +140,14 @@ files:
|
|
139
140
|
- lib/virgil/sdk/client/http/request.rb
|
140
141
|
- lib/virgil/sdk/client/request_signer.rb
|
141
142
|
- lib/virgil/sdk/client/requests.rb
|
143
|
+
- lib/virgil/sdk/client/requests/add_relation_request.rb
|
142
144
|
- lib/virgil/sdk/client/requests/confirm_identity_request.rb
|
143
145
|
- lib/virgil/sdk/client/requests/create_card_request.rb
|
146
|
+
- lib/virgil/sdk/client/requests/delete_relation_request.rb
|
144
147
|
- lib/virgil/sdk/client/requests/revoke_card_request.rb
|
145
148
|
- lib/virgil/sdk/client/requests/signable_request.rb
|
146
149
|
- lib/virgil/sdk/client/requests/verify_identity_request.rb
|
147
150
|
- lib/virgil/sdk/client/search_criteria.rb
|
148
|
-
- lib/virgil/sdk/client/signatures_base64.rb
|
149
151
|
- lib/virgil/sdk/client/virgil_client.rb
|
150
152
|
- lib/virgil/sdk/cryptography.rb
|
151
153
|
- lib/virgil/sdk/cryptography/hashes.rb
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Virgil
|
2
|
-
module SDK
|
3
|
-
module Client
|
4
|
-
module SignaturesBase64
|
5
|
-
|
6
|
-
def signatures_to_base64(signatures_bytes)
|
7
|
-
encoded_signatures = {}
|
8
|
-
signatures_bytes.each do |key, val|
|
9
|
-
encoded_signatures[key] = Base64.strict_encode64(Virgil::Crypto::Bytes.new(val).to_s) #TODO
|
10
|
-
end
|
11
|
-
encoded_signatures
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
def signatures_from_base64(signatures_base64)
|
16
|
-
decoded_signatures = {}
|
17
|
-
signatures_base64.each do |key, val|
|
18
|
-
decoded_signatures[key] = Virgil::Crypto::Bytes.from_base64(val)
|
19
|
-
end
|
20
|
-
decoded_signatures
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|