rbthemis 0.10.0 → 0.14.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 (4) hide show
  1. checksums.yaml +5 -5
  2. data/lib/rbthemis.rb +992 -0
  3. metadata +12 -15
  4. data/lib/rubythemis.rb +0 -645
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.10.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CossackLabs
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-06 00:00:00.000000000 Z
11
+ date: 2021-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -30,23 +30,21 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.9.8
33
- description: Themis is a data security library, providing users with high-quality
34
- security services for secure messaging of any kinds and flexible data storage. Themis
35
- is aimed at modern developers, with high level OOP wrappers for Ruby, Python, PHP,
36
- Java / Android and iOS / OSX. It is designed with ease of use in mind, high security
37
- and cross-platform availability.
33
+ description: Themis is a convenient cryptographic library for data protection. It
34
+ provides secure messaging with forward secrecy and secure data storage. Themis is
35
+ aimed at modern development practices and has a unified API across 12 platforms,
36
+ including Ruby, JavaScript, iOS/macOS, Python, and Java/Android.
38
37
  email: dev@cossacklabs.com
39
38
  executables: []
40
39
  extensions: []
41
40
  extra_rdoc_files: []
42
41
  files:
43
- - lib/rubythemis.rb
42
+ - lib/rbthemis.rb
44
43
  homepage: http://cossacklabs.com/
45
44
  licenses:
46
45
  - Apache-2.0
47
46
  metadata: {}
48
- post_install_message: If you were using rubythemis before, please uninstall it from
49
- your system using `gem uninstall rubythemis`
47
+ post_install_message:
50
48
  rdoc_options: []
51
49
  require_paths:
52
50
  - lib
@@ -61,10 +59,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
59
  - !ruby/object:Gem::Version
62
60
  version: '0'
63
61
  requirements:
64
- - libthemis, v0.10.0
65
- rubyforge_project:
66
- rubygems_version: 2.4.8
67
- signing_key:
62
+ - libthemis, v0.14.0
63
+ rubygems_version: 3.1.4
64
+ signing_key:
68
65
  specification_version: 4
69
66
  summary: Data security library for network communication and data storage for Ruby
70
67
  test_files: []
data/lib/rubythemis.rb DELETED
@@ -1,645 +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
- require 'ffi'
18
-
19
- module ThemisCommon
20
- def string_to_pointer_size(string)
21
- string_buf = FFI::MemoryPointer.new(
22
- :char, string.force_encoding('BINARY').size)
23
- string_buf.put_bytes(0, string.force_encoding('BINARY'),
24
- 0, string.force_encoding('BINARY').size)
25
- [string_buf, string.force_encoding('BINARY').size]
26
- end
27
- module_function :string_to_pointer_size
28
- end
29
-
30
- module ThemisImport
31
- extend FFI::Library
32
- ffi_lib 'themis'
33
-
34
- callback :get_pub_key_by_id_type,
35
- [:pointer, :int, :pointer, :int, :pointer], :int
36
- callback :send_callback_type, [:pointer, :int, :uint], :int
37
- callback :receive_callback_type, [:pointer, :int, :uint], :int
38
-
39
- class CallbacksStruct < FFI::Struct
40
- layout :send_data, :send_callback_type,
41
- :receive_data, :receive_callback_type,
42
- :state_changed, :pointer,
43
- :get_pub_key_for_id, :get_pub_key_by_id_type,
44
- :user_data, :pointer
45
- end
46
-
47
- attach_function :secure_session_create,
48
- [:pointer, :uint, :pointer, :uint, :pointer], :pointer
49
- attach_function :secure_session_destroy, [:pointer], :int
50
- attach_function :secure_session_generate_connect_request,
51
- [:pointer, :pointer, :pointer], :int
52
-
53
- attach_function :secure_session_wrap,
54
- [:pointer, :pointer, :int, :pointer, :pointer], :int
55
- attach_function :secure_session_unwrap,
56
- [:pointer, :pointer, :int, :pointer, :pointer], :int
57
- attach_function :secure_session_is_established, [:pointer], :bool
58
-
59
- attach_function :themis_secure_message_wrap,
60
- [:pointer, :int, :pointer, :int, :pointer,
61
- :int, :pointer, :pointer], :int
62
- attach_function :themis_secure_message_unwrap,
63
- [:pointer, :int, :pointer, :int, :pointer,
64
- :int, :pointer, :pointer], :int
65
-
66
- attach_function :themis_gen_rsa_key_pair,
67
- [:pointer, :pointer, :pointer, :pointer], :int
68
- attach_function :themis_gen_ec_key_pair,
69
- [:pointer, :pointer, :pointer, :pointer], :int
70
- attach_function :themis_version, [], :string
71
-
72
- attach_function :themis_secure_cell_encrypt_seal,
73
- [:pointer, :int, :pointer, :int, :pointer, :int,
74
- :pointer, :pointer], :int
75
- attach_function :themis_secure_cell_decrypt_seal,
76
- [:pointer, :int, :pointer, :int, :pointer, :int,
77
- :pointer, :pointer], :int
78
-
79
- attach_function :themis_secure_cell_encrypt_token_protect,
80
- [:pointer, :int, :pointer, :int, :pointer, :int,
81
- :pointer, :pointer, :pointer, :pointer], :int
82
- attach_function :themis_secure_cell_decrypt_token_protect,
83
- [:pointer, :int, :pointer, :int, :pointer, :int,
84
- :pointer, :int, :pointer, :pointer], :int
85
-
86
- attach_function :themis_secure_cell_encrypt_context_imprint,
87
- [:pointer, :int, :pointer, :int, :pointer, :int,
88
- :pointer, :pointer], :int
89
- attach_function :themis_secure_cell_decrypt_context_imprint,
90
- [:pointer, :int, :pointer, :int, :pointer, :int,
91
- :pointer, :pointer], :int
92
-
93
- begin
94
- attach_function :secure_comparator_create, [], :pointer
95
- attach_function :secure_comparator_destroy, [:pointer], :int
96
- attach_function :secure_comparator_append_secret,
97
- [:pointer, :pointer, :int], :int
98
- attach_function :secure_comparator_begin_compare,
99
- [:pointer, :pointer, :pointer], :int
100
- attach_function :secure_comparator_proceed_compare,
101
- [:pointer, :pointer, :int, :pointer, :pointer], :int
102
- attach_function :secure_comparator_get_result, [:pointer], :int
103
- rescue FFI::NotFoundError
104
- end
105
- end
106
-
107
- module Themis
108
- extend ThemisCommon
109
- extend ThemisImport
110
-
111
- extend Gem::Deprecate
112
-
113
- BUFFER_TOO_SMALL = 14
114
- SUCCESS = 0
115
- FAIL = 11
116
- SEND_AS_IS = 1
117
-
118
- ThemisError = Class.new(StandardError)
119
-
120
- class Callbacks
121
- def get_pub_key_by_id(id)
122
- raise ThemisError, 'Callback is not implemented: get_pub_key_by_id'
123
- end
124
-
125
- def send(message)
126
- raise ThemisError, 'Callback is not implemented: send'
127
- end
128
-
129
- def receive
130
- raise ThemisError, 'Callback is not implemented: receive'
131
- end
132
- end
133
-
134
- class SKeyPairGen
135
- include ThemisCommon
136
- include ThemisImport
137
-
138
- def ec
139
- private_key_length = FFI::MemoryPointer.new(:uint)
140
- public_key_length = FFI::MemoryPointer.new(:uint)
141
-
142
- res = themis_gen_ec_key_pair(
143
- nil, private_key_length, nil, public_key_length)
144
- if res != BUFFER_TOO_SMALL
145
- raise ThemisError, "Themis failed generating EC KeyPair: #{res}"
146
- end
147
-
148
- private_key = FFI::MemoryPointer.new(:char, private_key_length.read_uint)
149
- public_key = FFI::MemoryPointer.new(:char, public_key_length.read_uint)
150
-
151
- res = themis_gen_ec_key_pair(
152
- private_key, private_key_length, public_key, public_key_length)
153
- if res != SUCCESS
154
- raise ThemisError, "Themis failed generating EC KeyPair: #{res}"
155
- end
156
-
157
- [private_key.get_bytes(0, private_key_length.read_uint),
158
- public_key.get_bytes(0, public_key_length.read_uint)]
159
- end
160
-
161
- def rsa
162
- private_key_length = FFI::MemoryPointer.new(:uint)
163
- public_key_length = FFI::MemoryPointer.new(:uint)
164
-
165
- res = themis_gen_rsa_key_pair(
166
- nil, private_key_length, nil, public_key_length)
167
- if res != BUFFER_TOO_SMALL
168
- raise ThemisError, "Themis failed generating RSA KeyPair: #{res}"
169
- end
170
-
171
- private_key = FFI::MemoryPointer.new(:char, private_key_length.read_uint)
172
- public_key = FFI::MemoryPointer.new(:char, public_key_length.read_uint)
173
-
174
- res = themis_gen_rsa_key_pair(
175
- private_key, private_key_length, public_key, public_key_length)
176
- if res != SUCCESS
177
- raise ThemisError, "Themis failed generating RSA KeyPair: #{res}"
178
- end
179
-
180
- [private_key.get_bytes(0, private_key_length.read_uint),
181
- public_key.get_bytes(0, public_key_length.read_uint)]
182
- end
183
- end
184
-
185
- class Ssession
186
- include ThemisCommon
187
- include ThemisImport
188
-
189
- extend Gem::Deprecate
190
-
191
- MAPPING = {}
192
-
193
- GetPubKeyByIDCallback =
194
- FFI::Function.new(:int, [:pointer, :int, :pointer, :int, :pointer]) do |id_buf, id_length, pubkey_buf, pubkey_length, obj|
195
- pub_key = MAPPING[obj.read_uint64].get_pub_key_by_id(
196
- id_buf.get_bytes(0, id_length))
197
- return -1 unless pub_key
198
- pubkey_buf.put_bytes(0, pub_key)
199
- 0
200
- end
201
-
202
- def initialize(id, private_key, transport)
203
- id_buf, id_length = string_to_pointer_size(id)
204
- private_key_buf, private_key_length = string_to_pointer_size(private_key)
205
-
206
- @callbacks = CallbacksStruct.new
207
- @callbacks[:get_pub_key_for_id] = GetPubKeyByIDCallback
208
-
209
- MAPPING[transport.object_id] = transport
210
- @transport_obj_id = transport.object_id
211
-
212
- @callbacks[:user_data] = FFI::MemoryPointer.new(:uint64)
213
- @callbacks[:user_data].write_uint64(@transport_obj_id)
214
-
215
- @session = secure_session_create(
216
- id_buf, id_length, private_key_buf, private_key_length, @callbacks)
217
-
218
- raise ThemisError, 'Secure Session failed creating' unless @session
219
- end
220
-
221
- def is_established
222
- established?
223
- end
224
- deprecate(:is_established, :established?, 2018, 6)
225
-
226
- def established?
227
- secure_session_is_established @session
228
- end
229
-
230
- def connect_request
231
- connect_request_length = FFI::MemoryPointer.new(:uint)
232
- res = secure_session_generate_connect_request(
233
- @session, nil, connect_request_length)
234
- if res != BUFFER_TOO_SMALL
235
- raise(ThemisError,
236
- "Secure Session failed making connection request: #{res}")
237
- end
238
- connect_request = FFI::MemoryPointer.new(
239
- :char, connect_request_length.read_uint)
240
- res = secure_session_generate_connect_request(
241
- @session, connect_request, connect_request_length)
242
- if res != SUCCESS
243
- raise(ThemisError,
244
- "Secure Session failed making connection request: #{res}")
245
- end
246
- connect_request.get_bytes(0, connect_request_length.read_uint)
247
- end
248
-
249
- def unwrap(message)
250
- message_, message_length_ = string_to_pointer_size message
251
- unwrapped_message_length = FFI::MemoryPointer.new(:uint)
252
-
253
- res = secure_session_unwrap(
254
- @session, message_, message_length_, nil, unwrapped_message_length)
255
- return SUCCESS, '' if res == SUCCESS
256
- if res != BUFFER_TOO_SMALL
257
- raise ThemisError, "Secure Session failed decrypting: #{res}"
258
- end
259
-
260
- unwrapped_message = FFI::MemoryPointer.new(
261
- :char, unwrapped_message_length.read_uint)
262
- res = secure_session_unwrap(@session, message_, message_length_,
263
- unwrapped_message, unwrapped_message_length)
264
- if res != SUCCESS && res != SEND_AS_IS
265
- raise ThemisError, "Secure Session failed decrypting: #{res}"
266
- end
267
-
268
- [res, unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)]
269
- end
270
-
271
- def wrap(message)
272
- message_, message_length_ = string_to_pointer_size(message)
273
-
274
- wrapped_message_length = FFI::MemoryPointer.new(:uint)
275
- res = secure_session_wrap(
276
- @session, message_, message_length_, nil, wrapped_message_length)
277
- if res != BUFFER_TOO_SMALL
278
- raise ThemisError, "Secure Session failed encrypting: #{res}"
279
- end
280
-
281
- wrapped_message = FFI::MemoryPointer.new(
282
- :char, wrapped_message_length.read_uint)
283
- res = secure_session_wrap(@session, message_, message_length_,
284
- wrapped_message, wrapped_message_length)
285
- if res != SUCCESS && res != SEND_AS_IS
286
- raise ThemisError, "Secure Session failed encrypting: #{res}"
287
- end
288
-
289
- wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
290
- end
291
-
292
- def finalize
293
- res = secure_session_destroy(@session)
294
- raise ThemisError, 'Secure Session failed destroying' if res != SUCCESS
295
- end
296
- end
297
-
298
- class Smessage
299
- include ThemisCommon
300
- include ThemisImport
301
-
302
- def initialize(private_key, peer_public_key)
303
- @private_key, @private_key_length = string_to_pointer_size(private_key)
304
- @peer_public_key, @peer_public_key_length =
305
- string_to_pointer_size(peer_public_key)
306
- end
307
-
308
- def wrap(message)
309
- message_, message_length_ = string_to_pointer_size(message)
310
-
311
- wrapped_message_length = FFI::MemoryPointer.new(:uint)
312
- res = themis_secure_message_wrap(
313
- @private_key, @private_key_length, @peer_public_key,
314
- @peer_public_key_length, message_, message_length_,
315
- nil, wrapped_message_length)
316
- if res != BUFFER_TOO_SMALL
317
- raise ThemisError, "Secure Message failed encrypting: #{res}"
318
- end
319
-
320
- wrapped_message = FFI::MemoryPointer.new(
321
- :char, wrapped_message_length.read_uint)
322
- res = themis_secure_message_wrap(
323
- @private_key, @private_key_length, @peer_public_key,
324
- @peer_public_key_length, message_, message_length_,
325
- wrapped_message, wrapped_message_length)
326
- if res != SUCCESS
327
- raise ThemisError, "Secure Message failed encrypting: #{res}"
328
- end
329
-
330
- wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
331
- end
332
-
333
- def unwrap(message)
334
- message_, message_length_ = string_to_pointer_size(message)
335
- unwrapped_message_length = FFI::MemoryPointer.new(:uint)
336
- res = themis_secure_message_unwrap(
337
- @private_key, @private_key_length, @peer_public_key,
338
- @peer_public_key_length, message_, message_length_,
339
- nil, unwrapped_message_length)
340
- if res != BUFFER_TOO_SMALL
341
- raise ThemisError, "Secure Message failed decrypting: #{res}"
342
- end
343
-
344
- unwrapped_message = FFI::MemoryPointer.new(
345
- :char, unwrapped_message_length.read_uint)
346
- res = themis_secure_message_unwrap(
347
- @private_key, @private_key_length, @peer_public_key,
348
- @peer_public_key_length, message_, message_length_,
349
- unwrapped_message, unwrapped_message_length)
350
- if res != SUCCESS
351
- raise ThemisError, "Secure Message failed decrypting: #{res}"
352
- end
353
-
354
- unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)
355
- end
356
- end
357
-
358
- def Ssign(*args)
359
- s_sign(*args)
360
- end
361
- deprecate :Ssign, :s_sign, 2018, 6
362
-
363
- def s_sign(private_key, message)
364
- private_key_, private_key_length_ = string_to_pointer_size(private_key)
365
- message_, message_length_ = string_to_pointer_size(message)
366
-
367
- wrapped_message_length = FFI::MemoryPointer.new(:uint)
368
- res = themis_secure_message_wrap(
369
- private_key_, private_key_length_, nil, 0, message_,
370
- message_length_, nil, wrapped_message_length)
371
- if res != BUFFER_TOO_SMALL
372
- raise ThemisError, "Secure Message failed singing: #{res}"
373
- end
374
-
375
- wrapped_message = FFI::MemoryPointer.new(
376
- :char, wrapped_message_length.read_uint)
377
- res = themis_secure_message_wrap(
378
- private_key_, private_key_length_, nil, 0, message_,
379
- message_length_, wrapped_message, wrapped_message_length)
380
- if res != SUCCESS
381
- raise ThemisError, "Secure Message failed singing: #{res}"
382
- end
383
-
384
- wrapped_message.get_bytes(0, wrapped_message_length.read_uint)
385
- end
386
-
387
- def Sverify(*args)
388
- s_verify(*args)
389
- end
390
- deprecate :Sverify, :s_verify, 2018, 6
391
-
392
- def s_verify(peer_public_key, message)
393
- include ThemisCommon
394
- include ThemisImport
395
-
396
- public_key_, public_key_length_ = string_to_pointer_size(peer_public_key)
397
- message_, message_length_ = string_to_pointer_size(message)
398
-
399
- unwrapped_message_length = FFI::MemoryPointer.new(:uint)
400
- res = themis_secure_message_unwrap(
401
- nil, 0, public_key_, public_key_length_, message_,
402
- message_length_, nil, unwrapped_message_length)
403
- if res != BUFFER_TOO_SMALL
404
- raise ThemisError, "Secure Message failed verifying: #{res}"
405
- end
406
-
407
- unwrapped_message = FFI::MemoryPointer.new(
408
- :char, unwrapped_message_length.read_uint)
409
- res = themis_secure_message_unwrap(
410
- nil, 0, public_key_, public_key_length_, message_,
411
- message_length_, unwrapped_message, unwrapped_message_length)
412
- if res != SUCCESS
413
- raise ThemisError, "Secure Message failed verifying: #{res}"
414
- end
415
-
416
- unwrapped_message.get_bytes(0, unwrapped_message_length.read_uint)
417
- end
418
-
419
- class Scell
420
- include ThemisCommon
421
- include ThemisImport
422
-
423
- SEAL_MODE = 0
424
- TOKEN_PROTECT_MODE = 1
425
- CONTEXT_IMPRINT_MODE = 2
426
-
427
- def initialize(key, mode)
428
- @key, @key_length = string_to_pointer_size(key)
429
- @mode = mode
430
- end
431
-
432
- def encrypt(message, context = nil)
433
- message_, message_length_ = string_to_pointer_size(message)
434
- context_, context_length_ =
435
- context.nil? ? [nil, 0] : string_to_pointer_size(context)
436
- encrypted_message_length = FFI::MemoryPointer.new(:uint)
437
- enccontext_length = FFI::MemoryPointer.new(:uint)
438
- case @mode
439
- when SEAL_MODE
440
- res = themis_secure_cell_encrypt_seal(
441
- @key, @key_length, context_, context_length_, message_,
442
- message_length_, nil, encrypted_message_length)
443
- if res != BUFFER_TOO_SMALL
444
- raise ThemisError, "Secure Cell (Seal) failed encrypting: #{res}"
445
- end
446
- encrypted_message = FFI::MemoryPointer.new(
447
- :char, encrypted_message_length.read_uint)
448
- res = themis_secure_cell_encrypt_seal(
449
- @key, @key_length, context_, context_length_, message_,
450
- message_length_, encrypted_message, encrypted_message_length)
451
- if res != SUCCESS
452
- raise ThemisError, "Secure Cell (Seal) failed encrypting: #{res}"
453
- end
454
- encrypted_message.get_bytes(0, encrypted_message_length.read_uint)
455
- when TOKEN_PROTECT_MODE
456
- res = themis_secure_cell_encrypt_token_protect(
457
- @key, @key_length, context_, context_length_, message_,
458
- message_length_, nil, enccontext_length, nil,
459
- encrypted_message_length)
460
- if res != BUFFER_TOO_SMALL
461
- raise(ThemisError,
462
- "Secure Cell (Token protect) failed encrypting: #{res}")
463
- end
464
- encrypted_message = FFI::MemoryPointer.new(
465
- :char, encrypted_message_length.read_uint)
466
- enccontext = FFI::MemoryPointer.new(:char, enccontext_length.read_uint)
467
- res = themis_secure_cell_encrypt_token_protect(
468
- @key, @key_length, context_, context_length_, message_,
469
- message_length_, enccontext, enccontext_length, encrypted_message,
470
- encrypted_message_length)
471
- if res != SUCCESS
472
- raise(ThemisError,
473
- "Secure Cell (Token Protect) failed encrypting: #{res}")
474
- end
475
- [encrypted_message.get_bytes(0, encrypted_message_length.read_uint),
476
- enccontext.get_bytes(0, enccontext_length.read_uint),]
477
- when CONTEXT_IMPRINT_MODE
478
- res = themis_secure_cell_encrypt_context_imprint(
479
- @key, @key_length, message_, message_length_, context_,
480
- context_length_, nil, encrypted_message_length)
481
- if res != BUFFER_TOO_SMALL
482
- raise(ThemisError,
483
- "Secure Cell (Context Imprint) failed encrypting: #{res}")
484
- end
485
- encrypted_message = FFI::MemoryPointer.new(
486
- :char, encrypted_message_length.read_uint)
487
- res = themis_secure_cell_encrypt_context_imprint(
488
- @key, @key_length, message_, message_length_, context_,
489
- context_length_, encrypted_message, encrypted_message_length)
490
- if res != SUCCESS
491
- raise(ThemisError,
492
- "Secure Cell (Context Imprint) failed encrypting: #{res}")
493
- end
494
- encrypted_message.get_bytes(0, encrypted_message_length.read_uint)
495
- else
496
- raise ThemisError, 'Secure Cell failed encrypting, undefined mode'
497
- end
498
- end
499
-
500
- def decrypt(message, context = nil)
501
- context_, context_length_ =
502
- context.nil? ? [nil, 0] : string_to_pointer_size(context)
503
- decrypted_message_length = FFI::MemoryPointer.new(:uint)
504
- case @mode
505
- when SEAL_MODE
506
- message_, message_length_ = string_to_pointer_size(message)
507
- res = themis_secure_cell_decrypt_seal(
508
- @key, @key_length, context_, context_length_, message_,
509
- message_length_, nil, decrypted_message_length)
510
- if res != BUFFER_TOO_SMALL
511
- raise ThemisError, "Secure Cell (Seal) failed decrypting: #{res}"
512
- end
513
- decrypted_message = FFI::MemoryPointer.new(
514
- :char, decrypted_message_length.read_uint)
515
- res = themis_secure_cell_decrypt_seal(
516
- @key, @key_length, context_, context_length_, message_,
517
- message_length_, decrypted_message, decrypted_message_length)
518
- if res != SUCCESS
519
- raise ThemisError, "Secure Cell (Seal) failed decrypting: #{res}"
520
- end
521
- decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
522
- when TOKEN_PROTECT_MODE
523
- message_, enccontext = message
524
- message__, message_length__ = string_to_pointer_size(message_)
525
- enccontext_, enccontext_length = string_to_pointer_size(enccontext)
526
- res = themis_secure_cell_decrypt_token_protect(
527
- @key, @key_length, context_, context_length_, message__,
528
- message_length__, enccontext_, enccontext_length, nil,
529
- decrypted_message_length)
530
- if res != BUFFER_TOO_SMALL
531
- raise(ThemisError,
532
- "Secure Cell (Token Protect) failed decrypting: #{res}")
533
- end
534
- decrypted_message = FFI::MemoryPointer.new(
535
- :char, decrypted_message_length.read_uint)
536
- res = themis_secure_cell_decrypt_token_protect(
537
- @key, @key_length, context_, context_length_, message__,
538
- message_length__, enccontext_, enccontext_length,
539
- decrypted_message, decrypted_message_length)
540
- if res != SUCCESS
541
- raise(ThemisError,
542
- "Secure Cell (Token Protect) failed decrypting: #{res}")
543
- end
544
- decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
545
- when CONTEXT_IMPRINT_MODE
546
- message_, message_length_ = string_to_pointer_size(message)
547
- res = themis_secure_cell_decrypt_context_imprint(
548
- @key, @key_length, message_, message_length_, context_,
549
- context_length_, nil, decrypted_message_length)
550
- if res != BUFFER_TOO_SMALL
551
- raise(ThemisError,
552
- "Secure Cell (Context Imprint) failed decrypting: #{res}")
553
- end
554
- decrypted_message = FFI::MemoryPointer.new(
555
- :char, decrypted_message_length.read_uint)
556
- res = themis_secure_cell_decrypt_context_imprint(@key, @key_length,
557
- message_, message_length_, context_, context_length_,
558
- decrypted_message, decrypted_message_length)
559
- if res != SUCCESS
560
- raise(ThemisError,
561
- "Secure Cell (Context Imprint) failed decrypting: #{res}")
562
- end
563
- decrypted_message.get_bytes(0, decrypted_message_length.read_uint)
564
- else
565
- raise ThemisError, 'Secure Cell failed encrypting, undefined mode'
566
- end
567
- end
568
- end
569
-
570
- class Scomparator
571
- include ThemisCommon
572
- include ThemisImport
573
-
574
- MATCH = 21
575
- NOT_MATCH = 22
576
- NOT_READY = 0
577
-
578
- def initialize(shared_secret)
579
- shared_secret_buf, shared_secret_length =
580
- string_to_pointer_size(shared_secret)
581
- @comparator = secure_comparator_create
582
- raise ThemisError, 'Secure Comparator failed creating' unless @comparator
583
- res = secure_comparator_append_secret(
584
- @comparator, shared_secret_buf, shared_secret_length)
585
- if res != SUCCESS
586
- raise ThemisError, 'Secure Comparator failed appending secret'
587
- end
588
- end
589
-
590
- def finalize
591
- res = secure_comparator_destroy(@comparator)
592
- if res != SUCCESS
593
- raise ThemisError, 'Secure Comparator failed destroying'
594
- end
595
- end
596
-
597
- def begin_compare
598
- res_length = FFI::MemoryPointer.new(:uint)
599
- res = secure_comparator_begin_compare(@comparator, nil, res_length)
600
- if res != BUFFER_TOO_SMALL
601
- raise(ThemisError,
602
- 'Secure Comparator failed making initialisation message')
603
- end
604
-
605
- res_buffer = FFI::MemoryPointer.new(:char, res_length.read_uint)
606
- res = secure_comparator_begin_compare(@comparator, res_buffer, res_length)
607
- if res != SUCCESS && res != SEND_AS_IS
608
- raise(ThemisError,
609
- 'Secure Comparator failed making initialisation message')
610
- end
611
-
612
- res_buffer.get_bytes(0, res_length.read_uint)
613
- end
614
-
615
- def proceed_compare(control_message)
616
- message, message_length = string_to_pointer_size(control_message)
617
- res_length = FFI::MemoryPointer.new(:uint)
618
-
619
- res = secure_comparator_proceed_compare(
620
- @comparator, message, message_length, nil, res_length)
621
- return '' if res == SUCCESS
622
- if res != BUFFER_TOO_SMALL
623
- raise ThemisError, 'Secure Comparator failed proceeding message'
624
- end
625
-
626
- res_buffer = FFI::MemoryPointer.new(:char, res_length.read_uint)
627
- res = secure_comparator_proceed_compare(
628
- @comparator, message, message_length, res_buffer, res_length)
629
- if res != SUCCESS && res != SEND_AS_IS
630
- raise ThemisError, 'Secure Comparator failed proceeding message'
631
- end
632
-
633
- res_buffer.get_bytes(0, res_length.read_uint)
634
- end
635
-
636
- def result
637
- secure_comparator_get_result(@comparator)
638
- end
639
- end
640
-
641
- module_function :Ssign
642
- module_function :Sverify
643
- module_function :s_sign
644
- module_function :s_verify
645
- end