bcrypt 3.1.7 → 3.1.20

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/ext/mri/x86.S ADDED
@@ -0,0 +1,203 @@
1
+ /*
2
+ * Written by Solar Designer <solar at openwall.com> in 1998-2010.
3
+ * No copyright is claimed, and the software is hereby placed in the public
4
+ * domain. In case this attempt to disclaim copyright and place the software
5
+ * in the public domain is deemed null and void, then the software is
6
+ * Copyright (c) 1998-2010 Solar Designer and it is hereby released to the
7
+ * general public under the following terms:
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted.
11
+ *
12
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
13
+ *
14
+ * See crypt_blowfish.c for more information.
15
+ */
16
+
17
+ #ifdef __i386__
18
+
19
+ #if defined(__OpenBSD__) && !defined(__ELF__)
20
+ #define UNDERSCORES
21
+ #define ALIGN_LOG
22
+ #endif
23
+
24
+ #if defined(__CYGWIN32__) || defined(__MINGW32__)
25
+ #define UNDERSCORES
26
+ #endif
27
+
28
+ #ifdef __DJGPP__
29
+ #define UNDERSCORES
30
+ #define ALIGN_LOG
31
+ #endif
32
+
33
+ #ifdef UNDERSCORES
34
+ #define _BF_body_r __BF_body_r
35
+ #endif
36
+
37
+ #ifdef ALIGN_LOG
38
+ #define DO_ALIGN(log) .align (log)
39
+ #elif defined(DUMBAS)
40
+ #define DO_ALIGN(log) .align 1 << log
41
+ #else
42
+ #define DO_ALIGN(log) .align (1 << (log))
43
+ #endif
44
+
45
+ #define BF_FRAME 0x200
46
+ #define ctx %esp
47
+
48
+ #define BF_ptr (ctx)
49
+
50
+ #define S(N, r) N+BF_FRAME(ctx,r,4)
51
+ #ifdef DUMBAS
52
+ #define P(N) 0x1000+N+N+N+N+BF_FRAME(ctx)
53
+ #else
54
+ #define P(N) 0x1000+4*N+BF_FRAME(ctx)
55
+ #endif
56
+
57
+ /*
58
+ * This version of the assembly code is optimized primarily for the original
59
+ * Intel Pentium but is also careful to avoid partial register stalls on the
60
+ * Pentium Pro family of processors (tested up to Pentium III Coppermine).
61
+ *
62
+ * It is possible to do 15% faster on the Pentium Pro family and probably on
63
+ * many non-Intel x86 processors, but, unfortunately, that would make things
64
+ * twice slower for the original Pentium.
65
+ *
66
+ * An additional 2% speedup may be achieved with non-reentrant code.
67
+ */
68
+
69
+ #define L %esi
70
+ #define R %edi
71
+ #define tmp1 %eax
72
+ #define tmp1_lo %al
73
+ #define tmp2 %ecx
74
+ #define tmp2_hi %ch
75
+ #define tmp3 %edx
76
+ #define tmp3_lo %dl
77
+ #define tmp4 %ebx
78
+ #define tmp4_hi %bh
79
+ #define tmp5 %ebp
80
+
81
+ .text
82
+
83
+ #define BF_ROUND(L, R, N) \
84
+ xorl L,tmp2; \
85
+ xorl tmp1,tmp1; \
86
+ movl tmp2,L; \
87
+ shrl $16,tmp2; \
88
+ movl L,tmp4; \
89
+ movb tmp2_hi,tmp1_lo; \
90
+ andl $0xFF,tmp2; \
91
+ movb tmp4_hi,tmp3_lo; \
92
+ andl $0xFF,tmp4; \
93
+ movl S(0,tmp1),tmp1; \
94
+ movl S(0x400,tmp2),tmp5; \
95
+ addl tmp5,tmp1; \
96
+ movl S(0x800,tmp3),tmp5; \
97
+ xorl tmp5,tmp1; \
98
+ movl S(0xC00,tmp4),tmp5; \
99
+ addl tmp1,tmp5; \
100
+ movl 4+P(N),tmp2; \
101
+ xorl tmp5,R
102
+
103
+ #define BF_ENCRYPT_START \
104
+ BF_ROUND(L, R, 0); \
105
+ BF_ROUND(R, L, 1); \
106
+ BF_ROUND(L, R, 2); \
107
+ BF_ROUND(R, L, 3); \
108
+ BF_ROUND(L, R, 4); \
109
+ BF_ROUND(R, L, 5); \
110
+ BF_ROUND(L, R, 6); \
111
+ BF_ROUND(R, L, 7); \
112
+ BF_ROUND(L, R, 8); \
113
+ BF_ROUND(R, L, 9); \
114
+ BF_ROUND(L, R, 10); \
115
+ BF_ROUND(R, L, 11); \
116
+ BF_ROUND(L, R, 12); \
117
+ BF_ROUND(R, L, 13); \
118
+ BF_ROUND(L, R, 14); \
119
+ BF_ROUND(R, L, 15); \
120
+ movl BF_ptr,tmp5; \
121
+ xorl L,tmp2; \
122
+ movl P(17),L
123
+
124
+ #define BF_ENCRYPT_END \
125
+ xorl R,L; \
126
+ movl tmp2,R
127
+
128
+ DO_ALIGN(5)
129
+ .globl _BF_body_r
130
+ _BF_body_r:
131
+ movl 4(%esp),%eax
132
+ pushl %ebp
133
+ pushl %ebx
134
+ pushl %esi
135
+ pushl %edi
136
+ subl $BF_FRAME-8,%eax
137
+ xorl L,L
138
+ cmpl %esp,%eax
139
+ ja BF_die
140
+ xchgl %eax,%esp
141
+ xorl R,R
142
+ pushl %eax
143
+ leal 0x1000+BF_FRAME-4(ctx),%eax
144
+ movl 0x1000+BF_FRAME-4(ctx),tmp2
145
+ pushl %eax
146
+ xorl tmp3,tmp3
147
+ BF_loop_P:
148
+ BF_ENCRYPT_START
149
+ addl $8,tmp5
150
+ BF_ENCRYPT_END
151
+ leal 0x1000+18*4+BF_FRAME(ctx),tmp1
152
+ movl tmp5,BF_ptr
153
+ cmpl tmp5,tmp1
154
+ movl L,-8(tmp5)
155
+ movl R,-4(tmp5)
156
+ movl P(0),tmp2
157
+ ja BF_loop_P
158
+ leal BF_FRAME(ctx),tmp5
159
+ xorl tmp3,tmp3
160
+ movl tmp5,BF_ptr
161
+ BF_loop_S:
162
+ BF_ENCRYPT_START
163
+ BF_ENCRYPT_END
164
+ movl P(0),tmp2
165
+ movl L,(tmp5)
166
+ movl R,4(tmp5)
167
+ BF_ENCRYPT_START
168
+ BF_ENCRYPT_END
169
+ movl P(0),tmp2
170
+ movl L,8(tmp5)
171
+ movl R,12(tmp5)
172
+ BF_ENCRYPT_START
173
+ BF_ENCRYPT_END
174
+ movl P(0),tmp2
175
+ movl L,16(tmp5)
176
+ movl R,20(tmp5)
177
+ BF_ENCRYPT_START
178
+ addl $32,tmp5
179
+ BF_ENCRYPT_END
180
+ leal 0x1000+BF_FRAME(ctx),tmp1
181
+ movl tmp5,BF_ptr
182
+ cmpl tmp5,tmp1
183
+ movl P(0),tmp2
184
+ movl L,-8(tmp5)
185
+ movl R,-4(tmp5)
186
+ ja BF_loop_S
187
+ movl 4(%esp),%esp
188
+ popl %edi
189
+ popl %esi
190
+ popl %ebx
191
+ popl %ebp
192
+ ret
193
+
194
+ BF_die:
195
+ /* Oops, need to re-compile with a larger BF_FRAME. */
196
+ hlt
197
+ jmp BF_die
198
+
199
+ #endif
200
+
201
+ #if defined(__ELF__) && defined(__linux__)
202
+ .section .note.GNU-stack,"",%progbits
203
+ #endif
data/lib/bcrypt/engine.rb CHANGED
@@ -2,9 +2,19 @@ module BCrypt
2
2
  # A Ruby wrapper for the bcrypt() C extension calls and the Java calls.
3
3
  class Engine
4
4
  # The default computational expense parameter.
5
- DEFAULT_COST = 10
5
+ DEFAULT_COST = 12
6
6
  # The minimum cost supported by the algorithm.
7
7
  MIN_COST = 4
8
+ # The maximum cost supported by the algorithm.
9
+ MAX_COST = 31
10
+ # Maximum possible size of bcrypt() secrets.
11
+ # Older versions of the bcrypt library would truncate passwords longer
12
+ # than 72 bytes, but newer ones do not. We truncate like the old library for
13
+ # forward compatibility. This way users upgrading from Ubuntu 18.04 to 20.04
14
+ # will not have their user passwords invalidated, for example.
15
+ # A max secret length greater than 255 leads to bcrypt returning nil.
16
+ # https://github.com/bcrypt-ruby/bcrypt-ruby/issues/225#issuecomment-875908425
17
+ MAX_SECRET_BYTESIZE = 72
8
18
  # Maximum possible size of bcrypt() salts.
9
19
  MAX_SALT_LENGTH = 16
10
20
 
@@ -28,8 +38,8 @@ module BCrypt
28
38
  #
29
39
  # Example:
30
40
  #
31
- # BCrypt::Engine::DEFAULT_COST #=> 10
32
- # BCrypt::Password.create('secret').cost #=> 10
41
+ # BCrypt::Engine::DEFAULT_COST #=> 12
42
+ # BCrypt::Password.create('secret').cost #=> 12
33
43
  #
34
44
  # BCrypt::Engine.cost = 8
35
45
  # BCrypt::Password.create('secret').cost #=> 8
@@ -41,14 +51,23 @@ module BCrypt
41
51
  end
42
52
 
43
53
  # Given a secret and a valid salt (see BCrypt::Engine.generate_salt) calculates
44
- # a bcrypt() password hash.
54
+ # a bcrypt() password hash. Secrets longer than 72 bytes are truncated.
45
55
  def self.hash_secret(secret, salt, _ = nil)
56
+ unless _.nil?
57
+ warn "[DEPRECATION] Passing the third argument to " \
58
+ "`BCrypt::Engine.hash_secret` is deprecated. " \
59
+ "Please do not pass the third argument which " \
60
+ "is currently not used."
61
+ end
62
+
46
63
  if valid_secret?(secret)
47
64
  if valid_salt?(salt)
48
65
  if RUBY_PLATFORM == "java"
49
- Java.bcrypt_jruby.BCrypt.hashpw(secret.to_s, salt.to_s)
66
+ Java.bcrypt_jruby.BCrypt.hashpw(secret.to_s.to_java_bytes, salt.to_s)
50
67
  else
51
- __bc_crypt(secret.to_s, salt)
68
+ secret = secret.to_s
69
+ secret = secret.byteslice(0, MAX_SECRET_BYTESIZE) if secret && secret.bytesize > MAX_SECRET_BYTESIZE
70
+ __bc_crypt(secret, salt)
52
71
  end
53
72
  else
54
73
  raise Errors::InvalidSalt.new("invalid salt")
@@ -68,8 +87,7 @@ module BCrypt
68
87
  if RUBY_PLATFORM == "java"
69
88
  Java.bcrypt_jruby.BCrypt.gensalt(cost)
70
89
  else
71
- prefix = "$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW"
72
- __bc_salt(prefix, cost, OpenSSL::Random.random_bytes(MAX_SALT_LENGTH))
90
+ __bc_salt("$2a$", cost, OpenSSL::Random.random_bytes(MAX_SALT_LENGTH))
73
91
  end
74
92
  else
75
93
  raise Errors::InvalidCost.new("cost must be numeric and > 0")
@@ -78,7 +96,7 @@ module BCrypt
78
96
 
79
97
  # Returns true if +salt+ is a valid bcrypt() salt, false if not.
80
98
  def self.valid_salt?(salt)
81
- !!(salt =~ /^\$[0-9a-z]{2,}\$[0-9]{2,}\$[A-Za-z0-9\.\/]{22,}$/)
99
+ !!(salt =~ /\A\$[0-9a-z]{2,}\$[0-9]{2,}\$[A-Za-z0-9\.\/]{22,}\z/)
82
100
  end
83
101
 
84
102
  # Returns true if +secret+ is a valid bcrypt() secret, false if not.
@@ -99,7 +117,7 @@ module BCrypt
99
117
  # # should take less than 1000ms
100
118
  # BCrypt::Password.create("woo", :cost => 12)
101
119
  def self.calibrate(upper_time_limit_in_ms)
102
- 40.times do |i|
120
+ (BCrypt::Engine::MIN_COST..BCrypt::Engine::MAX_COST-1).each do |i|
103
121
  start_time = Time.now
104
122
  Password.create("testing testing", :cost => i+1)
105
123
  end_time = Time.now - start_time
@@ -7,7 +7,7 @@ module BCrypt
7
7
  #
8
8
  # # hash a user's password
9
9
  # @password = Password.create("my grand secret")
10
- # @password #=> "$2a$10$GtKs1Kbsig8ULHZzO1h2TetZfhO4Fmlxphp8bVKnUlZCBYYClPohG"
10
+ # @password #=> "$2a$12$C5.FIvVDS9W4AYZ/Ib37YuWd/7ozp1UaMhU28UKrfSxp2oDchbi3K"
11
11
  #
12
12
  # # store it safely
13
13
  # @user.update_attribute(:password, @password)
@@ -42,12 +42,12 @@ module BCrypt
42
42
  # @password = BCrypt::Password.create("my secret", :cost => 13)
43
43
  def create(secret, options = {})
44
44
  cost = options[:cost] || BCrypt::Engine.cost
45
- raise ArgumentError if cost > 31
45
+ raise ArgumentError if cost > BCrypt::Engine::MAX_COST
46
46
  Password.new(BCrypt::Engine.hash_secret(secret, BCrypt::Engine.generate_salt(cost)))
47
47
  end
48
48
 
49
49
  def valid_hash?(h)
50
- h =~ /^\$[0-9a-z]{2}\$[0-9]{2}\$[A-Za-z0-9\.\/]{53}$/
50
+ /\A\$[0-9a-z]{2}\$[0-9]{2}\$[A-Za-z0-9\.\/]{53}\z/ === h
51
51
  end
52
52
  end
53
53
 
@@ -62,6 +62,17 @@ module BCrypt
62
62
  end
63
63
 
64
64
  # Compares a potential secret against the hash. Returns true if the secret is the original secret, false otherwise.
65
+ #
66
+ # Comparison edge case/gotcha:
67
+ #
68
+ # secret = "my secret"
69
+ # @password = BCrypt::Password.create(secret)
70
+ #
71
+ # @password == secret # => True
72
+ # @password == @password # => False
73
+ # @password == @password.to_s # => False
74
+ # @password.to_s == @password # => True
75
+ # @password.to_s == @password.to_s # => True
65
76
  def ==(secret)
66
77
  super(BCrypt::Engine.hash_secret(secret, @salt))
67
78
  end
@@ -80,8 +91,7 @@ module BCrypt
80
91
  # Splits +h+ into version, cost, salt, and hash and returns them in that order.
81
92
  def split_hash(h)
82
93
  _, v, c, mash = h.split('$')
83
- return v, c.to_i, h[0, 29].to_str, mash[-31, 31].to_str
94
+ return v.to_str, c.to_i, h[0, 29].to_str, mash[-31, 31].to_str
84
95
  end
85
96
  end
86
-
87
97
  end
data/lib/bcrypt.rb CHANGED
@@ -9,12 +9,7 @@ else
9
9
  require "openssl"
10
10
  end
11
11
 
12
- begin
13
- RUBY_VERSION =~ /(\d+.\d+)/
14
- require "#{$1}/bcrypt_ext"
15
- rescue LoadError
16
- require "bcrypt_ext"
17
- end
12
+ require "bcrypt_ext"
18
13
 
19
14
  require 'bcrypt/error'
20
15
  require 'bcrypt/engine'
metadata CHANGED
@@ -1,54 +1,52 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: bcrypt
3
- version: !ruby/object:Gem::Version
4
- version: 3.1.7
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.1.20
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Coda Hale
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2014-02-25 00:00:00 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
11
+ date: 2023-11-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
15
14
  name: rake-compiler
16
- prerelease: false
17
- requirement: &id001 !ruby/object:Gem::Requirement
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 0.9.2
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
22
20
  type: :development
23
- version_requirements: *id001
24
- - !ruby/object:Gem::Dependency
25
- name: rspec
26
21
  prerelease: false
27
- requirement: &id002 !ruby/object:Gem::Requirement
28
- requirements:
29
- - &id004
30
- - ">="
31
- - !ruby/object:Gem::Version
32
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3'
33
34
  type: :development
34
- version_requirements: *id002
35
- - !ruby/object:Gem::Dependency
36
- name: rdoc
37
35
  prerelease: false
38
- requirement: &id003 !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ~>
41
- - !ruby/object:Gem::Version
42
- version: "3.12"
43
- type: :development
44
- version_requirements: *id003
45
- description: " bcrypt() is a sophisticated and secure hash algorithm designed by The OpenBSD project\n for hashing passwords. The bcrypt Ruby gem provides a simple wrapper for safely handling\n passwords.\n"
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3'
41
+ description: |2
42
+ bcrypt() is a sophisticated and secure hash algorithm designed by The OpenBSD project
43
+ for hashing passwords. The bcrypt Ruby gem provides a simple wrapper for safely handling
44
+ passwords.
46
45
  email: coda.hale@gmail.com
47
46
  executables: []
48
-
49
- extensions:
47
+ extensions:
50
48
  - ext/mri/extconf.rb
51
- extra_rdoc_files:
49
+ extra_rdoc_files:
52
50
  - README.md
53
51
  - COPYING
54
52
  - CHANGELOG
@@ -56,62 +54,53 @@ extra_rdoc_files:
56
54
  - lib/bcrypt/error.rb
57
55
  - lib/bcrypt/password.rb
58
56
  - lib/bcrypt.rb
59
- files:
60
- - .gitignore
61
- - .rspec
62
- - .travis.yml
57
+ files:
63
58
  - CHANGELOG
64
59
  - COPYING
65
- - Gemfile
66
- - Gemfile.lock
67
60
  - README.md
68
- - Rakefile
69
- - bcrypt.gemspec
70
61
  - ext/jruby/bcrypt_jruby/BCrypt.java
71
62
  - ext/mri/bcrypt_ext.c
72
63
  - ext/mri/crypt.c
73
64
  - ext/mri/crypt.h
74
65
  - ext/mri/crypt_blowfish.c
66
+ - ext/mri/crypt_blowfish.h
75
67
  - ext/mri/crypt_gensalt.c
68
+ - ext/mri/crypt_gensalt.h
76
69
  - ext/mri/extconf.rb
77
70
  - ext/mri/ow-crypt.h
78
71
  - ext/mri/wrapper.c
72
+ - ext/mri/x86.S
79
73
  - lib/bcrypt.rb
80
74
  - lib/bcrypt/engine.rb
81
75
  - lib/bcrypt/error.rb
82
76
  - lib/bcrypt/password.rb
83
- - spec/TestBCrypt.java
84
- - spec/bcrypt/engine_spec.rb
85
- - spec/bcrypt/error_spec.rb
86
- - spec/bcrypt/password_spec.rb
87
- - spec/spec_helper.rb
88
- homepage: https://github.com/codahale/bcrypt-ruby
89
- licenses:
77
+ homepage: https://github.com/bcrypt-ruby/bcrypt-ruby
78
+ licenses:
90
79
  - MIT
91
80
  metadata: {}
92
-
93
- post_install_message:
94
- rdoc_options:
95
- - --title
81
+ post_install_message:
82
+ rdoc_options:
83
+ - "--title"
96
84
  - bcrypt-ruby
97
- - --line-numbers
98
- - --inline-source
99
- - --main
85
+ - "--line-numbers"
86
+ - "--inline-source"
87
+ - "--main"
100
88
  - README.md
101
- require_paths:
89
+ require_paths:
102
90
  - lib
103
- required_ruby_version: !ruby/object:Gem::Requirement
104
- requirements:
105
- - *id004
106
- required_rubygems_version: !ruby/object:Gem::Requirement
107
- requirements:
108
- - *id004
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
109
101
  requirements: []
110
-
111
- rubyforge_project:
112
- rubygems_version: 2.0.14
113
- signing_key:
102
+ rubygems_version: 3.4.10
103
+ signing_key:
114
104
  specification_version: 4
115
105
  summary: OpenBSD's bcrypt() password hashing algorithm.
116
106
  test_files: []
117
-
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- *.o
2
- *.bundle
3
- *.so
4
- *.jar
5
- ext/mri/Makefile
6
- doc
7
- pkg
8
- *.class
9
- tmp/
10
- .DS_Store
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --backtrace
3
- --format documentation
data/.travis.yml DELETED
@@ -1,15 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.8.7
4
- - 1.9.2
5
- - 1.9.3
6
- - 2.0.0
7
- - 2.1.0
8
- - ruby-head
9
- - jruby-18mode
10
- - jruby-19mode
11
- - jruby-head
12
- - rbx-2
13
- - rbx
14
- - ree
15
- script: bundle exec rake
data/Gemfile DELETED
@@ -1,2 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
data/Gemfile.lock DELETED
@@ -1,36 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- bcrypt (3.1.7)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- diff-lcs (1.2.5)
10
- json (1.8.1)
11
- json (1.8.1-java)
12
- rake (10.1.0)
13
- rake-compiler (0.9.2)
14
- rake
15
- rdoc (3.12.2)
16
- json (~> 1.4)
17
- rspec (2.14.1)
18
- rspec-core (~> 2.14.0)
19
- rspec-expectations (~> 2.14.0)
20
- rspec-mocks (~> 2.14.0)
21
- rspec-core (2.14.7)
22
- rspec-expectations (2.14.4)
23
- diff-lcs (>= 1.1.3, < 2.0)
24
- rspec-mocks (2.14.4)
25
-
26
- PLATFORMS
27
- java
28
- ruby
29
- x64-mingw32
30
- x86-mingw32
31
-
32
- DEPENDENCIES
33
- bcrypt!
34
- rake-compiler (~> 0.9.2)
35
- rdoc (~> 3.12)
36
- rspec
data/Rakefile DELETED
@@ -1,73 +0,0 @@
1
- require 'rspec/core/rake_task'
2
- require 'rubygems/package_task'
3
- require 'rake/extensiontask'
4
- require 'rake/javaextensiontask'
5
- require 'rake/clean'
6
- require 'rdoc/task'
7
- require 'benchmark'
8
-
9
- CLEAN.include(
10
- "ext/mri/*.o",
11
- "ext/mri/*.bundle",
12
- "ext/mri/*.so",
13
- "ext/jruby/bcrypt_jruby/*.class"
14
- )
15
- CLOBBER.include(
16
- "ext/mri/Makefile",
17
- "doc/coverage",
18
- "pkg"
19
- )
20
- GEMSPEC = Gem::Specification.load("bcrypt.gemspec")
21
-
22
- task :default => [:compile, :spec]
23
-
24
- desc "Run all specs"
25
- RSpec::Core::RakeTask.new do |t|
26
- t.pattern = 'spec/**/*_spec.rb'
27
- t.ruby_opts = '-w'
28
- end
29
-
30
- desc "Run all specs, with coverage testing"
31
- RSpec::Core::RakeTask.new(:rcov) do |t|
32
- t.pattern = 'spec/**/*_spec.rb'
33
- t.rcov = true
34
- t.rcov_path = 'doc/coverage'
35
- t.rcov_opts = ['--exclude', 'rspec,diff-lcs,rcov,_spec,_helper']
36
- end
37
-
38
- desc 'Generate RDoc'
39
- RDoc::Task.new do |rdoc|
40
- rdoc.rdoc_dir = 'doc/rdoc'
41
- rdoc.options += GEMSPEC.rdoc_options
42
- rdoc.template = ENV['TEMPLATE'] if ENV['TEMPLATE']
43
- rdoc.rdoc_files.include(*GEMSPEC.extra_rdoc_files)
44
- end
45
-
46
- Gem::PackageTask.new(GEMSPEC) do |pkg|
47
- pkg.need_zip = true
48
- pkg.need_tar = true
49
- end
50
-
51
- if RUBY_PLATFORM =~ /java/
52
- Rake::JavaExtensionTask.new('bcrypt_ext', GEMSPEC) do |ext|
53
- ext.ext_dir = 'ext/jruby'
54
- end
55
- else
56
- Rake::ExtensionTask.new("bcrypt_ext", GEMSPEC) do |ext|
57
- ext.ext_dir = 'ext/mri'
58
- ext.cross_compile = true
59
- ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
60
- end
61
- end
62
-
63
- desc "Run a set of benchmarks on the compiled extension."
64
- task :benchmark do
65
- TESTS = 100
66
- TEST_PWD = "this is a test"
67
- require File.expand_path(File.join(File.dirname(__FILE__), "lib", "bcrypt"))
68
- Benchmark.bmbm do |results|
69
- 4.upto(10) do |n|
70
- results.report("cost #{n}:") { TESTS.times { BCrypt::Password.create(TEST_PWD, :cost => n) } }
71
- end
72
- end
73
- end