Skip to content

Commit a13ccfe

Browse files
authored
Merge pull request #78 from Geod24/kd
Add binding for kdf.h
2 parents 16667d8 + 529e80b commit a13ccfe

File tree

3 files changed

+247
-0
lines changed

3 files changed

+247
-0
lines changed

source/deimos/openssl/evp.d

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,8 @@ int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX* ctx, int keytype, int optype,
11311131
int cmd, int p1, void* p2);
11321132
int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX* ctx, const(char)* type,
11331133
const(char)* value);
1134+
int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX* ctx, int keytype, int optype,
1135+
int cmd, ulong value);
11341136

11351137
int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX* ctx);
11361138
void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX* ctx, int* dat, int datlen);

source/deimos/openssl/kdf.d

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
/*
2+
* Port of `<openssl/kdf.h>`
3+
*
4+
* This header was introduced in v1.1.0.
5+
*
6+
* Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
7+
*
8+
* Licensed under the Apache License 2.0 (the "License"). You may not use
9+
* this file except in compliance with the License. You can obtain a copy
10+
* in the file LICENSE in the source distribution or at
11+
* https://www.openssl.org/source/license.html
12+
*/
13+
module deimos.openssl.kdf;
14+
15+
import deimos.openssl.evp;
16+
import deimos.openssl.opensslv;
17+
import deimos.openssl.types;
18+
19+
extern (C):
20+
nothrow:
21+
22+
static if (OPENSSL_VERSION_AT_LEAST(3, 0, 0))
23+
{
24+
int EVP_KDF_up_ref(EVP_KDF* kdf);
25+
void EVP_KDF_free(EVP_KDF* kdf);
26+
EVP_KDF* EVP_KDF_fetch(
27+
OSSL_LIB_CTX *libctx, const(char)* algorithm, const(char)* properties);
28+
29+
EVP_KDF_CTX* EVP_KDF_CTX_new(EVP_KDF* kdf);
30+
void EVP_KDF_CTX_free(EVP_KDF_CTX* ctx);
31+
EVP_KDF_CTX* EVP_KDF_CTX_dup(const(EVP_KDF_CTX)* src);
32+
const(char)* EVP_KDF_get0_description(const(EVP_KDF)* kdf);
33+
int EVP_KDF_is_a(const(EVP_KDF)* kdf, const(char)* name);
34+
const(char)* EVP_KDF_get0_name(const(EVP_KDF)* kdf);
35+
const(OSSL_PROVIDER)* EVP_KDF_get0_provider(const(EVP_KDF)* kdf);
36+
const(EVP_KDF)* EVP_KDF_CTX_kdf(EVP_KDF_CTX* ctx);
37+
38+
void EVP_KDF_CTX_reset(EVP_KDF_CTX* ctx);
39+
size_t EVP_KDF_CTX_get_kdf_size(EVP_KDF_CTX* ctx);
40+
int EVP_KDF_derive(
41+
EVP_KDF_CTX* ctx, ubyte* key, size_t keylen, const(OSSL_PARAM)* params);
42+
int EVP_KDF_get_params(EVP_KDF* kdf, OSSL_PARAM* params);
43+
int EVP_KDF_CTX_get_params(EVP_KDF_CTX* ctx, OSSL_PARAM* params);
44+
int EVP_KDF_CTX_set_params(EVP_KDF_CTX* ctx, const(OSSL_PARAM)* params);
45+
const(OSSL_PARAM)* EVP_KDF_gettable_params(const(EVP_KDF)* kdf);
46+
const(OSSL_PARAM)* EVP_KDF_gettable_ctx_params(const(EVP_KDF)* kdf);
47+
const(OSSL_PARAM)* EVP_KDF_settable_ctx_params(const(EVP_KDF)* kdf);
48+
const(OSSL_PARAM)* EVP_KDF_CTX_gettable_params(EVP_KDF_CTX* ctx);
49+
const(OSSL_PARAM)* EVP_KDF_CTX_settable_params(EVP_KDF_CTX* ctx);
50+
51+
private alias EVP_KDF_apply_fn = extern(C) void function(EVP_KDF* kdf, void* arg);
52+
void EVP_KDF_do_all_provided(OSSL_LIB_CTX *libctx, EVP_KDF_apply_fn fn, void* arg);
53+
private alias EVP_KDF_names_apply_fn = extern(C) void function(const(char)* name, void* data);
54+
int EVP_KDF_names_do_all(const(EVP_KDF)* kdf, EVP_KDF_names_apply_fn fn, void* data);
55+
}
56+
57+
enum EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND = 0;
58+
enum EVP_KDF_HKDF_MODE_EXTRACT_ONLY = 1;
59+
enum EVP_KDF_HKDF_MODE_EXPAND_ONLY = 2;
60+
61+
enum EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV = 65;
62+
enum EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI = 66;
63+
enum EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV = 67;
64+
enum EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI = 68;
65+
enum EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV = 69;
66+
enum EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI = 70;
67+
68+
/**** The legacy PKEY-based KDF API follows. ****/
69+
70+
enum EVP_PKEY_CTRL_TLS_MD = (EVP_PKEY_ALG_CTRL);
71+
enum EVP_PKEY_CTRL_TLS_SECRET = (EVP_PKEY_ALG_CTRL + 1);
72+
enum EVP_PKEY_CTRL_TLS_SEED = (EVP_PKEY_ALG_CTRL + 2);
73+
enum EVP_PKEY_CTRL_HKDF_MD = (EVP_PKEY_ALG_CTRL + 3);
74+
enum EVP_PKEY_CTRL_HKDF_SALT = (EVP_PKEY_ALG_CTRL + 4);
75+
enum EVP_PKEY_CTRL_HKDF_KEY = (EVP_PKEY_ALG_CTRL + 5);
76+
enum EVP_PKEY_CTRL_HKDF_INFO = (EVP_PKEY_ALG_CTRL + 6);
77+
static if (OPENSSL_VERSION_AT_LEAST(1, 1, 1))
78+
{
79+
// https://github.com/openssl/openssl/commit/cefa762ee5c28359986c6af5bf4db4e901f75846
80+
enum EVP_PKEY_CTRL_HKDF_MODE = (EVP_PKEY_ALG_CTRL + 7);
81+
enum EVP_PKEY_CTRL_PASS = (EVP_PKEY_ALG_CTRL + 8);
82+
enum EVP_PKEY_CTRL_SCRYPT_SALT = (EVP_PKEY_ALG_CTRL + 9);
83+
enum EVP_PKEY_CTRL_SCRYPT_N = (EVP_PKEY_ALG_CTRL + 10);
84+
enum EVP_PKEY_CTRL_SCRYPT_R = (EVP_PKEY_ALG_CTRL + 11);
85+
enum EVP_PKEY_CTRL_SCRYPT_P = (EVP_PKEY_ALG_CTRL + 12);
86+
enum EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES = (EVP_PKEY_ALG_CTRL + 13);
87+
}
88+
else
89+
{
90+
// https://github.com/openssl/openssl/blob/OpenSSL_1_1_0l/include/openssl/kdf.h#L59
91+
92+
/* Error codes for the KDF functions. */
93+
int ERR_load_KDF_strings();
94+
95+
/* Function codes. */
96+
enum KDF_F_PKEY_TLS1_PRF_CTRL_STR = 100;
97+
enum KDF_F_PKEY_TLS1_PRF_DERIVE = 101;
98+
99+
/* Reason codes. */
100+
enum KDF_R_INVALID_DIGEST = 100;
101+
enum KDF_R_MISSING_PARAMETER = 101;
102+
enum KDF_R_VALUE_MISSING = 102;
103+
}
104+
105+
alias EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND = EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND;
106+
alias EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY = EVP_KDF_HKDF_MODE_EXTRACT_ONLY;
107+
alias EVP_PKEY_HKDEF_MODE_EXPAND_ONLY = EVP_KDF_HKDF_MODE_EXPAND_ONLY;
108+
109+
static if (OPENSSL_VERSION_AT_LEAST(3, 0, 0))
110+
{
111+
// Before 3.0.0 those were macros
112+
int EVP_PKEY_CTX_set_tls1_prf_md(EVP_PKEY_CTX* ctx, const(EVP_MD)* md);
113+
int EVP_PKEY_CTX_set1_tls1_prf_secret(
114+
EVP_PKEY_CTX* pctx, const(ubyte)* sec, int seclen);
115+
int EVP_PKEY_CTX_add1_tls1_prf_seed(
116+
EVP_PKEY_CTX* pctx, const(ubyte)* seed, int seedlen);
117+
118+
int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX* ctx, const(EVP_MD)* md);
119+
int EVP_PKEY_CTX_set1_hkdf_salt(
120+
EVP_PKEY_CTX* ctx, const(ubyte)* salt, int saltlen);
121+
int EVP_PKEY_CTX_set1_hkdf_key(
122+
EVP_PKEY_CTX* ctx, const(ubyte)* key, int keylen);
123+
int EVP_PKEY_CTX_add1_hkdf_info(
124+
EVP_PKEY_CTX* ctx, const(ubyte)* info, int infolen);
125+
126+
int EVP_PKEY_CTX_set_hkdf_mode(EVP_PKEY_CTX* ctx, int mode);
127+
alias EVP_PKEY_CTX_hkdf_mode = EVP_PKEY_CTX_set_hkdf_mode;
128+
129+
int EVP_PKEY_CTX_set1_pbe_pass(EVP_PKEY_CTX* ctx, const(char)* pass, int passlen);
130+
131+
int EVP_PKEY_CTX_set1_scrypt_salt(
132+
EVP_PKEY_CTX* ctx, const(ubyte)* salt, int saltlen);
133+
134+
int EVP_PKEY_CTX_set_scrypt_N(EVP_PKEY_CTX* ctx, ulong n);
135+
int EVP_PKEY_CTX_set_scrypt_r(EVP_PKEY_CTX* ctx, ulong r);
136+
int EVP_PKEY_CTX_set_scrypt_p(EVP_PKEY_CTX* ctx, ulong p);
137+
138+
int EVP_PKEY_CTX_set_scrypt_maxmem_bytes(EVP_PKEY_CTX* ctx, ulong maxmem_bytes);
139+
}
140+
else
141+
{
142+
auto EVP_PKEY_CTX_set_tls1_prf_md () (EVP_PKEY_CTX* ctx, const(EVP_MD)* md)
143+
{
144+
return EVP_PKEY_CTX_ctrl(
145+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_TLS_MD, 0, md);
146+
}
147+
148+
auto EVP_PKEY_CTX_set1_tls1_prf_secret () (
149+
EVP_PKEY_CTX* pctx, const(ubyte)* sec, int seclen)
150+
{
151+
return EVP_PKEY_CTX_ctrl(
152+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_TLS_SECRET, seclen, sec);
153+
}
154+
155+
auto EVP_PKEY_CTX_add1_tls1_prf_seed () (
156+
EVP_PKEY_CTX* pctx, const(ubyte)* seed, int seedlen)
157+
{
158+
return EVP_PKEY_CTX_ctrl(
159+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_TLS_SEED, seedlen, seed);
160+
}
161+
162+
auto EVP_PKEY_CTX_set_hkdf_md () (EVP_PKEY_CTX* ctx, const(EVP_MD)* md)
163+
{
164+
return EVP_PKEY_CTX_ctrl(
165+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_HKDF_MD, 0, md);
166+
}
167+
auto EVP_PKEY_CTX_set1_hkdf_salt () (
168+
EVP_PKEY_CTX* ctx, const(ubyte)* salt, int saltlen)
169+
{
170+
return EVP_PKEY_CTX_ctrl(
171+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_HKDF_SALT, saltlen, salt);
172+
}
173+
auto EVP_PKEY_CTX_set1_hkdf_key () (
174+
EVP_PKEY_CTX* ctx, const(ubyte)* key, int keylen)
175+
{
176+
return EVP_PKEY_CTX_ctrl(
177+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_HKDF_KEY, keylen, key);
178+
}
179+
auto EVP_PKEY_CTX_add1_hkdf_info () (
180+
EVP_PKEY_CTX* ctx, const(ubyte)* info, int infolen)
181+
{
182+
return EVP_PKEY_CTX_ctrl(
183+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_HKDF_INFO, infolen, info);
184+
}
185+
186+
auto EVP_PKEY_CTX_hkdf_mode () (EVP_PKEY_CTX* ctx, int mode)
187+
{
188+
return EVP_PKEY_CTX_ctrl(
189+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_HKDF_MODE, mode, null);
190+
}
191+
192+
static if (OPENSSL_VERSION_AT_LEAST(1, 1, 1))
193+
{
194+
auto EVP_PKEY_CTX_set1_pbe_pass ()
195+
(EVP_PKEY_CTX* ctx, const(char)* pass, int passlen)
196+
{
197+
return EVP_PKEY_CTX_ctrl(
198+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_PASS, passlen, pass);
199+
}
200+
201+
auto EVP_PKEY_CTX_set1_scrypt_salt ()
202+
(EVP_PKEY_CTX* ctx, const(ubyte)* salt, int saltlen)
203+
{
204+
return EVP_PKEY_CTX_ctrl(
205+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SCRYPT_SALT, saltlen, salt);
206+
}
207+
208+
auto EVP_PKEY_CTX_set_scrypt_N ()
209+
(EVP_PKEY_CTX* ctx, ulong n)
210+
{
211+
return EVP_PKEY_CTX_ctrl_uint64(
212+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SCRYPT_N, n);
213+
}
214+
215+
auto EVP_PKEY_CTX_set_scrypt_r ()
216+
(EVP_PKEY_CTX* ctx, ulong n)
217+
{
218+
return EVP_PKEY_CTX_ctrl_uint64(
219+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SCRYPT_R, r);
220+
}
221+
222+
auto EVP_PKEY_CTX_set_scrypt_p ()
223+
(EVP_PKEY_CTX* ctx, ulong n)
224+
{
225+
return EVP_PKEY_CTX_ctrl_uint64(
226+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SCRYPT_P, p);
227+
}
228+
229+
auto EVP_PKEY_CTX_set_scrypt_maxmem_bytes ()
230+
(EVP_PKEY_CTX* ctx, ulong maxmem_bytes)
231+
{
232+
return EVP_PKEY_CTX_ctrl_uint64(
233+
pctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES, maxmem_bytes);
234+
}
235+
}
236+
}

source/deimos/openssl/types.d

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import deimos.openssl._d_util;
1515

1616
public import deimos.openssl.e_os2;
1717

18+
struct OSSL_PROVIDER; /* Provider Object */
19+
1820
version (NO_ASN1_TYPEDEFS) {
1921
alias ASN1_STRING ASN1_INTEGER;
2022
alias ASN1_STRING ASN1_ENUMERATED;
@@ -100,6 +102,9 @@ alias evp_pkey_method_st EVP_PKEY_METHOD;
100102
struct evp_pkey_ctx_st;
101103
alias evp_pkey_ctx_st EVP_PKEY_CTX;
102104

105+
struct EVP_KDF;
106+
struct EVP_KDF_CTX;
107+
103108
import deimos.openssl.dh;
104109
/*struct dh_st;*/
105110
alias dh_st DH;
@@ -218,3 +223,7 @@ alias ocsp_req_ctx_st OCSP_REQ_CTX;
218223
alias ocsp_response_st OCSP_RESPONSE;
219224
/*struct ocsp_responder_id_st;*/
220225
alias ocsp_responder_id_st OCSP_RESPID;
226+
227+
struct OSSL_LIB_CTX;
228+
229+
struct OSSL_PARAM;

0 commit comments

Comments
 (0)