Skip to content

Commit 7ef5fbf

Browse files
committed
kdf: add shorthand method for Argon2id
1 parent 59f24a7 commit 7ef5fbf

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

lib/openssl.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
require_relative 'openssl/ssl'
2323
require_relative 'openssl/pkcs5'
2424
require_relative 'openssl/version'
25+
require_relative 'openssl/kdf'
2526

2627
module OpenSSL
2728
# call-seq:

lib/openssl/kdf.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# frozen_string_literal: true
2+
3+
module OpenSSL
4+
module KDF
5+
if respond_to?(:derive)
6+
# Argon2id, a variant of Argon2, is a password hashing function
7+
# described in {RFC 9106}[https://www.rfc-editor.org/rfc/rfc9106].
8+
#
9+
# Available when compiled with \OpenSSL 3.2 or later.
10+
#
11+
# === Parameters
12+
# pass:: Passowrd to be hashed. Message string +P+ in RFC 9106.
13+
# salt:: Salt. Nonce +S+ in RFC 9106.
14+
# lanes:: Degree of parallelism. +p+ in RFC 9106.
15+
# length:: Desired output length in bytes. Tag length +T+ in RFC 9106.
16+
# memcost:: Memory size in the number of kibibytes. +m+ in RFC 9106.
17+
# iter:: Number of passes. +t+ in RFC 9106.
18+
# secret:: Secret value. +K+ in RFC 9106.
19+
# ad:: Associated data. +X+ in RFC 9106.
20+
def self.argon2id(pass, salt:, lanes:, length:, memcost:, iter:,
21+
secret: "", ad: "")
22+
params = {
23+
pass: pass, salt: salt, lanes: lanes, memcost: memcost, iter: iter,
24+
secret: secret, ad: ad,
25+
}
26+
derive("ARGON2ID", length, params)
27+
end
28+
end
29+
end
30+
end

test/openssl/test_kdf.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,18 @@ def test_derive
201201
}
202202
end if openssl?(3, 0, 0) || OpenSSL::KDF.respond_to?(:derive)
203203

204+
def test_argon2id_rfc9106
205+
password = B("01" * 32)
206+
salt = B("02" * 16)
207+
secret = B("03" * 8)
208+
ad = B("04" * 12)
209+
tag = B("0d640df58d78766c08c037a34a8b53c9d0" \
210+
"1ef0452d75b65eb52520e96b01e659")
211+
ret = OpenSSL::KDF.argon2id(password, salt: salt, lanes: 4, length: 32,
212+
memcost: 32, iter: 3, secret: secret, ad: ad)
213+
assert_equal(tag, ret)
214+
end if openssl?(3, 2, 0)
215+
204216
private
205217

206218
def B(ary)

0 commit comments

Comments
 (0)