class Evervault::Crypto::Client
Attributes
request[R]
Public Class Methods
new(request:)
click to toggle source
# File lib/evervault/crypto/client.rb, line 12 def initialize(request:) @request = request end
Public Instance Methods
encrypt(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 16 def encrypt(data) raise Evervault::Errors::UndefinedDataError.new( "Data is required for encryption" ) if data.nil? || data.empty? if data.instance_of? Hash encrypt_hash(data) elsif encryptable_data?(data) encrypt_string(data) end end
Private Instance Methods
encrypt_hash(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 45 def encrypt_hash(data) if encryptable_data?(data) return encrypt_string(data) elsif data.instance_of?(Hash) encrypted_data = {} data.each { |key, value| encrypted_data[key] = encrypt_hash(value) } return encrypted_data end data end
encrypt_string(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 28 def encrypt_string(data) cipher = OpenSSL::Cipher::AES256.new(:GCM).encrypt iv = cipher.random_iv root_key = cipher.random_key cipher.key = root_key cipher.iv = iv encrypted_data = cipher.update(data) + cipher.final encrypted_buffer = encrypted_data + cipher.auth_tag encrypted_key = team_key.public_key.public_encrypt( root_key, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING ) data = [encrypted_key, encrypted_buffer, iv].map { |val| Base64.strict_encode64(val) } format(header_type(data), *data) end
encryptable_data?(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 56 def encryptable_data?(data) data.instance_of?(String) || data.instance_of?(Array) || [true, false].include?(data) || data.instance_of?(Integer) || data.instance_of?(Float) end
format(header, encrypted_key, encrypted_data, iv)
click to toggle source
# File lib/evervault/crypto/client.rb, line 66 def format(header, encrypted_key, encrypted_data, iv) header = utf8_to_base_64_url( { iss: "evervault", version: 1, datatype: header }.to_json ) payload = utf8_to_base_64_url( { cageData: encrypted_key, keyIv: iv, sharedEncryptedData: encrypted_data }.to_json ) "#{header}.#{payload}.#{SecureRandom.uuid}" end
header_type(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 87 def header_type(data) if data.instance_of?(Array) return "Array" elsif [true, false].include?(data) return "boolean" elsif data.instance_of?(Hash) return "object" elsif data.instance_of?(Float) || data.instance_of?(Integer) return "number" elsif data.instance_of?(String) return "string" end end
team_key()
click to toggle source
# File lib/evervault/crypto/client.rb, line 62 def team_key @team_key ||= Key.new(public_key: @request.get("cages/key")["key"]) end
utf8_to_base_64_url(data)
click to toggle source
# File lib/evervault/crypto/client.rb, line 82 def utf8_to_base_64_url(data) b64_string = Base64.strict_encode64(data) b64_string.gsub("+", "-").gsub("/", "_") end