rbthemis 0.11.0 → 0.12.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.
- checksums.yaml +5 -5
- metadata +5 -8
- data/lib/rubythemis.rb +0 -709
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 76eb20b6223204fc2d128ba98bf69b9a30f38e89baf26c0a2adf1c32162de96c
|
|
4
|
+
data.tar.gz: 41aff8e122e39cf7a8b7da7564e67233ea31efb1438d7a9aac68ba589f88dda9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9c04031cb903cb567ab5158bf039f1090d242a704a01ad12e197cce205b25e020cc1f947a6b71bfc969dfd4b6e87dfc07abc2c319e08877f2a61371e02a64cb6
|
|
7
|
+
data.tar.gz: 713414c7013c4b678997efa5560cb95ea630f89cbf6dfbb50b2446c7ac3473dc509e087d4ef3eea6af70a1db9f43f2ca48de49edaccc1b23f4103857774bb2e2
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbthemis
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- CossackLabs
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-09-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: ffi
|
|
@@ -41,13 +41,11 @@ extensions: []
|
|
|
41
41
|
extra_rdoc_files: []
|
|
42
42
|
files:
|
|
43
43
|
- lib/rbthemis.rb
|
|
44
|
-
- lib/rubythemis.rb
|
|
45
44
|
homepage: http://cossacklabs.com/
|
|
46
45
|
licenses:
|
|
47
46
|
- Apache-2.0
|
|
48
47
|
metadata: {}
|
|
49
|
-
post_install_message:
|
|
50
|
-
your system using `gem uninstall rubythemis`
|
|
48
|
+
post_install_message:
|
|
51
49
|
rdoc_options: []
|
|
52
50
|
require_paths:
|
|
53
51
|
- lib
|
|
@@ -62,9 +60,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
62
60
|
- !ruby/object:Gem::Version
|
|
63
61
|
version: '0'
|
|
64
62
|
requirements:
|
|
65
|
-
- libthemis, v0.
|
|
66
|
-
|
|
67
|
-
rubygems_version: 2.5.2.1
|
|
63
|
+
- libthemis, v0.12.0
|
|
64
|
+
rubygems_version: 3.0.2
|
|
68
65
|
signing_key:
|
|
69
66
|
specification_version: 4
|
|
70
67
|
summary: Data security library for network communication and data storage for Ruby
|
data/lib/rubythemis.rb
DELETED
|
@@ -1,709 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Copyright (c) 2015 Cossack Labs Limited
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
warn %(DEPRECATION WARNING: The `rubythemis` gem is deprecated. ) +
|
|
18
|
-
%(Please use "require 'rbthemis'" instead of "require 'rubythemis'". ) +
|
|
19
|
-
%(`rubythemis.rb` will be removed in 0.12.0 release.)
|
|
20
|
-
|
|
21
|
-
require 'ffi'
|
|
22
|
-
|
|
23
|
-
module ThemisCommon
|
|
24
|
-
def string_to_pointer_size(string)
|
|
25
|
-
string_buf = FFI::MemoryPointer.new(
|
|
26
|
-
:char, string.force_encoding('BINARY').size)
|
|
27
|
-
string_buf.put_bytes(0, string.force_encoding('BINARY'),
|
|
28
|
-
0, string.force_encoding('BINARY').size)
|
|
29
|
-
[string_buf, string.force_encoding('BINARY').size]
|
|
30
|
-
end
|
|
31
|
-
module_function :string_to_pointer_size
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
module ThemisImport
|
|
35
|
-
extend FFI::Library
|
|
36
|
-
ffi_lib 'themis'
|
|
37
|
-
|
|
38
|
-
callback :get_pub_key_by_id_type,
|
|
39
|
-
[:pointer, :int, :pointer, :int, :pointer], :int
|
|
40
|
-
callback :send_callback_type, [:pointer, :int, :uint], :int
|
|
41
|
-
callback :receive_callback_type, [:pointer, :int, :uint], :int
|
|
42
|
-
|
|
43
|
-
class CallbacksStruct < FFI::Struct
|
|
44
|
-
layout :send_data, :send_callback_type,
|
|
45
|
-
:receive_data, :receive_callback_type,
|
|
46
|
-
:state_changed, :pointer,
|
|
47
|
-
:get_pub_key_for_id, :get_pub_key_by_id_type,
|
|
48
|
-
:user_data, :pointer
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
attach_function :secure_session_create,
|
|
52
|
-
[:pointer, :uint, :pointer, :uint, :pointer], :pointer
|
|
53
|
-
attach_function :secure_session_destroy, [:pointer], :int
|
|
54
|
-
attach_function :secure_session_generate_connect_request,
|
|
55
|
-
[:pointer, :pointer, :pointer], :int
|
|
56
|
-
|
|
57
|
-
attach_function :secure_session_wrap,
|
|
58
|
-
[:pointer, :pointer, :int, :pointer, :pointer], :int
|
|
59
|
-
attach_function :secure_session_unwrap,
|
|
60
|
-
[:pointer, :pointer, :int, :pointer, :pointer], :int
|
|
61
|
-
attach_function :secure_session_is_established, [:pointer], :bool
|
|
62
|
-
|
|
63
|
-
attach_function :themis_secure_message_encrypt,
|
|
64
|
-
[:pointer, :int, :pointer, :int, :pointer,
|
|
65
|
-
:int, :pointer, :pointer], :int
|
|
66
|
-
attach_function :themis_secure_message_decrypt,
|
|
67
|
-
[:pointer, :int, :pointer, :int, :pointer,
|
|
68
|
-
:int, :pointer, :pointer], :int
|
|
69
|
-
attach_function :themis_secure_message_sign,
|
|
70
|
-
[:pointer, :int, :pointer, :int, :pointer,
|
|
71
|
-
:pointer], :int
|
|
72
|
-
attach_function :themis_secure_message_verify,
|
|
73
|
-
[:pointer, :int, :pointer, :int, :pointer,
|
|
74
|
-
:pointer], :int
|
|
75
|
-
|
|
76
|
-
attach_function :themis_gen_rsa_key_pair,
|
|
77
|
-
[:pointer, :pointer, :pointer, :pointer], :int
|
|
78
|
-
attach_function :themis_gen_ec_key_pair,
|
|
79
|
-
[:pointer, :pointer, :pointer, :pointer], :int
|
|
80
|
-
|
|
81
|
-
THEMIS_KEY_INVALID = 0
|
|
82
|
-
THEMIS_KEY_RSA_PRIVATE = 1
|
|
83
|
-
THEMIS_KEY_RSA_PUBLIC = 2
|
|
84
|
-
THEMIS_KEY_EC_PRIVATE = 3
|
|
85
|
-
THEMIS_KEY_EC_PUBLIC = 4
|
|
86
|
-
|
|
87
|
-
attach_function :themis_is_valid_asym_key, [:pointer, :int], :int
|
|
88
|
-
attach_function :themis_get_asym_key_kind, [:pointer, :int], :int
|
|
89
|
-
|
|
90
|
-
attach_function :themis_secure_cell_encrypt_seal,
|
|
91
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
92
|
-
:pointer, :pointer], :int
|
|
93
|
-
attach_function :themis_secure_cell_decrypt_seal,
|
|
94
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
95
|
-
:pointer, :pointer], :int
|
|
96
|
-
|
|
97
|
-
attach_function :themis_secure_cell_encrypt_token_protect,
|
|
98
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
99
|
-
:pointer, :pointer, :pointer, :pointer], :int
|
|
100
|
-
attach_function :themis_secure_cell_decrypt_token_protect,
|
|
101
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
102
|
-
:pointer, :int, :pointer, :pointer], :int
|
|
103
|
-
|
|
104
|
-
attach_function :themis_secure_cell_encrypt_context_imprint,
|
|
105
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
106
|
-
:pointer, :pointer], :int
|
|
107
|
-
attach_function :themis_secure_cell_decrypt_context_imprint,
|
|
108
|
-
[:pointer, :int, :pointer, :int, :pointer, :int,
|
|
109
|
-
:pointer, :pointer], :int
|
|
110
|
-
|
|
111
|
-
begin
|
|
112
|
-
attach_function :secure_comparator_create, [], :pointer
|
|
113
|
-
attach_function :secure_comparator_destroy, [:pointer], :int
|
|
114
|
-
attach_function :secure_comparator_append_secret,
|
|
115
|
-
[:pointer, :pointer, :int], :int
|
|
116
|
-
attach_function :secure_comparator_begin_compare,
|
|
117
|
-
[:pointer, :pointer, :pointer], :int
|
|
118
|
-
attach_function :secure_comparator_proceed_compare,
|
|
119
|
-
[:pointer, :pointer, :int, :pointer, :pointer], :int
|
|
120
|
-
attach_function :secure_comparator_get_result, [:pointer], :int
|
|
121
|
-
rescue FFI::NotFoundError
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
module Themis
|
|
126
|
-
extend ThemisCommon
|
|
127
|
-
extend ThemisImport
|
|
128
|
-
|
|
129
|
-
extend Gem::Deprecate
|
|
130
|
-
|
|
131
|
-
BUFFER_TOO_SMALL = 14
|
|
132
|
-
SUCCESS = 0
|
|
133
|
-
FAIL = 11
|
|
134
|
-
SEND_AS_IS = 1
|
|
135
|
-
|
|
136
|
-
ThemisError = Class.new(StandardError)
|
|
137
|
-
|
|
138
|
-
class Callbacks
|
|
139
|
-
def get_pub_key_by_id(id)
|
|
140
|
-
raise ThemisError, 'Callback is not implemented: get_pub_key_by_id'
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def send(message)
|
|
144
|
-
raise ThemisError, 'Callback is not implemented: send'
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def receive
|
|
148
|
-
raise ThemisError, 'Callback is not implemented: receive'
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
class SKeyPairGen
|
|
153
|
-
include ThemisCommon
|
|
154
|
-
include ThemisImport
|
|
155
|
-
|
|
156
|
-
def ec
|
|
157
|
-
private_key_length = FFI::MemoryPointer.new(:uint)
|
|
158
|
-
public_key_length = FFI::MemoryPointer.new(:uint)
|
|
159
|
-
|
|
160
|
-
res = themis_gen_ec_key_pair(
|
|
161
|
-
nil, private_key_length, nil, public_key_length)
|
|
162
|
-
if res != BUFFER_TOO_SMALL
|
|
163
|
-
raise ThemisError, "Themis failed generating EC KeyPair: #{res}"
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
private_key = FFI::MemoryPointer.new(:char, private_key_length.read_uint)
|
|
167
|
-
public_key = FFI::MemoryPointer.new(:char, public_key_length.read_uint)
|
|
168
|
-
|
|
169
|
-
res = themis_gen_ec_key_pair(
|
|
170
|
-
private_key, private_key_length, public_key, public_key_length)
|
|
171
|
-
if res != SUCCESS
|
|
172
|
-
raise ThemisError, "Themis failed generating EC KeyPair: #{res}"
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
[private_key.get_bytes(0, private_key_length.read_uint),
|
|
176
|
-
public_key.get_bytes(0, public_key_length.read_uint)]
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def rsa
|
|
180
|
-
private_key_length = FFI::MemoryPointer.new(:uint)
|
|
181
|
-
public_key_length = FFI::MemoryPointer.new(:uint)
|
|
182
|
-
|
|
183
|
-
res = themis_gen_rsa_key_pair(
|
|
184
|
-
nil, private_key_length, nil, public_key_length)
|
|
185
|
-
if res != BUFFER_TOO_SMALL
|
|
186
|
-
raise ThemisError, "Themis failed generating RSA KeyPair: #{res}"
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
private_key = FFI::MemoryPointer.new(:char, private_key_length.read_uint)
|
|
190
|
-
public_key = FFI::MemoryPointer.new(:char, public_key_length.read_uint)
|
|
191
|
-
|
|
192
|
-
res = themis_gen_rsa_key_pair(
|
|
193
|
-
private_key, private_key_length, public_key, public_key_length)
|
|
194
|
-
if res != SUCCESS
|
|
195
|
-
raise ThemisError, "Themis failed generating RSA KeyPair: #{res}"
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
[private_key.get_bytes(0, private_key_length.read_uint),
|
|
199
|
-
public_key.get_bytes(0, public_key_length.read_uint)]
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
def Themis.valid_key(key)
|
|
204
|
-
if key.nil? || key.empty?
|
|
205
|
-
return false
|
|
206
|
-
end
|
|
207
|
-
key_, len_ = string_to_pointer_size(key)
|
|
208
|
-
return themis_is_valid_asym_key(key_, len_) == SUCCESS
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def Themis.private_key(key)
|
|
212
|
-
key_, len_ = string_to_pointer_size(key)
|
|
213
|
-
kind = themis_get_asym_key_kind(key_, len_)
|
|
214
|
-
return kind == ThemisImport::THEMIS_KEY_RSA_PRIVATE \
|
|
215
|
-
|| kind == ThemisImport::THEMIS_KEY_EC_PRIVATE
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def Themis.public_key(key)
|
|
219
|
-
key_, len_ = string_to_pointer_size(key)
|
|
220
|
-
kind = themis_get_asym_key_kind(key_, len_)
|
|
221
|
-
return kind == ThemisImport::THEMIS_KEY_RSA_PUBLIC \
|
|
222
|
-
|| kind == ThemisImport::THEMIS_KEY_EC_PUBLIC
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
class Ssession
|
|
226
|
-
include ThemisCommon
|
|
227
|
-
include ThemisImport
|
|
228
|
-
|
|
229
|
-
extend Gem::Deprecate
|
|
230
|
-
|
|
231
|
-
MAPPING = {}
|
|
232
|
-
|
|
233
|
-
GetPubKeyByIDCallback =
|
|
234
|
-
FFI::Function.new(:int, [:pointer, :int, :pointer, :int, :pointer]) do |id_buf, id_length, pubkey_buf, pubkey_length, obj|
|
|
235
|
-
pub_key = MAPPING[obj.read_uint64].get_pub_key_by_id(
|
|
236
|
-
id_buf.get_bytes(0, id_length))
|
|
237
|
-
return -1 unless pub_key
|
|
238
|
-
pubkey_buf.put_bytes(0, pub_key)
|
|
239
|
-
0
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
def initialize(id, private_key, transport)
|
|
243
|
-
id_buf, id_length = string_to_pointer_size(id)
|
|
244
|
-
private_key_buf, private_key_length = string_to_pointer_size(private_key)
|
|
245
|
-
|
|
246
|
-
@callbacks = CallbacksStruct.new
|
|
247
|
-
@callbacks[:get_pub_key_for_id] = GetPubKeyByIDCallback
|
|
248
|
-
|
|
249
|
-
MAPPING[transport.object_id] = transport
|
|
250
|
-
@transport_obj_id = transport.object_id
|
|
251
|
-
|
|
252
|
-
@callbacks[:user_data] = FFI::MemoryPointer.new(:uint64)
|
|
253
|
-
@callbacks[:user_data].write_uint64(@transport_obj_id)
|
|
254
|
-
|
|
255
|
-
@session = secure_session_create(
|
|
256
|
-
id_buf, id_length, private_key_buf, private_key_length, @callbacks)
|
|
257
|
-
|
|
258
|
-
raise ThemisError, 'Secure Session failed creating' unless @session
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
def is_established
|
|
262
|
-
established?
|
|
263
|
-
end
|
|
264
|
-
deprecate(:is_established, :established?, 2018, 6)
|
|
265
|
-
|
|
266
|
-
def established?
|
|
267
|
-
secure_session_is_established @session
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
def connect_request
|
|
271
|
-
connect_request_length = FFI::MemoryPointer.new(:uint)
|
|
272
|
-
res = secure_session_generate_connect_request(
|
|
273
|
-
@session, nil, connect_request_length)
|
|
274
|
-
if res != BUFFER_TOO_SMALL
|
|
275
|
-
raise(ThemisError,
|
|
276
|
-
"Secure Session failed making connection request: #{res}")
|
|
277
|
-
end
|
|
278
|
-
connect_request = FFI::MemoryPointer.new(
|
|
279
|
-
:char, connect_request_length.read_uint)
|
|
280
|
-
res = secure_session_generate_connect_request(
|
|
281
|
-
@session, connect_request, connect_request_length)
|
|
282
|
-
if res != SUCCESS
|
|
283
|
-
raise(ThemisError,
|
|
284
|
-
"Secure Session failed making connection request: #{res}")
|
|
285
|
-
end
|
|
286
|
-
connect_request.get_bytes(0, connect_request_length.read_uint)
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
def unwrap(message)
|
|
290
|
-
message_, message_length_ = string_to_pointer_size message
|
|
291
|
-
unwrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
292
|
-
|
|
293
|
-
res = secure_session_unwrap(
|
|
294
|
-
@session, message_, message_length_, nil, unwrapped_message_length)
|
|
295
|
-
return SUCCESS, '' if res == SUCCESS
|
|
296
|
-
if res != BUFFER_TOO_SMALL
|
|
297
|
-
raise ThemisError, "Secure Session failed decrypting: #{res}"
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
unwrapped_message = FFI::MemoryPointer.new(
|
|
301
|
-
:char, unwrapped_message_length.read_uint)
|
|
302
|
-
res = secure_session_unwrap(@session, message_, message_length_,
|
|
303
|
-
unwrapped_message, unwrapped_message_length)
|
|
304
|
-
if res != SUCCESS && res != SEND_AS_IS
|
|
305
|
-
raise ThemisError, "Secure Session failed decrypting: #{res}"
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
[res, unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)]
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
def wrap(message)
|
|
312
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
313
|
-
|
|
314
|
-
wrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
315
|
-
res = secure_session_wrap(
|
|
316
|
-
@session, message_, message_length_, nil, wrapped_message_length)
|
|
317
|
-
if res != BUFFER_TOO_SMALL
|
|
318
|
-
raise ThemisError, "Secure Session failed encrypting: #{res}"
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
wrapped_message = FFI::MemoryPointer.new(
|
|
322
|
-
:char, wrapped_message_length.read_uint)
|
|
323
|
-
res = secure_session_wrap(@session, message_, message_length_,
|
|
324
|
-
wrapped_message, wrapped_message_length)
|
|
325
|
-
if res != SUCCESS && res != SEND_AS_IS
|
|
326
|
-
raise ThemisError, "Secure Session failed encrypting: #{res}"
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
def finalize
|
|
333
|
-
res = secure_session_destroy(@session)
|
|
334
|
-
raise ThemisError, 'Secure Session failed destroying' if res != SUCCESS
|
|
335
|
-
end
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
class Smessage
|
|
339
|
-
include ThemisCommon
|
|
340
|
-
include ThemisImport
|
|
341
|
-
|
|
342
|
-
def initialize(private_key, peer_public_key)
|
|
343
|
-
if not Themis.valid_key(private_key)
|
|
344
|
-
raise ThemisError, "Secure Message: invalid private key"
|
|
345
|
-
end
|
|
346
|
-
if not Themis.valid_key(peer_public_key)
|
|
347
|
-
raise ThemisError, "Secure Message: invalid public key"
|
|
348
|
-
end
|
|
349
|
-
if not Themis.private_key(private_key)
|
|
350
|
-
raise ThemisError, "Secure Message: public key used instead of private"
|
|
351
|
-
end
|
|
352
|
-
if not Themis.public_key(peer_public_key)
|
|
353
|
-
raise ThemisError, "Secure Message: private key used instead of public"
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
@private_key, @private_key_length = string_to_pointer_size(private_key)
|
|
357
|
-
@peer_public_key, @peer_public_key_length =
|
|
358
|
-
string_to_pointer_size(peer_public_key)
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
def wrap(message)
|
|
362
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
363
|
-
|
|
364
|
-
wrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
365
|
-
res = themis_secure_message_encrypt(
|
|
366
|
-
@private_key, @private_key_length, @peer_public_key,
|
|
367
|
-
@peer_public_key_length, message_, message_length_,
|
|
368
|
-
nil, wrapped_message_length)
|
|
369
|
-
if res != BUFFER_TOO_SMALL
|
|
370
|
-
raise ThemisError, "Secure Message failed to encrypt: #{res}"
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
wrapped_message = FFI::MemoryPointer.new(
|
|
374
|
-
:char, wrapped_message_length.read_uint)
|
|
375
|
-
res = themis_secure_message_encrypt(
|
|
376
|
-
@private_key, @private_key_length, @peer_public_key,
|
|
377
|
-
@peer_public_key_length, message_, message_length_,
|
|
378
|
-
wrapped_message, wrapped_message_length)
|
|
379
|
-
if res != SUCCESS
|
|
380
|
-
raise ThemisError, "Secure Message failed to encrypt: #{res}"
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
def unwrap(message)
|
|
387
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
388
|
-
unwrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
389
|
-
res = themis_secure_message_decrypt(
|
|
390
|
-
@private_key, @private_key_length, @peer_public_key,
|
|
391
|
-
@peer_public_key_length, message_, message_length_,
|
|
392
|
-
nil, unwrapped_message_length)
|
|
393
|
-
if res != BUFFER_TOO_SMALL
|
|
394
|
-
raise ThemisError, "Secure Message failed to decrypt: #{res}"
|
|
395
|
-
end
|
|
396
|
-
|
|
397
|
-
unwrapped_message = FFI::MemoryPointer.new(
|
|
398
|
-
:char, unwrapped_message_length.read_uint)
|
|
399
|
-
res = themis_secure_message_decrypt(
|
|
400
|
-
@private_key, @private_key_length, @peer_public_key,
|
|
401
|
-
@peer_public_key_length, message_, message_length_,
|
|
402
|
-
unwrapped_message, unwrapped_message_length)
|
|
403
|
-
if res != SUCCESS
|
|
404
|
-
raise ThemisError, "Secure Message failed to decrypt: #{res}"
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)
|
|
408
|
-
end
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
def Ssign(*args)
|
|
412
|
-
s_sign(*args)
|
|
413
|
-
end
|
|
414
|
-
deprecate :Ssign, :s_sign, 2018, 6
|
|
415
|
-
|
|
416
|
-
def s_sign(private_key, message)
|
|
417
|
-
if not valid_key(private_key)
|
|
418
|
-
raise ThemisError, "Secure Message: invalid private key"
|
|
419
|
-
end
|
|
420
|
-
if not private_key(private_key)
|
|
421
|
-
raise ThemisError, "Secure Message: public key used instead of private"
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
private_key_, private_key_length_ = string_to_pointer_size(private_key)
|
|
425
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
426
|
-
|
|
427
|
-
wrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
428
|
-
res = themis_secure_message_sign(
|
|
429
|
-
private_key_, private_key_length_, message_,
|
|
430
|
-
message_length_, nil, wrapped_message_length)
|
|
431
|
-
if res != BUFFER_TOO_SMALL
|
|
432
|
-
raise ThemisError, "Secure Message failed to sign: #{res}"
|
|
433
|
-
end
|
|
434
|
-
|
|
435
|
-
wrapped_message = FFI::MemoryPointer.new(
|
|
436
|
-
:char, wrapped_message_length.read_uint)
|
|
437
|
-
res = themis_secure_message_sign(
|
|
438
|
-
private_key_, private_key_length_, message_,
|
|
439
|
-
message_length_, wrapped_message, wrapped_message_length)
|
|
440
|
-
if res != SUCCESS
|
|
441
|
-
raise ThemisError, "Secure Message failed to sign: #{res}"
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
def Sverify(*args)
|
|
448
|
-
s_verify(*args)
|
|
449
|
-
end
|
|
450
|
-
deprecate :Sverify, :s_verify, 2018, 6
|
|
451
|
-
|
|
452
|
-
def s_verify(peer_public_key, message)
|
|
453
|
-
if not valid_key(peer_public_key)
|
|
454
|
-
raise ThemisError, "Secure Message: invalid public key"
|
|
455
|
-
end
|
|
456
|
-
if not public_key(peer_public_key)
|
|
457
|
-
raise ThemisError, "Secure Message: private key used instead of public"
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
public_key_, public_key_length_ = string_to_pointer_size(peer_public_key)
|
|
461
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
462
|
-
|
|
463
|
-
unwrapped_message_length = FFI::MemoryPointer.new(:uint)
|
|
464
|
-
res = themis_secure_message_verify(
|
|
465
|
-
public_key_, public_key_length_, message_,
|
|
466
|
-
message_length_, nil, unwrapped_message_length)
|
|
467
|
-
if res != BUFFER_TOO_SMALL
|
|
468
|
-
raise ThemisError, "Secure Message failed to verify: #{res}"
|
|
469
|
-
end
|
|
470
|
-
|
|
471
|
-
unwrapped_message = FFI::MemoryPointer.new(
|
|
472
|
-
:char, unwrapped_message_length.read_uint)
|
|
473
|
-
res = themis_secure_message_verify(
|
|
474
|
-
public_key_, public_key_length_, message_,
|
|
475
|
-
message_length_, unwrapped_message, unwrapped_message_length)
|
|
476
|
-
if res != SUCCESS
|
|
477
|
-
raise ThemisError, "Secure Message failed to verify: #{res}"
|
|
478
|
-
end
|
|
479
|
-
|
|
480
|
-
unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)
|
|
481
|
-
end
|
|
482
|
-
|
|
483
|
-
class Scell
|
|
484
|
-
include ThemisCommon
|
|
485
|
-
include ThemisImport
|
|
486
|
-
|
|
487
|
-
SEAL_MODE = 0
|
|
488
|
-
TOKEN_PROTECT_MODE = 1
|
|
489
|
-
CONTEXT_IMPRINT_MODE = 2
|
|
490
|
-
|
|
491
|
-
def initialize(key, mode)
|
|
492
|
-
@key, @key_length = string_to_pointer_size(key)
|
|
493
|
-
@mode = mode
|
|
494
|
-
end
|
|
495
|
-
|
|
496
|
-
def encrypt(message, context = nil)
|
|
497
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
498
|
-
context_, context_length_ =
|
|
499
|
-
context.nil? ? [nil, 0] : string_to_pointer_size(context)
|
|
500
|
-
encrypted_message_length = FFI::MemoryPointer.new(:uint)
|
|
501
|
-
enccontext_length = FFI::MemoryPointer.new(:uint)
|
|
502
|
-
case @mode
|
|
503
|
-
when SEAL_MODE
|
|
504
|
-
res = themis_secure_cell_encrypt_seal(
|
|
505
|
-
@key, @key_length, context_, context_length_, message_,
|
|
506
|
-
message_length_, nil, encrypted_message_length)
|
|
507
|
-
if res != BUFFER_TOO_SMALL
|
|
508
|
-
raise ThemisError, "Secure Cell (Seal) failed encrypting: #{res}"
|
|
509
|
-
end
|
|
510
|
-
encrypted_message = FFI::MemoryPointer.new(
|
|
511
|
-
:char, encrypted_message_length.read_uint)
|
|
512
|
-
res = themis_secure_cell_encrypt_seal(
|
|
513
|
-
@key, @key_length, context_, context_length_, message_,
|
|
514
|
-
message_length_, encrypted_message, encrypted_message_length)
|
|
515
|
-
if res != SUCCESS
|
|
516
|
-
raise ThemisError, "Secure Cell (Seal) failed encrypting: #{res}"
|
|
517
|
-
end
|
|
518
|
-
encrypted_message.get_bytes(0, encrypted_message_length.read_uint)
|
|
519
|
-
when TOKEN_PROTECT_MODE
|
|
520
|
-
res = themis_secure_cell_encrypt_token_protect(
|
|
521
|
-
@key, @key_length, context_, context_length_, message_,
|
|
522
|
-
message_length_, nil, enccontext_length, nil,
|
|
523
|
-
encrypted_message_length)
|
|
524
|
-
if res != BUFFER_TOO_SMALL
|
|
525
|
-
raise(ThemisError,
|
|
526
|
-
"Secure Cell (Token protect) failed encrypting: #{res}")
|
|
527
|
-
end
|
|
528
|
-
encrypted_message = FFI::MemoryPointer.new(
|
|
529
|
-
:char, encrypted_message_length.read_uint)
|
|
530
|
-
enccontext = FFI::MemoryPointer.new(:char, enccontext_length.read_uint)
|
|
531
|
-
res = themis_secure_cell_encrypt_token_protect(
|
|
532
|
-
@key, @key_length, context_, context_length_, message_,
|
|
533
|
-
message_length_, enccontext, enccontext_length, encrypted_message,
|
|
534
|
-
encrypted_message_length)
|
|
535
|
-
if res != SUCCESS
|
|
536
|
-
raise(ThemisError,
|
|
537
|
-
"Secure Cell (Token Protect) failed encrypting: #{res}")
|
|
538
|
-
end
|
|
539
|
-
[encrypted_message.get_bytes(0, encrypted_message_length.read_uint),
|
|
540
|
-
enccontext.get_bytes(0, enccontext_length.read_uint),]
|
|
541
|
-
when CONTEXT_IMPRINT_MODE
|
|
542
|
-
res = themis_secure_cell_encrypt_context_imprint(
|
|
543
|
-
@key, @key_length, message_, message_length_, context_,
|
|
544
|
-
context_length_, nil, encrypted_message_length)
|
|
545
|
-
if res != BUFFER_TOO_SMALL
|
|
546
|
-
raise(ThemisError,
|
|
547
|
-
"Secure Cell (Context Imprint) failed encrypting: #{res}")
|
|
548
|
-
end
|
|
549
|
-
encrypted_message = FFI::MemoryPointer.new(
|
|
550
|
-
:char, encrypted_message_length.read_uint)
|
|
551
|
-
res = themis_secure_cell_encrypt_context_imprint(
|
|
552
|
-
@key, @key_length, message_, message_length_, context_,
|
|
553
|
-
context_length_, encrypted_message, encrypted_message_length)
|
|
554
|
-
if res != SUCCESS
|
|
555
|
-
raise(ThemisError,
|
|
556
|
-
"Secure Cell (Context Imprint) failed encrypting: #{res}")
|
|
557
|
-
end
|
|
558
|
-
encrypted_message.get_bytes(0, encrypted_message_length.read_uint)
|
|
559
|
-
else
|
|
560
|
-
raise ThemisError, 'Secure Cell failed encrypting, undefined mode'
|
|
561
|
-
end
|
|
562
|
-
end
|
|
563
|
-
|
|
564
|
-
def decrypt(message, context = nil)
|
|
565
|
-
context_, context_length_ =
|
|
566
|
-
context.nil? ? [nil, 0] : string_to_pointer_size(context)
|
|
567
|
-
decrypted_message_length = FFI::MemoryPointer.new(:uint)
|
|
568
|
-
case @mode
|
|
569
|
-
when SEAL_MODE
|
|
570
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
571
|
-
res = themis_secure_cell_decrypt_seal(
|
|
572
|
-
@key, @key_length, context_, context_length_, message_,
|
|
573
|
-
message_length_, nil, decrypted_message_length)
|
|
574
|
-
if res != BUFFER_TOO_SMALL
|
|
575
|
-
raise ThemisError, "Secure Cell (Seal) failed decrypting: #{res}"
|
|
576
|
-
end
|
|
577
|
-
decrypted_message = FFI::MemoryPointer.new(
|
|
578
|
-
:char, decrypted_message_length.read_uint)
|
|
579
|
-
res = themis_secure_cell_decrypt_seal(
|
|
580
|
-
@key, @key_length, context_, context_length_, message_,
|
|
581
|
-
message_length_, decrypted_message, decrypted_message_length)
|
|
582
|
-
if res != SUCCESS
|
|
583
|
-
raise ThemisError, "Secure Cell (Seal) failed decrypting: #{res}"
|
|
584
|
-
end
|
|
585
|
-
decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
|
|
586
|
-
when TOKEN_PROTECT_MODE
|
|
587
|
-
message_, enccontext = message
|
|
588
|
-
message__, message_length__ = string_to_pointer_size(message_)
|
|
589
|
-
enccontext_, enccontext_length = string_to_pointer_size(enccontext)
|
|
590
|
-
res = themis_secure_cell_decrypt_token_protect(
|
|
591
|
-
@key, @key_length, context_, context_length_, message__,
|
|
592
|
-
message_length__, enccontext_, enccontext_length, nil,
|
|
593
|
-
decrypted_message_length)
|
|
594
|
-
if res != BUFFER_TOO_SMALL
|
|
595
|
-
raise(ThemisError,
|
|
596
|
-
"Secure Cell (Token Protect) failed decrypting: #{res}")
|
|
597
|
-
end
|
|
598
|
-
decrypted_message = FFI::MemoryPointer.new(
|
|
599
|
-
:char, decrypted_message_length.read_uint)
|
|
600
|
-
res = themis_secure_cell_decrypt_token_protect(
|
|
601
|
-
@key, @key_length, context_, context_length_, message__,
|
|
602
|
-
message_length__, enccontext_, enccontext_length,
|
|
603
|
-
decrypted_message, decrypted_message_length)
|
|
604
|
-
if res != SUCCESS
|
|
605
|
-
raise(ThemisError,
|
|
606
|
-
"Secure Cell (Token Protect) failed decrypting: #{res}")
|
|
607
|
-
end
|
|
608
|
-
decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
|
|
609
|
-
when CONTEXT_IMPRINT_MODE
|
|
610
|
-
message_, message_length_ = string_to_pointer_size(message)
|
|
611
|
-
res = themis_secure_cell_decrypt_context_imprint(
|
|
612
|
-
@key, @key_length, message_, message_length_, context_,
|
|
613
|
-
context_length_, nil, decrypted_message_length)
|
|
614
|
-
if res != BUFFER_TOO_SMALL
|
|
615
|
-
raise(ThemisError,
|
|
616
|
-
"Secure Cell (Context Imprint) failed decrypting: #{res}")
|
|
617
|
-
end
|
|
618
|
-
decrypted_message = FFI::MemoryPointer.new(
|
|
619
|
-
:char, decrypted_message_length.read_uint)
|
|
620
|
-
res = themis_secure_cell_decrypt_context_imprint(@key, @key_length,
|
|
621
|
-
message_, message_length_, context_, context_length_,
|
|
622
|
-
decrypted_message, decrypted_message_length)
|
|
623
|
-
if res != SUCCESS
|
|
624
|
-
raise(ThemisError,
|
|
625
|
-
"Secure Cell (Context Imprint) failed decrypting: #{res}")
|
|
626
|
-
end
|
|
627
|
-
decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
|
|
628
|
-
else
|
|
629
|
-
raise ThemisError, 'Secure Cell failed encrypting, undefined mode'
|
|
630
|
-
end
|
|
631
|
-
end
|
|
632
|
-
end
|
|
633
|
-
|
|
634
|
-
class Scomparator
|
|
635
|
-
include ThemisCommon
|
|
636
|
-
include ThemisImport
|
|
637
|
-
|
|
638
|
-
MATCH = 21
|
|
639
|
-
NOT_MATCH = 22
|
|
640
|
-
NOT_READY = 0
|
|
641
|
-
|
|
642
|
-
def initialize(shared_secret)
|
|
643
|
-
shared_secret_buf, shared_secret_length =
|
|
644
|
-
string_to_pointer_size(shared_secret)
|
|
645
|
-
@comparator = secure_comparator_create
|
|
646
|
-
raise ThemisError, 'Secure Comparator failed creating' unless @comparator
|
|
647
|
-
res = secure_comparator_append_secret(
|
|
648
|
-
@comparator, shared_secret_buf, shared_secret_length)
|
|
649
|
-
if res != SUCCESS
|
|
650
|
-
raise ThemisError, 'Secure Comparator failed appending secret'
|
|
651
|
-
end
|
|
652
|
-
end
|
|
653
|
-
|
|
654
|
-
def finalize
|
|
655
|
-
res = secure_comparator_destroy(@comparator)
|
|
656
|
-
if res != SUCCESS
|
|
657
|
-
raise ThemisError, 'Secure Comparator failed destroying'
|
|
658
|
-
end
|
|
659
|
-
end
|
|
660
|
-
|
|
661
|
-
def begin_compare
|
|
662
|
-
res_length = FFI::MemoryPointer.new(:uint)
|
|
663
|
-
res = secure_comparator_begin_compare(@comparator, nil, res_length)
|
|
664
|
-
if res != BUFFER_TOO_SMALL
|
|
665
|
-
raise(ThemisError,
|
|
666
|
-
'Secure Comparator failed making initialisation message')
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
res_buffer = FFI::MemoryPointer.new(:char, res_length.read_uint)
|
|
670
|
-
res = secure_comparator_begin_compare(@comparator, res_buffer, res_length)
|
|
671
|
-
if res != SUCCESS && res != SEND_AS_IS
|
|
672
|
-
raise(ThemisError,
|
|
673
|
-
'Secure Comparator failed making initialisation message')
|
|
674
|
-
end
|
|
675
|
-
|
|
676
|
-
res_buffer.get_bytes(0, res_length.read_uint)
|
|
677
|
-
end
|
|
678
|
-
|
|
679
|
-
def proceed_compare(control_message)
|
|
680
|
-
message, message_length = string_to_pointer_size(control_message)
|
|
681
|
-
res_length = FFI::MemoryPointer.new(:uint)
|
|
682
|
-
|
|
683
|
-
res = secure_comparator_proceed_compare(
|
|
684
|
-
@comparator, message, message_length, nil, res_length)
|
|
685
|
-
return '' if res == SUCCESS
|
|
686
|
-
if res != BUFFER_TOO_SMALL
|
|
687
|
-
raise ThemisError, 'Secure Comparator failed proceeding message'
|
|
688
|
-
end
|
|
689
|
-
|
|
690
|
-
res_buffer = FFI::MemoryPointer.new(:char, res_length.read_uint)
|
|
691
|
-
res = secure_comparator_proceed_compare(
|
|
692
|
-
@comparator, message, message_length, res_buffer, res_length)
|
|
693
|
-
if res != SUCCESS && res != SEND_AS_IS
|
|
694
|
-
raise ThemisError, 'Secure Comparator failed proceeding message'
|
|
695
|
-
end
|
|
696
|
-
|
|
697
|
-
res_buffer.get_bytes(0, res_length.read_uint)
|
|
698
|
-
end
|
|
699
|
-
|
|
700
|
-
def result
|
|
701
|
-
secure_comparator_get_result(@comparator)
|
|
702
|
-
end
|
|
703
|
-
end
|
|
704
|
-
|
|
705
|
-
module_function :Ssign
|
|
706
|
-
module_function :Sverify
|
|
707
|
-
module_function :s_sign
|
|
708
|
-
module_function :s_verify
|
|
709
|
-
end
|