webget_ruby_secure_random 1.2.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.
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ �����8��e_�O@=�,N�Kj�gu �3� h���U�3��GYPX��7�4W�D_� �au8m�wxr��7�6ig[ ��`D�z�-JS�P),
2
+ f������e���1�-2i��(�C��é
@@ -0,0 +1,154 @@
1
+ =begin rdoc
2
+
3
+ = WebGet Ruby Gem: secure random number generator interface for Ruby 1.86 backported from 1.8.7
4
+
5
+ Author:: Joel Parker Henderson, joelparkerhenderson@gmail.com
6
+ Copyright:: Copyright the original author; I merely made it into a gem.
7
+ License:: CreativeCommons License, Non-commercial Share Alike
8
+ License:: LGPL, GNU Lesser General Public License
9
+
10
+ This gem is intended for use with Ruby 1.8.6 only.
11
+
12
+ This gem is a backport of the built-in securerandom method from Ruby 1.8.7.
13
+
14
+ This library is an interface for secure random number generator which is
15
+ suitable for generating session key in HTTP cookies, etc.
16
+
17
+ It supports following secure random number generators.
18
+
19
+ * openssl
20
+ * /dev/urandom
21
+
22
+ Examples
23
+ SecureRandom.hex(10) => "52750b30ffbc7de3b362"
24
+ SecureRandom.hex(10) => "92b15d6c8dc4beb5f559"
25
+ SecureRandom.hex(11) => "6aca1b5c58e4863e6b81b8"
26
+ SecureRandom.hex(12) => "94b2fff3e7fd9b9c391a2306"
27
+ SecureRandom.hex(13) => "39b290146bea6ce975c37cfc23"
28
+
29
+ Examples
30
+ SecureRandom.base64(10) => "EcmTPZwWRAozdA=="
31
+ SecureRandom.base64(10) => "9b0nsevdwNuM/w=="
32
+ SecureRandom.base64(10) => "KO1nIU+p9DKxGg=="
33
+ SecureRandom.base64(11) => "l7XEiFja+8EKEtY="
34
+ SecureRandom.base64(12) => "7kJSM/MzBJI+75j8"
35
+ SecureRandom.base64(13) => "vKLJ0tXBHqQOuIcSIg=="
36
+
37
+ Examples
38
+ SecureRandom.random_bytes(10) => "\016\t{\370g\310pbr\301"
39
+ SecureRandom.random_bytes(10) => "\323U\030TO\234\357\020\a\337"
40
+
41
+ =end
42
+
43
+
44
+ begin
45
+ require 'openssl'
46
+ rescue LoadError
47
+ end
48
+
49
+ module SecureRandom
50
+ # SecureRandom.random_bytes generates a random binary string.
51
+ #
52
+ # The argument n specifies the length of the result string.
53
+ #
54
+ # If n is not specified, 16 is assumed.
55
+ # It may be larger in future.
56
+ #
57
+ # If secure random number generator is not available,
58
+ # NotImplementedError is raised.
59
+ def self.random_bytes(n=nil)
60
+ n ||= 16
61
+ if defined? OpenSSL::Random
62
+ return OpenSSL::Random.random_bytes(n)
63
+ end
64
+ if !defined?(@has_urandom) || @has_urandom
65
+ @has_urandom = false
66
+ flags = File::RDONLY
67
+ flags |= File::NONBLOCK if defined? File::NONBLOCK
68
+ flags |= File::NOCTTY if defined? File::NOCTTY
69
+ flags |= File::NOFOLLOW if defined? File::NOFOLLOW
70
+ begin
71
+ File.open("/dev/urandom", flags) {|f|
72
+ unless f.stat.chardev?
73
+ raise Errno::ENOENT
74
+ end
75
+ @has_urandom = true
76
+ ret = f.readpartial(n)
77
+ if ret.length != n
78
+ raise NotImplementedError, "Unexpected partial read from random device"
79
+ end
80
+ return ret
81
+ }
82
+ rescue Errno::ENOENT
83
+ raise NotImplementedError, "No random device"
84
+ end
85
+ end
86
+ raise NotImplementedError, "No random device"
87
+ end
88
+
89
+ # SecureRandom.hex generates a random hex string.
90
+ #
91
+ # The argument n specifies the length of the random length.
92
+ # The length of the result string is twice of n.
93
+ #
94
+ # If n is not specified, 16 is assumed.
95
+ # It may be larger in future.
96
+ #
97
+ # If secure random number generator is not available,
98
+ # NotImplementedError is raised.
99
+ def self.hex(n=nil)
100
+ random_bytes(n).unpack("H*")[0]
101
+ end
102
+
103
+ # SecureRandom.base64 generates a random base64 string.
104
+ #
105
+ # The argument n specifies the length of the random length.
106
+ # The length of the result string is about 4/3 of n.
107
+ #
108
+ # If n is not specified, 16 is assumed.
109
+ # It may be larger in future.
110
+ #
111
+ # If secure random number generator is not available,
112
+ # NotImplementedError is raised.
113
+ def self.base64(n=nil)
114
+ [random_bytes(n)].pack("m*").delete("\n")
115
+ end
116
+
117
+ # SecureRandom.random_number generates a random number.
118
+ #
119
+ # If an positive integer is given as n,
120
+ # SecureRandom.random_number returns an integer:
121
+ # 0 <= SecureRandom.random_number(n) < n.
122
+ #
123
+ # If 0 is given or an argument is not given,
124
+ # SecureRandom.random_number returns an float:
125
+ # 0.0 <= SecureRandom.random_number() < 1.0.
126
+ def self.random_number(n=0)
127
+ if 0 < n
128
+ hex = n.to_s(16)
129
+ hex = '0' + hex if (hex.length & 1) == 1
130
+ bin = [hex].pack("H*")
131
+ mask = bin[0].ord
132
+ mask |= mask >> 1
133
+ mask |= mask >> 2
134
+ mask |= mask >> 4
135
+ begin
136
+ rnd = SecureRandom.random_bytes(bin.length)
137
+ rnd[0] = (rnd[0].ord & mask).chr
138
+ end until rnd < bin
139
+ rnd.unpack("H*")[0].hex
140
+ else
141
+ # assumption: Float::MANT_DIG <= 64
142
+ i64 = SecureRandom.random_bytes(8).unpack("Q")[0]
143
+ Math.ldexp(i64 >> (64-Float::MANT_DIG), -Float::MANT_DIG)
144
+ end
145
+ end
146
+
147
+ end
148
+
149
+ # Added by joelparkerhenderson@gmail.com for backwards compatibility with Ruby 1.8
150
+ class Fixnum
151
+ def ord
152
+ return self
153
+ end
154
+ end
@@ -0,0 +1,48 @@
1
+ require 'test/unit'
2
+ require 'webget_ruby_secure_random'
3
+
4
+ class Testing < Test::Unit::TestCase
5
+
6
+ def test_random_bytes
7
+ n=16
8
+ 20.times{
9
+ x=SecureRandom.random_bytes(16)
10
+ assert_equal(x.length,n)
11
+ }
12
+ end
13
+
14
+ def test_hex
15
+ n=16
16
+ 20.times{
17
+ x=SecureRandom.hex(n)
18
+ assert_equal(x.length,2*n)
19
+ }
20
+ end
21
+
22
+ def test_base64
23
+ n=16
24
+ 20.times{
25
+ x=SecureRandom.base64(n)
26
+ assert(x.length>=n,"x length #{x.length} >= n #{n}")
27
+ assert(x.length<2*n,"x length #{x.length} < 2n #{2*n}")
28
+ }
29
+ end
30
+
31
+ def test_random_number_integer
32
+ n=16
33
+ 20.times{
34
+ x=SecureRandom.random_number(n)
35
+ assert(0<=x,"0<=x")
36
+ assert(x<n,"x<n")
37
+ }
38
+ end
39
+
40
+ def test_random_number_float
41
+ 20.times{
42
+ x=SecureRandom.random_number
43
+ assert(0<=x,"0<=x")
44
+ assert(x<1,"x<1")
45
+ }
46
+ end
47
+
48
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webget_ruby_secure_random
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ platform: ruby
6
+ authors:
7
+ - WebGet
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDvDCCAyWgAwIBAgIJAIlSqEkDQaZIMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYD
14
+ VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
15
+ aXNjbzETMBEGA1UEChMKV2ViR2V0LmNvbTETMBEGA1UECxMKV2ViR2V0LmNvbTET
16
+ MBEGA1UEAxMKV2ViR2V0LmNvbTEgMB4GCSqGSIb3DQEJARYRd2ViZ2V0QHdlYmdl
17
+ dC5jb20wHhcNMDkwMjI2MTk0NDU4WhcNMTExMTIzMTk0NDU4WjCBmzELMAkGA1UE
18
+ BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
19
+ Y28xEzARBgNVBAoTCldlYkdldC5jb20xEzARBgNVBAsTCldlYkdldC5jb20xEzAR
20
+ BgNVBAMTCldlYkdldC5jb20xIDAeBgkqhkiG9w0BCQEWEXdlYmdldEB3ZWJnZXQu
21
+ Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXCFYfW6hCQl0ToNjaMIXG
22
+ ZfPF6OoR20BO/Tg6V37qPi7gDSZ6vIC6Mxcs8LtEcju85cD9lnKKl/lo4S5/w9Ha
23
+ hGD2ZFFfbF8420X5Za5G2KuriS3GzRz7F5dKCTjb1NH9TPlgOc71bcrDmCwwtFJl
24
+ T+tdfBju0YxLSBiMXf4y5QIDAQABo4IBBDCCAQAwHQYDVR0OBBYEFHB1kXO/Xd4g
25
+ G+AJ2/wwh6JOWXzNMIHQBgNVHSMEgcgwgcWAFHB1kXO/Xd4gG+AJ2/wwh6JOWXzN
26
+ oYGhpIGeMIGbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG
27
+ A1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UEChMKV2ViR2V0LmNvbTETMBEGA1UE
28
+ CxMKV2ViR2V0LmNvbTETMBEGA1UEAxMKV2ViR2V0LmNvbTEgMB4GCSqGSIb3DQEJ
29
+ ARYRd2ViZ2V0QHdlYmdldC5jb22CCQCJUqhJA0GmSDAMBgNVHRMEBTADAQH/MA0G
30
+ CSqGSIb3DQEBBQUAA4GBADzVXlwuff0/w3yK4LflGKKhtC3oChIrwmSyP6tk628N
31
+ BHokpc4Kz63xSXqzYTnBS7rFBwlYThtNalQeWmoUjGh3Z0ZR0JlhU0ln8899LuJ3
32
+ DXnLFY0cVuBnNDMOOFl8vk1qIcZjcTovhzgcixpG6Uk5qmUsKHRLQf4oQJx7TfLK
33
+ -----END CERTIFICATE-----
34
+
35
+ date: 2010-02-17 00:00:00 -08:00
36
+ default_executable:
37
+ dependencies: []
38
+
39
+ description:
40
+ email: webget@webget.com
41
+ executables: []
42
+
43
+ extensions: []
44
+
45
+ extra_rdoc_files: []
46
+
47
+ files:
48
+ - lib/webget_ruby_secure_random.rb
49
+ has_rdoc: true
50
+ homepage: http://webget.com/
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options: []
55
+
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.5
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: "WebGet Ruby Gem: secure random number method for Ruby 1.8.6"
77
+ test_files:
78
+ - test/webget_ruby_secure_random_test.rb
metadata.gz.sig ADDED
Binary file