lib/rbnacl/password_hash/scrypt.rb in rbnacl-3.3.0 vs lib/rbnacl/password_hash/scrypt.rb in rbnacl-3.4.0
- old
+ new
@@ -15,55 +15,48 @@
# called "sequential memory hardness" which helps defeat attempts by
# attackers to compensate for their lack of memory (since they're typically
# on GPUs or FPGAs) with additional computation.
class SCrypt
extend Sodium
+ sodium_type :pwhash
+ sodium_primitive :scryptsalsa208sha256
- begin
- sodium_type :pwhash
- sodium_primitive :scryptsalsa208sha256
+ sodium_constant :SALTBYTES
- sodium_constant :SALTBYTES
+ sodium_function :scrypt,
+ :crypto_pwhash_scryptsalsa208sha256,
+ [:pointer, :ulong_long, :pointer, :ulong_long, :pointer, :ulong_long, :size_t]
- sodium_function :scrypt,
- :crypto_pwhash_scryptsalsa208sha256,
- [:pointer, :ulong_long, :pointer, :ulong_long, :pointer, :ulong_long, :size_t]
+ # Create a new SCrypt password hash object
+ #
+ # @param [Integer] opslimit the CPU cost (e.g. 2**20)
+ # @param [Integer] memlimit the memory cost (e.g. 2**24)
+ #
+ # @return [RbNaCl::PasswordHash::SCrypt] An SCrypt password hasher object
+ def initialize(opslimit, memlimit, digest_size = 64)
+ # TODO: sanity check these parameters
+ @opslimit = opslimit
+ @memlimit = memlimit
- # Create a new SCrypt password hash object
- #
- # @param [Integer] opslimit the CPU cost (e.g. 2**20)
- # @param [Integer] memlimit the memory cost (e.g. 2**24)
- #
- # @return [RbNaCl::PasswordHash::SCrypt] An SCrypt password hasher object
- def initialize(opslimit, memlimit, digest_size = 64)
- # TODO: sanity check these parameters
- @opslimit = opslimit
- @memlimit = memlimit
+ # TODO: check digest size validity
+ # raise LengthError, "digest size too short" if @digest_size < BYTES_MIN
+ # raise LengthError, "digest size too long" if @digest_size > BYTES_MAX
- # TODO: check digest size validity
- # raise LengthError, "digest size too short" if @digest_size < BYTES_MIN
- # raise LengthError, "digest size too long" if @digest_size > BYTES_MAX
+ @digest_size = digest_size
+ end
- @digest_size = digest_size
- end
+ # Calculate an scrypt digest for a given password and salt
+ #
+ # @param [String] password to be hashed
+ # @param [String] salt to make the digest unique
+ #
+ # @return [String] scrypt digest of the string as raw bytes
+ def digest(password, salt)
+ digest = Util.zeros(@digest_size)
+ salt = Util.check_string(salt, SALTBYTES, "salt")
- # Calculate an scrypt digest for a given password and salt
- #
- # @param [String] password to be hashed
- # @param [String] salt to make the digest unique
- #
- # @return [String] scrypt digest of the string as raw bytes
- def digest(password, salt)
- digest = Util.zeros(@digest_size)
- salt = Util.check_string(salt, SALTBYTES, "salt")
-
- self.class.scrypt(digest, @digest_size, password, password.bytesize, salt, @opslimit, @memlimit) || fail(CryptoError, "scrypt failed!")
- digest
- end
- rescue FFI::NotFoundError
- def initialize(_opslimit, _memlimit, _digest_size = 64)
- raise NotImplementedError, "scrypt not implemented in this version of libsodium"
- end
+ self.class.scrypt(digest, @digest_size, password, password.bytesize, salt, @opslimit, @memlimit) || raise(CryptoError, "scrypt failed!")
+ digest
end
end
end
end