rubyzip 0.9.1 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +354 -0
- data/Rakefile +15 -104
- data/TODO +0 -1
- data/lib/zip/central_directory.rb +212 -0
- data/lib/zip/compressor.rb +9 -0
- data/lib/zip/constants.rb +115 -0
- data/lib/zip/crypto/decrypted_io.rb +40 -0
- data/lib/zip/crypto/encryption.rb +11 -0
- data/lib/zip/crypto/null_encryption.rb +43 -0
- data/lib/zip/crypto/traditional_encryption.rb +99 -0
- data/lib/zip/decompressor.rb +31 -0
- data/lib/zip/deflater.rb +34 -0
- data/lib/zip/dos_time.rb +53 -0
- data/lib/zip/entry.rb +719 -0
- data/lib/zip/entry_set.rb +88 -0
- data/lib/zip/errors.rb +19 -0
- data/lib/zip/extra_field/generic.rb +44 -0
- data/lib/zip/extra_field/ntfs.rb +94 -0
- data/lib/zip/extra_field/old_unix.rb +46 -0
- data/lib/zip/extra_field/universal_time.rb +77 -0
- data/lib/zip/extra_field/unix.rb +39 -0
- data/lib/zip/extra_field/zip64.rb +70 -0
- data/lib/zip/extra_field/zip64_placeholder.rb +15 -0
- data/lib/zip/extra_field.rb +103 -0
- data/lib/zip/file.rb +468 -0
- data/lib/zip/filesystem.rb +643 -0
- data/lib/zip/inflater.rb +54 -0
- data/lib/zip/input_stream.rb +180 -0
- data/lib/zip/ioextras/abstract_input_stream.rb +122 -0
- data/lib/zip/ioextras/abstract_output_stream.rb +43 -0
- data/lib/zip/ioextras.rb +21 -140
- data/lib/zip/null_compressor.rb +15 -0
- data/lib/zip/null_decompressor.rb +19 -0
- data/lib/zip/null_input_stream.rb +10 -0
- data/lib/zip/output_stream.rb +198 -0
- data/lib/zip/pass_thru_compressor.rb +23 -0
- data/lib/zip/pass_thru_decompressor.rb +31 -0
- data/lib/zip/streamable_directory.rb +15 -0
- data/lib/zip/streamable_stream.rb +52 -0
- data/lib/zip/version.rb +3 -0
- data/lib/zip.rb +72 -0
- data/samples/example.rb +44 -32
- data/samples/example_filesystem.rb +16 -19
- data/samples/example_recursive.rb +54 -0
- data/samples/gtk_ruby_zip.rb +84 -0
- data/samples/qtzip.rb +25 -34
- data/samples/write_simple.rb +10 -13
- data/samples/zipfind.rb +38 -45
- metadata +182 -91
- data/ChangeLog +0 -1504
- data/NEWS +0 -144
- data/README +0 -72
- data/install.rb +0 -22
- data/lib/download_quizzes.rb +0 -119
- data/lib/quiz1/t/solutions/Bill Guindon/solitaire.rb +0 -205
- data/lib/quiz1/t/solutions/Carlos/solitaire.rb +0 -111
- data/lib/quiz1/t/solutions/Dennis Ranke/solitaire.rb +0 -111
- data/lib/quiz1/t/solutions/Florian Gross/solitaire.rb +0 -301
- data/lib/quiz1/t/solutions/Glen M. Lewis/solitaire.rb +0 -268
- data/lib/quiz1/t/solutions/James Edward Gray II/solitaire.rb +0 -132
- data/lib/quiz1/t/solutions/Jamis Buck/bin/main.rb +0 -13
- data/lib/quiz1/t/solutions/Jamis Buck/lib/cipher.rb +0 -230
- data/lib/quiz1/t/solutions/Jamis Buck/lib/cli.rb +0 -24
- data/lib/quiz1/t/solutions/Jamis Buck/test/tc_deck.rb +0 -30
- data/lib/quiz1/t/solutions/Jamis Buck/test/tc_key-stream.rb +0 -19
- data/lib/quiz1/t/solutions/Jamis Buck/test/tc_keying-algorithms.rb +0 -31
- data/lib/quiz1/t/solutions/Jamis Buck/test/tc_solitaire-cipher.rb +0 -66
- data/lib/quiz1/t/solutions/Jamis Buck/test/tc_unkeyed-algorithm.rb +0 -17
- data/lib/quiz1/t/solutions/Jamis Buck/test/tests.rb +0 -2
- data/lib/quiz1/t/solutions/Jim Menard/solitaire_cypher.rb +0 -204
- data/lib/quiz1/t/solutions/Jim Menard/test.rb +0 -47
- data/lib/quiz1/t/solutions/Moses Hohman/cipher.rb +0 -97
- data/lib/quiz1/t/solutions/Moses Hohman/deck.rb +0 -140
- data/lib/quiz1/t/solutions/Moses Hohman/solitaire.rb +0 -14
- data/lib/quiz1/t/solutions/Moses Hohman/test_cipher.rb +0 -68
- data/lib/quiz1/t/solutions/Moses Hohman/test_deck.rb +0 -146
- data/lib/quiz1/t/solutions/Moses Hohman/test_util.rb +0 -38
- data/lib/quiz1/t/solutions/Moses Hohman/testsuite.rb +0 -5
- data/lib/quiz1/t/solutions/Moses Hohman/util.rb +0 -27
- data/lib/quiz1/t/solutions/Niklas Frykholm/solitaire.rb +0 -151
- data/lib/quiz1/t/solutions/Thomas Leitner/solitaire.rb +0 -198
- data/lib/zip/stdrubyext.rb +0 -111
- data/lib/zip/tempfile_bugfixed.rb +0 -195
- data/lib/zip/zip.rb +0 -1847
- data/lib/zip/zipfilesystem.rb +0 -609
- data/lib/zip/ziprequire.rb +0 -90
- data/samples/gtkRubyzip.rb +0 -86
- data/test/alltests.rb +0 -9
- data/test/data/file1.txt +0 -46
- data/test/data/file1.txt.deflatedData +0 -0
- data/test/data/file2.txt +0 -1504
- data/test/data/notzippedruby.rb +0 -7
- data/test/data/rubycode.zip +0 -0
- data/test/data/rubycode2.zip +0 -0
- data/test/data/testDirectory.bin +0 -0
- data/test/data/zipWithDirs.zip +0 -0
- data/test/gentestfiles.rb +0 -157
- data/test/ioextrastest.rb +0 -208
- data/test/stdrubyexttest.rb +0 -52
- data/test/zipfilesystemtest.rb +0 -831
- data/test/ziprequiretest.rb +0 -43
- data/test/ziptest.rb +0 -1599
@@ -1,132 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby -w
|
2
|
-
|
3
|
-
$deck = (1..52).to_a + ["A", "B"] # Unkeyed deck - Keystream Step 1
|
4
|
-
|
5
|
-
def encrypt(message)
|
6
|
-
# Step 1
|
7
|
-
message = message.upcase.tr("^A-Z", "")
|
8
|
-
i = 5
|
9
|
-
while i < message.size
|
10
|
-
message[i, 0] = " "
|
11
|
-
i += 6
|
12
|
-
end
|
13
|
-
message += "X" while message.rindex(" ") != message.size - 6
|
14
|
-
|
15
|
-
# Step 2
|
16
|
-
key_stream = generate(message.count("^ "))
|
17
|
-
|
18
|
-
# Step 3
|
19
|
-
values = message.split("").map { |letter| letter[0] - ?A + 1 }
|
20
|
-
|
21
|
-
# Step 4
|
22
|
-
key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
|
23
|
-
|
24
|
-
# Step 5
|
25
|
-
values.each_with_index do |value, index|
|
26
|
-
next if value < 0
|
27
|
-
values[index] = value + key_values[index]
|
28
|
-
values[index] -= 26 if values[index] > 26
|
29
|
-
end
|
30
|
-
|
31
|
-
# Step 6
|
32
|
-
message = (values.map { |number| (number - 1 + ?A).chr }).join("")
|
33
|
-
|
34
|
-
return message
|
35
|
-
end
|
36
|
-
|
37
|
-
def decrypt(message)
|
38
|
-
# Step 1
|
39
|
-
key_stream = generate(message.size)
|
40
|
-
|
41
|
-
# Step 2
|
42
|
-
values = message.split("").map { |letter| letter[0] - ?A + 1 }
|
43
|
-
|
44
|
-
# Step 3
|
45
|
-
key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
|
46
|
-
|
47
|
-
# Step 4
|
48
|
-
values.each_with_index do |value, index|
|
49
|
-
next if value < 0
|
50
|
-
if value <= key_values[index]
|
51
|
-
values[index] = value + 26 - key_values[index]
|
52
|
-
else
|
53
|
-
values[index] = value - key_values[index]
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# Step 5
|
58
|
-
message = (values.map { |number| (number - 1 + ?A).chr }).join("")
|
59
|
-
|
60
|
-
return message
|
61
|
-
end
|
62
|
-
|
63
|
-
def generate(count) # Keystream Steps
|
64
|
-
key_stream = [ ]
|
65
|
-
|
66
|
-
until key_stream.size == count
|
67
|
-
# Step 2
|
68
|
-
a = $deck.index("A")
|
69
|
-
if a == 53
|
70
|
-
$deck.insert(1, $deck.pop)
|
71
|
-
else
|
72
|
-
$deck.insert(a + 1, $deck.delete_at(a))
|
73
|
-
end
|
74
|
-
|
75
|
-
# Step 3
|
76
|
-
b = $deck.index("B")
|
77
|
-
if b == 53
|
78
|
-
$deck.insert(2, $deck.pop)
|
79
|
-
elsif b == 52
|
80
|
-
$deck.insert(1, $deck.delete_at(b))
|
81
|
-
else
|
82
|
-
$deck.insert(b + 2, $deck.delete_at(b))
|
83
|
-
end
|
84
|
-
|
85
|
-
# Step 4
|
86
|
-
a = $deck.index("A")
|
87
|
-
b = $deck.index("B")
|
88
|
-
top = [a, b].min
|
89
|
-
bottom = [a, b].max
|
90
|
-
$deck = $deck.values_at((bottom + 1)..53, top..bottom, 0...top)
|
91
|
-
|
92
|
-
# Step 5
|
93
|
-
if $deck[53].kind_of? Integer
|
94
|
-
$deck = $deck.values_at($deck[53]..52, 0...$deck[53], 53)
|
95
|
-
end
|
96
|
-
|
97
|
-
# Step 5
|
98
|
-
if $deck[0].kind_of? Integer
|
99
|
-
if $deck[$deck[0]].kind_of? Integer
|
100
|
-
key_stream.push($deck[$deck[0]])
|
101
|
-
end
|
102
|
-
else
|
103
|
-
if $deck[53].kind_of? Integer
|
104
|
-
key_stream.push($deck[53])
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end # Step 7
|
108
|
-
|
109
|
-
key_stream.map! do |number|
|
110
|
-
if number > 26
|
111
|
-
(number - 26 - 1 + ?A).chr
|
112
|
-
else
|
113
|
-
(number - 1 + ?A).chr
|
114
|
-
end
|
115
|
-
end
|
116
|
-
key_stream = key_stream.join("")
|
117
|
-
i = 5
|
118
|
-
while i < key_stream.size
|
119
|
-
key_stream[i, 0] = " "
|
120
|
-
i += 6
|
121
|
-
end
|
122
|
-
return key_stream
|
123
|
-
end
|
124
|
-
|
125
|
-
# Mind reading interface
|
126
|
-
if ARGV.size == 1 and ARGV[0] =~ /^(?:[A-Z]{5} )*[A-Z]{5}$/
|
127
|
-
puts decrypt(ARGV[0])
|
128
|
-
elsif ARGV.size == 1
|
129
|
-
puts encrypt(ARGV[0])
|
130
|
-
else
|
131
|
-
puts "Usage: solitaire.rb MESSAGE"
|
132
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'copland'
|
4
|
-
|
5
|
-
libdir = File.join( File.dirname( __FILE__ ), "..", "lib" )
|
6
|
-
$: << libdir
|
7
|
-
|
8
|
-
registry = Copland::Registry.build libdir, :log_device => STDOUT
|
9
|
-
|
10
|
-
cli = registry.service( "solitaire.cipher.CLI" )
|
11
|
-
cli.run
|
12
|
-
|
13
|
-
registry.shutdown
|
@@ -1,230 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
class Deck
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@deck = (1..52).to_a + [ "A", "B" ]
|
7
|
-
@length = @deck.length
|
8
|
-
end
|
9
|
-
|
10
|
-
def cipher_shuffle!
|
11
|
-
# move joker A down one card, circularly
|
12
|
-
reposition_card( "A", 1 )
|
13
|
-
|
14
|
-
# move joker B down two cards, circularly
|
15
|
-
reposition_card( "B", 2 )
|
16
|
-
|
17
|
-
joker_A = @deck.index( "A" )
|
18
|
-
joker_B = @deck.index( "B" )
|
19
|
-
|
20
|
-
# move all cards above the top-most joker, below the bottom-most joker, and
|
21
|
-
# all cards below the bottom-most joker, above the top-most joker.
|
22
|
-
top = ( joker_A < joker_B ? joker_A : joker_B )
|
23
|
-
bottom = ( joker_A > joker_B ? joker_A : joker_B )
|
24
|
-
@deck = @deck[bottom+1..-1] + @deck[top..bottom] + @deck[0,top]
|
25
|
-
|
26
|
-
# take value of the bottom-most card, and cut that many cards off the
|
27
|
-
# top, inserting them just before the bottom-most card.
|
28
|
-
cut = @deck.last
|
29
|
-
@deck = @deck[cut..-2] + @deck[0,cut] + [ @deck.last ]
|
30
|
-
end
|
31
|
-
|
32
|
-
def cipher_letter
|
33
|
-
count = @deck.first
|
34
|
-
count = 53 if count.is_a?( String )
|
35
|
-
result = @deck[ count ]
|
36
|
-
return nil unless result.is_a? Fixnum
|
37
|
-
result -= 26 while result > 26
|
38
|
-
return (result+64).chr
|
39
|
-
end
|
40
|
-
|
41
|
-
def to_a
|
42
|
-
@deck.dup
|
43
|
-
end
|
44
|
-
|
45
|
-
def cards=( deck )
|
46
|
-
@deck = deck
|
47
|
-
@length = @deck.length
|
48
|
-
raise "the deck must contain an 'A' joker" unless @deck.include?("A")
|
49
|
-
raise "the deck must contain a 'B' joker" unless @deck.include?("B")
|
50
|
-
end
|
51
|
-
|
52
|
-
def reposition_card( card, delta )
|
53
|
-
pos = @deck.index card
|
54
|
-
@deck.delete_at pos
|
55
|
-
new_pos = pos + delta
|
56
|
-
new_pos = 1 + new_pos % @length if new_pos >= @length
|
57
|
-
@deck.insert new_pos, card
|
58
|
-
new_pos
|
59
|
-
end
|
60
|
-
private :reposition_card
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
class KeyingAlgorithms
|
65
|
-
|
66
|
-
attr_writer :algorithms
|
67
|
-
attr_writer :registry
|
68
|
-
|
69
|
-
def get( name )
|
70
|
-
svc_name = @algorithms[ name ]
|
71
|
-
raise "No such algorithm #{name.inspect}" if svc_name.nil?
|
72
|
-
|
73
|
-
return @registry.service( svc_name )
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
class UnkeyedAlgorithm
|
79
|
-
|
80
|
-
def new_deck
|
81
|
-
Deck.new
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
class KeyStream
|
87
|
-
|
88
|
-
attr_writer :deck
|
89
|
-
|
90
|
-
def next
|
91
|
-
loop do
|
92
|
-
@deck.cipher_shuffle!
|
93
|
-
letter = @deck.cipher_letter
|
94
|
-
return letter if letter
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
class SolitaireCipher
|
101
|
-
|
102
|
-
attr_writer :algorithms
|
103
|
-
attr_writer :stream
|
104
|
-
|
105
|
-
def initialize( default_algorithm )
|
106
|
-
@algorithm = default_algorithm
|
107
|
-
end
|
108
|
-
|
109
|
-
def use_algorithm( keying_algorithm )
|
110
|
-
@algorithm = @algorithms.get( keying_algorithm )
|
111
|
-
end
|
112
|
-
|
113
|
-
def encrypt( message )
|
114
|
-
reset
|
115
|
-
|
116
|
-
chars = message.split(//).map { |c| c.upcase }. reject { |c| c !~ /[A-Z]/ }
|
117
|
-
chars.concat ["X"] * ( 5 - chars.length % 5 ) if chars.length % 5 > 0
|
118
|
-
chars.map! { |c| c[0] - 64 }
|
119
|
-
key = generate_key( chars.length )
|
120
|
-
code = chars.zip( key ).map { |c,k| ( c + k > 26 ? c + k - 26 : c + k ) }.map { |c| (c+64).chr }
|
121
|
-
|
122
|
-
msg = ""
|
123
|
-
(code.length/5).times do
|
124
|
-
msg << " " if msg.length > 0
|
125
|
-
5.times { msg << code.shift }
|
126
|
-
end
|
127
|
-
|
128
|
-
return msg
|
129
|
-
end
|
130
|
-
|
131
|
-
def decrypt( message )
|
132
|
-
raise "bad decrypt message: #{message.inspect}" if message =~ /[^A-Z ]/
|
133
|
-
|
134
|
-
reset
|
135
|
-
chars = message.split(//).reject { |c| c == " " }.map { |c| c[0] - 64 }
|
136
|
-
key = generate_key( chars.length )
|
137
|
-
chars.zip( key ).map { |c,k| ( k >= c ? c + 26 - k : c - k ) }.map { |c| (c+64).chr }.join
|
138
|
-
end
|
139
|
-
|
140
|
-
def generate_key( length )
|
141
|
-
key = []
|
142
|
-
length.times { key << @stream.next }
|
143
|
-
key.map { |c| c[0] - 64 }
|
144
|
-
end
|
145
|
-
private :generate_key
|
146
|
-
|
147
|
-
def reset
|
148
|
-
@stream.deck = @algorithm.new_deck
|
149
|
-
end
|
150
|
-
private :reset
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
class Options
|
155
|
-
|
156
|
-
attr_reader :strings
|
157
|
-
attr_reader :keying_algorithm
|
158
|
-
|
159
|
-
def initialize( argv = ARGV )
|
160
|
-
@named_options = Hash.new
|
161
|
-
@run_app = true
|
162
|
-
@keying_algorithm = "unkeyed"
|
163
|
-
|
164
|
-
OptionParser.new do |opts|
|
165
|
-
opts.banner = "Usage: #{$0} [options] [strings]"
|
166
|
-
opts.separator ""
|
167
|
-
|
168
|
-
opts.on( "-o", "--option NAME=VALUE",
|
169
|
-
"Specify a named value, for use by a component of the cipher."
|
170
|
-
) do |pair|
|
171
|
-
name, value = pair.split( / *= */, 2 )
|
172
|
-
@named_options[ name ] = value
|
173
|
-
end
|
174
|
-
|
175
|
-
opts.on( "-k", "--key NAME", "Specify the keying algorithm to use" ) do |value|
|
176
|
-
@keying_algorithm = value
|
177
|
-
end
|
178
|
-
|
179
|
-
opts.separator ""
|
180
|
-
|
181
|
-
opts.on_tail( "-h", "--help", "This help text" ) do
|
182
|
-
puts opts
|
183
|
-
@run_app = false
|
184
|
-
end
|
185
|
-
|
186
|
-
opts.parse!( argv )
|
187
|
-
end
|
188
|
-
|
189
|
-
@strings = argv
|
190
|
-
end
|
191
|
-
|
192
|
-
def []( value )
|
193
|
-
@named_options[ value ]
|
194
|
-
end
|
195
|
-
|
196
|
-
def run_app?
|
197
|
-
@run_app
|
198
|
-
end
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
|
203
|
-
class BackwardsAlgorithm
|
204
|
-
|
205
|
-
def new_deck
|
206
|
-
deck = Deck.new
|
207
|
-
deck.cards = deck.to_a.reverse
|
208
|
-
deck
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|
212
|
-
|
213
|
-
class ShuffleAlgorithm
|
214
|
-
|
215
|
-
attr_writer :options
|
216
|
-
|
217
|
-
def new_deck
|
218
|
-
deck = Deck.new
|
219
|
-
cards = deck.to_a
|
220
|
-
|
221
|
-
seed = ( @options[ "seed" ] || 0 ).to_i
|
222
|
-
srand seed
|
223
|
-
|
224
|
-
7.times { cards.sort! { rand(3)-1 } }
|
225
|
-
deck.cards = cards
|
226
|
-
|
227
|
-
return deck
|
228
|
-
end
|
229
|
-
|
230
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class CLI
|
2
|
-
|
3
|
-
ENCRYPTED = /^([A-Z]{5} )*[A-Z]{5}$/
|
4
|
-
|
5
|
-
attr_writer :cipher
|
6
|
-
attr_writer :options
|
7
|
-
|
8
|
-
def run
|
9
|
-
return unless @options.run_app?
|
10
|
-
|
11
|
-
@cipher.use_algorithm @options.keying_algorithm
|
12
|
-
|
13
|
-
@options.strings.each do |arg|
|
14
|
-
if arg =~ ENCRYPTED
|
15
|
-
puts arg.inspect
|
16
|
-
puts " (decrypt)--> #{@cipher.decrypt(arg).inspect}"
|
17
|
-
else
|
18
|
-
puts arg.inspect
|
19
|
-
puts " (encrypt)--> #{@cipher.encrypt(arg).inspect}"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
$: << File.join( File.dirname( __FILE__ ), "..", "lib" )
|
2
|
-
require 'test/unit'
|
3
|
-
require 'cipher'
|
4
|
-
|
5
|
-
class TC_Deck < Test::Unit::TestCase
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@deck = Deck.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_content
|
12
|
-
expected = (1..52).to_a + [ "A", "B" ]
|
13
|
-
assert_equal expected, @deck.to_a
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_shuffle
|
17
|
-
@deck.cipher_shuffle!
|
18
|
-
expected = (2..52).to_a + [ "A", "B", 1 ]
|
19
|
-
assert_equal expected, @deck.to_a
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_letter
|
23
|
-
expected = %w{ D W J nil X H Y R F D G }
|
24
|
-
expected.each do |expected_letter|
|
25
|
-
@deck.cipher_shuffle!
|
26
|
-
assert_equal expected_letter, @deck.cipher_letter || "nil"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
$: << File.join( File.dirname( __FILE__ ), "..", "lib" )
|
2
|
-
require 'test/unit'
|
3
|
-
require 'cipher'
|
4
|
-
|
5
|
-
class TC_KeyStream < Test::Unit::TestCase
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@stream = KeyStream.new
|
9
|
-
@stream.deck = Deck.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_next
|
13
|
-
expected = %w{ D W J X H Y R F D G }
|
14
|
-
expected.each do |expected_letter|
|
15
|
-
assert_equal expected_letter, @stream.next
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
$: << File.join( File.dirname( __FILE__ ), "..", "lib" )
|
2
|
-
require 'test/unit'
|
3
|
-
require 'cipher'
|
4
|
-
|
5
|
-
class TC_KeyingAlgorithms < Test::Unit::TestCase
|
6
|
-
|
7
|
-
class MockRegistry
|
8
|
-
def service( name )
|
9
|
-
return "found" if name == "something.mock"
|
10
|
-
return nil
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@algorithms = KeyingAlgorithms.new
|
16
|
-
@algorithms.algorithms = { "mock" => "something.mock" }
|
17
|
-
@algorithms.registry = MockRegistry.new
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_get_not_found
|
21
|
-
assert_raise( RuntimeError ) do
|
22
|
-
@algorithms.get( "bogus" )
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_get_found
|
27
|
-
svc = @algorithms.get( "mock" )
|
28
|
-
assert_equal svc, "found"
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
$: << File.join( File.dirname( __FILE__ ), "..", "lib" )
|
2
|
-
require 'test/unit'
|
3
|
-
require 'cipher'
|
4
|
-
|
5
|
-
class TC_SolitaireCipher < Test::Unit::TestCase
|
6
|
-
|
7
|
-
class MockAlgorithms
|
8
|
-
def get( name )
|
9
|
-
MockAlgorithm.new
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class MockDeck
|
14
|
-
def cipher_shuffle!
|
15
|
-
end
|
16
|
-
|
17
|
-
def cipher_letter
|
18
|
-
"X"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class MockAlgorithm
|
23
|
-
def new_deck
|
24
|
-
MockDeck.new
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def setup
|
29
|
-
@cipher = SolitaireCipher.new( UnkeyedAlgorithm.new )
|
30
|
-
@cipher.algorithms = MockAlgorithms.new
|
31
|
-
@cipher.stream = KeyStream.new
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_use_algorithm
|
35
|
-
@cipher.use_algorithm "mock"
|
36
|
-
assert_equal "FCJJM", @cipher.encrypt( "HELLO" )
|
37
|
-
assert_equal "JGNNQ", @cipher.decrypt( "HELLO" )
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_encrypt
|
41
|
-
msg = "Code in Ruby! Live longer."
|
42
|
-
expected = "GLNCQ MJAFF FVOMB JIYCB"
|
43
|
-
assert_equal expected, @cipher.encrypt( msg )
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_decrypt_bad
|
47
|
-
assert_raise( RuntimeError ) do
|
48
|
-
@cipher.decrypt( "not good" )
|
49
|
-
end
|
50
|
-
|
51
|
-
assert_raise( RuntimeError ) do
|
52
|
-
@cipher.decrypt( "BOGUS 12345" )
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_decrypt_good
|
57
|
-
msg = "CLEPK HHNIY CFPWH FDFEH"
|
58
|
-
expected = "YOURCIPHERISWORKINGX"
|
59
|
-
assert_equal expected, @cipher.decrypt( msg )
|
60
|
-
|
61
|
-
msg = "ABVAW LWZSY OORYK DUPVH"
|
62
|
-
expected = "WELCOMETORUBYQUIZXXX"
|
63
|
-
assert_equal expected, @cipher.decrypt( msg )
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
$: << File.join( File.dirname( __FILE__ ), "..", "lib" )
|
2
|
-
require 'test/unit'
|
3
|
-
require 'cipher'
|
4
|
-
|
5
|
-
class TC_UnkeyedAlgorithm < Test::Unit::TestCase
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@algo = UnkeyedAlgorithm.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_new_deck
|
12
|
-
expected = (1..52).to_a + [ "A", "B" ]
|
13
|
-
deck = @algo.new_deck
|
14
|
-
assert_equal expected, deck.to_a
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|