Class: PuTTY::Key::Argon2Params

Inherits:
Object
  • Object
show all
Defined in:
lib/putty/key/argon2_params.rb

Overview

Argon2 key derivation parameters for use with format 3.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type: :id, memory: 8192, parallelism: 1, passes: nil, salt: nil, desired_time: 100) ⇒ Argon2Params

Initalizes a new PuTTY::Key::Argon2Params instance with the specified parameters.

Parameters:

  • type (Symbol) (defaults to: :id)

    The variant of Argon2 to use (:d, :i or :id).

  • memory (Integer) (defaults to: 8192)

    The amount of memory to use (memory cost) in kibibytes.

  • parallelism (Integer) (defaults to: 1)

    The number of parallel threads to use (parallelism degree / lanes).

  • passes (Integer) (defaults to: nil)

    The number of passes or iterations to run (time cost), or nil to determine the time cost based on #desired_time.

  • salt (String) (defaults to: nil)

    The salt to use, or nil if a random salt should be selected.

  • desired_time (Numeric) (defaults to: 100)

    The minimum time that should be taken to derive keys in milliseconds.

Raises:

  • (ArgumentError)

    If type is not either :d, :i or :id.

  • (ArgumentError)

    If memory is not an Integer, is negative or greater than 2³².

  • (ArgumentError)

    If parallelism is not an Integer, is negative or greater than 2³².

  • (ArgumentError)

    If passes is specified, but is not an Integer, is negative or greater than 2³².

  • (ArgumentError)

    If salt is specified, but is not a String.

  • (ArgumentError)

    If desired_time is not Numeric or is negative.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/putty/key/argon2_params.rb', line 63

def initialize(type: :id, memory: 8192, parallelism: 1, passes: nil, salt: nil, desired_time: 100)
  raise ArgumentError, 'type must be :d, :i or :id' unless type == :id || type == :i || type == :d
  raise ArgumentError, 'memory must be a non-negative Integer' unless memory.kind_of?(Integer) && memory >= 0 && memory <= 2**32
  raise ArgumentError, 'parallelism must be a non-negative Integer' unless parallelism.kind_of?(Integer) && parallelism >= 0 && parallelism <= 2**32
  raise ArgumentError, 'passes must be nil or a non-negative Integer' if passes && !(passes.kind_of?(Integer) && passes >= 0 && passes <= 2**32)
  raise ArgumentError, 'salt must be nil or a String' if salt && !salt.kind_of?(String)
  raise ArgumentError, 'desired_time must be a non-negative Numeric' unless desired_time.kind_of?(Numeric) && desired_time >= 0 && desired_time <= 2**32

  @type = type
  @memory = memory
  @parallelism = parallelism
  @passes = passes
  @salt = salt
  @desired_time = desired_time
end

Instance Attribute Details

#desired_timeNumeric (readonly)

The minimum time that should be taken to derive keys in milliseconds. Only used if #passes is nil.

A number of passes will be chosen that take at least #desired_time to compute a hash.

Returns:

  • (Numeric)

    The minimum time that should be taken to derive keys in milliseconds.



37
38
39
# File 'lib/putty/key/argon2_params.rb', line 37

def desired_time
  @desired_time
end

#memoryInteger (readonly)

Returns The amount of memory to use (memory cost) in kibibytes.

Returns:

  • (Integer)

    The amount of memory to use (memory cost) in kibibytes.



15
16
17
# File 'lib/putty/key/argon2_params.rb', line 15

def memory
  @memory
end

#parallelismInteger (readonly)

Returns The number of parallel threads to use (parallelism degree / lanes).

Returns:

  • (Integer)

    The number of parallel threads to use (parallelism degree / lanes).



19
20
21
# File 'lib/putty/key/argon2_params.rb', line 19

def parallelism
  @parallelism
end

#passesInteger (readonly)

Returns The number of passes or iterations to run (time cost), or nil to determine the time cost based on #desired_time.

Returns:

  • (Integer)

    The number of passes or iterations to run (time cost), or nil to determine the time cost based on #desired_time.



23
24
25
# File 'lib/putty/key/argon2_params.rb', line 23

def passes
  @passes
end

#saltString (readonly)

Returns The salt to use, or nil if a random salt should be selected.

Returns:

  • (String)

    The salt to use, or nil if a random salt should be selected.



27
28
29
# File 'lib/putty/key/argon2_params.rb', line 27

def salt
  @salt
end

#typeSymbol (readonly)

Returns the variant of Argon2 to use. :d for Argon2d, :i for Argon2i or :id for Argon2id.

Returns:

  • (Symbol)

    The variant of Argon2 to use (:d, :i or :id).



11
12
13
# File 'lib/putty/key/argon2_params.rb', line 11

def type
  @type
end

Instance Method Details

#complete(passes, salt) ⇒ Argon2Params

Returns an instance of PuTTY::Key::Argon2Params with the actual number of passes and salt used.

Parameters:

  • actual_passes (Integer)

    The number of passes or iterations used.

  • actual_salt (String)

    The actual salt used.

Returns:

Raises:

  • (ArgumentError)

    If actual_passes is not a positive Integer.

  • (ArgumentError)

    If actual_salt is not a String.



90
91
92
93
94
95
96
97
98
# File 'lib/putty/key/argon2_params.rb', line 90

def complete(passes, salt)
  raise ArgumentError, 'passes must not be nil' unless passes
  raise ArgumentError, 'salt must not be nil' unless salt
  if @passes == passes && @salt == salt
    self
  else
    Argon2Params.new(type: @type, memory: @memory, parallelism: @parallelism, passes: passes, salt: salt, desired_time: @desired_time)
  end
end