pwqgen 2.0.2 → 2.0.3

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: 64338058b67c43e96abc7538837c9b43b6f3cb3a
4
- data.tar.gz: 9e95480a1c72b8e0fa6514da1e0a853ed571fc27
3
+ metadata.gz: 3ab97bc484da2c721abec88ad2f675bce06d0abf
4
+ data.tar.gz: 619c2e93073ba7d15d6c04b6c959cec90d76e49d
5
5
  SHA512:
6
- metadata.gz: 8995d997aa7303d90c46229dab9d28c4e918711cc8d69691678ff14bae2c4a5a6f2564f1ea1a40d5e558aeba2cf92a72f2f16e3ea7992baebeda0963ce928181
7
- data.tar.gz: be2cdf114a7d98bd29876c0e681f61182a7a2a29e3e066d5648f5afc29abd954576488dc50dabc14a5eddbc2b9222fa13047a5e17713c5b4ac768bc0edbef266
6
+ metadata.gz: e27b701ed641e201cc0544202a89228f2b14291b8674a29eba211d7ab677a9175cb392840e8fa53f18ea4372de93efb6b51957019f724deaaf07dd9a51005a15
7
+ data.tar.gz: 6176509bc4b036a64c287734a4a1460eee1640eab8c5363722eded377d9530cc871226dea64d87b54df34db9c43af690f8d7f8acac865656a575957d9dda7cb5
data/lib/pwqgen/pwqgen.rb CHANGED
@@ -10,23 +10,6 @@ module Pwqgen
10
10
  NUMERIC_SEPARATORS = '23456789'.each_char.to_a # less entropy, but for sites that cannot use chatacters like _-, etc.
11
11
 
12
12
  class << self
13
- # for calculating base 2 log without any worry about floating point errors
14
- LOG2_TABLE = {
15
- 1 => 0,
16
- 2 => 1,
17
- 4 => 2,
18
- 8 => 3,
19
- 16 => 4,
20
- 32 => 5,
21
- 64 => 6,
22
- 128 => 7,
23
- 256 => 8,
24
- 512 => 9,
25
- 1024 => 10,
26
- 2048 => 11,
27
- 4096 => 12
28
- }.freeze
29
-
30
13
  # Pwqgen.pwqgen - generate a random passphrase using the pwqgen algorithm
31
14
  #
32
15
  # Arguments:
@@ -70,7 +53,7 @@ module Pwqgen
70
53
  raise ArgumentError, "invalid random_generator: #{random_generator.inspect}" unless random_generator.respond_to? :call
71
54
  raise ArgumentError, "separators must be Array of length 2**n n<=12, of one characters strings: #{separators.inspect}" \
72
55
  unless (separators.is_a? Array) && separators.inject(true) { |a, e| a && (e.is_a? String) && e.length == 1 } \
73
- && LOG2_TABLE[separators.length]
56
+ && log2(separators.length)
74
57
 
75
58
  random_separators = Array.new(n_words - 1) { random_separator(random_generator: random_generator, separators: separators) }
76
59
  random_words = Array.new(n_words) { random_word(random_generator: random_generator, random_capitalize: random_capitalize) }
@@ -81,6 +64,29 @@ module Pwqgen
81
64
  end
82
65
  end
83
66
 
67
+ # if n is a power of 2, return log2(n), else return nil
68
+ # Arguments:
69
+ # n: (Integer)
70
+ def log2(n)
71
+ return nil if n <= 0
72
+
73
+ # return nil unless n is a power of 2
74
+ return nil unless (n & (n - 1)).zero?
75
+
76
+ bits = 0
77
+
78
+ while n > 255
79
+ n >>= 8
80
+ bits += 8
81
+ end
82
+
83
+ while n > 0
84
+ n >>= 1
85
+ bits += 1
86
+ end
87
+ bits - 1
88
+ end
89
+
84
90
  private
85
91
 
86
92
  # Get n_bits bits from the random generator. This squanders some randomness,
@@ -98,14 +104,14 @@ module Pwqgen
98
104
  # generate a single word "randomly" chosen from WORDSET
99
105
  # with the option to capitalize "randomly"
100
106
  def random_word(random_generator:, random_capitalize: true) # :nodoc:
101
- random_word = WORDSET[random_bits(random_generator: random_generator, n_bits: LOG2_TABLE[WORDSET.length])].dup
107
+ random_word = WORDSET[random_bits(random_generator: random_generator, n_bits: log2(WORDSET.length))].dup
102
108
  random_word.capitalize! if random_capitalize && (random_bits(random_generator: random_generator, n_bits: 1) == 1)
103
109
  random_word
104
110
  end
105
111
 
106
112
  # generate a separator "randomly" chosen from separators
107
113
  def random_separator(random_generator:, separators:)
108
- separators[random_bits(random_generator: random_generator, n_bits: LOG2_TABLE[separators.length])]
114
+ separators[random_bits(random_generator: random_generator, n_bits: log2(separators.length))]
109
115
  end
110
116
  end
111
117
  end
@@ -1,5 +1,5 @@
1
1
  # vim: set expandtab sw=2 ts=2:ft=ruby
2
2
  module Pwqgen
3
3
  # version number
4
- VERSION = '2.0.2'.freeze
4
+ VERSION = '2.0.3'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwqgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Henderson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-31 00:00:00.000000000 Z
11
+ date: 2017-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sysrandom