drbg-rb 0.0.1

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.
@@ -0,0 +1,110 @@
1
+ module DRBG::HMAC
2
+
3
+ def initialize(entropy, sec_level=256, personalization_string="")
4
+
5
+ if sec_level > 256
6
+ raise 'sec_level cannot exceed 256 bits'
7
+ end
8
+
9
+ if personalization_string.size * 8 > 256
10
+ raise 'personalization_string cannot exceed 256 bits'
11
+ end
12
+
13
+ if sec_level <= 112
14
+ @security_strength = 112
15
+ elsif sec_level <= 128
16
+ @sec_level = 128
17
+ elsif sec_level <= 192
18
+ @sec_level = 192
19
+ else
20
+ @sec_level = 256
21
+ end
22
+
23
+ if (entropy.size * 8 * 2) < (3 * @sec_level)
24
+ raise 'entropy must be at least ' + (1.5 * @sec_level).to_s + ' bits'
25
+ end
26
+
27
+ if entropy.size * 8 > 1000
28
+ raise 'entropy cannot exceed 1000 bits'
29
+ end
30
+
31
+ _instantiate(entropy, personalization_string)
32
+
33
+ end
34
+
35
+
36
+ def generate(num_bytes, sec_level=256)
37
+
38
+ if num_bytes * 8 > 7500
39
+ raise 'generate cannot generate more than 7500 bits in a single call'
40
+ end
41
+
42
+ if sec_level > @sec_level
43
+ raise 'sec_level exceeds this instance\'s security_strength'
44
+ end
45
+
46
+ return if @reseed_counter >= 10000
47
+
48
+ temp = ''
49
+
50
+ while temp.size < num_bytes
51
+ @V = hmac(@K, @V)
52
+ temp += @V
53
+ end
54
+
55
+ self._update(nil)
56
+ @reseed_counter += 1
57
+
58
+ temp
59
+
60
+ end
61
+
62
+ protected
63
+
64
+ def _instantiate(entropy, personalization_string)
65
+
66
+ seed_material = entropy + personalization_string
67
+
68
+ @K = "\x00" * 32
69
+ @V = "\x01" * 32
70
+
71
+ _update(seed_material)
72
+ @reseed_counter = 1
73
+
74
+ end
75
+
76
+ def _update(provided_data = nil)
77
+
78
+ @K = hmac(@K, @V + "\x00" + (provided_data || ''))
79
+ @V = hmac(@K, @V)
80
+
81
+ if provided_data
82
+ @K = hmac(@K, @V + "\x01" + provided_data)
83
+ @V = hmac(@K, @V)
84
+ end
85
+
86
+ end
87
+
88
+ def reseed(entropy)
89
+
90
+ if len(entropy) * 8 < @sec_level
91
+ raise "entropy must be at least #{@sec_level} bits"
92
+ end
93
+
94
+ if len(entropy) * 8 > 1000
95
+ raise 'entropy cannot exceed 1000 bits'
96
+ end
97
+
98
+ _update(entropy)
99
+ @reseed_counter = 1
100
+
101
+ end
102
+
103
+ def hmac(key, data)
104
+
105
+ @digest ||= OpenSSL::Digest::SHA256.new
106
+ OpenSSL::HMAC.digest(@digest, key, data)
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,5 @@
1
+ module DRBG
2
+
3
+ VERSION = '0.0.1'
4
+
5
+ end
data/lib/drbg-rb.rb ADDED
@@ -0,0 +1,8 @@
1
+ module DRBG
2
+
3
+ require 'openssl'
4
+
5
+ require_relative 'drbg-rb/version'
6
+ require_relative 'drbg-rb/hmac'
7
+
8
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: drbg-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Louis Mullie
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-05-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.12.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.12.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ! ' Cryptographically secure deterministic random bit generators for
47
+ Ruby '
48
+ email:
49
+ - louis.mullie@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/drbg-rb/hmac.rb
55
+ - lib/drbg-rb/version.rb
56
+ - lib/drbg-rb.rb
57
+ homepage: https://github.com/cryodex/drbg-rb
58
+ licenses: []
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 1.8.25
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Cryptographically secure deterministic random bit generators for Ruby
81
+ test_files: []