lightning-bolt 1.4.0 → 1.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7471df6d70bb592054a2af7c3c5c1ff1ab8c0f8c
4
- data.tar.gz: 6f7524eb8b95366ce4150421d5bd3e1811d242f5
3
+ metadata.gz: 14a570b0301f4b6762152de51c14bde142aa8758
4
+ data.tar.gz: 1635e9d632ba71791d6217758c6b81cdaeb515c5
5
5
  SHA512:
6
- metadata.gz: 632a6d4885dadc45b4457835aa83ca31544da964300b9bd4283e21c04fa5773b488edd298b962de8332e970c50f354e8cab0e7396cd86e9334da625afc2bf3d0
7
- data.tar.gz: daaf4a3fdd304dd0e1983ee2158613a259bfdd9b66b8c910ea737abd3f8ce5a802e8de9167de9a192b44881182eff3b9944df1c804f7049e3abb6dfdcb030bd8
6
+ metadata.gz: f88dc2d733b77040763b93c9a98460b7a598890d2fe6da34adb2a3c516d614c5e093b765ae2fe2621008096c55129a18f9fdc203a3e237650688e25ed521d4f7
7
+ data.tar.gz: 28a41fd9d4e93076228360f7ddbe24e74e5ca9ac11e10ca8bf334050f63dd60d22fc74796459049493d7a4beb560e331c135c6b614fe3ffc391205277e0015a2
@@ -1,6 +1,7 @@
1
+ require 'lightning/bolt'
1
2
  require 'thor'
2
3
  require 'yaml'
3
- require_relative "codex"
4
+
4
5
  module Lightning
5
6
  module Bolt
6
7
  class Storm < Thor
@@ -5,35 +5,37 @@ module Lightning
5
5
 
6
6
  def initialize(encoder)
7
7
  @encoder = encoder
8
- @ftldrive = 0
9
- @warp = Time.new.to_i
8
+ @alphabet = alphabet()
10
9
  end
11
10
 
12
11
  def random_number(min,max)
13
12
  return SecureRandom.random_number(max-min)+min
14
13
  end
15
14
 
16
- def launch(seed, size, non_printable)
17
- randomizer = seeder(seed)
18
- addable = true
15
+ def random_character(seed, size, flags)
19
16
  enigma = ""
20
- while(enigma.length < size)
21
- rotar = randomizer.bytes(1)
22
- if encodable?(rotar)
23
- enigma += rotar
24
- end
17
+ (0..size).each do | index |
18
+ engima += random_number(0,@alphabet.size)
25
19
  end
26
- return enigma.encode(@encoder)
27
20
  end
28
21
 
29
22
  private
30
23
 
31
- def seeder(seed)
32
- time = Time.new.to_i
33
- time += @ftldrive
34
- @ftldrive = @ftldrive + 1
35
- seed = seed.eql?(nil) ? time : seed
36
- return Random.new(seed)
24
+ def alphabet
25
+ charset = []
26
+ 0.upto(1112064) do |i|
27
+ char = nil
28
+ begin
29
+ char = "" << i
30
+ rescue
31
+ end
32
+ if !char.eql?(nil)
33
+ if encodable?(char)
34
+ charset.push(char.encode(@encoder))
35
+ end
36
+ end
37
+ end
38
+ return charset
37
39
  end
38
40
 
39
41
  def encodable?(rotar)
@@ -1,67 +1,116 @@
1
1
  ---
2
- vault: templates/codex
3
- records:
4
- - en:
5
- - us:
6
- - states.yml
7
- - domains.yml
8
- - names.yml
9
- - colors.yml
10
- - it:
11
- - names.yml
12
- - fr:
13
- - names.yml
14
- - currency.yml
15
- - characters.yml
16
- payload:
17
- - name: ""
18
- reports:
19
- email: ""
20
- rules:
21
- address: ""
22
- - name: ""
23
- reports:
24
- email: |-
25
- Hello #:NAMES/EN/FULL_NAME,
26
- News has reached us that on #:DATES/ACCEPTED_DATE,
27
- you have received conformation that you will be attending
28
- Kettering University. We are equally pleased to hear the news
29
- and would like to extend the offer for you to intern with us as a coop.
30
-
31
- Thank you,
32
-
33
- Software Engineer @ #:MISC/COMPANY+company_sig
34
- Email: #:MISC/EMAIL
35
- Phone Number: #:MISC/PHONE_NUMBER
36
- full_name: "#:NAMES/EN/FULL_NAME"
37
- goog_email: "#:IT/FIRST_NAME.#:IT/LAST_NAME@COMPANY+goog.[com|org|net]"
38
- hw_email: "#:IT/FIRST_NAME.#:IT/LAST_NAME@[helloworld|eprize]+hw.[com|org|net]"
39
- test_email: "#:IT/FIRST_NAME.#:IT/LAST_NAME@COMPANY+test.[com|org|net]"
40
-
41
- rules:
42
- names:
43
- en:
44
- full_name: '#:FIRST_NAME #:MIDDLE_INITIAL #:LAST_NAME'
45
- first_name: "=:en/us/first_names"
46
- middle_initial: "[A-Z]"
47
- last_name: "=:en/us/last_names"
48
- it:
49
- first_name: "=:it/first_names"
50
- last_name: "=:it/last_names"
51
- dates:
52
- birth_date: "#:MONTH #:DAY #:BIRTH_YEAR #:TIME/HOUR #:TIME/MINUTE #:TIME/SECOND"
53
- accepted_date: "#:MONTH #:DAY #:RECENT_YEAR #:TIME/HOUR #:TIME/MINUTE #:TIME/SECOND"
54
- month: "=:en/months"
55
- day: "=:en/days"
56
- birth_year: "19[6-9][0-9]"
57
- recent_year: "20((0[0-9])|(1[0-6]))"
58
- time:
59
- hour: "(0[1-9]) | (1[0-2])"
60
- minute: "[0-5][0-9]"
61
- second: "[0..59]"
62
- misc:
63
- domains: "=:en/us/domains"
64
- area_code: "=:en/us/area_codes"
65
- phone_number: " #:AREA_CODE-([0-9]{3:3})-([0-9]{4:4})"
66
- email: "#:IT/FIRST_NAME.#:IT/LAST_NAME@COMPANY+company_sig.[com|org|net]"
67
- company: "=:en/us/companies"
2
+ theorems:
3
+ - name: "birth_date"
4
+ path: "#:identification-birth-date"
5
+ path: "#:identification-birth-date-range|#:identification-birth-date-norange"
6
+ - name: "birth_date_range"
7
+ path: "#:identification-birth-date-range"
8
+ rule: "#:birth-date-month&#:identification-birth-date-delimiter&#:identification-birth-year"
9
+ - name: "birth_date_month"
10
+ path: "#:birth-date-month"
11
+ rule: "(#:birth-date-feburary|#:birth-date-days-thirty-even|#:birth-date-days-thirty-odd)"
12
+ - name: "birth_date_feburary"
13
+ path: "#:birth-date-feburary"
14
+ rule: "(2#:identification-birth-date-delimiter[0..29])"
15
+ - name: "birth_date_days_thirty_even"
16
+ path: "#:birth-date-days-thirty-even"
17
+ rule: "((4|6|9|11)#:identification-birth-date-delimiter[0..30])"
18
+ - name: "birth_date_days_thirty_odd"
19
+ path: "#:birth-date-days-thirty-odd"
20
+ rule: "((1|3|5|7|8|10|12)#:identification-birth-date-delimiter[0..31])"
21
+ - name: "birth_date_norange"
22
+ path: "#:identification-birth-date-norange"
23
+ rule: "((2(([0-1][0-9])|(2[0-9])))|((1|3|5|7|8|10|12)&(([0-2])|([0-2][0-9])))|((4|6|9|11)[0..30]))"
24
+ - name: "birth_date_delimiter"
25
+ path: "#:identification-birth-date-delimiter"
26
+ rule: "/"
27
+ - name: "birth_year"
28
+ path: "#:identification-birth-year"
29
+ rule: "(19[0-9][0-9])|(20[0-1][0-9])|(20[0-1][6])"
30
+ - name: "time_year"
31
+ path: "#:time-year"
32
+ rule: "[0-9]{4:4}"
33
+ - name: "us_dollar"
34
+ path: "#:en-us-dollar"
35
+ rule: "$([0-9]{0:2}),([1-9]{3:3})\\.[0-9][0-9]"
36
+ - name: "time_month_numeric"
37
+ path: "#:time-month-numeric"
38
+ rule: "([1..12])|((0[0-9])|1(0-2))"
39
+ - name: "time_day_numeric"
40
+ path: "#:time-day-numeric"
41
+ rule: "([1..31])|(([0-2][0-9])|(3[01]))"
42
+ - name: "identification-email"
43
+ path: "#:profile-email"
44
+ rule: "#:name-dot@#:organization-website"
45
+ - name: "identification-website"
46
+ path: "#:organization-website"
47
+ rule: "@:en-organizations\\.#:names-domain"
48
+ - name: "website_domain"
49
+ path: "#:names-domain"
50
+ rule: "(org|com|net|)"
51
+ - name: "dot_name"
52
+ path: "#:name-dot"
53
+ rule: "((#:en-first-name)&(\\.)&(#:en-last-name)|(#:fr-first-name)&(\\.)&(#:fr-last-name)|(#:it-first-name)&(\\.)&(#:it-last-name))"
54
+ - name: "dash_name"
55
+ path: "#:name-dash"
56
+ rule: "((#:en-first-name\\-#:en-last-name)|(#:fr-first-name\\-#:fr-last-name)|(#:it-first-name\\-#:it-last-name))"
57
+ - name: "full_name"
58
+ path: "#:name-full"
59
+ rule: "((#:en-first-name #:en-last-name)|(#:fr-first-name #:fr-last-name)|(#:it-first-name #:it-last-name))"
60
+ - name: "english_first_name"
61
+ path: "#:en-first-name"
62
+ rule: "@:en-names-first"
63
+ - name: "english_last_name"
64
+ path: "#:en-last-name"
65
+ rule: "@:en-names-last"
66
+ - name: "french_first_name"
67
+ path: "#:fr-first-name"
68
+ rule: "@:fr-names-first"
69
+ - name: "french_last_name"
70
+ path: "#:fr-last-name"
71
+ rule: "@:fr-names-last"
72
+ - name: "italian_first_name"
73
+ path: "#:it-first-name"
74
+ rule: "@:it-names-first"
75
+ - name: "italian_last_name"
76
+ path: "#:it-last-name"
77
+ rule: "@:it-names-last"
78
+ - name: "hexadecimal"
79
+ path: "#:numeric-base-sixteen"
80
+ rule: "[0-9a-f]"
81
+ - name: "ipv4"
82
+ path: "#:technology-internet-ipv4"
83
+ rule: "(((([0-1][0-9][0-9])|(2([0-4][0-9]|5[0-5])))|(2[0..55]))\\.{3:3})&((([0-1][0-9][0-9])|(2([0-4][0-9]|5[0-5])))|(2[0..55]))"
84
+ - name: "ipv6"
85
+ path: "#:technology-internet-ipv6"
86
+ rule: "((#:numeric-base-sixteen{4:4}):{7:7})(#:numeric-base-sixteen{4:4})"
87
+ - name: "social_security_number"
88
+ path: "#:identification-socialsecuritynumber"
89
+ rule: "([0-9]{3:3})\\-([0-9]{2:2})\\-([0-9]{4:4})"
90
+ - name: "geolocation_latitude"
91
+ path: "#:geolocation-latitude"
92
+ rule: "#:numeric-float-signed"
93
+ - name: "geolocation_longitude"
94
+ path: "#:geolocation-longitude"
95
+ rule: "#:numeric-float-signed"
96
+ - name: "numeric_float_signed"
97
+ path: "#:numeric-float-signed"
98
+ rule: "(\\+|\\-)[0..65536]\\.[0..65536]"
99
+ - name: "us_address"
100
+ path: "#:identification-us-address"
101
+ rule: "[0..99999] @:"
102
+ - name: "us_city"
103
+ path: "#:identification-us-city"
104
+ rule: "@:en-us-cities"
105
+ - name: "us_state"
106
+ path: "#:identification-us-state"
107
+ rule: "@:en-us-states"
108
+ - name: "us_zipcode"
109
+ path: "#:identification-us-zipcode"
110
+ rule: "[0-9]{5:5}"
111
+ - name: "us_phone_number"
112
+ path: "#:identification-us-phonenumber"
113
+ rule: "[1-9][1-9][1-9]\\-[1-9][1-9][1-9]\\-[1-9][1-9][1-9][1-9]"
114
+ - name: "international_phone_number"
115
+ path: "#:identification-international-phonenumber"
116
+ rule: "hi"
@@ -1,5 +1,5 @@
1
1
  module Lightning
2
2
  module Bolt
3
- VERSION = "1.4.0"
3
+ VERSION = "1.5.0"
4
4
  end
5
5
  end
@@ -1,8 +1,298 @@
1
+ require "lightning/bolt/cypher"
2
+ require "lightning/bolt/fuzzer"
1
3
  require "lightning/bolt/version"
2
- require "lightning/bolt/codex"
4
+
5
+ require 'yaml'
6
+ require 'json'
7
+ require 'digest'
3
8
 
4
9
  module Lightning
5
10
  module Bolt
6
-
11
+ class Codex
12
+ def initialize(bookstore, theorems, memories)
13
+ @cypher = Lightning::Bolt::Cypher.new(bookstore)
14
+ @fuzzer = Lightning::Bolt::Fuzzer.new('UTF-8')
15
+ @keys = YAML.load_file("#{File.dirname(__FILE__)}/keys.yml")
16
+ @passable = true
17
+ @theorems = theorems
18
+ @memory = memories
19
+ end
20
+
21
+ def signal(passable, unique, name)
22
+ @passable = passable.eql?(nil) ? true : passable
23
+ unique = unique.eql?(nil) ? false : unique
24
+ path = nil
25
+ @theorems.each do | theorem |
26
+ if theorem["name"].eql?(name)
27
+ path = theorem["path"]
28
+ end
29
+ end
30
+ if path
31
+ data = decrypt(path)
32
+ if unique
33
+ hash = Digest::SHA256.hexdigest(path)
34
+ @memory[hash] = data
35
+ end
36
+ return path
37
+ else
38
+ return ""
39
+ end
40
+ end
41
+
42
+ def archive
43
+ return @memory
44
+ end
45
+
46
+ private
47
+
48
+ def decrypt(rule)
49
+ rule = rotar(rule, @keys["keys"]["reference"]) ? references(rule) : rule
50
+ rule = rotar(rule, @keys["keys"]["data"]) ? datum(rule) : rule
51
+ rule = rotar(rule, @keys["keys"]["group"]) ? group(rule) : rule
52
+ rule = rotar(rule, @keys["keys"]["repeat"]) ? repeat(rule) : rule
53
+ rule = rotar(rule, @keys["keys"]["set"]) ? set(rule) : rule
54
+ rule = rotar(rule, @keys["keys"]["not"]) ? exclude(rule) : rule
55
+ rule = rotar(rule, @keys["keys"]["or"]) ? either(rule) : rule
56
+ rule = rotar(rule, @keys["keys"]["and"]) ? concat(rule) : rule
57
+ rule = rotar(rule, @keys["keys"]["exist"]) ? exist(rule) : rule
58
+ rule = rotar(rule, @keys["keys"]["escapable"]) ? escapable(rule) : rule
59
+ rule = rotar(rule, @keys["keys"]["remember"]) ? remember(rule) : rule
60
+ return rule
61
+ end
62
+
63
+ def rotar(rule, expr)
64
+ return (rule.scan(Regexp.new(expr)).size > 0)
65
+ end
66
+
67
+ def references(rule)
68
+ vars = rule.scan(Regexp.new(@keys["keys"]["reference"]))
69
+ lock = false
70
+ vars.each do | var |
71
+ scan = radar(var)
72
+ if scan.eql?("")
73
+ lock = true
74
+ else
75
+ rule = rule.sub(var, radar(var))
76
+ end
77
+ end
78
+ if lock
79
+ return rule
80
+ else
81
+ return decrypt(rule)
82
+ end
83
+ end
84
+
85
+ def radar(map)
86
+ rule = ""
87
+ if @passable
88
+ @theorems.each do | theorem |
89
+ if theorem["path"].eql?(map)
90
+ rule = theorem["rule"]
91
+ end
92
+ end
93
+ else
94
+ rule = @theorems[@fuzzer.random_number(0, @theorems.size)]
95
+ end
96
+ return rule
97
+ end
98
+
99
+ def datum(rule)
100
+ datum = rule.scan(Regexp.new(@keys["keys"]["data"]))
101
+ datum.each do | data |
102
+ if @passable
103
+ rule = rule.sub(data, @cypher.arc(data))
104
+ else
105
+ rule = rule.sub(data, @fuzzer.random_character(64, ''))
106
+ end
107
+ end
108
+ return rule
109
+ end
110
+
111
+ def group(rule)
112
+ groups = rule.scan(Regexp.new(@keys["keys"]["group"]))
113
+ groups.each do | group |
114
+ group = group.join("")
115
+ rule = rule.sub(group, decrypt(group[1..-2]))
116
+ end
117
+ return rule
118
+ end
119
+
120
+ def set(rule)
121
+ sets = rule.scan(Regexp.new(@keys["keys"]["set"]))
122
+ if sets
123
+ sets.each do | set |
124
+ rangesets = set[0].scan(Regexp.new(@keys["keys"]["range"]))
125
+ subsets = set[0].scan(Regexp.new(@keys["keys"]["subsets"]))
126
+ if rangesets.size > 0
127
+ rangesets.each do | rangeset |
128
+ subranges = []
129
+ subrangeset = rangeset[1..-2].split("..")
130
+ (subrangeset[0]..subrangeset[1]).each do | x |
131
+ subranges.push(x)
132
+ end
133
+ swap = subranges[@fuzzer.random_number(0,subranges.size)]
134
+ rule = rule.sub(rangeset, swap)
135
+ end
136
+ elsif subsets.size > 0
137
+ charset = []
138
+ subsets.each do | subset |
139
+ if subset
140
+ if @passable
141
+ charset += ruleset(subset[0])
142
+ else
143
+ charset += @fuzzer.random_character(1, '')
144
+ end
145
+ end
146
+ end
147
+ if charset.size > 0
148
+ char = charset[@fuzzer.random_number(0,charset.size)]
149
+ rule = rule.sub(set[0], char)
150
+ end
151
+ end
152
+ end
153
+ end
154
+ return (rule)
155
+ end
156
+
157
+ def ruleset(subset)
158
+ charset = []
159
+ if subset
160
+ if subset.size == 3
161
+ set_range = subset.split("-")
162
+ if set_range.size == 2
163
+ min = set_range[0]
164
+ max = set_range[1]
165
+ range_set = []
166
+ (min..max).each do | range |
167
+ range_set.push(range)
168
+ end
169
+ charset += range_set
170
+ end
171
+ elsif subset.size == 2 && subset[0].eql?("\\")
172
+ charset.push(subset[1])
173
+ else
174
+ charset.push(subset)
175
+ end
176
+ end
177
+ return charset
178
+ end
179
+
180
+ def either(rule)
181
+ if !@passable
182
+ rule = charflip(rule, "|", "&")
183
+ end
184
+ subrules = rule.split(Regexp.new(@keys["keys"]["or"]))
185
+ subrule = subrules[@fuzzer.random_number(0,subrules.length)]
186
+ rule = rule.sub(rule, decrypt(subrule))
187
+ end
188
+
189
+ def concat(rule)
190
+ if !@passable
191
+ rule = charflip(rule, "&", "|")
192
+ end
193
+ combinator = ""
194
+ subrules = rule.split(Regexp.new(@keys["keys"]["and"]))
195
+ subrules.each do | subrule |
196
+ combinator += decrypt(subrule)
197
+ end
198
+ return rule.sub(rule, combinator)
199
+ end
200
+
201
+ def charflip(str, a, b)
202
+ charset = str.split("")
203
+ charset.each_with_index do | set, index |
204
+ if set.eql?(a)
205
+ charset[index] = b
206
+ elsif set.eql?(b)
207
+ charset[index] = a
208
+ else
209
+ end
210
+ end
211
+ return charset.join("")
212
+ end
213
+
214
+ def exists(rule)
215
+ group_ranges = rule.match(Regexp.new(@keys["keys"]["group"] + @keys["keys"]["exist"]))
216
+ set_ranges = rule.match(Regexp.new(@keys["keys"]["set"] + @keys["keys"]["exist"]))
217
+ ranges = []
218
+ ranges += group_ranges.eql?(nil) ? [] : group_ranges[0..-1]
219
+ ranges += set_ranges.eql?(nil) ? [] : set_ranges[0..-1]
220
+ if ranges
221
+ ranges.each do | range |
222
+ range_set = range.match(Regexp.new(@keys["keys"]["exist"]))
223
+ if range_set
224
+ subrule = ""
225
+ if @fuzzer.random_number(0,1).eql(1)
226
+ subrule = rule[0..rule.size-2]
227
+ end
228
+ rule = rule.sub(rule, decrypt(subrule))
229
+ end
230
+ end
231
+ end
232
+ return rule
233
+ end
234
+
235
+ def exclude(rule)
236
+ rule.scan(Regexp.new(@keys["keys"]["exclude"]))
237
+ violated = true
238
+ while violated.eql?(true) do
239
+ violated = false
240
+ decrypt(rule)
241
+ end
242
+ return rule
243
+ end
244
+
245
+ def repeat(rule)
246
+ combinator = ""
247
+ min = max = 0
248
+ repeater = rule.scan(Regexp.new(@keys["keys"]["repeat"]))[0]
249
+ if repeater
250
+ rule = rule.sub(repeater, "")
251
+ range = repeater.to_s[1..-2].split(":")
252
+ min = @passable ? range[0].to_i() : @fuzzer.random_number(0,min)
253
+ max = @passable ? range[1].to_i() : @fuzzer.random_number(min, rand(max + 9))
254
+ if min.eql?(max)
255
+ (0..max-1).each do | i |
256
+ combinator += decrypt(rule)
257
+ end
258
+ else
259
+ (0..min-1).each do | i |
260
+ combinator += decrypt(rule)
261
+ end
262
+ (min..max-min).each do | i |
263
+ combinator += decrypt(rule)
264
+ end
265
+ end
266
+ end
267
+ return rule.sub(rule, combinator)
268
+ end
269
+
270
+ def escapable(rule)
271
+ escapes = rule.scan(Regexp.new(@keys["keys"]["escapable"]))
272
+ escapes.each do | escape |
273
+ if @passable
274
+ rule = rule.sub(escape, escape[1..-1])
275
+ else
276
+ rule = rule.sub(escape, @fuzzer.random_character(1, ''))
277
+ end
278
+ end
279
+ return decrypt(rule)
280
+ end
281
+
282
+ def remember(rule)
283
+ cortex = rule.scan(Regexp.new(@keys["keys"]["memorize"]))
284
+ bank = rule.split("+:")
285
+ memory = @memory[bank[1]]
286
+ if memory
287
+ return memory
288
+ else
289
+ bank = rule.split("+:")
290
+ rule = decrypt(bank[0])
291
+ memory = decrypt(bank[0])
292
+ return memory
293
+ end
294
+ end
295
+
296
+ end
7
297
  end
8
298
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lightning-bolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Austin Vecchio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-06 00:00:00.000000000 Z
11
+ date: 2016-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -96,9 +96,7 @@ files:
96
96
  - bin/lightningbolt
97
97
  - lib/lightning/bolt.rb
98
98
  - lib/lightning/bolt/cli.rb
99
- - lib/lightning/bolt/codex.rb
100
99
  - lib/lightning/bolt/cypher.rb
101
- - lib/lightning/bolt/encoding.yml
102
100
  - lib/lightning/bolt/fuzzer.rb
103
101
  - lib/lightning/bolt/keys.yml
104
102
  - lib/lightning/bolt/templates/codex/en/colors.yml
@@ -1,302 +0,0 @@
1
- require "lightning/bolt/cypher"
2
- require "lightning/bolt/fuzzer"
3
-
4
- require 'yaml'
5
- require 'json'
6
-
7
- module Lightning
8
- module Bolt
9
- class Codex
10
- def initialize(bookstore, theorems, memory)
11
- @cypher = Lightning::Bolt::Cypher.new(bookstore)
12
- @fuzzer = Lightning::Bolt::Fuzzer.new('UTF-8')
13
- @keys = YAML.load_file("#{File.dirname(__FILE__)}/keys.yml")
14
- @passable = true
15
- @unique = false
16
- @theorems = theorems
17
- @memory = memory
18
- end
19
-
20
- def signal(passable, unique, name)
21
- @passable = passable.eql?(nil) ? true : passable
22
- @unique = unique.eql?(nil) ? false : unique
23
- path = nil
24
- @theorems.each do | theorem |
25
- if theorem["name"].eql?(name)
26
- path = theorem["path"]
27
- end
28
- end
29
- if path
30
- path = decrypt(path)
31
- path = rotar(path, @keys["keys"]["escapable"]) ? escapable(path) : path
32
- return path
33
- else
34
- return ""
35
- end
36
- end
37
-
38
- private
39
-
40
- def decrypt(rule)
41
- rule = rotar(rule, @keys["keys"]["reference"]) ? references(rule) : rule
42
- rule = rotar(rule, @keys["keys"]["data"]) ? datum(rule) : rule
43
- rule = rotar(rule, @keys["keys"]["group"]) ? group(rule) : rule
44
- rule = rotar(rule, @keys["keys"]["repeat"]) ? repeat(rule) : rule
45
- rule = rotar(rule, @keys["keys"]["set"]) ? set(rule) : rule
46
- #rule = rotar(rule, @keys["keys"]["not"]) ? exclude(rule) : rule
47
- rule = rotar(rule, @keys["keys"]["or"]) ? either(rule) : rule
48
- rule = rotar(rule, @keys["keys"]["and"]) ? concat(rule) : rule
49
- rule = rotar(rule, @keys["keys"]["exist"]) ? exist(rule) : rule
50
- rule = rotar(rule, @keys["keys"]["escapable"]) ? escapable(rule) : rule
51
- rule = rotar(rule, @keys["keys"]["remember"]) ? remember(rule) : rule
52
- return rule
53
- end
54
-
55
- def rotar(rule, expr)
56
- return (rule.scan(Regexp.new(expr)).size > 0)
57
- end
58
-
59
- def references(rule)
60
- vars = rule.scan(Regexp.new(@keys["keys"]["reference"]))
61
- lock = false
62
- vars.each do | var |
63
- scan = radar(var)
64
- if scan.eql?("")
65
- lock = true
66
- else
67
- rule = rule.sub(var, radar(var))
68
- end
69
- end
70
- if lock
71
- return rule
72
- else
73
- return decrypt(rule)
74
- end
75
- end
76
-
77
- def radar(map)
78
- rule = ""
79
- if @passable
80
- @theorems.each do | theorem |
81
- if theorem["path"].eql?(map)
82
- rule = theorem["rule"]
83
- end
84
- end
85
- else
86
- rule = @theorems[@fuzzer.random_number(0, @theorems.size)]
87
- end
88
- return rule
89
- end
90
-
91
- def datum(rule)
92
- datum = rule.scan(Regexp.new(@keys["keys"]["data"]))
93
- datum.each do | data |
94
- if @passable
95
- rule = rule.sub(data, @cypher.arc(data))
96
- else
97
- rule = rule.sub(data, @fuzzer.launch(nil, 64, true))
98
- end
99
- end
100
- return rule
101
- end
102
-
103
- def group(rule)
104
- groups = rule.scan(Regexp.new(@keys["keys"]["group"]))
105
- groups.each do | group |
106
- group = group.join("")
107
- rule = rule.sub(group, decrypt(group[1..-2]))
108
- end
109
- return rule
110
- end
111
-
112
- def set(rule)
113
- sets = rule.scan(Regexp.new(@keys["keys"]["set"]))
114
- if sets
115
- sets.each do | set |
116
- rangesets = set[0].scan(Regexp.new(@keys["keys"]["range"]))
117
- subsets = set[0].scan(Regexp.new(@keys["keys"]["subsets"]))
118
- if rangesets.size > 0
119
- rangesets.each do | rangeset |
120
- subranges = []
121
- subrangeset = rangeset[1..-2].split("..")
122
- (subrangeset[0]..subrangeset[1]).each do | x |
123
- subranges.push(x)
124
- end
125
- swap = subranges[@fuzzer.random_number(0,subranges.size)]
126
- rule = rule.sub(rangeset, swap)
127
- end
128
- elsif subsets.size > 0
129
- charset = []
130
- subsets.each do | subset |
131
- if subset
132
- if @passable
133
- charset += ruleset(subset[0])
134
- else
135
- charset += glyph
136
- end
137
- end
138
- end
139
- if charset.size > 0
140
- char = charset[@fuzzer.random_number(0,charset.size)]
141
- rule = rule.sub(set[0], char)
142
- end
143
- end
144
- end
145
- end
146
- return (rule)
147
- end
148
-
149
- def ruleset(subset)
150
- charset = []
151
- if subset
152
- if subset.size == 3
153
- set_range = subset.split("-")
154
- if set_range.size == 2
155
- min = set_range[0]
156
- max = set_range[1]
157
- range_set = []
158
- (min..max).each do | range |
159
- range_set.push(range)
160
- end
161
- charset += range_set
162
- end
163
- elsif subset.size == 2 && subset[0].eql?("\\")
164
- charset.push(subset[1])
165
- else
166
- charset.push(subset)
167
- end
168
- end
169
- return charset
170
- end
171
-
172
- def glyph()
173
- range_set = []
174
- min = rand(65)
175
- max = rand(129)
176
- (min..@fuzzer.random_number(min,max)).each do | range |
177
- range_set.push(range.to_s(2).to_i(2))
178
- end
179
- return charsets
180
- end
181
-
182
- def either(rule)
183
- if !@passable
184
- rule = charflip(rule, "|", "&")
185
- end
186
- subrules = rule.split(Regexp.new(@keys["keys"]["or"]))
187
- subrule = subrules[@fuzzer.random_number(0,subrules.length)]
188
- rule = rule.sub(rule, decrypt(subrule))
189
- end
190
-
191
- def concat(rule)
192
- if !@passable
193
- rule = charflip(rule, "&", "|")
194
- end
195
- combinator = ""
196
- subrules = rule.split(Regexp.new(@keys["keys"]["and"]))
197
- subrules.each do | subrule |
198
- combinator += decrypt(subrule)
199
- end
200
- return rule.sub(rule, combinator)
201
- end
202
-
203
- def charflip(str, a, b)
204
- charset = str.split("")
205
- charset.each_with_index do | set, index |
206
- if set.eql?(a)
207
- charset[index] = b
208
- elsif set.eql?(b)
209
- charset[index] = a
210
- else
211
- end
212
- end
213
- return charset.join("")
214
- end
215
-
216
- def exists(rule)
217
- group_ranges = rule.match(Regexp.new(@keys["keys"]["group"] + @keys["keys"]["exist"]))
218
- set_ranges = rule.match(Regexp.new(@keys["keys"]["set"] + @keys["keys"]["exist"]))
219
- ranges = []
220
- ranges += group_ranges.eql?(nil) ? [] : group_ranges[0..-1]
221
- ranges += set_ranges.eql?(nil) ? [] : set_ranges[0..-1]
222
- if ranges
223
- ranges.each do | range |
224
- range_set = range.match(Regexp.new(@keys["keys"]["exist"]))
225
- if range_set
226
- subrule = ""
227
- if @fuzzer.random_number(0,1).eql(1)
228
- subrule = rule[0..rule.size-2]
229
- end
230
- rule = rule.sub(rule, decrypt(subrule))
231
- end
232
- end
233
- end
234
- return rule
235
- end
236
-
237
- def exclude(rule)
238
- =begin
239
- violated = true
240
- rule = switch(rule)
241
- while violated.eql?(true) do
242
- violated = false
243
- rule = decrypt(rule)
244
- end
245
- =end
246
- return rule
247
- end
248
-
249
- def repeat(rule)
250
- combinator = ""
251
- min = max = 0
252
- repeater = rule.scan(Regexp.new(@keys["keys"]["repeat"]))[0]
253
- if repeater
254
- rule = rule.sub(repeater, "")
255
- range = repeater.to_s[1..-2].split(":")
256
- min = @passable ? range[0].to_i() : @fuzzer.random_number(0,min)
257
- max = @passable ? range[1].to_i() : @fuzzer.random_number(min, rand(max + 9))
258
- if min.eql?(max)
259
- (0..max-1).each do | i |
260
- combinator += decrypt(rule)
261
- end
262
- else
263
- (0..min-1).each do | i |
264
- combinator += decrypt(rule)
265
- end
266
- (min..max-min).each do | i |
267
- combinator += decrypt(rule)
268
- end
269
- end
270
- end
271
- return rule.sub(rule, combinator)
272
- end
273
-
274
- def escapable(rule)
275
- escapes = rule.scan(Regexp.new(@keys["keys"]["escapable"]))
276
- escapes.each do | escape |
277
- if @passable
278
- rule = rule.sub(escape, escape[1..-1])
279
- else
280
- rule = rule.sub(escape, @fuzzer.launch(nil, 1, false))
281
- end
282
- end
283
- return decrypt(rule)
284
- end
285
-
286
- def remember(rule)
287
- cortex = rule.scan(Regexp.new(@keys["keys"]["memorize"]))
288
- bank = rule.split("+:")
289
- memory = @memory[bank[1]]
290
- if memory
291
- return memory
292
- else
293
- bank = rule.split("+:")
294
- rule = decrypt(bank[0])
295
- memory = decrypt(bank[0])
296
- return memory
297
- end
298
- end
299
-
300
- end
301
- end
302
- end
@@ -1,73 +0,0 @@
1
- encoding: "UTF-8"
2
- #encodable:
3
- #
4
- non-encodable:
5
- start: 55296
6
- end: 57343
7
- non-printable:
8
- - code: 0
9
- char: NUL
10
- - code: 1
11
- char: SOH
12
- - code: 2
13
- char: STX
14
- - code: 3
15
- char: ETX
16
- - code: 4
17
- char: EOT
18
- - code: 5
19
- char: ENQ
20
- - code: 6
21
- char: ACK
22
- - code: 7
23
- char: BEL
24
- - code: 8
25
- char: BS
26
- - code: 9
27
- char: TAB
28
- - code: A
29
- char: LF
30
- - code: B
31
- char: VT
32
- - code: C
33
- char: FF
34
- - code: D
35
- char: CR
36
- - code: E
37
- char: SO
38
- - code: F
39
- char: SI
40
- - code: 10
41
- char: DLE
42
- - code: 11
43
- char: DC1
44
- - code: 12
45
- char: DC2
46
- - code: 13
47
- char: DC3
48
- - code: 14
49
- char: DC4
50
- - code: 15
51
- char: NAK
52
- - code: 16
53
- char: SYN
54
- - code: 17
55
- char: ETB
56
- - code: 18
57
- char: CAN
58
- - code: 19
59
- char: EM
60
- - code: 1A
61
- char: SUB
62
- - code: 1B
63
- char: ESC
64
- - code: 1C
65
- char: FS
66
- - code: 1D
67
- char: GS
68
- - code: 1E
69
- char: RS
70
- - code: 1F
71
- char: US
72
- - code: 7F
73
- char: DEL