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