summaryrefslogtreecommitdiff
path: root/lib/trunk/storage.rb
blob: a041f604d7be6cff509110a591ad9505c9db83a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module Trunk
  class CompositeSerializer
    def initialize(serializers = [])
      @serializers = serializers
    end

    def add(serializer)
      @serializers.push(serializer)
    end

    def serialize(value)
      @serializers.each do |x|
        value = x.serialize(value)
      end
      value
    end

    def deserialize(value)
      puts "deserialize"
      @serializers.reverse.each do |x|
        puts x.class
        value = x.deserialize(value)
      end
      value
    end
  end

  class Base64Serializer
    def serialize(value)
      Base64.strict_encode64(value)
    end

    def deserialize(value)
      Base64.decode64(value)
    end
  end

  class SymmetricCrypto
    attr_reader :private_key, :algorithm

    def initialize(private_key, algorithm: 'AES-256-CBC')
      @private_key = private_key
      @algorithm = algorithm
    end

    def serialize(plain_text)
      cipher = OpenSSL::Cipher.new(algorithm)
      cipher.encrypt
      cipher.key = private_key
      cipher.random_iv + cipher.update(plain_text) + cipher.final
    end

    def deserialize(cipher_text)
      cipher = OpenSSL::Cipher.new(algorithm)
      cipher.decrypt
      iv = cipher_text[0..cipher.iv_len - 1]
      data = cipher_text[cipher.iv_len..-1]
      cipher.key = private_key
      cipher.iv = iv
      cipher.update(data) + cipher.final
    end
  end

  class Storage
    def initialize(hash, serializer)
      @hash = hash
      @serializer = serializer
    end

    def fetch(key)
      value = @hash[key]
      return if value.nil?
      @serializer.deserialize(value)
    end

    def store(key, value)
      @hash[key] = @serializer.serialize(value)
    end
  end
end