flatulent 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/flatulent-0.0.4.gem +0 -0
- data/install.rb +210 -0
- data/lib/flatulent.rb +76 -61
- data/rails/app/controllers/flatulent_controller.rb +6 -4
- data/rails/log/development.log +7242 -0
- data/rails/tmp/sessions/ruby_sess.82080df62364f531 +0 -0
- data/rails/tmp/sessions/ruby_sess.8900d08ad306f253 +0 -0
- data/rails/tmp/sessions/ruby_sess.f8fa47c3571d2497 +0 -0
- metadata +7 -49
- data/flatulent-0.0.2.gem +0 -0
- data/rails/lib/flatulent.rb +0 -450
- data/rails/lib/flatulent/attributes.rb +0 -79
- data/rails/lib/flatulent/crypt/blowfish-tables.rb +0 -190
- data/rails/lib/flatulent/crypt/blowfish.rb +0 -109
- data/rails/lib/flatulent/crypt/cbc.rb +0 -123
- data/rails/lib/flatulent/crypt/gost.rb +0 -140
- data/rails/lib/flatulent/crypt/idea.rb +0 -193
- data/rails/lib/flatulent/crypt/noise.rb +0 -94
- data/rails/lib/flatulent/crypt/purerubystringio.rb +0 -378
- data/rails/lib/flatulent/crypt/rijndael-tables.rb +0 -117
- data/rails/lib/flatulent/crypt/rijndael.rb +0 -269
- data/rails/lib/flatulent/fontfiles/banner.flf +0 -2494
- data/rails/lib/flatulent/fontfiles/big.flf +0 -2204
- data/rails/lib/flatulent/fontfiles/block.flf +0 -1691
- data/rails/lib/flatulent/fontfiles/bubble.flf +0 -1630
- data/rails/lib/flatulent/fontfiles/digital.flf +0 -1286
- data/rails/lib/flatulent/fontfiles/ivrit.flf +0 -900
- data/rails/lib/flatulent/fontfiles/lean.flf +0 -1691
- data/rails/lib/flatulent/fontfiles/mini.flf +0 -899
- data/rails/lib/flatulent/fontfiles/mnemonic.flf +0 -3702
- data/rails/lib/flatulent/fontfiles/script.flf +0 -1493
- data/rails/lib/flatulent/fontfiles/shadow.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/slant.flf +0 -1295
- data/rails/lib/flatulent/fontfiles/small.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/smscript.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/smshadow.flf +0 -899
- data/rails/lib/flatulent/fontfiles/smslant.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/standard.flf +0 -2227
- data/rails/lib/flatulent/fontfiles/term.flf +0 -600
- data/rails/lib/flatulent/pervasives.rb +0 -32
- data/rails/lib/flatulent/stringxor.rb +0 -27
- data/rails/lib/flatulent/text.rb +0 -6
- data/rails/lib/flatulent/text/double_metaphone.rb +0 -356
- data/rails/lib/flatulent/text/figlet.rb +0 -17
- data/rails/lib/flatulent/text/figlet/font.rb +0 -117
- data/rails/lib/flatulent/text/figlet/smusher.rb +0 -64
- data/rails/lib/flatulent/text/figlet/typesetter.rb +0 -68
- data/rails/lib/flatulent/text/levenshtein.rb +0 -65
- data/rails/lib/flatulent/text/metaphone.rb +0 -97
- data/rails/lib/flatulent/text/porter_stemming.rb +0 -171
- data/rails/lib/flatulent/text/soundex.rb +0 -61
@@ -1,140 +0,0 @@
|
|
1
|
-
# gost.rb
|
2
|
-
# Adapted by Richard Kernahan <kernighan_rich@rubyforge.org>
|
3
|
-
# from C++ code written by Wei Dai
|
4
|
-
# of the Crypto++ project http://www.eskimo.com/~weidai/cryptlib.html
|
5
|
-
|
6
|
-
module Crypt
|
7
|
-
class Gost
|
8
|
-
|
9
|
-
require 'crypt/cbc'
|
10
|
-
include CBC
|
11
|
-
|
12
|
-
ULONG = 0x100000000
|
13
|
-
|
14
|
-
def block_size
|
15
|
-
return(8)
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
def initialize(userKey)
|
20
|
-
|
21
|
-
# These are the S-boxes given in Applied Cryptography 2nd Ed., p. 333
|
22
|
-
@sBox = [
|
23
|
-
[4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3],
|
24
|
-
[14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9],
|
25
|
-
[5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11],
|
26
|
-
[7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3],
|
27
|
-
[6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2],
|
28
|
-
[4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14],
|
29
|
-
[13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12],
|
30
|
-
[1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12]
|
31
|
-
]
|
32
|
-
|
33
|
-
# These are the S-boxes given in the GOST source code listing in Applied
|
34
|
-
# Cryptography 2nd Ed., p. 644. They appear to be from the DES S-boxes
|
35
|
-
# [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 ],
|
36
|
-
# [ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 ],
|
37
|
-
# [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 ],
|
38
|
-
# [ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 ],
|
39
|
-
# [ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 ],
|
40
|
-
# [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 ],
|
41
|
-
# [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 ],
|
42
|
-
# [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 ]
|
43
|
-
|
44
|
-
# precalculate the S table
|
45
|
-
@sTable = precalculate_S_table()
|
46
|
-
|
47
|
-
# derive the 32-byte key from the user-supplied key
|
48
|
-
userKeyLength = userKey.length
|
49
|
-
@key = userKey[0..31].unpack('C'*32)
|
50
|
-
if (userKeyLength < 32)
|
51
|
-
userKeyLength.upto(31) { @key << 0 }
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
def precalculate_S_table()
|
57
|
-
sTable = [[], [], [], []]
|
58
|
-
0.upto(3) { |i|
|
59
|
-
0.upto(255) { |j|
|
60
|
-
t = @sBox[2*i][j % 16] | (@sBox[2*i+1][j/16] << 4)
|
61
|
-
u = (8*i + 11) % 32
|
62
|
-
v = (t << u) | (t >> (32-u))
|
63
|
-
sTable[i][j] = (v % ULONG)
|
64
|
-
}
|
65
|
-
}
|
66
|
-
return(sTable)
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
def f(longWord)
|
71
|
-
longWord = longWord % ULONG
|
72
|
-
a, b, c, d = [longWord].pack('L').unpack('CCCC')
|
73
|
-
return(@sTable[3][d] ^ @sTable[2][c] ^ @sTable[1][b] ^ @sTable[0][a])
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
def encrypt_pair(xl, xr)
|
78
|
-
3.times {
|
79
|
-
xr ^= f(xl+@key[0])
|
80
|
-
xl ^= f(xr+@key[1])
|
81
|
-
xr ^= f(xl+@key[2])
|
82
|
-
xl ^= f(xr+@key[3])
|
83
|
-
xr ^= f(xl+@key[4])
|
84
|
-
xl ^= f(xr+@key[5])
|
85
|
-
xr ^= f(xl+@key[6])
|
86
|
-
xl ^= f(xr+@key[7])
|
87
|
-
}
|
88
|
-
xr ^= f(xl+@key[7])
|
89
|
-
xl ^= f(xr+@key[6])
|
90
|
-
xr ^= f(xl+@key[5])
|
91
|
-
xl ^= f(xr+@key[4])
|
92
|
-
xr ^= f(xl+@key[3])
|
93
|
-
xl ^= f(xr+@key[2])
|
94
|
-
xr ^= f(xl+@key[1])
|
95
|
-
xl ^= f(xr+@key[0])
|
96
|
-
return([xr, xl])
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
def decrypt_pair(xl, xr)
|
101
|
-
xr ^= f(xl+@key[0])
|
102
|
-
xl ^= f(xr+@key[1])
|
103
|
-
xr ^= f(xl+@key[2])
|
104
|
-
xl ^= f(xr+@key[3])
|
105
|
-
xr ^= f(xl+@key[4])
|
106
|
-
xl ^= f(xr+@key[5])
|
107
|
-
xr ^= f(xl+@key[6])
|
108
|
-
xl ^= f(xr+@key[7])
|
109
|
-
3.times {
|
110
|
-
xr ^= f(xl+@key[7])
|
111
|
-
xl ^= f(xr+@key[6])
|
112
|
-
xr ^= f(xl+@key[5])
|
113
|
-
xl ^= f(xr+@key[4])
|
114
|
-
xr ^= f(xl+@key[3])
|
115
|
-
xl ^= f(xr+@key[2])
|
116
|
-
xr ^= f(xl+@key[1])
|
117
|
-
xl ^= f(xr+@key[0])
|
118
|
-
}
|
119
|
-
return([xr, xl])
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def encrypt_block(block)
|
124
|
-
xl, xr = block.unpack('NN')
|
125
|
-
xl, xr = encrypt_pair(xl, xr)
|
126
|
-
encrypted = [xl, xr].pack('NN')
|
127
|
-
return(encrypted)
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
def decrypt_block(block)
|
132
|
-
xl, xr = block.unpack('NN')
|
133
|
-
xl, xr = decrypt_pair(xl, xr)
|
134
|
-
decrypted = [xl, xr].pack('NN')
|
135
|
-
return(decrypted)
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
|
-
end
|
140
|
-
end
|
@@ -1,193 +0,0 @@
|
|
1
|
-
# idea.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
-
|
3
|
-
# IDEA (International Data Encryption Algorithm) by
|
4
|
-
# Xuejia Lai and James Massey (1992). Refer to license info at end.
|
5
|
-
# Ported by Richard Kernahan 2005
|
6
|
-
|
7
|
-
module Crypt
|
8
|
-
class IDEA
|
9
|
-
|
10
|
-
require 'crypt/cbc'
|
11
|
-
include Crypt::CBC
|
12
|
-
|
13
|
-
require 'digest/md5'
|
14
|
-
|
15
|
-
ULONG = 0x100000000
|
16
|
-
USHORT = 0x10000
|
17
|
-
|
18
|
-
ENCRYPT = 0
|
19
|
-
DECRYPT = 1
|
20
|
-
|
21
|
-
|
22
|
-
def block_size
|
23
|
-
return(8)
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
def initialize(key128, mode)
|
28
|
-
# IDEA is subject to attack unless the key is sufficiently random, so we
|
29
|
-
# take an MD5 digest of a variable-length passphrase to ensure a solid key
|
30
|
-
if (key128.class == String)
|
31
|
-
digest = Digest::MD5.new(key128).digest
|
32
|
-
key128 = digest.unpack('n'*8)
|
33
|
-
end
|
34
|
-
raise "Key must be 128 bits (8 words)" unless (key128.class == Array) && (key128.length == 8)
|
35
|
-
raise "Mode must be IDEA::ENCRYPT or IDEA::DECRYPT" unless ((mode == ENCRYPT) | (mode == DECRYPT))
|
36
|
-
if (mode == ENCRYPT)
|
37
|
-
@subkeys = generate_encryption_subkeys(key128)
|
38
|
-
else (mode == DECRYPT)
|
39
|
-
@subkeys = generate_decryption_subkeys(key128)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
def mul(a, b)
|
45
|
-
modulus = 0x10001
|
46
|
-
return((1 - b) % USHORT) if (a == 0)
|
47
|
-
return((1 - a) % USHORT) if (b == 0)
|
48
|
-
return((a * b) % modulus)
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
def mulInv(x)
|
53
|
-
modulus = 0x10001
|
54
|
-
x = x.to_i % USHORT
|
55
|
-
return(x) if (x <= 1)
|
56
|
-
t1 = USHORT / x
|
57
|
-
y = modulus % x
|
58
|
-
if (y == 1)
|
59
|
-
inv = (1 - t1) & 0xFFFF
|
60
|
-
return(inv)
|
61
|
-
end
|
62
|
-
t0 = 1
|
63
|
-
while (y != 1)
|
64
|
-
q = x / y
|
65
|
-
x = x % y
|
66
|
-
t0 = t0 + (q * t1)
|
67
|
-
return(t0) if (x == 1)
|
68
|
-
q = y / x
|
69
|
-
y = y % x
|
70
|
-
t1 = t1 + (q * t0)
|
71
|
-
end
|
72
|
-
inv = (1 - t1) & 0xFFFF
|
73
|
-
return(inv)
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
def generate_encryption_subkeys(key)
|
78
|
-
encrypt_keys = []
|
79
|
-
encrypt_keys[0..7] = key.dup
|
80
|
-
8.upto(51) { |i|
|
81
|
-
a = ((i + 1) % 8 > 0) ? (i-7) : (i-15)
|
82
|
-
b = ((i + 2) % 8 < 2) ? (i-14) : (i-6)
|
83
|
-
encrypt_keys[i] = ((encrypt_keys[a] << 9) | (encrypt_keys[b] >> 7)) % USHORT
|
84
|
-
}
|
85
|
-
return(encrypt_keys)
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
def generate_decryption_subkeys(key)
|
90
|
-
encrypt_keys = generate_encryption_subkeys(key)
|
91
|
-
decrypt_keys = []
|
92
|
-
decrypt_keys[48] = mulInv(encrypt_keys.shift)
|
93
|
-
decrypt_keys[49] = (-encrypt_keys.shift) % USHORT
|
94
|
-
decrypt_keys[50] = (-encrypt_keys.shift) % USHORT
|
95
|
-
decrypt_keys[51] = mulInv(encrypt_keys.shift)
|
96
|
-
42.step(0, -6) { |i|
|
97
|
-
decrypt_keys[i+4] = encrypt_keys.shift % USHORT
|
98
|
-
decrypt_keys[i+5] = encrypt_keys.shift % USHORT
|
99
|
-
decrypt_keys[i] = mulInv(encrypt_keys.shift)
|
100
|
-
if (i ==0)
|
101
|
-
decrypt_keys[1] = (-encrypt_keys.shift) % USHORT
|
102
|
-
decrypt_keys[2] = (-encrypt_keys.shift) % USHORT
|
103
|
-
else
|
104
|
-
decrypt_keys[i+2] = (-encrypt_keys.shift) % USHORT
|
105
|
-
decrypt_keys[i+1] = (-encrypt_keys.shift) % USHORT
|
106
|
-
end
|
107
|
-
decrypt_keys[i+3] = mulInv(encrypt_keys.shift)
|
108
|
-
}
|
109
|
-
return(decrypt_keys)
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
def crypt_pair(l, r)
|
114
|
-
word = [l, r].pack('NN').unpack('nnnn')
|
115
|
-
k = @subkeys[0..51]
|
116
|
-
8.downto(1) { |i|
|
117
|
-
word[0] = mul(word[0], k.shift)
|
118
|
-
word[1] = (word[1] + k.shift) % USHORT
|
119
|
-
word[2] = (word[2] + k.shift) % USHORT
|
120
|
-
word[3] = mul(word[3], k.shift)
|
121
|
-
t2 = word[0] ^ word[2]
|
122
|
-
t2 = mul(t2, k.shift)
|
123
|
-
t1 = (t2 + (word[1] ^ word[3])) % USHORT
|
124
|
-
t1 = mul(t1, k.shift)
|
125
|
-
t2 = (t1 + t2) % USHORT
|
126
|
-
word[0] ^= t1
|
127
|
-
word[3] ^= t2
|
128
|
-
t2 ^= word[1]
|
129
|
-
word[1] = word[2] ^ t1
|
130
|
-
word[2] = t2
|
131
|
-
}
|
132
|
-
result = []
|
133
|
-
result << mul(word[0], k.shift)
|
134
|
-
result << (word[2] + k.shift) % USHORT
|
135
|
-
result << (word[1] + k.shift) % USHORT
|
136
|
-
result << mul(word[3], k.shift)
|
137
|
-
twoLongs = result.pack('nnnn').unpack('NN')
|
138
|
-
return(twoLongs)
|
139
|
-
end
|
140
|
-
|
141
|
-
def encrypt_block(block)
|
142
|
-
xl, xr = block.unpack('NN')
|
143
|
-
xl, xr = crypt_pair(xl, xr)
|
144
|
-
encrypted = [xl, xr].pack('NN')
|
145
|
-
return(encrypted)
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
def decrypt_block(block)
|
150
|
-
xl, xr = block.unpack('NN')
|
151
|
-
xl, xr = crypt_pair(xl, xr)
|
152
|
-
decrypted = [xl, xr].pack('NN')
|
153
|
-
return(decrypted)
|
154
|
-
end
|
155
|
-
|
156
|
-
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
# LICENSE INFORMATION
|
161
|
-
#
|
162
|
-
# This software product contains the IDEA algorithm as described and claimed in
|
163
|
-
# US patent 5,214,703, EPO patent 0482154 (covering Austria, France, Germany,
|
164
|
-
# Italy, the Netherlands, Spain, Sweden, Switzerland, and the UK), and Japanese
|
165
|
-
# patent application 508119/1991, "Device for the conversion of a digital block
|
166
|
-
# and use of same" (hereinafter referred to as "the algorithm"). Any use of
|
167
|
-
# the algorithm for commercial purposes is thus subject to a license from Ascom
|
168
|
-
# Systec Ltd. of CH-5506 Maegenwil (Switzerland), being the patentee and sole
|
169
|
-
# owner of all rights, including the trademark IDEA.
|
170
|
-
#
|
171
|
-
# Commercial purposes shall mean any revenue generating purpose including but
|
172
|
-
# not limited to:
|
173
|
-
#
|
174
|
-
# i) Using the algorithm for company internal purposes (subject to a site
|
175
|
-
# license).
|
176
|
-
#
|
177
|
-
# ii) Incorporating the algorithm into any software and distributing such
|
178
|
-
# software and/or providing services relating thereto to others (subject to
|
179
|
-
# a product license).
|
180
|
-
#
|
181
|
-
# iii) Using a product containing the algorithm not covered by an IDEA license
|
182
|
-
# (subject to an end user license).
|
183
|
-
#
|
184
|
-
# All such end user license agreements are available exclusively from Ascom
|
185
|
-
# Systec Ltd and may be requested via the WWW at http://www.ascom.ch/systec or
|
186
|
-
# by email to idea@ascom.ch.
|
187
|
-
#
|
188
|
-
# Use other than for commercial purposes is strictly limited to non-revenue
|
189
|
-
# generating data transfer between private individuals. The use by government
|
190
|
-
# agencies, non-profit organizations, etc is considered as use for commercial
|
191
|
-
# purposes but may be subject to special conditions. Any misuse will be
|
192
|
-
# prosecuted.
|
193
|
-
|
@@ -1,94 +0,0 @@
|
|
1
|
-
# crypt/rattle.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
-
|
3
|
-
# add_noise - take a message and intersperse noise to make a new noisy message of given byte-length
|
4
|
-
# remove_noise - take a noisy message and extract the message
|
5
|
-
|
6
|
-
module Crypt
|
7
|
-
module Noise
|
8
|
-
|
9
|
-
def add_noise(newLength)
|
10
|
-
message = self
|
11
|
-
usableNoisyMessageLength = newLength / 9 * 8
|
12
|
-
bitmapSize = newLength / 9
|
13
|
-
remainingBytes = newLength - usableNoisyMessageLength - bitmapSize
|
14
|
-
if (message.length > usableNoisyMessageLength)
|
15
|
-
minimumNewLength = (message.length / 8.0).ceil * 9
|
16
|
-
puts "For a clear text of #{message.length} bytes, the minimum obscured length"
|
17
|
-
puts "is #{minimumNewLength} bytes which allows for no noise in the message."
|
18
|
-
puts "You should choose an obscured length of at least double the clear text"
|
19
|
-
puts "length, such as #{message.length / 8 * 32} bytes"
|
20
|
-
raise "Insufficient length for noisy message"
|
21
|
-
end
|
22
|
-
bitmap = []
|
23
|
-
usableNoisyMessageLength.times { bitmap << false }
|
24
|
-
srand(Time.now.to_i)
|
25
|
-
positionsSelected = 0
|
26
|
-
while (positionsSelected < message.length)
|
27
|
-
positionTaken = rand(usableNoisyMessageLength)
|
28
|
-
if bitmap[positionTaken]
|
29
|
-
next
|
30
|
-
else
|
31
|
-
bitmap[positionTaken] = true
|
32
|
-
positionsSelected = positionsSelected.next
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
noisyMessage = ""
|
37
|
-
0.upto(bitmapSize-1) { |byte|
|
38
|
-
c = 0
|
39
|
-
0.upto(7) { |bit|
|
40
|
-
c = c + (1<<bit) if bitmap[byte * 8 + bit]
|
41
|
-
}
|
42
|
-
noisyMessage << c.chr
|
43
|
-
}
|
44
|
-
posInMessage = 0
|
45
|
-
0.upto(usableNoisyMessageLength-1) { |pos|
|
46
|
-
if bitmap[pos]
|
47
|
-
meaningfulByte = message[posInMessage]
|
48
|
-
noisyMessage << meaningfulByte
|
49
|
-
posInMessage = posInMessage.next
|
50
|
-
else
|
51
|
-
noiseByte = rand(256).chr
|
52
|
-
noisyMessage << noiseByte
|
53
|
-
end
|
54
|
-
}
|
55
|
-
remainingBytes.times {
|
56
|
-
noiseByte = rand(256).chr
|
57
|
-
noisyMessage << noiseByte
|
58
|
-
}
|
59
|
-
return(noisyMessage)
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
def remove_noise
|
64
|
-
noisyMessage = self
|
65
|
-
bitmapSize = noisyMessage.length / 9
|
66
|
-
actualMessageLength = bitmapSize * 8
|
67
|
-
|
68
|
-
actualMessageStart = bitmapSize
|
69
|
-
actualMessageFinish = bitmapSize + actualMessageLength - 1
|
70
|
-
actualMessage = noisyMessage[actualMessageStart..actualMessageFinish]
|
71
|
-
|
72
|
-
bitmap = []
|
73
|
-
0.upto(bitmapSize - 1) { |byte|
|
74
|
-
c = noisyMessage[byte]
|
75
|
-
0.upto(7) { |bit|
|
76
|
-
bitmap[byte * 8 + bit] = (c[bit] == 1)
|
77
|
-
}
|
78
|
-
}
|
79
|
-
clearMessage = ""
|
80
|
-
0.upto(actualMessageLength) { |pos|
|
81
|
-
meaningful = bitmap[pos]
|
82
|
-
if meaningful
|
83
|
-
clearMessage << actualMessage[pos]
|
84
|
-
end
|
85
|
-
}
|
86
|
-
return(clearMessage)
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
class String
|
93
|
-
include Crypt::Noise
|
94
|
-
end
|
@@ -1,378 +0,0 @@
|
|
1
|
-
# Thanks to Binky DaClown who wrote this pure-ruby implementation
|
2
|
-
# http://rubyforge.org/projects/prstringio/
|
3
|
-
# Apparently CBC does not work well with the C-based stringio
|
4
|
-
|
5
|
-
module Crypt
|
6
|
-
class PureRubyStringIO
|
7
|
-
|
8
|
-
include Enumerable
|
9
|
-
|
10
|
-
SEEK_CUR = IO::SEEK_CUR
|
11
|
-
SEEK_END = IO::SEEK_END
|
12
|
-
SEEK_SET = IO::SEEK_SET
|
13
|
-
|
14
|
-
@@relayMethods = [:<<, :all?, :any?, :binmode, :close, :close_read, :close_write, :closed?, :closed_read?,
|
15
|
-
:closed_write?, :collect, :detect, :each, :each_byte, :each_line, :each_with_index,
|
16
|
-
:entries, :eof, :eof?, :fcntl, :fileno, :find, :find_all, :flush, :fsync, :getc, :gets,
|
17
|
-
:grep, :include?, :inject, :isatty, :length, :lineno, :lineno=, :map, :max, :member?,
|
18
|
-
:min, :partition, :path, :pid, :pos, :pos=, :print, :printf, :putc, :puts, :read,
|
19
|
-
:readchar, :readline, :readlines, :reject, :rewind, :seek, :select, :size, :sort,
|
20
|
-
:sort_by, :string, :string=, :sync, :sync=, :sysread, :syswrite, :tell, :truncate, :tty?,
|
21
|
-
:ungetc, :write, :zip]
|
22
|
-
|
23
|
-
def self.open(string="", mode="r+")
|
24
|
-
if block_given? then
|
25
|
-
sio = new(string, mode)
|
26
|
-
rc = yield(sio)
|
27
|
-
sio.close
|
28
|
-
rc
|
29
|
-
else
|
30
|
-
new(string, mode)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def <<(obj)
|
35
|
-
requireWritable
|
36
|
-
write obj
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
def binmode
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
def close
|
45
|
-
requireOpen
|
46
|
-
@sio_closed_read = true
|
47
|
-
@sio_closed_write = true
|
48
|
-
self
|
49
|
-
end
|
50
|
-
|
51
|
-
def close_read
|
52
|
-
raise IOError, "closing non-duplex IO for reading", caller if closed_read?
|
53
|
-
@sio_closed_read = true
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
def close_write
|
58
|
-
raise IOError, "closing non-duplex IO for writing", caller if closed_write?
|
59
|
-
@sio_closed_read = true
|
60
|
-
self
|
61
|
-
end
|
62
|
-
|
63
|
-
def closed?
|
64
|
-
closed_read? && closed_write?
|
65
|
-
end
|
66
|
-
|
67
|
-
def closed_read?
|
68
|
-
@sio_closed_read
|
69
|
-
end
|
70
|
-
|
71
|
-
def closed_write?
|
72
|
-
@sio_closed_write
|
73
|
-
end
|
74
|
-
|
75
|
-
def each(sep_string=$/, &block)
|
76
|
-
requireReadable
|
77
|
-
@sio_string.each(sep_string, &block)
|
78
|
-
@sio_pos = @sio_string.length
|
79
|
-
end
|
80
|
-
|
81
|
-
def each_byte(&block)
|
82
|
-
requireReadable
|
83
|
-
@sio_string.each_byte(&block)
|
84
|
-
@sio_pos = @sio_string.length
|
85
|
-
end
|
86
|
-
|
87
|
-
def eof
|
88
|
-
requireReadable { @sio_pos >= @sio_string.length }
|
89
|
-
end
|
90
|
-
|
91
|
-
def fcntl(integer_cmd, arg)
|
92
|
-
raise NotImplementedError, "The fcntl() function is unimplemented on this machine", caller
|
93
|
-
end
|
94
|
-
|
95
|
-
def fileno
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
def flush
|
100
|
-
self
|
101
|
-
end
|
102
|
-
|
103
|
-
def fsync
|
104
|
-
0
|
105
|
-
end
|
106
|
-
|
107
|
-
def getc
|
108
|
-
requireReadable
|
109
|
-
char = @sio_string[@sio_pos]
|
110
|
-
@sio_pos += 1 unless char.nil?
|
111
|
-
char
|
112
|
-
end
|
113
|
-
|
114
|
-
def gets(sep_string=$/)
|
115
|
-
requireReadable
|
116
|
-
@sio_lineno += 1
|
117
|
-
pstart = @sio_pos
|
118
|
-
@sio_pos = @sio_string.index(sep_string, @sio_pos) || [@sio_string.length, @sio_pos].max
|
119
|
-
@sio_string[pstart..@sio_pos]
|
120
|
-
end
|
121
|
-
|
122
|
-
def initialize(string="", mode="r+")
|
123
|
-
@sio_string = string.to_s
|
124
|
-
@sio_lineno = 0
|
125
|
-
@mode = mode
|
126
|
-
@relay = nil
|
127
|
-
case mode.delete("b")
|
128
|
-
when "r"
|
129
|
-
@sio_closed_read = false
|
130
|
-
@sio_closed_write = true
|
131
|
-
@sio_pos = 0
|
132
|
-
when "r+"
|
133
|
-
@sio_closed_read = false
|
134
|
-
@sio_closed_write = false
|
135
|
-
@sio_pos = 0
|
136
|
-
when "w"
|
137
|
-
@sio_closed_read = true
|
138
|
-
@sio_closed_write = false
|
139
|
-
@sio_pos = 0
|
140
|
-
@sio_string.replace("")
|
141
|
-
when "w+"
|
142
|
-
@sio_closed_read = false
|
143
|
-
@sio_closed_write = false
|
144
|
-
@sio_pos = 0
|
145
|
-
@sio_string.replace("")
|
146
|
-
when "a"
|
147
|
-
@sio_closed_read = true
|
148
|
-
@sio_closed_write = false
|
149
|
-
@sio_pos = @sio_string.length
|
150
|
-
when "a+"
|
151
|
-
@sio_closed_read = false
|
152
|
-
@sio_closed_write = false
|
153
|
-
@sio_pos = @sio_string.length
|
154
|
-
else
|
155
|
-
raise ArgumentError, "illegal access mode #{mode}", caller
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def isatty
|
160
|
-
flase
|
161
|
-
end
|
162
|
-
|
163
|
-
def length
|
164
|
-
@sio_string.length
|
165
|
-
end
|
166
|
-
|
167
|
-
def lineno
|
168
|
-
@sio_lineno
|
169
|
-
end
|
170
|
-
|
171
|
-
def lineno=(integer)
|
172
|
-
@sio_lineno = integer
|
173
|
-
end
|
174
|
-
|
175
|
-
def path
|
176
|
-
nil
|
177
|
-
end
|
178
|
-
|
179
|
-
def pid
|
180
|
-
nil
|
181
|
-
end
|
182
|
-
|
183
|
-
def pos
|
184
|
-
@sio_pos
|
185
|
-
end
|
186
|
-
|
187
|
-
def pos=(integer)
|
188
|
-
raise Errno::EINVAL, "Invalid argument", caller if integer < 0
|
189
|
-
@sio_pos = integer
|
190
|
-
end
|
191
|
-
|
192
|
-
def print(*args)
|
193
|
-
requireWritable
|
194
|
-
args.unshift($_) if args.empty
|
195
|
-
args.each { |obj| write(obj) }
|
196
|
-
write($\) unless $\.nil?
|
197
|
-
nil
|
198
|
-
end
|
199
|
-
|
200
|
-
def printf(format_string, *args)
|
201
|
-
requireWritable
|
202
|
-
write format(format_string, *args)
|
203
|
-
nil
|
204
|
-
end
|
205
|
-
|
206
|
-
def putc(obj)
|
207
|
-
requireWritable
|
208
|
-
write(obj.is_a?(Numeric) ? sprintf("%c", obj) : obj.to_s[0..0])
|
209
|
-
obj
|
210
|
-
end
|
211
|
-
|
212
|
-
def puts(*args)
|
213
|
-
requireWritable
|
214
|
-
args.unshift("") if args.empty?
|
215
|
-
args.each { |obj|
|
216
|
-
write obj
|
217
|
-
write $/
|
218
|
-
}
|
219
|
-
nil
|
220
|
-
end
|
221
|
-
|
222
|
-
def read(length=nil, buffer=nil)
|
223
|
-
requireReadable
|
224
|
-
len = length || [@sio_string.length - @sio_pos, 0].max
|
225
|
-
raise ArgumentError, "negative length #{len} given", caller if len < 0
|
226
|
-
buffer ||= ""
|
227
|
-
pstart = @sio_pos
|
228
|
-
@sio_pos += len
|
229
|
-
buffer.replace(@sio_string[pstart..@sio_pos])
|
230
|
-
buffer.empty? && !length.nil? ? nil : buffer
|
231
|
-
end
|
232
|
-
|
233
|
-
def readchar
|
234
|
-
requireReadable
|
235
|
-
raise EOFError, "End of file reached", caller if eof?
|
236
|
-
getc
|
237
|
-
end
|
238
|
-
|
239
|
-
def readline
|
240
|
-
requireReadable
|
241
|
-
raise EOFError, "End of file reached", caller if eof?
|
242
|
-
gets
|
243
|
-
end
|
244
|
-
|
245
|
-
def readlines(sep_string=$/)
|
246
|
-
requireReadable
|
247
|
-
raise EOFError, "End of file reached", caller if eof?
|
248
|
-
rc = []
|
249
|
-
until eof
|
250
|
-
rc << gets(sep_string)
|
251
|
-
end
|
252
|
-
rc
|
253
|
-
end
|
254
|
-
|
255
|
-
def reopen(string, mode=nil)
|
256
|
-
if string.is_a?(self.class) then
|
257
|
-
raise ArgumentError, "wrong number of arguments (2 for 1)", caller if !mode.nil?
|
258
|
-
@relay = string
|
259
|
-
instance_eval(%Q{
|
260
|
-
class << self
|
261
|
-
@@relayMethods.each { |name|
|
262
|
-
define_method(name, ObjectSpace._id2ref(#{@relay.object_id}).method(("original_" + name.to_s).to_sym).to_proc)
|
263
|
-
}
|
264
|
-
end
|
265
|
-
})
|
266
|
-
else
|
267
|
-
raise ArgumentError, "wrong number of arguments (1 for 2)", caller if mode.nil?
|
268
|
-
class << self
|
269
|
-
@@relayMethods.each { |name|
|
270
|
-
alias_method(name, "original_#{name}".to_sym)
|
271
|
-
public name
|
272
|
-
}
|
273
|
-
@relay = nil
|
274
|
-
end unless @relay.nil?
|
275
|
-
@sio_string = string.to_s
|
276
|
-
@mode = mode
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
def rewind
|
281
|
-
@sio_pos = 0
|
282
|
-
@sio_lineno = 0
|
283
|
-
end
|
284
|
-
|
285
|
-
def seek(amount, whence=SEEK_SET)
|
286
|
-
if whence == SEEK_CUR then
|
287
|
-
offset += @sio_pos
|
288
|
-
elsif whence == SEEK_END then
|
289
|
-
offset += size
|
290
|
-
end
|
291
|
-
@sio_pos = offset
|
292
|
-
end
|
293
|
-
|
294
|
-
def string
|
295
|
-
@sio_string
|
296
|
-
end
|
297
|
-
|
298
|
-
def string=(newstring)
|
299
|
-
@sio_string = newstring
|
300
|
-
end
|
301
|
-
|
302
|
-
def sync
|
303
|
-
true
|
304
|
-
end
|
305
|
-
|
306
|
-
def sync=(boolean)
|
307
|
-
boolean
|
308
|
-
end
|
309
|
-
|
310
|
-
def sysread(length=nil, buffer=nil)
|
311
|
-
requireReadable
|
312
|
-
raise EOFError, "End of file reached", caller if eof?
|
313
|
-
read(length, buffer)
|
314
|
-
end
|
315
|
-
|
316
|
-
def syswrite(string)
|
317
|
-
requireWritable
|
318
|
-
addition = "\000" * (@sio_string.length - @sio_pos) + string.to_s
|
319
|
-
@sio_string[@sio_pos..(addition.length - 1)] = addition
|
320
|
-
@sio_pos += addition.size
|
321
|
-
addition.size
|
322
|
-
end
|
323
|
-
|
324
|
-
#In ruby 1.8.4 truncate differs from the docs in two ways.
|
325
|
-
#First, if an integer greater that the length is given then the string is expanded to the new integer
|
326
|
-
#length. As this expansion seems to contain junk characters instead of nulls I suspect this may be a
|
327
|
-
#flaw in the C code which could cause a core dump if abused/used.
|
328
|
-
#Second, the documentation states that truncate returns 0. It returns the integer instead.
|
329
|
-
#This implementation follows the documentation in the first instance as I suspect this will be fixed
|
330
|
-
#in the C code. In the second instance, it follows the actions of the C code instead of the docs.
|
331
|
-
#This was decided as it causes no immedeate harm and this ruby implentation is to be as compatable
|
332
|
-
#as possible with the C version. Should the C version change to match the docs the ruby version
|
333
|
-
#will be simple to update as well.
|
334
|
-
def truncate(integer)
|
335
|
-
requireWritable
|
336
|
-
raise Errno::EINVAL, "Invalid argument - negative length", caller if integer < 0
|
337
|
-
@sio_string[[integer, @sio_string.length].max..-1] = ""
|
338
|
-
integer
|
339
|
-
end
|
340
|
-
|
341
|
-
def ungetc(integer)
|
342
|
-
requireWritable
|
343
|
-
if @sio_pos > 0 then
|
344
|
-
@sio_pos -= 1
|
345
|
-
putc(integer)
|
346
|
-
@sio_pos -= 1
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
alias :each_line :each
|
351
|
-
alias :eof? :eof
|
352
|
-
alias :size :length
|
353
|
-
alias :tty? :isatty
|
354
|
-
alias :tell :pos
|
355
|
-
alias :write :syswrite
|
356
|
-
|
357
|
-
protected
|
358
|
-
@@relayMethods.each { |name|
|
359
|
-
alias_method("original_#{name}".to_sym, name)
|
360
|
-
protected "original_#{name}".to_sym
|
361
|
-
}
|
362
|
-
|
363
|
-
private
|
364
|
-
|
365
|
-
def requireReadable
|
366
|
-
raise IOError, "not opened for reading", caller[1..-1] if @sio_closed_read
|
367
|
-
end
|
368
|
-
|
369
|
-
def requireWritable
|
370
|
-
raise IOError, "not opened for writing", caller[1..-1] if @sio_closed_write
|
371
|
-
end
|
372
|
-
|
373
|
-
def requireOpen
|
374
|
-
raise IOError, "closed stream", caller[1..-1] if @sio_closed_read && @sio_closed_write
|
375
|
-
end
|
376
|
-
|
377
|
-
end
|
378
|
-
end
|