drbg-rb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []