Module: Keystok::AESCrypto

Included in:
Client
Defined in:
lib/keystok/aes_crypto.rb

Overview

Module handling data encryption and decryption It also handles raw data from API unpacking

Constant Summary collapse

PREFIX =
':aes256:'

Instance Method Summary collapse

Instance Method Details

#cipher(plain_text, key, iv, key_size = 256, block_mode = :CBC) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/keystok/aes_crypto.rb', line 16

def cipher(plain_text, key, iv, key_size = 256, block_mode = :CBC)
  cipher = OpenSSL::Cipher::AES.new(key_size, block_mode)
  cipher.encrypt
  cipher.key = key
  cipher.iv = iv
  cipher.update(plain_text) + cipher.final
end

#decipher(encrypted, key, iv, key_size = 256, block_mode = :CBC) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/keystok/aes_crypto.rb', line 24

def decipher(encrypted, key, iv, key_size = 256, block_mode = :CBC)
  decipher = OpenSSL::Cipher::AES.new(key_size, block_mode)
  decipher.decrypt
  decipher.key = key
  decipher.iv = iv
  decipher.update(encrypted) + decipher.final
end

#decrypt_key(encrypted_key, config = nil) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/keystok/aes_crypto.rb', line 32

def decrypt_key(encrypted_key, config = nil)
  config ||= @config || {}
  fail Error::ConfigError, 'No decryption key in config' unless config[:dk]
  unless encrypted_key.start_with?(PREFIX)
    fail Error::UnsupportedDataFormat, 'Wrong encryption algorithm'
  end
  encrypted_data = Base64.decode64(encrypted_key.sub(/^:[^:]+:/, ''))
  json_data = JSON.parse(encrypted_data)
  key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(config[:dk],
                                        Base64.decode64(json_data['salt']),
                                        json_data['iter'],
                                        json_data['ks'] / 8)
  decipher(Base64.decode64(json_data['ct']), key,
           Base64.decode64(json_data['iv']), json_data['ks'])
end