Skip to content

Commit 026f0e0

Browse files
authored
Merge pull request #1 from securenative/dev
Encrypt/Decrypt
2 parents 37b4c3d + 8f346fa commit 026f0e0

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

lib/securenative/config.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ module Config
66
TRACK_EVENT = "/track"
77
VERIFY_EVENT = "/verify"
88
FLOW_EVENT = "/flow"
9+
CIPHER_SIZE = 256
10+
AES_BLOCK_SIZE = 32
911
end

lib/securenative/utils.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
require_relative 'config'
2+
require "logger"
13
require "base64"
24
require "json"
35
require 'openssl'
46

7+
58
module Utils
69
def self.verify_signature(secret, text_body, header_signature)
710
begin
@@ -38,4 +41,34 @@ def self.parse_cookie(cookie = nil)
3841
return fp, cid
3942
end
4043
end
44+
45+
def self.encrypt(plain_text, key)
46+
cipher = OpenSSL::Cipher::AES.new(Config::CIPHER_SIZE, :CBC).encrypt
47+
cipher.padding = 0
48+
49+
if plain_text.size % Config::AES_BLOCK_SIZE != 0
50+
logger = Logger.new(STDOUT)
51+
logger.level = Logger::WARN
52+
logger.fatal("data not multiple of block length")
53+
return nil
54+
end
55+
56+
key = Digest::SHA1.hexdigest key
57+
cipher.key = key.slice(0, Config::AES_BLOCK_SIZE)
58+
s = cipher.update(plain_text) + cipher.final
59+
60+
s.unpack('H*')[0].upcase
61+
end
62+
63+
def self.decrypt(encrypted, key)
64+
cipher = OpenSSL::Cipher::AES.new(Config::CIPHER_SIZE, :CBC).decrypt
65+
cipher.padding = 0
66+
67+
key = Digest::SHA1.hexdigest key
68+
cipher.key = key.slice(0, Config::AES_BLOCK_SIZE)
69+
s = [encrypted].pack("H*").unpack("C*").pack("c*")
70+
71+
rv = cipher.update(s) + cipher.final
72+
return rv.strip
73+
end
4174
end

test/test_utils.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,24 @@
2525
expect(cookie[0]).to be_empty
2626
expect(cookie[1]).to be_empty
2727
end
28+
29+
it "encrypt text" do
30+
plain_text = "Some random plain text for test"
31+
key = "6EA4915349C0AAC6F6572DA4F6B00C42DAD33E75"
32+
encrypted = "B8D770D0F7388EC3DF62B0097C36C05CAB03E934F2E2760536004F87FE11644C"
33+
34+
res = Utils.encrypt(plain_text, key)
35+
expect(res).to_not be_empty
36+
expect(res).to eq(encrypted)
37+
end
38+
39+
it "decrypt text" do
40+
encrypted_text = "B8D770D0F7388EC3DF62B0097C36C05CAB03E934F2E2760536004F87FE11644C"
41+
decrypted = "Some random plain text for test"
42+
key = "6EA4915349C0AAC6F6572DA4F6B00C42DAD33E75"
43+
44+
res = Utils.decrypt(encrypted_text, key)
45+
expect(res).to_not be_empty
46+
expect(res).to eq(decrypted)
47+
end
2848
end

0 commit comments

Comments
 (0)