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.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. metadata +5 -8
  3. data/lib/rubythemis.rb +0 -709
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8bb951f9da0bc027471c72aea7cd56eabc7991b1
4
- data.tar.gz: 2f5d37f48f67ced53c083b259e4f0af4cb5253f9
2
+ SHA256:
3
+ metadata.gz: 76eb20b6223204fc2d128ba98bf69b9a30f38e89baf26c0a2adf1c32162de96c
4
+ data.tar.gz: 41aff8e122e39cf7a8b7da7564e67233ea31efb1438d7a9aac68ba589f88dda9
5
5
  SHA512:
6
- metadata.gz: bf76747c0f1fc78e8d4f2a599877008586daaf24ee9bb57d86cfb989b524db3b7917bd9cb82b00c2366519c4499c0338eb112b4a33148bfa57bbf2a3b413ef37
7
- data.tar.gz: 75686146b8c9f4801de42033fb1be44d1dea86618286f9ac5b93228f74cf66becb45a734acf13f25a8b0f7b7fd0b440405c59f7c366685bf72d08b13a4791ef2
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.11.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-03-28 00:00:00.000000000 Z
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: If you were using rubythemis before, please uninstall it from
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.11.0
66
- rubyforge_project:
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
@@ -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