scrypt 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scrypt (1.0.3)
4
+ scrypt (1.0.4)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ scrypt
2
+ ======
3
+
4
+ The scrypt key derivation function is designed to be far more secure against hardware brute-force attacks than alternative functions such as PBKDF2 or bcrypt.
5
+
6
+ * http://www.tarsnap.com/scrypt.html
7
+ * http://github.com/pbhogan/scrypt
8
+
9
+ ## Why you should use scrypt
10
+
11
+ ![KDF comparison](https://github.com/tarcieri/scrypt/raw/modern-readme/kdf-comparison.png)
12
+
13
+ The designers of scrypt estimate that on modern (2009) hardware, if 5 seconds are spent computing a derived key, the cost of a hardware brute-force attack against scrypt is roughly 4000 times greater than the cost of a similar attack against bcrypt (to find the same password), and 20000 times greater than a similar attack against PBKDF2.
14
+
15
+ ## How to install scrypt
16
+
17
+ ```
18
+ gem install scrypt
19
+ ```
20
+
21
+ ## How to use scrypt
22
+
23
+ It works pretty similarly to ruby-bcrypt with a few minor differences, especially where the cost factor is concerned.
24
+
25
+ ```ruby
26
+ include "scrypt"
27
+
28
+ # hash a user's password
29
+ @password = Password.create("my grand secret")
30
+ @password #=> "2000$8$1$f5f2fa5fe5484a7091f1299768fbe92b5a7fbc77$6a385f22c54d92c314b71a4fd5ef33967c93d679"
31
+
32
+ # store it safely
33
+ @user.update_attribute(:password, @password)
34
+
35
+ # read it back
36
+ @user.reload!
37
+ @db_password = Password.new(@user.password)
38
+
39
+ # compare it after retrieval
40
+ @db_password == "my grand secret" #=> true
41
+ @db_password == "a paltry guess" #=> false
42
+ ```
43
+
44
+ Password.create takes three options which will determine the cost limits of the computation:
45
+
46
+ * `:max_time` specifies the maximum number of seconds the computation should take.
47
+ * `:max_mem` specifies the maximum number of bytes the computation should take. A value of 0 specifies no upper limit. The minimum is always 1 MB.
48
+ * `:max_memfrac` specifies the maximum memory in a fraction of available resources to use. Any value equal to 0 or greater than 0.5 will result in 0.5 being used.
49
+
50
+ Default options will result in calculation time of approx. 200 ms with 1 MB memory use.
data/ext/mri/Makefile CHANGED
@@ -1,70 +1,97 @@
1
1
 
2
2
  SHELL = /bin/sh
3
3
 
4
+ # V=0 quiet, V=1 verbose. other values don't work.
5
+ V = 0
6
+ Q1 = $(V:1=)
7
+ Q = $(Q1:0=@)
8
+ n=$(NULLCMD)
9
+ ECHO1 = $(V:1=@$n)
10
+ ECHO = $(ECHO1:0=@echo)
11
+
4
12
  #### Start of system configuration section. ####
5
13
 
6
14
  srcdir = .
7
- topdir = /Users/pbhogan/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/i686-darwin10.4.0
8
- hdrdir = $(topdir)
9
- VPATH = $(srcdir):$(topdir):$(hdrdir)
15
+ topdir = /Volumes/Secondary/Users/pbhogan/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1
16
+ hdrdir = /Volumes/Secondary/Users/pbhogan/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1
17
+ arch_hdrdir = /Volumes/Secondary/Users/pbhogan/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/$(arch)
18
+ VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
19
+ prefix = $(DESTDIR)/Volumes/Secondary/Users/pbhogan/.rvm/rubies/ruby-1.9.3-p125
20
+ rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
10
21
  exec_prefix = $(prefix)
11
- prefix = $(DESTDIR)/Users/pbhogan/.rvm/rubies/ree-1.8.7-2010.02
12
- sharedstatedir = $(prefix)/com
22
+ vendorhdrdir = $(rubyhdrdir)/vendor_ruby
23
+ sitehdrdir = $(rubyhdrdir)/site_ruby
24
+ rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
25
+ vendordir = $(rubylibprefix)/vendor_ruby
26
+ sitedir = $(rubylibprefix)/site_ruby
27
+ ridir = $(datarootdir)/$(RI_BASE_NAME)
13
28
  mandir = $(datarootdir)/man
14
- psdir = $(docdir)
15
- oldincludedir = $(DESTDIR)/usr/include
16
29
  localedir = $(datarootdir)/locale
17
- bindir = $(exec_prefix)/bin
18
- libexecdir = $(exec_prefix)/libexec
19
- sitedir = $(libdir)/ruby/site_ruby
30
+ libdir = $(exec_prefix)/lib
31
+ psdir = $(docdir)
32
+ pdfdir = $(docdir)
33
+ dvidir = $(docdir)
20
34
  htmldir = $(docdir)
21
- vendorarchdir = $(vendorlibdir)/$(sitearch)
22
- includedir = $(prefix)/include
23
35
  infodir = $(datarootdir)/info
24
- vendorlibdir = $(vendordir)/$(ruby_version)
25
- sysconfdir = $(prefix)/etc
26
- libdir = $(exec_prefix)/lib
27
- sbindir = $(exec_prefix)/sbin
28
- rubylibdir = $(libdir)/ruby/$(ruby_version)
29
36
  docdir = $(datarootdir)/doc/$(PACKAGE)
30
- dvidir = $(docdir)
31
- vendordir = $(libdir)/ruby/vendor_ruby
37
+ oldincludedir = $(DESTDIR)/usr/include
38
+ includedir = $(prefix)/include
39
+ localstatedir = $(prefix)/var
40
+ sharedstatedir = $(prefix)/com
41
+ sysconfdir = $(prefix)/etc
42
+ datadir = $(datarootdir)
32
43
  datarootdir = $(prefix)/share
33
- pdfdir = $(docdir)
44
+ libexecdir = $(exec_prefix)/libexec
45
+ sbindir = $(exec_prefix)/sbin
46
+ bindir = $(exec_prefix)/bin
47
+ rubylibdir = $(rubylibprefix)/$(ruby_version)
34
48
  archdir = $(rubylibdir)/$(arch)
35
- sitearchdir = $(sitelibdir)/$(sitearch)
36
- datadir = $(datarootdir)
37
- localstatedir = $(prefix)/var
38
49
  sitelibdir = $(sitedir)/$(ruby_version)
50
+ sitearchdir = $(sitelibdir)/$(sitearch)
51
+ vendorlibdir = $(vendordir)/$(ruby_version)
52
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
53
+
54
+ NULLCMD = :
39
55
 
40
- CC = gcc -Wall
41
- LIBRUBY = $(LIBRUBY_A)
56
+ CC = /usr/bin/gcc-4.2 -Wall
57
+ CXX = g++-4.2
58
+ LIBRUBY = $(LIBRUBY_SO)
42
59
  LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
43
- LIBRUBYARG_SHARED =
60
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
44
61
  LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
62
+ OUTFLAG = -o
63
+ COUTFLAG = -o
45
64
 
46
65
  RUBY_EXTCONF_H =
47
- CFLAGS = -fno-common -g -O2 -pipe -fno-common $(cflags)
48
- INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
66
+ cflags = $(optflags) $(debugflags) $(warnflags)
67
+ optflags = -O3
68
+ debugflags = -g
69
+ warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration
70
+ CFLAGS = -fno-common $(cflags) -fno-common -pipe $(ARCH_FLAG)
71
+ INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
49
72
  DEFS =
50
- CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
51
- CXXFLAGS = $(CFLAGS)
52
- ldflags = -L.
53
- dldflags =
54
- archflag =
55
- DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
56
- LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
73
+ CPPFLAGS = -I/Volumes/Secondary/Users/pbhogan/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
74
+ CXXFLAGS = $(CFLAGS) $(cxxflags)
75
+ ldflags = -L. -L/usr/local/lib
76
+ dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace
77
+ ARCH_FLAG =
78
+ DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
79
+ LDSHARED = $(CC) -dynamic -bundle
80
+ LDSHAREDXX = $(CXX) -dynamic -bundle
57
81
  AR = ar
58
82
  EXEEXT =
59
83
 
84
+ RUBY_BASE_NAME = ruby
60
85
  RUBY_INSTALL_NAME = ruby
61
- RUBY_SO_NAME = ruby
62
- arch = i686-darwin10.4.0
63
- sitearch = i686-darwin10.4.0
64
- ruby_version = 1.8
65
- ruby = /Users/pbhogan/.rvm/rubies/ree-1.8.7-2010.02/bin/ruby
86
+ RUBY_SO_NAME = ruby.1.9.1
87
+ arch = x86_64-darwin11.3.0
88
+ sitearch = $(arch)
89
+ ruby_version = 1.9.1
90
+ ruby = /Volumes/Secondary/Users/pbhogan/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
66
91
  RUBY = $(ruby)
67
92
  RM = rm -f
93
+ RM_RF = $(RUBY) -run -e rm -- -rf
94
+ RMDIRS = rmdir -p
68
95
  MAKEDIRS = mkdir -p
69
96
  INSTALL = /usr/bin/install -c
70
97
  INSTALL_PROG = $(INSTALL) -m 0755
@@ -75,18 +102,19 @@ COPY = cp
75
102
 
76
103
  preload =
77
104
 
78
- libpath = . $(libdir)
79
- LIBPATH = -L. -L$(libdir)
105
+ libpath = . $(libdir) /Volumes/Secondary/Users/pbhogan/.rvm/usr/lib
106
+ LIBPATH = -L. -L$(libdir) -L/Volumes/Secondary/Users/pbhogan/.rvm/usr/lib
80
107
  DEFFILE =
81
108
 
82
109
  CLEANFILES = mkmf.log
83
110
  DISTCLEANFILES =
111
+ DISTCLEANDIRS =
84
112
 
85
113
  extout =
86
114
  extout_prefix =
87
115
  target_prefix =
88
116
  LOCAL_LIBS =
89
- LIBS = -ldl -lobjc
117
+ LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc
90
118
  SRCS = crypto_scrypt-ref.c memlimit.c scrypt_calibrate.c scrypt_ext.c scryptenc_cpuperf.c sha256.c
91
119
  OBJS = crypto_scrypt-ref.o memlimit.o scrypt_calibrate.o scrypt_ext.o scryptenc_cpuperf.o sha256.o
92
120
  TARGET = scrypt_ext
@@ -98,60 +126,88 @@ BINDIR = $(bindir)
98
126
  RUBYCOMMONDIR = $(sitedir)$(target_prefix)
99
127
  RUBYLIBDIR = $(sitelibdir)$(target_prefix)
100
128
  RUBYARCHDIR = $(sitearchdir)$(target_prefix)
129
+ HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
130
+ ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
101
131
 
102
132
  TARGET_SO = $(DLLIB)
103
- CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
104
- CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
105
-
106
- all: $(DLLIB)
107
- static: $(STATIC_LIB)
108
-
109
- clean:
133
+ CLEANLIBS = $(TARGET).bundle
134
+ CLEANOBJS = *.o *.bak
135
+
136
+ all: $(DLLIB)
137
+ static: $(STATIC_LIB)
138
+ .PHONY: all install static install-so install-rb
139
+ .PHONY: clean clean-so clean-rb
140
+
141
+ clean-rb-default::
142
+ clean-rb::
143
+ clean-so::
144
+ clean: clean-so clean-rb-default clean-rb
110
145
  @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
111
146
 
112
- distclean: clean
147
+ distclean-rb-default::
148
+ distclean-rb::
149
+ distclean-so::
150
+ distclean: clean distclean-so distclean-rb-default distclean-rb
113
151
  @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
114
152
  @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
153
+ @-$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
115
154
 
116
- realclean: distclean
155
+ realclean: distclean
117
156
  install: install-so install-rb
118
157
 
119
158
  install-so: $(RUBYARCHDIR)
120
159
  install-so: $(RUBYARCHDIR)/$(DLLIB)
121
160
  $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
122
- $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
161
+ @-$(MAKEDIRS) $(@D)
162
+ $(INSTALL_PROG) $(DLLIB) $(@D)
123
163
  install-rb: pre-install-rb install-rb-default
124
164
  install-rb-default: pre-install-rb-default
125
165
  pre-install-rb: Makefile
126
166
  pre-install-rb-default: Makefile
167
+ pre-install-rb-default:
168
+ $(ECHO) installing default scrypt_ext libraries
127
169
  $(RUBYARCHDIR):
128
- $(MAKEDIRS) $@
170
+ $(Q) $(MAKEDIRS) $@
129
171
 
130
172
  site-install: site-install-so site-install-rb
131
173
  site-install-so: install-so
132
174
  site-install-rb: install-rb
133
175
 
134
- .SUFFIXES: .c .m .cc .cxx .cpp .C .o
176
+ .SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o
135
177
 
136
178
  .cc.o:
137
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
179
+ $(ECHO) compiling $(<)
180
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
181
+
182
+ .mm.o:
183
+ $(ECHO) compiling $(<)
184
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
138
185
 
139
186
  .cxx.o:
140
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
187
+ $(ECHO) compiling $(<)
188
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
141
189
 
142
190
  .cpp.o:
143
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
191
+ $(ECHO) compiling $(<)
192
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
144
193
 
145
194
  .C.o:
146
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
195
+ $(ECHO) compiling $(<)
196
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
147
197
 
148
198
  .c.o:
149
- $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
199
+ $(ECHO) compiling $(<)
200
+ $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
201
+
202
+ .m.o:
203
+ $(ECHO) compiling $(<)
204
+ $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
150
205
 
151
206
  $(DLLIB): $(OBJS) Makefile
152
- @-$(RM) $@
153
- $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
207
+ $(ECHO) linking shared-object $(DLLIB)
208
+ @-$(RM) $(@)
209
+ $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
154
210
 
155
211
 
156
212
 
157
- $(OBJS): ruby.h defines.h
213
+ $(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h
@@ -255,7 +255,7 @@ crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
255
255
  goto err2;
256
256
 
257
257
  /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */
258
- PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r);
258
+ PBKDF2_scrypt_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r);
259
259
 
260
260
  /* 2: for i = 0 to p - 1 do */
261
261
  for (i = 0; i < p; i++) {
@@ -264,7 +264,7 @@ crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
264
264
  }
265
265
 
266
266
  /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
267
- PBKDF2_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen);
267
+ PBKDF2_scrypt_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen);
268
268
 
269
269
  /* Free memory. */
270
270
  free(V);
data/ext/mri/sha256.c CHANGED
@@ -60,7 +60,7 @@ be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
60
60
  dst[i] = be32dec(src + i * 4);
61
61
  }
62
62
 
63
- /* Elementary functions used by SHA256 */
63
+ /* Elementary functions used by scrypt_SHA256 */
64
64
  #define Ch(x, y, z) ((x & (y ^ z)) ^ z)
65
65
  #define Maj(x, y, z) ((x & (y | z)) | (y & z))
66
66
  #define SHR(x, n) (x >> n)
@@ -70,7 +70,7 @@ be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
70
70
  #define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
71
71
  #define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
72
72
 
73
- /* SHA256 round function */
73
+ /* scrypt_SHA256 round function */
74
74
  #define RND(a, b, c, d, e, f, g, h, k) \
75
75
  t0 = h + S1(e) + Ch(e, f, g) + k; \
76
76
  t1 = S0(a) + Maj(a, b, c); \
@@ -86,11 +86,11 @@ be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
86
86
  W[i] + k)
87
87
 
88
88
  /*
89
- * SHA256 block compression function. The 256-bit state is transformed via
89
+ * scrypt_SHA256 block compression function. The 256-bit state is transformed via
90
90
  * the 512-bit input block to produce a new state.
91
91
  */
92
92
  static void
93
- SHA256_Transform(uint32_t * state, const unsigned char block[64])
93
+ scrypt_SHA256_Transform(uint32_t * state, const unsigned char block[64])
94
94
  {
95
95
  uint32_t W[64];
96
96
  uint32_t S[8];
@@ -190,7 +190,7 @@ static unsigned char PAD[64] = {
190
190
 
191
191
  /* Add padding and terminating bit-count. */
192
192
  static void
193
- SHA256_Pad(SHA256_CTX * ctx)
193
+ scrypt_SHA256_Pad(scrypt_SHA256_CTX * ctx)
194
194
  {
195
195
  unsigned char len[8];
196
196
  uint32_t r, plen;
@@ -204,15 +204,15 @@ SHA256_Pad(SHA256_CTX * ctx)
204
204
  /* Add 1--64 bytes so that the resulting length is 56 mod 64 */
205
205
  r = (ctx->count[1] >> 3) & 0x3f;
206
206
  plen = (r < 56) ? (56 - r) : (120 - r);
207
- SHA256_Update(ctx, PAD, (size_t)plen);
207
+ scrypt_SHA256_Update(ctx, PAD, (size_t)plen);
208
208
 
209
209
  /* Add the terminating bit-count */
210
- SHA256_Update(ctx, len, 8);
210
+ scrypt_SHA256_Update(ctx, len, 8);
211
211
  }
212
212
 
213
213
  /* SHA-256 initialization. Begins a SHA-256 operation. */
214
214
  void
215
- SHA256_Init(SHA256_CTX * ctx)
215
+ scrypt_SHA256_Init(scrypt_SHA256_CTX * ctx)
216
216
  {
217
217
 
218
218
  /* Zero bits processed so far */
@@ -231,7 +231,7 @@ SHA256_Init(SHA256_CTX * ctx)
231
231
 
232
232
  /* Add bytes into the hash */
233
233
  void
234
- SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
234
+ scrypt_SHA256_Update(scrypt_SHA256_CTX * ctx, const void *in, size_t len)
235
235
  {
236
236
  uint32_t bitlen[2];
237
237
  uint32_t r;
@@ -257,13 +257,13 @@ SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
257
257
 
258
258
  /* Finish the current block */
259
259
  memcpy(&ctx->buf[r], src, 64 - r);
260
- SHA256_Transform(ctx->state, ctx->buf);
260
+ scrypt_SHA256_Transform(ctx->state, ctx->buf);
261
261
  src += 64 - r;
262
262
  len -= 64 - r;
263
263
 
264
264
  /* Perform complete blocks */
265
265
  while (len >= 64) {
266
- SHA256_Transform(ctx->state, src);
266
+ scrypt_SHA256_Transform(ctx->state, src);
267
267
  src += 64;
268
268
  len -= 64;
269
269
  }
@@ -277,11 +277,11 @@ SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
277
277
  * and clears the context state.
278
278
  */
279
279
  void
280
- SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
280
+ scrypt_SHA256_Final(unsigned char digest[32], scrypt_SHA256_CTX * ctx)
281
281
  {
282
282
 
283
283
  /* Add padding */
284
- SHA256_Pad(ctx);
284
+ scrypt_SHA256_Pad(ctx);
285
285
 
286
286
  /* Write the hash */
287
287
  be32enc_vect(digest, ctx->state, 32);
@@ -290,80 +290,80 @@ SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
290
290
  memset((void *)ctx, 0, sizeof(*ctx));
291
291
  }
292
292
 
293
- /* Initialize an HMAC-SHA256 operation with the given key. */
293
+ /* Initialize an HMAC-scrypt_SHA256 operation with the given key. */
294
294
  void
295
- HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
295
+ HMAC_scrypt_SHA256_Init(HMAC_scrypt_SHA256_CTX * ctx, const void * _K, size_t Klen)
296
296
  {
297
297
  unsigned char pad[64];
298
298
  unsigned char khash[32];
299
299
  const unsigned char * K = _K;
300
300
  size_t i;
301
301
 
302
- /* If Klen > 64, the key is really SHA256(K). */
302
+ /* If Klen > 64, the key is really scrypt_SHA256(K). */
303
303
  if (Klen > 64) {
304
- SHA256_Init(&ctx->ictx);
305
- SHA256_Update(&ctx->ictx, K, Klen);
306
- SHA256_Final(khash, &ctx->ictx);
304
+ scrypt_SHA256_Init(&ctx->ictx);
305
+ scrypt_SHA256_Update(&ctx->ictx, K, Klen);
306
+ scrypt_SHA256_Final(khash, &ctx->ictx);
307
307
  K = khash;
308
308
  Klen = 32;
309
309
  }
310
310
 
311
- /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
312
- SHA256_Init(&ctx->ictx);
311
+ /* Inner scrypt_SHA256 operation is scrypt_SHA256(K xor [block of 0x36] || data). */
312
+ scrypt_SHA256_Init(&ctx->ictx);
313
313
  memset(pad, 0x36, 64);
314
314
  for (i = 0; i < Klen; i++)
315
315
  pad[i] ^= K[i];
316
- SHA256_Update(&ctx->ictx, pad, 64);
316
+ scrypt_SHA256_Update(&ctx->ictx, pad, 64);
317
317
 
318
- /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
319
- SHA256_Init(&ctx->octx);
318
+ /* Outer scrypt_SHA256 operation is scrypt_SHA256(K xor [block of 0x5c] || hash). */
319
+ scrypt_SHA256_Init(&ctx->octx);
320
320
  memset(pad, 0x5c, 64);
321
321
  for (i = 0; i < Klen; i++)
322
322
  pad[i] ^= K[i];
323
- SHA256_Update(&ctx->octx, pad, 64);
323
+ scrypt_SHA256_Update(&ctx->octx, pad, 64);
324
324
 
325
325
  /* Clean the stack. */
326
326
  memset(khash, 0, 32);
327
327
  }
328
328
 
329
- /* Add bytes to the HMAC-SHA256 operation. */
329
+ /* Add bytes to the HMAC-scrypt_SHA256 operation. */
330
330
  void
331
- HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len)
331
+ HMAC_scrypt_SHA256_Update(HMAC_scrypt_SHA256_CTX * ctx, const void *in, size_t len)
332
332
  {
333
333
 
334
- /* Feed data to the inner SHA256 operation. */
335
- SHA256_Update(&ctx->ictx, in, len);
334
+ /* Feed data to the inner scrypt_SHA256 operation. */
335
+ scrypt_SHA256_Update(&ctx->ictx, in, len);
336
336
  }
337
337
 
338
- /* Finish an HMAC-SHA256 operation. */
338
+ /* Finish an HMAC-scrypt_SHA256 operation. */
339
339
  void
340
- HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx)
340
+ HMAC_scrypt_SHA256_Final(unsigned char digest[32], HMAC_scrypt_SHA256_CTX * ctx)
341
341
  {
342
342
  unsigned char ihash[32];
343
343
 
344
- /* Finish the inner SHA256 operation. */
345
- SHA256_Final(ihash, &ctx->ictx);
344
+ /* Finish the inner scrypt_SHA256 operation. */
345
+ scrypt_SHA256_Final(ihash, &ctx->ictx);
346
346
 
347
- /* Feed the inner hash to the outer SHA256 operation. */
348
- SHA256_Update(&ctx->octx, ihash, 32);
347
+ /* Feed the inner hash to the outer scrypt_SHA256 operation. */
348
+ scrypt_SHA256_Update(&ctx->octx, ihash, 32);
349
349
 
350
- /* Finish the outer SHA256 operation. */
351
- SHA256_Final(digest, &ctx->octx);
350
+ /* Finish the outer scrypt_SHA256 operation. */
351
+ scrypt_SHA256_Final(digest, &ctx->octx);
352
352
 
353
353
  /* Clean the stack. */
354
354
  memset(ihash, 0, 32);
355
355
  }
356
356
 
357
357
  /**
358
- * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
359
- * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
358
+ * PBKDF2_scrypt_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
359
+ * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-scrypt_SHA256 as the PRF, and
360
360
  * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
361
361
  */
362
362
  void
363
- PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
363
+ PBKDF2_scrypt_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
364
364
  size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
365
365
  {
366
- HMAC_SHA256_CTX PShctx, hctx;
366
+ HMAC_scrypt_SHA256_CTX PShctx, hctx;
367
367
  size_t i;
368
368
  uint8_t ivec[4];
369
369
  uint8_t U[32];
@@ -373,8 +373,8 @@ PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
373
373
  size_t clen;
374
374
 
375
375
  /* Compute HMAC state after processing P and S. */
376
- HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
377
- HMAC_SHA256_Update(&PShctx, salt, saltlen);
376
+ HMAC_scrypt_SHA256_Init(&PShctx, passwd, passwdlen);
377
+ HMAC_scrypt_SHA256_Update(&PShctx, salt, saltlen);
378
378
 
379
379
  /* Iterate through the blocks. */
380
380
  for (i = 0; i * 32 < dkLen; i++) {
@@ -382,18 +382,18 @@ PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
382
382
  be32enc(ivec, (uint32_t)(i + 1));
383
383
 
384
384
  /* Compute U_1 = PRF(P, S || INT(i)). */
385
- memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
386
- HMAC_SHA256_Update(&hctx, ivec, 4);
387
- HMAC_SHA256_Final(U, &hctx);
385
+ memcpy(&hctx, &PShctx, sizeof(HMAC_scrypt_SHA256_CTX));
386
+ HMAC_scrypt_SHA256_Update(&hctx, ivec, 4);
387
+ HMAC_scrypt_SHA256_Final(U, &hctx);
388
388
 
389
389
  /* T_i = U_1 ... */
390
390
  memcpy(T, U, 32);
391
391
 
392
392
  for (j = 2; j <= c; j++) {
393
393
  /* Compute U_j. */
394
- HMAC_SHA256_Init(&hctx, passwd, passwdlen);
395
- HMAC_SHA256_Update(&hctx, U, 32);
396
- HMAC_SHA256_Final(U, &hctx);
394
+ HMAC_scrypt_SHA256_Init(&hctx, passwd, passwdlen);
395
+ HMAC_scrypt_SHA256_Update(&hctx, U, 32);
396
+ HMAC_scrypt_SHA256_Final(U, &hctx);
397
397
 
398
398
  /* ... xor U_j ... */
399
399
  for (k = 0; k < 32; k++)
@@ -408,5 +408,5 @@ PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
408
408
  }
409
409
 
410
410
  /* Clean PShctx, since we never called _Final on it. */
411
- memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));
411
+ memset(&PShctx, 0, sizeof(HMAC_scrypt_SHA256_CTX));
412
412
  }
data/ext/mri/sha256.h CHANGED
@@ -26,37 +26,37 @@
26
26
  * $FreeBSD: src/lib/libmd/sha256.h,v 1.2 2006/01/17 15:35:56 phk Exp $
27
27
  */
28
28
 
29
- #ifndef _SHA256_H_
30
- #define _SHA256_H_
29
+ #ifndef _scrypt_SHA256_H_
30
+ #define _scrypt_SHA256_H_
31
31
 
32
32
  #include <sys/types.h>
33
33
 
34
34
  #include <stdint.h>
35
35
 
36
- typedef struct SHA256Context {
36
+ typedef struct scrypt_SHA256Context {
37
37
  uint32_t state[8];
38
38
  uint32_t count[2];
39
39
  unsigned char buf[64];
40
- } SHA256_CTX;
40
+ } scrypt_SHA256_CTX;
41
41
 
42
- typedef struct HMAC_SHA256Context {
43
- SHA256_CTX ictx;
44
- SHA256_CTX octx;
45
- } HMAC_SHA256_CTX;
42
+ typedef struct HMAC_scrypt_SHA256Context {
43
+ scrypt_SHA256_CTX ictx;
44
+ scrypt_SHA256_CTX octx;
45
+ } HMAC_scrypt_SHA256_CTX;
46
46
 
47
- void SHA256_Init(SHA256_CTX *);
48
- void SHA256_Update(SHA256_CTX *, const void *, size_t);
49
- void SHA256_Final(unsigned char [32], SHA256_CTX *);
50
- void HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t);
51
- void HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t);
52
- void HMAC_SHA256_Final(unsigned char [32], HMAC_SHA256_CTX *);
47
+ void scrypt_SHA256_Init(scrypt_SHA256_CTX *);
48
+ void scrypt_SHA256_Update(scrypt_SHA256_CTX *, const void *, size_t);
49
+ void scrypt_SHA256_Final(unsigned char [32], scrypt_SHA256_CTX *);
50
+ void HMAC_scrypt_SHA256_Init(HMAC_scrypt_SHA256_CTX *, const void *, size_t);
51
+ void HMAC_scrypt_SHA256_Update(HMAC_scrypt_SHA256_CTX *, const void *, size_t);
52
+ void HMAC_scrypt_SHA256_Final(unsigned char [32], HMAC_scrypt_SHA256_CTX *);
53
53
 
54
54
  /**
55
- * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
56
- * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
55
+ * PBKDF2_scrypt_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
56
+ * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-scrypt_SHA256 as the PRF, and
57
57
  * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
58
58
  */
59
- void PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,
59
+ void PBKDF2_scrypt_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,
60
60
  uint64_t, uint8_t *, size_t);
61
61
 
62
- #endif /* !_SHA256_H_ */
62
+ #endif /* !_scrypt_SHA256_H_ */
Binary file
@@ -1,3 +1,3 @@
1
1
  module SCrypt
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scrypt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-15 00:00:00.000000000 -05:00
13
- default_executable:
12
+ date: 2012-04-11 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- requirement: &2151879660 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ! '>='
@@ -22,10 +21,15 @@ dependencies:
22
21
  version: '0'
23
22
  type: :development
24
23
  prerelease: false
25
- version_requirements: *2151879660
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
26
30
  - !ruby/object:Gem::Dependency
27
31
  name: rake
28
- requirement: &2151878380 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
29
33
  none: false
30
34
  requirements:
31
35
  - - ! '>='
@@ -33,7 +37,12 @@ dependencies:
33
37
  version: '0'
34
38
  type: :development
35
39
  prerelease: false
36
- version_requirements: *2151878380
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
37
46
  description: ! " The scrypt key derivation function is designed to be far \n more
38
47
  secure against hardware brute-force attacks than \n alternative functions such
39
48
  as PBKDF2 or bcrypt.\n"
@@ -50,7 +59,7 @@ files:
50
59
  - COPYING
51
60
  - Gemfile
52
61
  - Gemfile.lock
53
- - README
62
+ - README.md
54
63
  - Rakefile
55
64
  - Rakefile.old
56
65
  - autotest/discover.rb
@@ -69,13 +78,13 @@ files:
69
78
  - ext/mri/sha256.c
70
79
  - ext/mri/sha256.h
71
80
  - ext/mri/sysendian.h
81
+ - kdf-comparison.png
72
82
  - lib/scrypt.rb
73
83
  - lib/scrypt/version.rb
74
84
  - scrypt.gemspec
75
85
  - spec/scrypt/engine_spec.rb
76
86
  - spec/scrypt/password_spec.rb
77
87
  - spec/spec_helper.rb
78
- has_rdoc: true
79
88
  homepage: ''
80
89
  licenses: []
81
90
  post_install_message:
@@ -90,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
99
  version: '0'
91
100
  segments:
92
101
  - 0
93
- hash: -2866022726436582212
102
+ hash: 194968761822727959
94
103
  required_rubygems_version: !ruby/object:Gem::Requirement
95
104
  none: false
96
105
  requirements:
@@ -99,10 +108,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
108
  version: '0'
100
109
  segments:
101
110
  - 0
102
- hash: -2866022726436582212
111
+ hash: 194968761822727959
103
112
  requirements: []
104
113
  rubyforge_project: scrypt
105
- rubygems_version: 1.6.2
114
+ rubygems_version: 1.8.21
106
115
  signing_key:
107
116
  specification_version: 3
108
117
  summary: scrypt password hashing algorithm.
data/README DELETED
@@ -1,42 +0,0 @@
1
- = scrypt
2
-
3
- The scrypt key derivation function is designed to be far more secure against hardware brute-force attacks than alternative functions such as PBKDF2 or bcrypt.
4
-
5
- * http://www.tarsnap.com/scrypt.html
6
- * http://github.com/pbhogan/scrypt
7
-
8
- == Why you should use scrypt
9
-
10
- The designers of scrypt estimate that on modern (2009) hardware, if 5 seconds are spent computing a derived key, the cost of a hardware brute-force attack against scrypt is roughly 4000 times greater than the cost of a similar attack against bcrypt (to find the same password), and 20000 times greater than a similar attack against PBKDF2.
11
-
12
- == How to install scrypt
13
-
14
- gem install scrypt
15
-
16
- == How to use scrypt
17
-
18
- It works pretty similarly to ruby-bcrypt with a few minor differences, especially where the cost factor is concerned.
19
-
20
- include "scrypt"
21
-
22
- # hash a user's password
23
- @password = Password.create("my grand secret")
24
- @password #=> "2000$8$1$f5f2fa5fe5484a7091f1299768fbe92b5a7fbc77$6a385f22c54d92c314b71a4fd5ef33967c93d679"
25
-
26
- # store it safely
27
- @user.update_attribute(:password, @password)
28
-
29
- # read it back
30
- @user.reload!
31
- @db_password = Password.new(@user.password)
32
-
33
- # compare it after retrieval
34
- @db_password == "my grand secret" #=> true
35
- @db_password == "a paltry guess" #=> false
36
-
37
- Password.create takes three options which will determine the cost limits of the computation.
38
- * :max_time specifies the maximum number of seconds the computation should take.
39
- * :max_mem specifies the maximum number of bytes the computation should take. A value of 0 specifies no upper limit. The minimum is always 1 MB.
40
- * :max_memfrac specifies the maximum memory in a fraction of available resources to use. Any value equal to 0 or greater than 0.5 will result in 0.5 being used.
41
-
42
- Default options will result in calculation time of approx. 200 ms with 1 MB memory use.