pwqgen 2.0.2 → 2.0.3

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: 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