crypto-toolbox 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe24da56b4f073b5f98d3272c04a23c2aadaaf7a
|
4
|
+
data.tar.gz: 49231fab5588a34344c78a9a55df286699f374e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c10b6b880631787c73340e66cadd4a1abae268e73914b80d09e9463c8b3bf3201e5d9e94d7c4bc64110aa90d60ae7d72a6ba4f9c0f9ee8c01756003f791bd6b
|
7
|
+
data.tar.gz: 06c2b6a4e7c8d14118b4e2981014d4d70f0efde4f0ea73c3d0be2101633ee513c3e03de812e2211eee98cbd2a3a8da15ff4cb436bb836b321623a0ce590ab044
|
@@ -55,7 +55,7 @@ Letter Array include?(A): 76997.0 i/s - 42.73x slower
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def convert_shift(shift)
|
58
|
-
("A".."Z").to_a.
|
58
|
+
("A".."Z").to_a.each.with_index.with_object({}){|(val,index),hsh| hsh[val] = index }[shift]
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -1,32 +1,37 @@
|
|
1
1
|
require 'aes'
|
2
2
|
require 'openssl'
|
3
3
|
require 'forwardable'
|
4
|
+
|
5
|
+
require 'crypto-toolbox/crypt_buffer/concerns/arithmetic.rb'
|
4
6
|
require 'crypto-toolbox/crypt_buffer/concerns/byte_expander.rb'
|
5
|
-
require 'crypto-toolbox/crypt_buffer/concerns/byte_manipulation.rb'
|
6
7
|
require 'crypto-toolbox/crypt_buffer/concerns/comparable.rb'
|
7
8
|
require 'crypto-toolbox/crypt_buffer/concerns/convertable.rb'
|
8
|
-
require 'crypto-toolbox/crypt_buffer/concerns/
|
9
|
+
require 'crypto-toolbox/crypt_buffer/concerns/padding.rb'
|
9
10
|
require 'crypto-toolbox/crypt_buffer/concerns/pretty_print.rb'
|
10
|
-
|
11
|
+
require 'crypto-toolbox/crypt_buffer/concerns/xor.rb'
|
11
12
|
|
12
13
|
class CryptBuffer
|
13
14
|
class OutOfRangeError < RuntimeError; end
|
14
|
-
|
15
|
-
|
15
|
+
|
16
|
+
include CryptBufferConcern::Arithmetic
|
17
|
+
include CryptBufferConcern::ByteExpander
|
16
18
|
include CryptBufferConcern::Convertable
|
17
19
|
include CryptBufferConcern::Comparable
|
18
|
-
include CryptBufferConcern::
|
19
|
-
include CryptBufferConcern::ByteManipulation
|
20
|
+
include CryptBufferConcern::Padding
|
20
21
|
include CryptBufferConcern::PrettyPrint
|
21
|
-
include CryptBufferConcern::
|
22
|
+
include CryptBufferConcern::Xor
|
23
|
+
|
22
24
|
|
25
|
+
include Enumerable
|
23
26
|
extend Forwardable
|
24
|
-
def_delegators :@bytes, :[], :empty?,:include?, :length
|
25
|
-
|
27
|
+
def_delegators :@bytes, :[], :empty?,:include?, :each, :length
|
26
28
|
|
29
|
+
|
27
30
|
attr_accessor :bytes
|
28
31
|
alias_method :b, :bytes
|
29
32
|
|
33
|
+
|
34
|
+
|
30
35
|
|
31
36
|
def initialize(input)
|
32
37
|
@bytes = bytes_from_any(input)
|
@@ -43,12 +48,6 @@ class CryptBuffer
|
|
43
48
|
CryptBuffer.new(hexstr)
|
44
49
|
end
|
45
50
|
|
46
|
-
include Enumerable
|
47
|
-
def each(&block)
|
48
|
-
@bytes.each(&block)
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
51
|
# Returns an array of the nth least sigificant by bit of each byte
|
53
52
|
def nth_bits(n)
|
54
53
|
raise OutOfRangeError if n < 0
|
@@ -61,6 +60,8 @@ class CryptBuffer
|
|
61
60
|
self.bytes.each_slice(n).map{|chunk| CryptBuffer(chunk) }
|
62
61
|
end
|
63
62
|
|
63
|
+
|
64
|
+
|
64
65
|
|
65
66
|
private
|
66
67
|
def sanitize_modulus(mod)
|
@@ -70,55 +71,60 @@ class CryptBuffer
|
|
70
71
|
def xor_multiple(byte,bytes)
|
71
72
|
([byte] + bytes).reduce(:^)
|
72
73
|
end
|
74
|
+
|
73
75
|
def bytes_from_any(input)
|
74
76
|
case input
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
when Fixnum
|
86
|
-
# integers as strings dont have a 0x prefix
|
87
|
-
if input.to_s(16).match(/^[0-9a-fA-F]+$/)
|
88
|
-
# assume 0x prefixed integer
|
89
|
-
hex2bytes(normalize_hex(input.to_s(16)))
|
90
|
-
else
|
91
|
-
# regular number
|
92
|
-
[input].pack('C*').bytes
|
93
|
-
end
|
94
|
-
else
|
95
|
-
raise "Unsupported input: #{input.inspect} of class #{input.class}"
|
77
|
+
when Array
|
78
|
+
input
|
79
|
+
when String
|
80
|
+
str2bytes(input)
|
81
|
+
when CryptBuffer
|
82
|
+
input.b
|
83
|
+
when Fixnum
|
84
|
+
int2bytes(input)
|
85
|
+
else
|
86
|
+
raise "Unsupported input: #{input.inspect} of class #{input.class}"
|
96
87
|
end
|
97
88
|
end
|
98
89
|
|
99
|
-
def self.pad_hex_char(str)
|
100
|
-
(str.length == 1) ? "0#{str}" : "#{str}"
|
101
|
-
end
|
102
90
|
def normalize_hex(str)
|
103
91
|
tmp = self.class.pad_hex_char(str)
|
104
92
|
tmp.gsub(/(^0x|\s)/,"").upcase
|
105
93
|
end
|
106
|
-
|
94
|
+
|
95
|
+
def self.pad_hex_char(str)
|
96
|
+
(str.length == 1) ? "0#{str}" : "#{str}"
|
97
|
+
end
|
98
|
+
|
107
99
|
def strip_hex_prefix(hex)
|
108
100
|
raise "remove 0x from hexinput"
|
109
101
|
end
|
110
|
-
|
102
|
+
|
103
|
+
def int2bytes(input)
|
104
|
+
# integers as strings dont have a 0x prefix
|
105
|
+
if input.to_s(16).match(/^[0-9a-fA-F]+$/)
|
106
|
+
# assume 0x prefixed integer
|
107
|
+
hex2bytes(normalize_hex(input.to_s(16)))
|
108
|
+
else
|
109
|
+
# regular number
|
110
|
+
[input].pack('C*').bytes
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
111
114
|
def hex2bytes(hexstr)
|
112
115
|
hexstr.scan(/../).map{|h| h.to_i(16) }
|
113
116
|
end
|
114
117
|
|
115
118
|
def str2bytes(str)
|
116
|
-
str.
|
119
|
+
if str.match(/^0x[0-9a-fA-F]+$/).nil?
|
120
|
+
str.bytes.to_a
|
121
|
+
else
|
122
|
+
hex2bytes(normalize_hex(str))
|
123
|
+
end
|
117
124
|
end
|
118
|
-
|
119
|
-
|
120
125
|
end
|
121
126
|
|
127
|
+
|
122
128
|
def CryptBuffer(input)
|
123
129
|
CryptBuffer.new(input)
|
124
130
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module CryptBufferConcern
|
2
|
+
module Padding
|
3
|
+
# This module extends functionality the CryptBuffer to
|
4
|
+
# handle PKCS7 padding.
|
5
|
+
# It has the ability to detect, replace, add and strip a
|
6
|
+
# padding from a CryptBuffer to return a new one without
|
7
|
+
# mutating the existing buffer.
|
8
|
+
#
|
9
|
+
# The purpose is making crypto analysis of cbc and other
|
10
|
+
# cipher modes that use pkcs7 padding easier.
|
11
|
+
|
12
|
+
# Return any existing padding
|
13
|
+
def padding
|
14
|
+
last = bytes.last
|
15
|
+
subset = subset_padding
|
16
|
+
|
17
|
+
if subset.all?{|e| e == last }
|
18
|
+
self.class.new(subset)
|
19
|
+
else
|
20
|
+
self.class.new([])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Strip the existing padding if present
|
25
|
+
def strip_padding
|
26
|
+
subset = bytes
|
27
|
+
|
28
|
+
if padding?
|
29
|
+
pad = padding
|
30
|
+
len = pad.length
|
31
|
+
subset = bytes[0,bytes.length - len]
|
32
|
+
end
|
33
|
+
self.class.new(subset)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def padding?
|
38
|
+
!padding.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
# pad an existing buffer with the given amount of bytes
|
42
|
+
# If a padding already exists, replace: decides whether or not
|
43
|
+
# to replace it
|
44
|
+
def pad(n,replace: true)
|
45
|
+
if padding? && replace
|
46
|
+
strip_padding.pad(n)
|
47
|
+
else
|
48
|
+
pad = [n] * n
|
49
|
+
return CryptBuffer(bytes + pad )
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def subset_padding
|
55
|
+
last = bytes.last
|
56
|
+
return [] if last.nil?
|
57
|
+
# e.g. 5: take from -5, 5 elems
|
58
|
+
bytes[-1 * last, last]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypto-toolbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Sivia
|
@@ -52,10 +52,11 @@ files:
|
|
52
52
|
- lib/crypto-toolbox/ciphers/caesar.rb
|
53
53
|
- lib/crypto-toolbox/ciphers/rot13.rb
|
54
54
|
- lib/crypto-toolbox/crypt_buffer.rb
|
55
|
+
- lib/crypto-toolbox/crypt_buffer/concerns/arithmetic.rb
|
55
56
|
- lib/crypto-toolbox/crypt_buffer/concerns/byte_expander.rb
|
56
|
-
- lib/crypto-toolbox/crypt_buffer/concerns/byte_manipulation.rb
|
57
57
|
- lib/crypto-toolbox/crypt_buffer/concerns/comparable.rb
|
58
58
|
- lib/crypto-toolbox/crypt_buffer/concerns/convertable.rb
|
59
|
+
- lib/crypto-toolbox/crypt_buffer/concerns/padding.rb
|
59
60
|
- lib/crypto-toolbox/crypt_buffer/concerns/pretty_print.rb
|
60
61
|
- lib/crypto-toolbox/crypt_buffer/concerns/xor.rb
|
61
62
|
- lib/crypto-toolbox/key_filter.rb
|