cirandas.net

ref: master

vendor/ezcrypto/test/ezcrypto_test.rb


  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
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
$:.unshift(File.dirname(__FILE__) + "/../lib/")

require 'test/unit'
require 'fileutils'
require 'ezcrypto'
require 'base64'

class EzCryptoTest < Test::Unit::TestCase

  def setup
  end

  def test_generate_alg_key
    assert_generate_alg_key "aes-128-cbc",16
    assert_generate_alg_key "aes-192-cbc",24
    assert_generate_alg_key "aes-256-cbc",32    
    assert_generate_alg_key "rc2-40-cbc",5 
    assert_generate_alg_key "rc2-64-cbc",8
    assert_generate_alg_key "rc4-64" ,8
    assert_generate_alg_key "blowfish" ,16
    assert_generate_alg_key "des" ,8
  end
  
  def test_with_password
      assert_with_password "","secret","aes-128-cbc",16
      assert_with_password "test","secret","aes-128-cbc",16
      assert_with_password "password","secret","aes-128-cbc",16
      assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-128-cbc",16
      
      assert_with_password "","secret","aes-192-cbc",24
      assert_with_password "test","secret","aes-192-cbc",24
      assert_with_password "password","secret","aes-192-cbc",24
      assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-192-cbc",24

      assert_with_password "","secret","aes-256-cbc",32
      assert_with_password "test","secret","aes-256-cbc",32
      assert_with_password "password","secret","aes-256-cbc",32
      assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-256-cbc",32

  end

  def test_encoded
    0.upto 32 do |size|
      assert_encoded_keys size
    end
  end
  
  def test_encrypt    
    0.upto(CLEAR_TEXT.size-1) do |size|
      assert_encrypt CLEAR_TEXT[0..size]
    end  
  end
  
  def test_decrypt    
    0.upto(CLEAR_TEXT.size) do |size|
      assert_decrypt CLEAR_TEXT[0..size]
    end  
  end

  def test_decrypt64
    0.upto(CLEAR_TEXT.size) do |size|
      assert_decrypt64 CLEAR_TEXT[0..size]
    end  
  end
    
  def test_keyfile_store_load

    algo, size = "aes-256-cbc", 32   
    keyfile = 'ezcrypto-test.key'
    
    FileUtils.rm [keyfile], :force => true
    key = EzCrypto::Key.generate :algorithm => algo    
    assert_file_not_exists keyfile    
    key.store keyfile    
    assert_file_exists keyfile    
    assert_file_permissions keyfile, 0100400    
    
    key2 = EzCrypto::Key.load(keyfile)    
    assert_equal key.raw, key2.raw
    
    FileUtils.rm [keyfile], :force => true    
  end
  
  def test_filestuff_with_defaults      

    clearfile = 'lorem_ipsum.txt'
    keyfile = 'lorem_ipsum.key'
    algo, size = "aes-256-cbc", 32
    
    File.open(clearfile, 'w') { |f| f.write(CLEAR_TEXT) }
    assert_file_contains clearfile, CLEAR_TEXT    

    key = EzCrypto::Key.generate :algorithm => algo    

    # default behaviour: remove clearfile, append '.ez' suffix  
    cryptfile = key.encrypt_file(clearfile)    
    assert_equal cryptfile, clearfile + ".ez"
    assert_file_not_exists clearfile
    assert_file_exists cryptfile 
    assert_file_contains cryptfile, key.encrypt(CLEAR_TEXT)    

    # default behaviour: unlink cryptfile and remove suffix from filename
    clearfile = key.decrypt_file cryptfile
    assert_file_exists clearfile
    assert_file_not_exists cryptfile
    assert_file_contains clearfile, CLEAR_TEXT    
    FileUtils.rm [keyfile, clearfile, cryptfile], :force => true
  end
  
  def test_filestuff_with_options
  
    clearfile = 'lorem_ipsum.txt'
    keyfile = 'lorem_ipsum.key'
    algo, size = "aes-256-cbc", 32    

    File.open(clearfile, 'w') { |f| f.write(CLEAR_TEXT) }
    assert_file_contains clearfile, CLEAR_TEXT
    
    key = EzCrypto::Key.generate :algorithm => algo      
    
    # with options: keep the original file, auto-create a 
    # new filename with a user-defined suffix        
    cryptfile = key.encrypt_file(clearfile, nil, :autoclean => false, :suffix => '.Encrypted')
    assert_equal cryptfile, clearfile + ".Encrypted", 'suffix was added'
    assert_file_exists clearfile
    assert_file_exists cryptfile    
    assert_file_permissions cryptfile, 0100600
    
    assert_raises(Errno::EEXIST, "the original file would not be overwritten") { 
      key.decrypt_file(cryptfile, nil, :autoclean => false, :suffix => '.Encrypted')
    } 
    FileUtils.rm [clearfile], :force => true    

    clearfile = key.decrypt_file(cryptfile, nil, :autoclean => false, :suffix => '.Encrypted')
    assert_equal cryptfile, clearfile + ".Encrypted", 'suffix was removed'    
    assert_file_exists clearfile
    assert_file_exists cryptfile
    assert_file_permissions cryptfile, 0100600    
    assert_file_contains clearfile, CLEAR_TEXT    

    FileUtils.rm [keyfile, clearfile, cryptfile], :force => true        
  end
    
  def assert_file_permissions(filename, mode, msg='')
    fmode = File.stat(filename).mode
    assert_equal fmode, mode, msg 
  end
  
  def assert_file_exists(filename)
    assert File.exists?(filename)
  end

  def assert_file_not_exists(filename)
    assert !File.exists?(filename)
  end
  
  def assert_file_contains(filename, expected)
    assert_file_exists(filename)
    content = File.open(filename,'r').read
    assert_equal expected, content
  end
  
  def assert_key_size(size,key)
    assert_equal size,key.raw.size      
  end
  
  def assert_generate_alg_key(algorithm,size)
    key=EzCrypto::Key.generate :algorithm=>algorithm
    assert_key_size size,key 
  end
 
  def assert_with_password(password,salt,algorithm,size)
    key=EzCrypto::Key.with_password password,salt,:algorithm=>algorithm
    assert_key_size size,key
    assert_equal key.raw,EzCrypto::Key.with_password( password,salt,:algorithm=>algorithm).raw
  end
  
  def assert_encoded_keys(size)
    key=EzCrypto::Key.generate size
    key2=EzCrypto::Key.decode(key.encode)
    assert_equal key.raw, key2.raw    
  end
  
  def assert_encrypt(clear)
    ALGORITHMS.each do |alg|
      key=EzCrypto::Key.generate :algorithm=>alg
      encrypted=key.encrypt clear
      assert_not_nil encrypted    
    end
  end
  
  def assert_decrypt(clear)
    ALGORITHMS.each do |alg|
      key=EzCrypto::Key.generate :algorithm=>alg
      encrypted=key.encrypt clear
      assert_not_nil encrypted
      assert_equal clear,key.decrypt(encrypted)
    end
  end
  
  def assert_decrypt64(clear)
    key=EzCrypto::Key.generate
    encrypted=key.encrypt64 clear
    assert_not_nil encrypted
    assert_equal clear,key.decrypt64(encrypted)
  end
  
  ALGORITHMS=["aes128","bf","blowfish","des","des3","rc4","rc2"]
  CLEAR_TEXT="Lorem ipsum dolor sit amet, suspendisse id interdum mus leo id. Sapien tempus consequat nullam, platea vitae sociis sed elementum et fermentum, vel praesent eget. Sed blandit augue, molestie mus sed habitant, semper voluptatibus neque, nullam a augue. Aptent imperdiet curabitur, quam quis laoreet. Dolor magna. Quis vestibulum amet eu arcu fringilla nibh, mi urna sunt dictumst nulla, elit quisque purus eros, sem hendrerit. Vulputate tortor rhoncus ac nonummy tortor nulla. Nunc id nunc luctus ligula."
end