putty-key 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -1
  3. data/CHANGES.md +23 -0
  4. data/Gemfile +10 -5
  5. data/LICENSE +1 -1
  6. data/README.md +32 -6
  7. data/Rakefile +24 -0
  8. data/lib/putty/key/argon2_params.rb +101 -0
  9. data/lib/putty/key/error.rb +17 -0
  10. data/lib/putty/key/libargon2.rb +54 -0
  11. data/lib/putty/key/openssl.rb +279 -48
  12. data/lib/putty/key/ppk.rb +482 -104
  13. data/lib/putty/key/util.rb +10 -10
  14. data/lib/putty/key/version.rb +1 -1
  15. data/lib/putty/key.rb +6 -6
  16. data/putty-key.gemspec +11 -2
  17. data/test/argon2_params_test.rb +144 -0
  18. data/test/fixtures/{dss-1024-encrypted.ppk → dss-1024-encrypted-format-2.ppk} +17 -17
  19. data/test/fixtures/dss-1024-encrypted-format-3.ppk +22 -0
  20. data/test/fixtures/{dss-1024.ppk → dss-1024-format-2.ppk} +17 -17
  21. data/test/fixtures/dss-1024-format-3.ppk +17 -0
  22. data/test/fixtures/{ecdsa-sha2-nistp256-encrypted.ppk → ecdsa-sha2-nistp256-encrypted-format-2.ppk} +10 -10
  23. data/test/fixtures/ecdsa-sha2-nistp256-encrypted-format-3.ppk +15 -0
  24. data/test/fixtures/{ecdsa-sha2-nistp256.ppk → ecdsa-sha2-nistp256-format-2.ppk} +10 -10
  25. data/test/fixtures/ecdsa-sha2-nistp256-format-3.ppk +10 -0
  26. data/test/fixtures/{ecdsa-sha2-nistp384-encrypted.ppk → ecdsa-sha2-nistp384-encrypted-format-2.ppk} +11 -11
  27. data/test/fixtures/ecdsa-sha2-nistp384-encrypted-format-3.ppk +16 -0
  28. data/test/fixtures/{ecdsa-sha2-nistp384.ppk → ecdsa-sha2-nistp384-format-2.ppk} +11 -11
  29. data/test/fixtures/ecdsa-sha2-nistp384-format-3.ppk +11 -0
  30. data/test/fixtures/{ecdsa-sha2-nistp521-encrypted.ppk → ecdsa-sha2-nistp521-encrypted-format-2.ppk} +12 -12
  31. data/test/fixtures/ecdsa-sha2-nistp521-encrypted-format-3.ppk +17 -0
  32. data/test/fixtures/{ecdsa-sha2-nistp521.ppk → ecdsa-sha2-nistp521-format-2.ppk} +12 -12
  33. data/test/fixtures/ecdsa-sha2-nistp521-format-3.ppk +12 -0
  34. data/test/fixtures/{rsa-2048-encrypted.ppk → rsa-2048-encrypted-format-2.ppk} +26 -26
  35. data/test/fixtures/rsa-2048-encrypted-format-3.ppk +31 -0
  36. data/test/fixtures/{rsa-2048.ppk → rsa-2048-format-2.ppk} +26 -26
  37. data/test/fixtures/rsa-2048-format-3.ppk +26 -0
  38. data/test/fixtures/test-blank-comment.ppk +11 -11
  39. data/test/fixtures/test-empty-blobs-encrypted.ppk +6 -0
  40. data/test/fixtures/test-empty-blobs.ppk +6 -0
  41. data/test/fixtures/{test-encrypted.ppk → test-encrypted-format-2.ppk} +11 -11
  42. data/test/fixtures/test-encrypted-format-3.ppk +16 -0
  43. data/test/fixtures/test-encrypted-type-d-format-3.ppk +16 -0
  44. data/test/fixtures/test-encrypted-type-i-format-3.ppk +16 -0
  45. data/test/fixtures/{test-unix-line-endings.ppk → test-format-2.ppk} +0 -0
  46. data/test/fixtures/test-format-3.ppk +11 -0
  47. data/test/fixtures/test-invalid-argon2-memory-for-libargon2.ppk +16 -0
  48. data/test/fixtures/test-invalid-argon2-memory-maximum.ppk +16 -0
  49. data/test/fixtures/test-invalid-argon2-memory.ppk +16 -0
  50. data/test/fixtures/test-invalid-argon2-parallelism-maximum.ppk +16 -0
  51. data/test/fixtures/test-invalid-argon2-parallelism.ppk +16 -0
  52. data/test/fixtures/test-invalid-argon2-passes-maximum.ppk +16 -0
  53. data/test/fixtures/test-invalid-argon2-passes.ppk +16 -0
  54. data/test/fixtures/test-invalid-argon2-salt.ppk +16 -0
  55. data/test/fixtures/test-invalid-blob-lines.ppk +11 -11
  56. data/test/fixtures/test-invalid-encryption-type.ppk +11 -11
  57. data/test/fixtures/test-invalid-format-1.ppk +11 -11
  58. data/test/fixtures/{test-invalid-format-3.ppk → test-invalid-format-4.ppk} +11 -11
  59. data/test/fixtures/test-invalid-key-derivation.ppk +16 -0
  60. data/test/fixtures/test-invalid-private-mac.ppk +11 -11
  61. data/test/fixtures/test-legacy-mac-line-endings.ppk +1 -0
  62. data/test/fixtures/test-missing-final-line-ending.ppk +11 -0
  63. data/test/fixtures/test-truncated.ppk +10 -10
  64. data/test/fixtures/{test.ppk → test-windows-line-endings.ppk} +0 -0
  65. data/test/openssl_test.rb +243 -53
  66. data/test/ppk_test.rb +325 -44
  67. data/test/test_helper.rb +10 -3
  68. data.tar.gz.sig +0 -0
  69. metadata +73 -23
  70. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ee468e63692d4e452273f75c0e2349f451992fa906901f8856685c8c8f2bf82
4
- data.tar.gz: 4aafcf168d89410aae4e6f513a10e6fb3261c4a88493ca88125a1ea251cc6721
3
+ metadata.gz: 7206dacd7197ee9c1344a8cbf607c72614ab3031241bb72a32648bbe62cd784a
4
+ data.tar.gz: d2835eaa489968b975a93c7cb89e8d7b1dde7e52dc597cc48b54c2b3d9c59c5e
5
5
  SHA512:
6
- metadata.gz: 67187df6dd956d5067b3a97f35fe53fbb35698f788c5a08f6fd6bf42cc20afcb910fab6773f8af24ac6d53d6f9bd0c23737e47d683921147e9453296d3eed32d
7
- data.tar.gz: 7ff5c7f235975206b17da9be813221c4d24e9706e036ef4fc32ed097cfa4ce52deeb11cd9acfc68c218b0e6b7f68d07a54155e81738acd3bf05ca26f75921f03
6
+ metadata.gz: 0bc6d6331bd8e27ebb082a3bee81b71953cc75e7eea0c80cb6aa3577b4f47a22b379683188a800321848aecffd6e5e6ead37fc1691593c717f9a5b189a03f671
7
+ data.tar.gz: 5e9b7f92503ba1d3ee96089d42fc20f0ab59203c80c6eca9c2e284df67dacf877356ef6a8bbadca8ac569250f9b965b290f5904bfd6885f9f1648e76c0a39dfc
checksums.yaml.gz.sig CHANGED
@@ -1 +1,2 @@
1
- 8�Ǜ�#��Z�8�S���B��4a5A YP]ph�-ܚ�������%�*�x���j?� _����"ME �@c�l���&,��&�i�_�ֹ�8R^U',&aa�A�&"@�~��U'8���XG*�G���6�y��V�z#��0�E�1 �Օ6��k(�Z�C2�/e����6es�^����zBj���f�ڤ��\=F��Px��}��="�X���qAN�ޜ��g��卹��az �O:d�;���w��ћ�1��M
1
+ ����\�5��dk0���i52����¸����ʍj%��aH!j��v���{��{��|8D���#�}���fjYTr����/b�p����7������ě��t�^*ЅDŸ��)� U�*:�́�G���ԥ̔U��"ᖿ���sZ�)5XsΞ/�#iQ[K��,��˃��԰�Xt���ڇeE3�����ە
2
+ �v�1+A����`o��XhȒf6�XQ��� ��R��� Iҙ�J��&�!á*S
data/CHANGES.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changes #
2
2
 
3
+ ## Version 1.1.1 - 23-Oct-2022 ##
4
+
5
+ * Add support for Ruby 3.2.
6
+ * Add support for OpenSSL 3 (requires either Ruby 3.1+, or version 3.0.0+ of the
7
+ openssl gem).
8
+
9
+
10
+ ## Version 1.1.0 - 24-May-2021 ##
11
+
12
+ * Add support for [format 3 .ppk files](https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ppk3.html)
13
+ introduced in PuTTY version 0.75. `PuTTY::Key::PPK#save` defaults to saving
14
+ format 2 files. [libargon2](https://github.com/P-H-C/phc-winner-argon2) is
15
+ required to load and save encrypted format 3 files.
16
+ * Write files using LF line endings (Unix) instead of CRLF (Windows) to match
17
+ PuTTYgen version 0.75 (versions up to 0.74 used CRLF, but are compatible with
18
+ CRLF and LF).
19
+ * Support reading files with CR line endings (Classic Mac OS).
20
+ * Support reading from and writing to `IO`-like streams.
21
+ * Allow loading and saving files with empty private or public keys.
22
+ * Fix adding unnecessary padding to the private key on saving when it is an
23
+ exact multiple of the block size.
24
+
25
+
3
26
  ## Version 1.0.1 - 26-Dec-2019 ##
4
27
 
5
28
  * Fix errors converting DSA and RSA PPK keys to OpenSSL in
data/Gemfile CHANGED
@@ -12,12 +12,17 @@ group :test do
12
12
 
13
13
  # coveralls is no longer maintained, but supports Ruby < 2.3.
14
14
  # coveralls_reborn is maintained, but requires Ruby >= 2.3.
15
- gem 'coveralls', '~> 0.8', require: false if RUBY_VERSION < '2.3'
15
+ gem 'coveralls', git: 'https://github.com/philr/coveralls-ruby.git', require: false if RUBY_VERSION < '2.3'
16
16
  gem 'coveralls_reborn', '~> 0.13', require: false if RUBY_VERSION >= '2.3'
17
17
 
18
- # json is a dependency of simplecov. Version 2.3.0 is declared as compatible
19
- # with Ruby >= 1.9, but actually fails with a syntax error.
18
+ # The source version of ffi 1.15.5 is declared as compatible with Ruby >= 2.3.
19
+ # The binary version of 1.15.5 is declared as compatible with Ruby >= 2.4, so
20
+ # doesn't get used. The using the source version results in a segmentation
21
+ # fault during libffi initialization.
20
22
  #
21
- # Limit to earlier versions on Ruby 1.9.
22
- gem 'json', '< 2.3.0', require: false if RUBY_VERSION < '2.0'
23
+ # Binaries of 15.5.0 to 15.5.4 are declared as compatible with Ruby >= 2.3,
24
+ # but don't get used with Bundler 2.3.23 and Ruby 2.3 on Windows.
25
+ #
26
+ # Limit to earlier compatible versions.
27
+ gem 'ffi', '< 1.15.0' if RUBY_VERSION < '2.4' && RUBY_PLATFORM =~ /mingw/
23
28
  end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016-2019 Philip Ross
1
+ Copyright (c) 2016-2022 Philip Ross
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of
4
4
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # PuTTY::Key #
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/putty-key.svg)](https://badge.fury.io/rb/putty-key) [![Build Status](https://travis-ci.org/philr/putty-key.svg?branch=master)](https://travis-ci.org/philr/putty-key) [![Build status](https://ci.appveyor.com/api/projects/status/btinuu4g8sdachj3/branch/master?svg=true)](https://ci.appveyor.com/project/philr/tzinfo/branch/master) [![Coverage Status](https://coveralls.io/repos/philr/putty-key/badge.svg?branch=master)](https://coveralls.io/r/philr/putty-key?branch=master)
3
+ [![RubyGems](https://img.shields.io/gem/v/putty-key?logo=rubygems&label=Gem)](https://rubygems.org/gems/putty-key) [![Tests](https://github.com/philr/putty-key/workflows/Tests/badge.svg?branch=master&event=push)](https://github.com/philr/putty-key/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush) [![Coverage Status](https://img.shields.io/coveralls/github/philr/putty-key/master?label=Coverage&logo=Coveralls)](https://coveralls.io/github/philr/putty-key?branch=master)
4
4
 
5
- PuTTY::Key is a pure-Ruby implementation of the PuTTY private key (ppk) format,
6
- handling reading and writing .ppk files. It includes a refinement to Ruby's
7
- OpenSSL library to add support for converting DSA, EC and RSA private keys to
8
- and from PuTTY private key files. This allows OpenSSH ecdsa, ssh-dss and ssh-rsa
9
- private keys to be converted to and from PuTTY's private key format.
5
+ PuTTY::Key is a Ruby implementation of the PuTTY private key (ppk) format
6
+ (versions 2 and 3), handling reading and writing .ppk files. It includes a
7
+ refinement to Ruby's OpenSSL library to add support for converting DSA, EC and
8
+ RSA private keys to and from PuTTY private key files. This allows OpenSSH ecdsa,
9
+ ssh-dss and ssh-rsa private keys to be converted to and from PuTTY's private key
10
+ format.
10
11
 
11
12
 
12
13
  ## Installation ##
@@ -29,6 +30,22 @@ gem 'putty-key'
29
30
  PuTTY::Key is compatible with Ruby MRI 2.1.0+ and JRuby 9.1.0.0+.
30
31
 
31
32
 
33
+ ## Formats ##
34
+
35
+ Format 2 and 3 .ppk files are supported. Format 1 (not supported) was only used
36
+ briefly early on in the development of the .ppk format and was never included in
37
+ a PuTTY release. Format 2 is supported by PuTTY version 0.52 onwards. Format 3
38
+ is supported by PuTTY version 0.75 onwards. By default, `PuTTY::Key::PPK` saves
39
+ files using format 2. Format 3 can be selected with the `format` parameter.
40
+
41
+ [libargon2](https://github.com/P-H-C/phc-winner-argon2) is required to load and
42
+ save encrypted format 3 files. Binaries are typically available with your OS
43
+ distribution. For Windows, binaries are available from the
44
+ [argon2-windows](https://github.com/philr/argon2-windows/releases) repository.
45
+ Use either Argon2OptDll.dll for CPUs supporting AVX or Argon2RefDll.dll
46
+ otherwise.
47
+
48
+
32
49
  ## Usage ##
33
50
 
34
51
  To use PuTTY::Key, it must first be loaded with:
@@ -68,6 +85,9 @@ ppk.comment = 'Optional comment'
68
85
  ppk.save('key.ppk')
69
86
  ```
70
87
 
88
+ Use `ppk.save('key.ppk', format: 3)` to save a format 3 file instead of
89
+ format 2.
90
+
71
91
 
72
92
  ### Generating a new RSA key and saving it as an encrypted .ppk file ###
73
93
 
@@ -82,6 +102,9 @@ ppk.comment = 'RSA 2048'
82
102
  ppk.save('rsa.ppk', 'Passphrase for encryption')
83
103
  ```
84
104
 
105
+ Use `ppk.save('rsa.ppk', 'Passphrase for encryption', format: 3)` to save a
106
+ format 3 file instead of format 2.
107
+
85
108
 
86
109
  ### Converting an unencrypted .ppk file to .pem format ###
87
110
 
@@ -106,6 +129,9 @@ ppk = PuTTY::Key::PPK.new('rsa.ppk', 'Passphrase for encryption')
106
129
  ppk.save('rsa-plain.ppk')
107
130
  ```
108
131
 
132
+ Use `ppk.save('rsa-plain.ppk', format: 3)` to save a format 3 file instead of
133
+ format 2.
134
+
109
135
 
110
136
  ## API Documentation ##
111
137
 
data/Rakefile CHANGED
@@ -105,3 +105,27 @@ end
105
105
  desc 'Run tests using the refinement, then with the global install'
106
106
  task :test => [:clean_coverage, 'test:refinement', 'test:global'] + (TEST_COVERAGE ? ['coveralls:push'] : []) do
107
107
  end
108
+
109
+ # Coveralls expects an sh compatible shell when running git commands with Kernel#`
110
+ # On Windows, the results end up wrapped in single quotes.
111
+ # Patch Coveralls::Configuration to remove the quotes.
112
+ if RUBY_PLATFORM =~ /mingw/
113
+ module CoverallsFixConfigurationOnWindows
114
+ def self.included(base)
115
+ base.instance_eval do
116
+ class << self
117
+ alias_method :git_without_windows_fix, :git
118
+
119
+ def git
120
+ git_without_windows_fix.tap do |hash|
121
+ hash[:head] = hash[:head].map {|k, v| [k, v =~ /\A'(.*)'\z/ ? $1 : v] }.to_h
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ require 'coveralls'
130
+ Coveralls::Configuration.send(:include, CoverallsFixConfigurationOnWindows)
131
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PuTTY
4
+ module Key
5
+ # Argon2 key derivation parameters for use with format 3.
6
+ class Argon2Params
7
+ # Returns the variant of Argon2 to use. `:d` for Argon2d, `:i` for Argon2i
8
+ # or `:id` for Argon2id.
9
+ #
10
+ # @return [Symbol] The variant of Argon2 to use (`:d`, `:i` or `:id`).
11
+ attr_reader :type
12
+
13
+ # @return [Integer] The amount of memory to use (memory cost) in
14
+ # kibibytes.
15
+ attr_reader :memory
16
+
17
+ # @return [Integer] The number of parallel threads to use (parallelism
18
+ # degree / lanes).
19
+ attr_reader :parallelism
20
+
21
+ # @return [Integer] The number of passes or iterations to run (time cost),
22
+ # or `nil` to determine the time cost based on {#desired_time}.
23
+ attr_reader :passes
24
+
25
+ # @return [String] The salt to use, or `nil` if a random salt should be
26
+ # selected.
27
+ attr_reader :salt
28
+
29
+ # The minimum time that should be taken to derive keys in milliseconds.
30
+ # Only used if {#passes} is `nil`.
31
+ #
32
+ # A number of passes will be chosen that take at least {#desired_time} to
33
+ # compute a hash.
34
+ #
35
+ # @return [Numeric] The minimum time that should be taken to derive keys
36
+ # in milliseconds.
37
+ attr_reader :desired_time
38
+
39
+ # Initalizes a new {Argon2Params} instance with the specified parameters.
40
+ #
41
+ # @param type [Symbol] The variant of Argon2 to use (`:d`, `:i` or `:id`).
42
+ # @param memory [Integer] The amount of memory to use (memory cost) in
43
+ # kibibytes.
44
+ # @param parallelism [Integer] The number of parallel threads to use
45
+ # (parallelism degree / lanes).
46
+ # @param passes [Integer] The number of passes or iterations to run (time
47
+ # cost), or `nil` to determine the time cost based on {#desired_time}.
48
+ # @param salt [String] The salt to use, or `nil` if a random salt should
49
+ # be selected.
50
+ # @param desired_time [Numeric] The minimum time that should be taken to
51
+ # derive keys in milliseconds.
52
+ #
53
+ # @raise [ArgumentError] If `type` is not either `:d`, `:i` or `:id`.
54
+ # @raise [ArgumentError] If `memory` is not an `Integer`, is negative or
55
+ # greater than 2³².
56
+ # @raise [ArgumentError] If `parallelism` is not an `Integer`, is negative
57
+ # or greater than 2³².
58
+ # @raise [ArgumentError] If `passes` is specified, but is not an
59
+ # `Integer`, is negative or greater than 2³².
60
+ # @raise [ArgumentError] If `salt` is specified, but is not a `String`.
61
+ # @raise [ArgumentError] If `desired_time` is not `Numeric` or is
62
+ # negative.
63
+ def initialize(type: :id, memory: 8192, parallelism: 1, passes: nil, salt: nil, desired_time: 100)
64
+ raise ArgumentError, 'type must be :d, :i or :id' unless type == :id || type == :i || type == :d
65
+ raise ArgumentError, 'memory must be a non-negative Integer' unless memory.kind_of?(Integer) && memory >= 0 && memory <= 2**32
66
+ raise ArgumentError, 'parallelism must be a non-negative Integer' unless parallelism.kind_of?(Integer) && parallelism >= 0 && parallelism <= 2**32
67
+ raise ArgumentError, 'passes must be nil or a non-negative Integer' if passes && !(passes.kind_of?(Integer) && passes >= 0 && passes <= 2**32)
68
+ raise ArgumentError, 'salt must be nil or a String' if salt && !salt.kind_of?(String)
69
+ raise ArgumentError, 'desired_time must be a non-negative Numeric' unless desired_time.kind_of?(Numeric) && desired_time >= 0 && desired_time <= 2**32
70
+
71
+ @type = type
72
+ @memory = memory
73
+ @parallelism = parallelism
74
+ @passes = passes
75
+ @salt = salt
76
+ @desired_time = desired_time
77
+ end
78
+
79
+ # Returns an instance of {Argon2Params} with the actual number of passes
80
+ # and salt used.
81
+ #
82
+ # @param actual_passes [Integer] The number of passes or iterations used.
83
+ # @param actual_salt [String] The actual salt used.
84
+ #
85
+ # @return [Argon2Params] An instance of {Argon2Params} with the given
86
+ # passes and salt.
87
+ #
88
+ # @raise [ArgumentError] If `actual_passes` is not a positive `Integer`.
89
+ # @raise [ArgumentError] If `actual_salt` is not a `String`.
90
+ def complete(passes, salt)
91
+ raise ArgumentError, 'passes must not be nil' unless passes
92
+ raise ArgumentError, 'salt must not be nil' unless salt
93
+ if @passes == passes && @salt == salt
94
+ self
95
+ else
96
+ Argon2Params.new(type: @type, memory: @memory, parallelism: @parallelism, passes: passes, salt: salt, desired_time: @desired_time)
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -18,6 +18,23 @@ module PuTTY
18
18
  class UnsupportedCurveError < Error
19
19
  end
20
20
 
21
+ # Indicates that libargon2 encountered an error hashing the passphrase to
22
+ # derive the keys for a format 3 .ppk file.
23
+ class Argon2Error < Error
24
+ # The error code returned by the `argon2_hash` function.
25
+ attr_reader :error_code
26
+
27
+ # Initializes a new {Argon2Error}.
28
+ #
29
+ # @param error_code [Integer] The error code returned by the `argon2_hash`
30
+ # function.
31
+ # @param message [String] A description of the error.
32
+ def initialize(error_code, message)
33
+ super(message)
34
+ @error_code = error_code
35
+ end
36
+ end
37
+
21
38
  # Indicates that a nil value has been encountered.
22
39
  class NilValueError < Error
23
40
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+
5
+ module PuTTY
6
+ module Key
7
+ # A wrapper for the required functions from libargon2.
8
+ module Libargon2
9
+ extend ::FFI::Library
10
+
11
+ ffi_lib ['argon2', 'libargon2.so.1', 'libargon2.dll', 'Argon2OptDll.dll', 'Argon2RefDll.dll']
12
+
13
+ # Returned by `argon2_hash` if successful.
14
+ ARGON2_OK = 0
15
+
16
+ # The type of hash to perform.
17
+ enum :argon2_type, [:d, 0, :i, 1, :id, 2]
18
+
19
+ # The version of the algorithm to use.
20
+ enum FFI::Type::UINT32, :argon2_version, [:version_10, 0x10, :version_13, 0x13]
21
+
22
+ # Hashes a password with Argon2, producing a raw hash at hash.
23
+ #
24
+ # t_cost Number of iterations.
25
+ # m_cost Sets memory usage to m_cost kibibytes.
26
+ # parallelism Number of threads and compute lanes.
27
+ # pwd Pointer to password.
28
+ # pwdlen Password size in bytes.
29
+ # salt Pointer to salt.
30
+ # saltlen Salt size in bytes.
31
+ # hash Buffer where to write the raw hash - updated by the function.
32
+ # hashlen Desired length of the hash in bytes.
33
+ #
34
+ # Different parallelism levels will give different results.
35
+ #
36
+ # Returns ARGON2_OK if successful.
37
+ #
38
+ # ARGON2_PUBLIC int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
39
+ # const uint32_t parallelism, const void *pwd,
40
+ # const size_t pwdlen, const void *salt,
41
+ # const size_t saltlen, void *hash,
42
+ # const size_t hashlen, char *encoded,
43
+ # const size_t encodedlen, argon2_type type,
44
+ # const uint32_t version);
45
+ attach_function 'argon2_hash', [:uint32, :uint32, :uint32, :pointer, :size_t, :pointer, :size_t, :pointer, :size_t, :pointer, :size_t, :argon2_type, :argon2_version], :int
46
+
47
+ # Returns an error message corresponding to the given error code.
48
+ #
49
+ # ARGON2_PUBLIC const char *argon2_error_message(int error_code);
50
+ attach_function :argon2_error_message, [:int], :string
51
+ end
52
+ private_constant :Libargon2
53
+ end
54
+ end