rbthemis 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +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