putty-key 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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