rbthemis 0.10.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 +7 -0
  2. data/lib/rubythemis.rb +645 -0
  3. metadata +70 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 882a2cc4955dac5be7b20b4e72850118ccbd8d4d
4
+ data.tar.gz: 181012eb67923ba79fd15514dba8f8e53efde6b1
5
+ SHA512:
6
+ metadata.gz: 3e1cd0ac78beeceb97aa708297f8c8ec80a7eb0c4e8b61f4f64535388531d25bbe790122e3504546546f0bd9cfae92f69c76270a7d779ca38f0edbe73bdc12e8
7
+ data.tar.gz: 3e58ca419b4125a7e2717c7647d1db567251c71560758121b7e16e329111e983953784a3df7c1fd8624ac149c8e62705904db529113528cc9b1488af13854f65
data/lib/rubythemis.rb ADDED
@@ -0,0 +1,645 @@
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
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbthemis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.10.0
5
+ platform: ruby
6
+ authors:
7
+ - CossackLabs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.9.8
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.9'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
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.
38
+ email: dev@cossacklabs.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - lib/rubythemis.rb
44
+ homepage: http://cossacklabs.com/
45
+ licenses:
46
+ - Apache-2.0
47
+ metadata: {}
48
+ post_install_message: If you were using rubythemis before, please uninstall it from
49
+ your system using `gem uninstall rubythemis`
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements:
64
+ - libthemis, v0.10.0
65
+ rubyforge_project:
66
+ rubygems_version: 2.4.8
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: Data security library for network communication and data storage for Ruby
70
+ test_files: []