crypto-toolbox 0.2.7 → 0.3.0

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: 4b760901ea5c2ae1dea432a632e4d9d48e3bb58f
4
- data.tar.gz: 866e4c2c574a4ad9f8a43891574087e74022d55f
3
+ metadata.gz: ac647d6b3c258b6a0f67e6f842c417e05fa9d432
4
+ data.tar.gz: b23897bb84b56a1ca9ad119a87bd562568ff555e
5
5
  SHA512:
6
- metadata.gz: 90b498603ff15a35d88d7c37295f9d45146ba69b58e3ca3c0348a45d40a61d053e9ea962d8388fa8e31e9879bdce5516857ca696c00e86217011c08585246a40
7
- data.tar.gz: 4453d964ccd6f3c10dbf39102ee1cadabf1273d2e7cd0ac3c736bf7eeea0081448a27d716eb56edc19c901134622c0b4743ae8944f1dd96426b7e3feade1e794
6
+ metadata.gz: 48140f890a028bf4f43c9f482141edc90c4617b5fba729a958b6b621cbe51e6775c5820611930b474cb0c7ef0a06e8bce0a06d574420fbca77f870a6aa7ad848
7
+ data.tar.gz: 448b241d14ca70b2b8b8a5174da29d5a79664c8ccc1b29523b5390e41be20495b504ae8aa41017c5d0c028d61499e15d5dcd4bf3291c86a540d4ff0145497756
@@ -7,5 +7,7 @@ if ARGV[0].nil?
7
7
  else
8
8
  ciphertext = ARGV[0]
9
9
 
10
- Analyzers::PaddingOracle::Analyzer.new.analyze(ciphertext)
10
+ result = Analyzers::PaddingOracle::Analyzer.new.analyze(ciphertext)
11
+ puts "result: "
12
+ puts result.str
11
13
  end
@@ -1,10 +1,17 @@
1
- # coding: utf-8
1
+ require 'base64'
2
+
2
3
  require 'crypto-toolbox/utils/reporting/console.rb'
3
4
  require 'crypto-toolbox/utils/hamming_distance_filter.rb'
4
5
  require 'crypto-toolbox/utils/ecb_detector.rb'
5
6
  require 'crypto-toolbox/utils/ecb_oracle.rb'
6
7
 
7
8
  require 'crypto-toolbox/oracles/user_profile_encryption_oracle.rb'
9
+ require 'crypto-toolbox/oracles/cbc_mutating_encryption_oracle.rb'
10
+
11
+ require 'crypto-toolbox/oracles/padding_oracle/tcp_oracle.rb'
12
+ require 'crypto-toolbox/oracles/padding_oracle/http_oracle.rb'
13
+ require 'crypto-toolbox/oracles/padding_oracle/memory_oracle.rb'
14
+
8
15
 
9
16
 
10
17
 
@@ -22,6 +29,7 @@ require 'crypto-toolbox/analyzers/padding_oracle.rb'
22
29
  require 'crypto-toolbox/analyzers/cbc_mac.rb'
23
30
  require 'crypto-toolbox/analyzers/vigenere_xor.rb'
24
31
  require 'crypto-toolbox/analyzers/ecb_string_appender.rb'
32
+ require 'crypto-toolbox/analyzers/cbc_mutating_encryption.rb'
25
33
 
26
34
 
27
35
  require 'crypto-toolbox/ciphers/aes.rb'
@@ -0,0 +1,20 @@
1
+ module CryptoToolbox
2
+ module Analyzers
3
+ class CbcMutatingEncryption
4
+ attr_reader :oracle
5
+ def initialize(oracle)
6
+ @oracle = oracle
7
+ end
8
+
9
+ def assemble_attack_message
10
+ # we are lazy thus we use 0 as a byte which is neutral to xor,
11
+ # thus we dont have to cancel it before adding admin=true.
12
+ input = "\0" * 32
13
+ blocks = @oracle.encrypted_message_for(input).chunks_of(16)
14
+ fake = blocks[2].xor(";admin=true;",expand_input: false )
15
+ blocks[2] = fake
16
+ ciphertext = blocks.map(&:str).join
17
+ end
18
+ end
19
+ end
20
+ end
@@ -105,6 +105,7 @@ module Analyzers
105
105
  dict[result].tap do |match|
106
106
  jot(match,debug: true,raw: true) unless match.nil?
107
107
  if match.nil?
108
+ binding.pry
108
109
  raise "Could not find dictonary entry for block #{block_id}, pos: #{pos}"
109
110
  end
110
111
  end
@@ -182,7 +183,7 @@ module Analyzers
182
183
  total_length = oracle.encipher(@prefix_pad + (DUMMY * i) ).length
183
184
  result = total_length - (@prefix_blocks * block_size )
184
185
  if result > minimum_length
185
- return minimum_length - (i-1)
186
+ return minimum_length - i
186
187
  end
187
188
  end
188
189
  end
@@ -1,6 +1,3 @@
1
- require 'crypto-toolbox/analyzers/padding_oracle/oracles/http_oracle.rb'
2
- require 'crypto-toolbox/analyzers/padding_oracle/oracles/tcp_oracle.rb'
3
-
4
1
 
5
2
  module Analyzers
6
3
  module PaddingOracle
@@ -10,7 +7,7 @@ module Analyzers
10
7
  attr_reader :result
11
8
  include ::Utils::Reporting::Console
12
9
 
13
- def initialize(oracle = ::Analyzers::PaddingOracle::Oracles::TcpOracle.new)
10
+ def initialize(oracle = CryptoToolbox::Oracles::PaddingOracle::TcpOracle.new)
14
11
  @result = [ ]
15
12
  @oracle = oracle
16
13
  end
@@ -25,21 +22,21 @@ module Analyzers
25
22
  def analyze(cipher)
26
23
  blocks = CryptBuffer.from_hex(cipher).chunks_of(16)
27
24
 
28
- # for whatever reason ranges cant be from high to low
25
+ # ranges cant be from high to low
29
26
  (1..(blocks.length() -1)).reverse_each do |block_index|
30
27
  result.unshift analyse_block(blocks,block_index)
31
28
  end
32
-
33
- report_result(result)
34
- end
35
-
36
29
 
30
+ plaintext = CryptBuffer(result.flatten)
31
+ report_result(plaintext)
32
+ plaintext.strip_padding
33
+ end
37
34
 
38
35
  private
39
36
 
40
37
  def analyse_block(blocks,block_index)
41
38
  block_result = []
42
-
39
+
43
40
  # manipulate each byte of the 16 byte block
44
41
  1.upto(blocks[block_index -1].length) do |pad_index|
45
42
  with_oracle_connection do
@@ -52,9 +49,9 @@ module Analyzers
52
49
  end
53
50
 
54
51
  def report_result(result)
55
- jot(CryptBuffer(result.flatten).chars.inspect,debug: false)
52
+ jot(result.chars.inspect,debug: true)
56
53
  jot("stripping padding!",debug: true)
57
- jot(CryptBuffer(result.flatten).strip_padding.str,debug: false)
54
+ jot(result.strip_padding.str,debug: true)
58
55
  end
59
56
 
60
57
  def with_oracle_connection
@@ -83,15 +80,14 @@ module Analyzers
83
80
  # and store the result in a buffer we will mess with
84
81
  forge_buf = apply_found_bytes(blocks[block_index - 1],cur_result,pad_index)
85
82
 
86
- 1.upto 256 do |guess|
83
+ 1.upto 255 do |guess|
87
84
  input = assemble_oracle_input(forge_buf,blocks,block_index,pad_index,guess)
88
85
 
89
86
  next if skip?(pad_index,block_index,guess,cur_result)
90
-
91
- return guess if@oracle.valid_padding?(input,block_amount(block_index))
87
+ return guess if @oracle.valid_padding?(input,block_amount(block_index))
92
88
  end
93
89
 
94
- raise FailedAnalysis, "No padding found... this should neve happen..."
90
+ raise FailedAnalysis, "No padding found... this should never happen..."
95
91
  end
96
92
  private
97
93
 
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  module Ciphers
2
3
  class Aes
3
4
 
@@ -8,32 +9,48 @@ module Ciphers
8
9
  end
9
10
 
10
11
  # NOTE convert ECB encryption to AES gem or both to openssl
11
- def decipher_ecb(key,input)
12
- decipher_ecb_blockwise(CryptBuffer(key),CryptBuffer(input).chunks_of(@block_size_bytes))
12
+ def decipher_ecb(key,input,strip_padding: true)
13
+ plain = decipher_ecb_blockwise(CryptBuffer(key),CryptBuffer(input).chunks_of(@block_size_bytes)).to_crypt_buffer
14
+ strip_padding ? plain.strip_padding : plain
13
15
  end
14
16
 
15
17
  def encipher_ecb(key,input)
16
- encipher_ecb_blockwise(CryptBuffer(key),CryptBuffer(input).chunks_of(@block_size_bytes))
18
+ encipher_ecb_blockwise(CryptBuffer(key),pad_message(input).chunks_of(@block_size_bytes))
17
19
  end
18
20
 
19
21
  def encipher_cbc(key_str,input_str,iv: nil)
20
- unicipher_cbc(:encipher,key_str,input_str,iv)
22
+ unicipher_cbc(:encipher,key_str,pad_message(input_str),iv)
21
23
  end
22
24
 
23
- def decipher_cbc(key_str,input_str,iv: nil)
24
- unicipher_cbc(:decipher,key_str,input_str,iv)
25
+ def decipher_cbc(key_str,input_str,iv: nil,strip_padding: true)
26
+ plain = unicipher_cbc(:decipher,key_str,CryptBuffer(input_str),iv).to_crypt_buffer
27
+ strip_padding ? plain.strip_padding : plain
25
28
  end
26
29
 
27
30
 
28
31
  private
29
32
 
33
+ def pad_message(input)
34
+ buffer=CryptBuffer(input)
35
+ final_block_size = buffer.length % @block_size_bytes
36
+ delta = @block_size_bytes - final_block_size
37
+ if delta > 0
38
+ buffer.pad(delta)
39
+ else
40
+ buffer
41
+ end
42
+ end
43
+
44
+ def pad_block(block)
45
+ return block
46
+ end
47
+
30
48
  def encipher_ecb_blockwise(key,blocks)
31
49
  blocks.map{|block| encipher_ecb_block(key,block) }.join
32
50
  end
33
51
 
34
52
  def encipher_ecb_block(key,block)
35
- need_padding = block.length < @block_size_bytes
36
- _,out = AES.encrypt(block.str, key.hex, {:format => :plain,:padding => need_padding,:cipher => "AES-#{@key_size}-ECB"})
53
+ _,out = AES.encrypt(block.str, key.hex, {:format => :plain,:padding => false,:cipher => "AES-#{@key_size}-ECB"})
37
54
  out
38
55
  end
39
56
 
@@ -42,22 +59,23 @@ module Ciphers
42
59
  end
43
60
 
44
61
  def decipher_ecb_block(key,block)
45
- need_padding = block.length < @block_size_bytes
62
+ need_padding = (block.length < @block_size_bytes)
46
63
  AES.decrypt(["",block.str], key.hex, {:format => :plain,:padding => need_padding,:cipher => "AES-#{@key_size}-ECB"})
47
64
  end
48
65
 
49
66
  # this method is used for encipher and decipher since most of the code is identical
50
67
  # only the value of the previous block and the internal ecb method differs
51
- def unicipher_cbc(direction,key_str,input_str,iv)
68
+ def unicipher_cbc(direction,key_str,input_buf,iv)
69
+
52
70
  method="#{direction.to_s}_cbc_block"
53
- blocks = CryptBuffer(input_str).chunks_of(@block_size_bytes)
71
+ blocks = input_buf.chunks_of(@block_size_bytes)
54
72
  iv ||= blocks.shift.str
55
73
  key = CryptBuffer(key_str).hex
56
74
 
57
75
  prev_block=iv.to_crypt_buffer
58
76
 
59
- blocks.map do |block|
60
- ctext_block = send(method,key,block,prev_block) #encipher_cbc_block(key,block,prev_block)
77
+ strings = blocks.map.with_index do |block,i|
78
+ ctext_block = send(method,key,block,prev_block)
61
79
  if direction == :encipher
62
80
  prev_block = ctext_block
63
81
  else
@@ -65,22 +83,24 @@ module Ciphers
65
83
  end
66
84
 
67
85
  ctext_block.str
68
- end.join.to_crypt_buffer
86
+ end
87
+
88
+ CryptBuffer(strings.join)
69
89
  end
70
90
 
71
91
  def encipher_cbc_block(key,block,prev_block)
72
92
  xored = block ^ prev_block
73
- need_padding = block.length != @block_size_bytes
74
-
75
- _,out = AES.encrypt(xored.str, key, {:format => :plain,:padding => need_padding,:cipher => "AES-#{@key_size}-ECB",:iv => prev_block.str })
93
+
94
+ _,out = AES.encrypt(xored.str, key, {:format => :plain,:padding => false,:cipher => "AES-#{@key_size}-ECB",:iv => prev_block.str })
76
95
  ecb_block = CryptBuffer(out)
77
96
  end
97
+
78
98
  def decipher_cbc_block(key,block,prev_block)
79
- need_padding = block.length != @block_size_bytes
80
-
81
- out = ::AES.decrypt([prev_block.str,block.str] , key, {:format => :plain,:padding => need_padding,:cipher => "AES-#{@key_size}-ECB",:iv => prev_block.str })
99
+
100
+ out = ::AES.decrypt([prev_block.str,block.str] , key, {:format => :plain,:padding => false,:cipher => "AES-#{@key_size}-ECB",:iv => prev_block.str })
82
101
  ecb_block = CryptBuffer(out)
83
- ecb_block ^ prev_block
102
+
103
+ xored = ecb_block ^ prev_block
84
104
  end
85
105
 
86
106
  end
@@ -1,14 +1,17 @@
1
+
2
+
1
3
  module CryptBufferConcern
4
+ # This module extends functionality the CryptBuffer to
5
+ # handle PKCS7 padding.
6
+ # It has the ability to detect, replace, add and strip a
7
+ # padding from a CryptBuffer to return a new one without
8
+ # mutating the existing buffer.
9
+ #
10
+ # The purpose is making crypto analysis of cbc and other
11
+ # cipher modes that use pkcs7 padding easier.
2
12
  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
-
13
+ class InvalidPkcs7Padding < RuntimeError; end
14
+
12
15
  # Return any existing padding
13
16
  def padding
14
17
  last = bytes.last
@@ -32,7 +35,16 @@ module CryptBufferConcern
32
35
  end
33
36
  self.class.new(subset)
34
37
  end
38
+
39
+ def strip_padding!
40
+ validate_padding!
41
+ strip_padding
42
+ end
35
43
 
44
+ def validate_padding!
45
+ raise InvalidPkcs7Padding, "No valid pkcs#7 padding present" unless padding?
46
+ true
47
+ end
36
48
 
37
49
  def padding?
38
50
  !padding.empty?
@@ -1,6 +1,8 @@
1
1
 
2
-
3
2
  class CryptBufferInputConverter
3
+ class ImpossibleConversion < RuntimeError; end
4
+ class InvalidHexstring < RuntimeError; end
5
+
4
6
  def convert(input)
5
7
  bytes_from_any(input)
6
8
  end
@@ -9,6 +11,7 @@ class CryptBufferInputConverter
9
11
  # This is especially useful for unknown or uncertain inputs like
10
12
  # strings with or without leading 0x
11
13
  def from_hex(input)
14
+ raise InvalidHexstring, "input: #{input} is not a valid hexadicimal string" unless valid_hexstring?(input)
12
15
  hexstr =""
13
16
  unless input.nil?
14
17
  hexstr = normalize_hex(input)
@@ -63,7 +66,11 @@ class CryptBufferInputConverter
63
66
  tmp = pad_hex_char(str)
64
67
  tmp.gsub(/(^0x|\s)/,"").upcase
65
68
  end
66
-
69
+ private
70
+
71
+ def valid_hexstring?(input)
72
+ input =~ /^(0x)?[a-fA-F0-9]+$/
73
+ end
67
74
  end
68
75
 
69
76
  def CryptBuffer(input)
@@ -57,6 +57,15 @@ module Matasano
57
57
  Analyzers::EcbStringAppender.new(oracle).analyze
58
58
  end
59
59
 
60
+ def solve15(input)
61
+ CryptBuffer(input).strip_padding!.str
62
+ end
63
+
64
+ def solve16(oracle)
65
+ analyzer = CryptoToolbox::Analyzers::CbcMutatingEncryption.new(oracle)
66
+ analyzer.assemble_attack_message
67
+ end
68
+
60
69
  end
61
70
  end
62
71
  end
@@ -0,0 +1,11 @@
1
+
2
+ module Matasano
3
+ module Sets
4
+ module Set3
5
+ def solve17(oracle)
6
+ ciphertext = oracle.sample_ciphertext
7
+ result = Analyzers::PaddingOracle::Analyzer.new(oracle).analyze(ciphertext)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,9 +1,11 @@
1
1
  require 'crypto-toolbox/matasano/sets/set1.rb'
2
2
  require 'crypto-toolbox/matasano/sets/set2.rb'
3
+ require 'crypto-toolbox/matasano/sets/set3.rb'
3
4
 
4
5
  module Matasano
5
6
  class Solver
6
7
  include Matasano::Sets::Set1
7
8
  include Matasano::Sets::Set2
9
+ include Matasano::Sets::Set3
8
10
  end
9
11
  end
@@ -0,0 +1,44 @@
1
+ module CryptoToolbox
2
+ module Oracles
3
+ class CbcMutatingEncryptionOracle
4
+ attr_reader :prefix,:suffix
5
+
6
+
7
+ def initialize(key = SecureRandom.random_bytes(16) )
8
+ @key = key
9
+ @prefix = "comment1=cooking%20MCs;userdata="
10
+ @suffix = ";comment2=%20like%20a%20pound%20of%20bacon"
11
+ @iv = SecureRandom.random_bytes(16)
12
+ end
13
+
14
+ #make sure this attack is not possible
15
+ # fake_user="admin=true;admin=true;"
16
+ # ciphertext = oracle.encrypted_message_for(fake_user)
17
+ # oracle.is_admin?(ciphertext)
18
+ def message_for(user)
19
+ user.gsub!(/[;=]/,"") # sanitize meta chars
20
+ @prefix + user + @suffix
21
+ end
22
+
23
+ def parse_message(string)
24
+ string.split(";").each_with_object({}){|pair,hsh| k,v = pair.split("="); hsh[k.to_sym] = v }
25
+ end
26
+
27
+ def encrypted_message_for(user)
28
+ Ciphers::Aes.new.encipher_cbc(@key,message_for(user),iv: @iv)
29
+ end
30
+
31
+ def is_admin?(ciphertext)
32
+ data = decrypt_message(ciphertext)
33
+ data.has_key?(:admin) && data[:admin] == "true"
34
+ end
35
+
36
+ private
37
+ def decrypt_message(ciphertext)
38
+ plaintext = Ciphers::Aes.new.decipher_cbc(@key,ciphertext,iv: @iv).to_crypt_buffer.strip_padding.str
39
+ parse_message(plaintext)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -1,7 +1,6 @@
1
-
2
- module Analyzers
3
- module PaddingOracle
4
- module Oracles
1
+ module CryptoToolbox
2
+ module Oracles
3
+ module PaddingOracle
5
4
  class HttpOracle
6
5
  def initialize
7
6
  require 'net/http'
@@ -0,0 +1,69 @@
1
+ module CryptoToolbox
2
+ module Oracles
3
+ module PaddingOracle
4
+
5
+ class PlaintextSelection
6
+ PLAIN_TEXTS= %w(
7
+ MDAwMDAwTm93IHRoYXQgdGhlIHBhcnR5IGlzIGp1bXBpbmc=
8
+ MDAwMDAxV2l0aCB0aGUgYmFzcyBraWNrZWQgaW4gYW5kIHRoZSBWZWdhJ3MgYXJlIHB1bXBpbic=
9
+ MDAwMDAyUXVpY2sgdG8gdGhlIHBvaW50LCB0byB0aGUgcG9pbnQsIG5vIGZha2luZw==
10
+ MDAwMDAzQ29va2luZyBNQydzIGxpa2UgYSBwb3VuZCBvZiBiYWNvbg==
11
+ MDAwMDA0QnVybmluZyAnZW0sIGlmIHlvdSBhaW4ndCBxdWljayBhbmQgbmltYmxl
12
+ MDAwMDA1SSBnbyBjcmF6eSB3aGVuIEkgaGVhciBhIGN5bWJhbA==
13
+ MDAwMDA2QW5kIGEgaGlnaCBoYXQgd2l0aCBhIHNvdXBlZCB1cCB0ZW1wbw==
14
+ MDAwMDA3SSdtIG9uIGEgcm9sbCwgaXQncyB0aW1lIHRvIGdvIHNvbG8=
15
+ MDAwMDA4b2xsaW4nIGluIG15IGZpdmUgcG9pbnQgb2g=
16
+ MDAwMDA5aXRoIG15IHJhZy10b3AgZG93biBzbyBteSBoYWlyIGNhbiBibG93
17
+ ).freeze
18
+ def self.sample
19
+ samples.sample
20
+ end
21
+ def self.samples
22
+ PLAIN_TEXTS
23
+ end
24
+ end
25
+
26
+ class MemoryOracle
27
+ attr_reader :secret_plaintext # for result validation only. I can trust myself
28
+
29
+ def initialize
30
+ @key = SecureRandom.random_bytes(16)
31
+ @iv = SecureRandom.random_bytes(16)
32
+ @secret_plaintext = CryptBuffer.from_base64(PlaintextSelection::sample).str
33
+ end
34
+
35
+ def sample_ciphertext
36
+ @ciphertext ||= generate_ciphertext
37
+ end
38
+
39
+ def connect; end
40
+ def disconnect; end
41
+
42
+ def valid_padding?(input,custom_block_amount=nil)
43
+ # openssl will throw on invalid padding
44
+ begin
45
+ block = CryptBuffer(input)
46
+ result = CryptBuffer(decrypt(block))
47
+ result.validate_padding!
48
+ rescue CryptBufferConcern::Padding::InvalidPkcs7Padding => ex
49
+ false
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def generate_ciphertext
56
+ CryptBuffer(@iv + Ciphers::Aes.new.encipher_cbc(@key,@secret_plaintext,iv: @iv).str).hex
57
+ end
58
+
59
+ def decrypt(msg)
60
+ Ciphers::Aes.new.decipher_cbc(@key,msg,iv: @iv,strip_padding: false)
61
+ end
62
+
63
+ def check_padding(msg)
64
+
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,15 +1,10 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'crypto-toolbox'
4
-
5
- module Analyzers
6
- module PaddingOracle
7
- module Oracles
1
+ module CryptoToolbox
2
+ module Oracles
3
+ module PaddingOracle
8
4
 
9
5
  class TcpOracle
10
6
  def initialize
11
7
  require "socket"
12
- require_relative "./tcp_oracle.rb"
13
8
 
14
9
  @hostname = '54.165.60.84'
15
10
  @port = 80
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crypto-toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Sivia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-27 00:00:00.000000000 Z
11
+ date: 2015-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aes
@@ -57,11 +57,10 @@ files:
57
57
  - lib/crypto-toolbox/analyzers/cbc_mac.rb
58
58
  - lib/crypto-toolbox/analyzers/cbc_mac/variable_length/analyzer.rb
59
59
  - lib/crypto-toolbox/analyzers/cbc_mac/variable_length/oracles/tcp.rb
60
+ - lib/crypto-toolbox/analyzers/cbc_mutating_encryption.rb
60
61
  - lib/crypto-toolbox/analyzers/ecb_string_appender.rb
61
62
  - lib/crypto-toolbox/analyzers/padding_oracle.rb
62
63
  - lib/crypto-toolbox/analyzers/padding_oracle/analyzer.rb
63
- - lib/crypto-toolbox/analyzers/padding_oracle/oracles/http_oracle.rb
64
- - lib/crypto-toolbox/analyzers/padding_oracle/oracles/tcp_oracle.rb
65
64
  - lib/crypto-toolbox/analyzers/utils/ascii_language_detector.rb
66
65
  - lib/crypto-toolbox/analyzers/utils/human_language_detector.rb
67
66
  - lib/crypto-toolbox/analyzers/utils/key_candidate_map.rb
@@ -86,7 +85,12 @@ files:
86
85
  - lib/crypto-toolbox/forgers/stream_ciphers/forge_generator.rb
87
86
  - lib/crypto-toolbox/matasano/sets/set1.rb
88
87
  - lib/crypto-toolbox/matasano/sets/set2.rb
88
+ - lib/crypto-toolbox/matasano/sets/set3.rb
89
89
  - lib/crypto-toolbox/matasano/solver.rb
90
+ - lib/crypto-toolbox/oracles/cbc_mutating_encryption_oracle.rb
91
+ - lib/crypto-toolbox/oracles/padding_oracle/http_oracle.rb
92
+ - lib/crypto-toolbox/oracles/padding_oracle/memory_oracle.rb
93
+ - lib/crypto-toolbox/oracles/padding_oracle/tcp_oracle.rb
90
94
  - lib/crypto-toolbox/oracles/user_profile_encryption_oracle.rb
91
95
  - lib/crypto-toolbox/utils/ecb_detector.rb
92
96
  - lib/crypto-toolbox/utils/ecb_oracle.rb
@@ -112,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
116
  version: '0'
113
117
  requirements: []
114
118
  rubyforge_project:
115
- rubygems_version: 2.4.6
119
+ rubygems_version: 2.4.7
116
120
  signing_key:
117
121
  specification_version: 4
118
122
  summary: Toolbox for crypto analysis