Coverage Report

Created: 2026-06-09 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/hostap/src/crypto/crypto_openssl.c
Line
Count
Source
1
/*
2
 * Wrapper functions for OpenSSL libcrypto
3
 * Copyright (c) 2004-2024, Jouni Malinen <j@w1.fi>
4
 *
5
 * This software may be distributed under the terms of the BSD license.
6
 * See README for more details.
7
 */
8
9
#include "includes.h"
10
#include <openssl/opensslv.h>
11
#include <openssl/err.h>
12
#include <openssl/des.h>
13
#include <openssl/aes.h>
14
#include <openssl/bn.h>
15
#include <openssl/evp.h>
16
#include <openssl/dh.h>
17
#include <openssl/hmac.h>
18
#include <openssl/rand.h>
19
#include <openssl/rsa.h>
20
#include <openssl/pem.h>
21
#ifdef CONFIG_ECC
22
#include <openssl/ec.h>
23
#include <openssl/x509.h>
24
#endif /* CONFIG_ECC */
25
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
26
#include <openssl/provider.h>
27
#include <openssl/core_names.h>
28
#include <openssl/param_build.h>
29
#include <openssl/encoder.h>
30
#include <openssl/decoder.h>
31
#else /* OpenSSL version >= 3.0 */
32
#include <openssl/cmac.h>
33
#endif /* OpenSSL version >= 3.0 */
34
#ifdef CONFIG_DPP3
35
#if OPENSSL_VERSION_NUMBER >= 0x30200000L
36
#include <openssl/hpke.h>
37
#endif
38
#endif /* CONFIG_DPP3 */
39
40
#include "common.h"
41
#include "utils/const_time.h"
42
#include "wpabuf.h"
43
#include "dh_group5.h"
44
#include "sha1.h"
45
#include "sha256.h"
46
#include "sha384.h"
47
#include "sha512.h"
48
#include "md5.h"
49
#include "aes_wrap.h"
50
#include "crypto.h"
51
52
#if OPENSSL_VERSION_NUMBER < 0x10100000L
53
/* Compatibility wrappers for older versions. */
54
55
static HMAC_CTX * HMAC_CTX_new(void)
56
{
57
  HMAC_CTX *ctx;
58
59
  ctx = os_zalloc(sizeof(*ctx));
60
  if (ctx)
61
    HMAC_CTX_init(ctx);
62
  return ctx;
63
}
64
65
66
static void HMAC_CTX_free(HMAC_CTX *ctx)
67
{
68
  if (!ctx)
69
    return;
70
  HMAC_CTX_cleanup(ctx);
71
  bin_clear_free(ctx, sizeof(*ctx));
72
}
73
74
75
static EVP_MD_CTX * EVP_MD_CTX_new(void)
76
{
77
  EVP_MD_CTX *ctx;
78
79
  ctx = os_zalloc(sizeof(*ctx));
80
  if (ctx)
81
    EVP_MD_CTX_init(ctx);
82
  return ctx;
83
}
84
85
86
static void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
87
{
88
  if (!ctx)
89
    return;
90
  EVP_MD_CTX_cleanup(ctx);
91
  bin_clear_free(ctx, sizeof(*ctx));
92
}
93
94
95
#ifdef CONFIG_ECC
96
97
static EC_KEY * EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey)
98
{
99
  if (pkey->type != EVP_PKEY_EC)
100
    return NULL;
101
  return pkey->pkey.ec;
102
}
103
104
105
static int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s)
106
{
107
  sig->r = r;
108
  sig->s = s;
109
  return 1;
110
}
111
112
113
static void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr,
114
         const BIGNUM **ps)
115
{
116
  if (pr)
117
    *pr = sig->r;
118
  if (ps)
119
    *ps = sig->s;
120
}
121
122
#endif /* CONFIG_ECC */
123
124
static const unsigned char * ASN1_STRING_get0_data(const ASN1_STRING *x)
125
{
126
  return ASN1_STRING_data((ASN1_STRING *) x);
127
}
128
129
130
static const ASN1_TIME * X509_get0_notBefore(const X509 *x)
131
{
132
  return X509_get_notBefore(x);
133
}
134
135
136
static const ASN1_TIME * X509_get0_notAfter(const X509 *x)
137
{
138
  return X509_get_notAfter(x);
139
}
140
141
#endif /* OpenSSL version < 1.1.0 */
142
143
144
#if OPENSSL_VERSION_NUMBER < 0x10101000L || \
145
  (defined(LIBRESSL_VERSION_NUMBER) && \
146
   LIBRESSL_VERSION_NUMBER < 0x30400000L)
147
148
static int EC_POINT_get_affine_coordinates(const EC_GROUP *group,
149
             const EC_POINT *point, BIGNUM *x,
150
             BIGNUM *y, BN_CTX *ctx)
151
{
152
  return EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx);
153
}
154
155
156
static int EC_POINT_set_affine_coordinates(const EC_GROUP *group,
157
             EC_POINT *point, const BIGNUM *x,
158
             const BIGNUM *y, BN_CTX *ctx)
159
{
160
  return EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx);
161
}
162
163
#endif /* OpenSSL version < 1.1.1 */
164
165
166
#if OPENSSL_VERSION_NUMBER < 0x10101000L || \
167
  defined(OPENSSL_IS_BORINGSSL) || \
168
  (defined(LIBRESSL_VERSION_NUMBER) && \
169
   LIBRESSL_VERSION_NUMBER < 0x30400000L)
170
171
static int EC_POINT_set_compressed_coordinates(const EC_GROUP *group,
172
                 EC_POINT *point, const BIGNUM *x,
173
                 int y_bit, BN_CTX *ctx)
174
{
175
  return EC_POINT_set_compressed_coordinates_GFp(group, point, x, y_bit,
176
                   ctx);
177
}
178
179
180
static int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a,
181
            BIGNUM *b, BN_CTX *ctx)
182
{
183
  return EC_GROUP_get_curve_GFp(group, p, a, b, ctx);
184
}
185
186
#endif /* OpenSSL version < 1.1.1 */
187
188
189
static void openssl_disable_fips(void)
190
0
{
191
0
#ifndef CONFIG_FIPS
192
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
193
  static bool done = false;
194
195
  if (done)
196
    return;
197
  done = true;
198
199
  if (!EVP_default_properties_is_fips_enabled(NULL))
200
    return; /* FIPS mode is not enabled */
201
202
  if (!EVP_default_properties_enable_fips(NULL, 0))
203
    wpa_printf(MSG_INFO,
204
         "OpenSSL: Failed to disable FIPS mode");
205
  else
206
    wpa_printf(MSG_DEBUG,
207
         "OpenSSL: Disabled FIPS mode to enable non-FIPS-compliant algorithms and parameters");
208
#endif /* OpenSSL version >= 3.0 */
209
0
#endif /* !CONFIG_FIPS */
210
0
}
211
212
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
213
static OSSL_PROVIDER *openssl_legacy_provider = NULL;
214
static OSSL_PROVIDER *openssl_default_provider = NULL;
215
#endif /* OpenSSL version >= 3.0 */
216
217
void openssl_load_legacy_provider(void)
218
0
{
219
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
220
  if (openssl_legacy_provider)
221
    return;
222
223
  openssl_legacy_provider = OSSL_PROVIDER_try_load(NULL, "legacy", 1);
224
#endif /* OpenSSL version >= 3.0 */
225
0
}
226
227
228
static void openssl_unload_legacy_provider(void)
229
0
{
230
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
231
  if (openssl_legacy_provider) {
232
    OSSL_PROVIDER_unload(openssl_legacy_provider);
233
    openssl_legacy_provider = NULL;
234
  }
235
#endif /* OpenSSL version >= 3.0 */
236
0
}
237
238
239
static void openssl_load_default_provider_if_fips(void)
240
0
{
241
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
242
  if (openssl_default_provider)
243
    return;
244
245
  if (!OSSL_PROVIDER_available(NULL, "fips"))
246
    return;
247
248
  wpa_printf(MSG_DEBUG,
249
       "OpenSSL: Load default provider to replace fips provider when needed");
250
  openssl_default_provider = OSSL_PROVIDER_try_load(NULL, "default", 1);
251
  if (!openssl_default_provider)
252
    wpa_printf(MSG_DEBUG,
253
         "OpenSSL: Failed to load default provider");
254
#endif /* OpenSSL version >= 3.0 */
255
0
}
256
257
258
static void openssl_unload_default_provider(void)
259
0
{
260
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
261
  if (openssl_default_provider) {
262
    OSSL_PROVIDER_unload(openssl_default_provider);
263
    openssl_default_provider = NULL;
264
  }
265
#endif /* OpenSSL version >= 3.0 */
266
0
}
267
268
269
#if OPENSSL_VERSION_NUMBER < 0x30000000L
270
271
static BIGNUM * get_group5_prime(void)
272
0
{
273
0
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
274
0
  return BN_get_rfc3526_prime_1536(NULL);
275
#elif !defined(OPENSSL_IS_BORINGSSL)
276
  return get_rfc3526_prime_1536(NULL);
277
#else
278
  static const unsigned char RFC3526_PRIME_1536[] = {
279
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,
280
    0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,
281
    0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6,
282
    0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
283
    0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,
284
    0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,
285
    0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9,
286
    0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
287
    0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,
288
    0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,
289
    0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36,
290
    0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
291
    0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,
292
    0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,
293
    0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08,
294
    0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
295
  };
296
        return BN_bin2bn(RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536), NULL);
297
#endif
298
0
}
299
300
301
static BIGNUM * get_group5_order(void)
302
0
{
303
0
  static const unsigned char RFC3526_ORDER_1536[] = {
304
0
    0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE4,0x87,0xED,0x51,
305
0
    0x10,0xB4,0x61,0x1A,0x62,0x63,0x31,0x45,0xC0,0x6E,0x0E,0x68,
306
0
    0x94,0x81,0x27,0x04,0x45,0x33,0xE6,0x3A,0x01,0x05,0xDF,0x53,
307
0
    0x1D,0x89,0xCD,0x91,0x28,0xA5,0x04,0x3C,0xC7,0x1A,0x02,0x6E,
308
0
    0xF7,0xCA,0x8C,0xD9,0xE6,0x9D,0x21,0x8D,0x98,0x15,0x85,0x36,
309
0
    0xF9,0x2F,0x8A,0x1B,0xA7,0xF0,0x9A,0xB6,0xB6,0xA8,0xE1,0x22,
310
0
    0xF2,0x42,0xDA,0xBB,0x31,0x2F,0x3F,0x63,0x7A,0x26,0x21,0x74,
311
0
    0xD3,0x1B,0xF6,0xB5,0x85,0xFF,0xAE,0x5B,0x7A,0x03,0x5B,0xF6,
312
0
    0xF7,0x1C,0x35,0xFD,0xAD,0x44,0xCF,0xD2,0xD7,0x4F,0x92,0x08,
313
0
    0xBE,0x25,0x8F,0xF3,0x24,0x94,0x33,0x28,0xF6,0x72,0x2D,0x9E,
314
0
    0xE1,0x00,0x3E,0x5C,0x50,0xB1,0xDF,0x82,0xCC,0x6D,0x24,0x1B,
315
0
    0x0E,0x2A,0xE9,0xCD,0x34,0x8B,0x1F,0xD4,0x7E,0x92,0x67,0xAF,
316
0
    0xC1,0xB2,0xAE,0x91,0xEE,0x51,0xD6,0xCB,0x0E,0x31,0x79,0xAB,
317
0
    0x10,0x42,0xA9,0x5D,0xCF,0x6A,0x94,0x83,0xB8,0x4B,0x4B,0x36,
318
0
    0xB3,0x86,0x1A,0xA7,0x25,0x5E,0x4C,0x02,0x78,0xBA,0x36,0x04,
319
0
    0x65,0x11,0xB9,0x93,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
320
0
  };
321
0
  return BN_bin2bn(RFC3526_ORDER_1536, sizeof(RFC3526_ORDER_1536), NULL);
322
0
}
323
324
#endif /* OpenSSL version < 3.0 */
325
326
327
#ifdef OPENSSL_NO_SHA256
328
#define NO_SHA256_WRAPPER
329
#endif
330
#ifdef OPENSSL_NO_SHA512
331
#define NO_SHA384_WRAPPER
332
#endif
333
334
static int openssl_digest_vector(const EVP_MD *type, size_t num_elem,
335
         const u8 *addr[], const size_t *len, u8 *mac)
336
0
{
337
0
  EVP_MD_CTX *ctx;
338
0
  size_t i;
339
0
  unsigned int mac_len;
340
341
0
  if (TEST_FAIL())
342
0
    return -1;
343
344
0
  ctx = EVP_MD_CTX_new();
345
0
  if (!ctx)
346
0
    return -1;
347
0
  if (!EVP_DigestInit_ex(ctx, type, NULL)) {
348
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestInit_ex failed: %s",
349
0
         ERR_error_string(ERR_get_error(), NULL));
350
0
    EVP_MD_CTX_free(ctx);
351
0
    return -1;
352
0
  }
353
0
  for (i = 0; i < num_elem; i++) {
354
0
    if (!EVP_DigestUpdate(ctx, addr[i], len[i])) {
355
0
      wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestUpdate "
356
0
           "failed: %s",
357
0
           ERR_error_string(ERR_get_error(), NULL));
358
0
      EVP_MD_CTX_free(ctx);
359
0
      return -1;
360
0
    }
361
0
  }
362
0
  if (!EVP_DigestFinal(ctx, mac, &mac_len)) {
363
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestFinal failed: %s",
364
0
         ERR_error_string(ERR_get_error(), NULL));
365
0
    EVP_MD_CTX_free(ctx);
366
0
    return -1;
367
0
  }
368
0
  EVP_MD_CTX_free(ctx);
369
370
0
  return 0;
371
0
}
372
373
374
#ifndef CONFIG_FIPS
375
376
static void openssl_need_md5(void)
377
0
{
378
0
  openssl_disable_fips();
379
0
  openssl_load_default_provider_if_fips();
380
0
}
381
382
383
int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
384
0
{
385
0
  openssl_disable_fips();
386
0
  openssl_load_legacy_provider();
387
0
  return openssl_digest_vector(EVP_md4(), num_elem, addr, len, mac);
388
0
}
389
390
391
int des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
392
0
{
393
0
  u8 pkey[8], next, tmp;
394
0
  int i, plen, ret = -1;
395
0
  EVP_CIPHER_CTX *ctx;
396
397
0
  openssl_load_legacy_provider();
398
399
  /* Add parity bits to the key */
400
0
  next = 0;
401
0
  for (i = 0; i < 7; i++) {
402
0
    tmp = key[i];
403
0
    pkey[i] = (tmp >> i) | next | 1;
404
0
    next = tmp << (7 - i);
405
0
  }
406
0
  pkey[i] = next | 1;
407
408
0
  ctx = EVP_CIPHER_CTX_new();
409
0
  if (ctx &&
410
0
      EVP_EncryptInit_ex(ctx, EVP_des_ecb(), NULL, pkey, NULL) == 1 &&
411
0
      EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
412
0
      EVP_EncryptUpdate(ctx, cypher, &plen, clear, 8) == 1 &&
413
0
      EVP_EncryptFinal_ex(ctx, &cypher[plen], &plen) == 1)
414
0
    ret = 0;
415
0
  else
416
0
    wpa_printf(MSG_ERROR, "OpenSSL: DES encrypt failed");
417
418
0
  if (ctx)
419
0
    EVP_CIPHER_CTX_free(ctx);
420
0
  return ret;
421
0
}
422
423
424
#ifndef CONFIG_NO_RC4
425
int rc4_skip(const u8 *key, size_t keylen, size_t skip,
426
       u8 *data, size_t data_len)
427
0
{
428
#ifdef OPENSSL_NO_RC4
429
  return -1;
430
#else /* OPENSSL_NO_RC4 */
431
0
  EVP_CIPHER_CTX *ctx;
432
0
  int outl;
433
0
  int res = -1;
434
0
  unsigned char skip_buf[16] = { 0 };
435
436
0
  openssl_load_legacy_provider();
437
438
0
  ctx = EVP_CIPHER_CTX_new();
439
0
  if (!ctx ||
440
0
      !EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, NULL, NULL, 1) ||
441
0
      !EVP_CIPHER_CTX_set_padding(ctx, 0) ||
442
0
      !EVP_CIPHER_CTX_set_key_length(ctx, keylen) ||
443
0
      !EVP_CipherInit_ex(ctx, NULL, NULL, key, NULL, 1))
444
0
    goto out;
445
446
0
  while (skip >= sizeof(skip_buf)) {
447
0
    size_t len = skip;
448
0
    if (len > sizeof(skip_buf))
449
0
      len = sizeof(skip_buf);
450
0
    if (!EVP_CipherUpdate(ctx, skip_buf, &outl, skip_buf, len))
451
0
      goto out;
452
0
    skip -= len;
453
0
  }
454
455
0
  if (EVP_CipherUpdate(ctx, data, &outl, data, data_len))
456
0
    res = 0;
457
458
0
out:
459
0
  if (ctx)
460
0
    EVP_CIPHER_CTX_free(ctx);
461
0
  return res;
462
0
#endif /* OPENSSL_NO_RC4 */
463
0
}
464
#endif /* CONFIG_NO_RC4 */
465
466
467
int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
468
0
{
469
0
  openssl_need_md5();
470
0
  return openssl_digest_vector(EVP_md5(), num_elem, addr, len, mac);
471
0
}
472
473
#endif /* CONFIG_FIPS */
474
475
476
int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
477
0
{
478
0
  return openssl_digest_vector(EVP_sha1(), num_elem, addr, len, mac);
479
0
}
480
481
482
#ifndef NO_SHA256_WRAPPER
483
int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len,
484
      u8 *mac)
485
0
{
486
0
  return openssl_digest_vector(EVP_sha256(), num_elem, addr, len, mac);
487
0
}
488
#endif /* NO_SHA256_WRAPPER */
489
490
491
#ifndef NO_SHA384_WRAPPER
492
int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
493
      u8 *mac)
494
0
{
495
0
  return openssl_digest_vector(EVP_sha384(), num_elem, addr, len, mac);
496
0
}
497
#endif /* NO_SHA384_WRAPPER */
498
499
500
#ifndef NO_SHA512_WRAPPER
501
int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len,
502
      u8 *mac)
503
0
{
504
0
  return openssl_digest_vector(EVP_sha512(), num_elem, addr, len, mac);
505
0
}
506
#endif /* NO_SHA512_WRAPPER */
507
508
509
static const EVP_CIPHER * aes_get_evp_cipher(size_t keylen)
510
0
{
511
0
  switch (keylen) {
512
0
  case 16:
513
0
    return EVP_aes_128_ecb();
514
0
  case 24:
515
0
    return EVP_aes_192_ecb();
516
0
  case 32:
517
0
    return EVP_aes_256_ecb();
518
0
  default:
519
0
    return NULL;
520
0
  }
521
0
}
522
523
524
void * aes_encrypt_init(const u8 *key, size_t len)
525
0
{
526
0
  EVP_CIPHER_CTX *ctx;
527
0
  const EVP_CIPHER *type;
528
529
0
  if (TEST_FAIL())
530
0
    return NULL;
531
532
0
  type = aes_get_evp_cipher(len);
533
0
  if (!type) {
534
0
    wpa_printf(MSG_INFO, "%s: Unsupported len=%u",
535
0
         __func__, (unsigned int) len);
536
0
    return NULL;
537
0
  }
538
539
0
  ctx = EVP_CIPHER_CTX_new();
540
0
  if (ctx == NULL)
541
0
    return NULL;
542
0
  if (EVP_EncryptInit_ex(ctx, type, NULL, key, NULL) != 1 ||
543
0
      EVP_CIPHER_CTX_set_padding(ctx, 0) != 1) {
544
0
    EVP_CIPHER_CTX_free(ctx);
545
0
    return NULL;
546
0
  }
547
0
  return ctx;
548
0
}
549
550
551
int aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
552
0
{
553
0
  EVP_CIPHER_CTX *c = ctx;
554
0
  int clen = 16;
555
0
  if (EVP_EncryptUpdate(c, crypt, &clen, plain, 16) != 1) {
556
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptUpdate failed: %s",
557
0
         ERR_error_string(ERR_get_error(), NULL));
558
0
    return -1;
559
0
  }
560
0
  return 0;
561
0
}
562
563
564
void aes_encrypt_deinit(void *ctx)
565
0
{
566
0
  EVP_CIPHER_CTX *c = ctx;
567
0
  u8 buf[16];
568
0
  int len = sizeof(buf);
569
0
  if (EVP_EncryptFinal_ex(c, buf, &len) != 1) {
570
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptFinal_ex failed: "
571
0
         "%s", ERR_error_string(ERR_get_error(), NULL));
572
0
  }
573
0
  if (len != 0) {
574
0
    wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d "
575
0
         "in AES encrypt", len);
576
0
  }
577
0
  EVP_CIPHER_CTX_free(c);
578
0
}
579
580
581
void * aes_decrypt_init(const u8 *key, size_t len)
582
0
{
583
0
  EVP_CIPHER_CTX *ctx;
584
0
  const EVP_CIPHER *type;
585
586
0
  if (TEST_FAIL())
587
0
    return NULL;
588
589
0
  type = aes_get_evp_cipher(len);
590
0
  if (!type) {
591
0
    wpa_printf(MSG_INFO, "%s: Unsupported len=%u",
592
0
         __func__, (unsigned int) len);
593
0
    return NULL;
594
0
  }
595
596
0
  ctx = EVP_CIPHER_CTX_new();
597
0
  if (ctx == NULL)
598
0
    return NULL;
599
0
  if (EVP_DecryptInit_ex(ctx, type, NULL, key, NULL) != 1 ||
600
0
      EVP_CIPHER_CTX_set_padding(ctx, 0) != 1) {
601
0
    EVP_CIPHER_CTX_free(ctx);
602
0
    return NULL;
603
0
  }
604
0
  return ctx;
605
0
}
606
607
608
int aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
609
0
{
610
0
  EVP_CIPHER_CTX *c = ctx;
611
0
  int plen = 16;
612
0
  if (EVP_DecryptUpdate(c, plain, &plen, crypt, 16) != 1) {
613
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptUpdate failed: %s",
614
0
         ERR_error_string(ERR_get_error(), NULL));
615
0
    return -1;
616
0
  }
617
0
  return 0;
618
0
}
619
620
621
void aes_decrypt_deinit(void *ctx)
622
0
{
623
0
  EVP_CIPHER_CTX *c = ctx;
624
0
  u8 buf[16];
625
0
  int len = sizeof(buf);
626
0
  if (EVP_DecryptFinal_ex(c, buf, &len) != 1) {
627
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptFinal_ex failed: "
628
0
         "%s", ERR_error_string(ERR_get_error(), NULL));
629
0
  }
630
0
  if (len != 0) {
631
0
    wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d "
632
0
         "in AES decrypt", len);
633
0
  }
634
0
  EVP_CIPHER_CTX_free(c);
635
0
}
636
637
638
#ifndef CONFIG_FIPS
639
#ifndef CONFIG_OPENSSL_INTERNAL_AES_WRAP
640
641
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
642
static const EVP_CIPHER * aes_get_evp_wrap_cipher(size_t keylen)
643
{
644
  switch (keylen) {
645
  case 16:
646
    return EVP_aes_128_wrap();
647
  case 24:
648
    return EVP_aes_192_wrap();
649
  case 32:
650
    return EVP_aes_256_wrap();
651
  default:
652
    return NULL;
653
  }
654
}
655
#endif /* OpenSSL version >= 3.0 */
656
657
658
int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher)
659
0
{
660
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
661
  EVP_CIPHER_CTX *ctx;
662
  const EVP_CIPHER *type;
663
  int ret = -1, len;
664
  u8 buf[16];
665
666
  if (TEST_FAIL())
667
    return -1;
668
669
  type = aes_get_evp_wrap_cipher(kek_len);
670
  if (!type)
671
    return -1;
672
673
  ctx = EVP_CIPHER_CTX_new();
674
  if (!ctx)
675
    return -1;
676
677
  if (EVP_EncryptInit_ex(ctx, type, NULL, kek, NULL) == 1 &&
678
      EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
679
      EVP_EncryptUpdate(ctx, cipher, &len, plain, n * 8) == 1 &&
680
      len == (n + 1) * 8 &&
681
      EVP_EncryptFinal_ex(ctx, buf, &len) == 1)
682
    ret = 0;
683
684
  EVP_CIPHER_CTX_free(ctx);
685
  return ret;
686
#else /* OpenSSL version >= 3.0 */
687
0
  AES_KEY actx;
688
0
  int res;
689
690
0
  if (TEST_FAIL())
691
0
    return -1;
692
0
  if (AES_set_encrypt_key(kek, kek_len << 3, &actx))
693
0
    return -1;
694
0
  res = AES_wrap_key(&actx, NULL, cipher, plain, n * 8);
695
0
  OPENSSL_cleanse(&actx, sizeof(actx));
696
0
  return res <= 0 ? -1 : 0;
697
0
#endif /* OpenSSL version >= 3.0 */
698
0
}
699
700
701
int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher,
702
         u8 *plain)
703
0
{
704
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
705
  EVP_CIPHER_CTX *ctx;
706
  const EVP_CIPHER *type;
707
  int ret = -1, len;
708
  u8 buf[16];
709
710
  if (TEST_FAIL())
711
    return -1;
712
713
  type = aes_get_evp_wrap_cipher(kek_len);
714
  if (!type)
715
    return -1;
716
717
  ctx = EVP_CIPHER_CTX_new();
718
  if (!ctx)
719
    return -1;
720
721
  if (EVP_DecryptInit_ex(ctx, type, NULL, kek, NULL) == 1 &&
722
      EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
723
      EVP_DecryptUpdate(ctx, plain, &len, cipher, (n + 1) * 8) == 1 &&
724
      len == n * 8 &&
725
      EVP_DecryptFinal_ex(ctx, buf, &len) == 1)
726
    ret = 0;
727
728
  EVP_CIPHER_CTX_free(ctx);
729
  return ret;
730
#else /* OpenSSL version >= 3.0 */
731
0
  AES_KEY actx;
732
0
  int res;
733
734
0
  if (TEST_FAIL())
735
0
    return -1;
736
0
  if (AES_set_decrypt_key(kek, kek_len << 3, &actx))
737
0
    return -1;
738
0
  res = AES_unwrap_key(&actx, NULL, plain, cipher, (n + 1) * 8);
739
0
  OPENSSL_cleanse(&actx, sizeof(actx));
740
0
  return res <= 0 ? -1 : 0;
741
0
#endif /* OpenSSL version >= 3.0 */
742
0
}
743
744
#endif /* CONFIG_OPENSSL_INTERNAL_AES_WRAP */
745
#endif /* CONFIG_FIPS */
746
747
748
int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
749
0
{
750
0
  EVP_CIPHER_CTX *ctx;
751
0
  int clen, len;
752
0
  u8 buf[16];
753
0
  int res = -1;
754
755
0
  if (TEST_FAIL())
756
0
    return -1;
757
758
0
  ctx = EVP_CIPHER_CTX_new();
759
0
  if (!ctx)
760
0
    return -1;
761
0
  clen = data_len;
762
0
  len = sizeof(buf);
763
0
  if (EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) == 1 &&
764
0
      EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
765
0
      EVP_EncryptUpdate(ctx, data, &clen, data, data_len) == 1 &&
766
0
      clen == (int) data_len &&
767
0
      EVP_EncryptFinal_ex(ctx, buf, &len) == 1 && len == 0)
768
0
    res = 0;
769
0
  EVP_CIPHER_CTX_free(ctx);
770
771
0
  return res;
772
0
}
773
774
775
int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
776
0
{
777
0
  EVP_CIPHER_CTX *ctx;
778
0
  int plen, len;
779
0
  u8 buf[16];
780
0
  int res = -1;
781
782
0
  if (TEST_FAIL())
783
0
    return -1;
784
785
0
  ctx = EVP_CIPHER_CTX_new();
786
0
  if (!ctx)
787
0
    return -1;
788
0
  plen = data_len;
789
0
  len = sizeof(buf);
790
0
  if (EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) == 1 &&
791
0
      EVP_CIPHER_CTX_set_padding(ctx, 0) == 1 &&
792
0
      EVP_DecryptUpdate(ctx, data, &plen, data, data_len) == 1 &&
793
0
      plen == (int) data_len &&
794
0
      EVP_DecryptFinal_ex(ctx, buf, &len) == 1 && len == 0)
795
0
    res = 0;
796
0
  EVP_CIPHER_CTX_free(ctx);
797
798
0
  return res;
799
800
0
}
801
802
803
int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey,
804
       u8 *pubkey)
805
0
{
806
0
  size_t pubkey_len, pad;
807
808
0
  if (os_get_random(privkey, prime_len) < 0)
809
0
    return -1;
810
0
  if (os_memcmp(privkey, prime, prime_len) > 0) {
811
    /* Make sure private value is smaller than prime */
812
0
    privkey[0] = 0;
813
0
  }
814
815
0
  pubkey_len = prime_len;
816
0
  if (crypto_mod_exp(&generator, 1, privkey, prime_len, prime, prime_len,
817
0
         pubkey, &pubkey_len) < 0)
818
0
    return -1;
819
0
  if (pubkey_len < prime_len) {
820
0
    pad = prime_len - pubkey_len;
821
0
    os_memmove(pubkey + pad, pubkey, pubkey_len);
822
0
    os_memset(pubkey, 0, pad);
823
0
  }
824
825
0
  return 0;
826
0
}
827
828
829
int crypto_dh_derive_secret(u8 generator, const u8 *prime, size_t prime_len,
830
          const u8 *order, size_t order_len,
831
          const u8 *privkey, size_t privkey_len,
832
          const u8 *pubkey, size_t pubkey_len,
833
          u8 *secret, size_t *len)
834
0
{
835
0
  BIGNUM *pub, *p;
836
0
  int res = -1;
837
838
0
  pub = BN_bin2bn(pubkey, pubkey_len, NULL);
839
0
  p = BN_bin2bn(prime, prime_len, NULL);
840
0
  if (!pub || !p || BN_is_zero(pub) || BN_is_one(pub) ||
841
0
      BN_cmp(pub, p) >= 0)
842
0
    goto fail;
843
844
0
  if (order) {
845
0
    BN_CTX *ctx;
846
0
    BIGNUM *q, *tmp;
847
0
    int failed;
848
849
    /* verify: pubkey^q == 1 mod p */
850
0
    q = BN_bin2bn(order, order_len, NULL);
851
0
    ctx = BN_CTX_new();
852
0
    tmp = BN_new();
853
0
    failed = !q || !ctx || !tmp ||
854
0
      !BN_mod_exp(tmp, pub, q, p, ctx) ||
855
0
      !BN_is_one(tmp);
856
0
    BN_clear_free(q);
857
0
    BN_clear_free(tmp);
858
0
    BN_CTX_free(ctx);
859
0
    if (failed)
860
0
      goto fail;
861
0
  }
862
863
0
  res = crypto_mod_exp(pubkey, pubkey_len, privkey, privkey_len,
864
0
           prime, prime_len, secret, len);
865
0
fail:
866
0
  BN_clear_free(pub);
867
0
  BN_clear_free(p);
868
0
  return res;
869
0
}
870
871
872
int crypto_mod_exp(const u8 *base, size_t base_len,
873
       const u8 *power, size_t power_len,
874
       const u8 *modulus, size_t modulus_len,
875
       u8 *result, size_t *result_len)
876
0
{
877
0
  BIGNUM *bn_base, *bn_exp, *bn_modulus, *bn_result;
878
0
  int ret = -1;
879
0
  BN_CTX *ctx;
880
881
0
  ctx = BN_CTX_new();
882
0
  if (ctx == NULL)
883
0
    return -1;
884
885
0
  bn_base = BN_bin2bn(base, base_len, NULL);
886
0
  bn_exp = BN_bin2bn(power, power_len, NULL);
887
0
  bn_modulus = BN_bin2bn(modulus, modulus_len, NULL);
888
0
  bn_result = BN_new();
889
890
0
  if (bn_base == NULL || bn_exp == NULL || bn_modulus == NULL ||
891
0
      bn_result == NULL)
892
0
    goto error;
893
894
0
  if (BN_mod_exp_mont_consttime(bn_result, bn_base, bn_exp, bn_modulus,
895
0
              ctx, NULL) != 1)
896
0
    goto error;
897
898
0
  *result_len = BN_bn2bin(bn_result, result);
899
0
  ret = 0;
900
901
0
error:
902
0
  BN_clear_free(bn_base);
903
0
  BN_clear_free(bn_exp);
904
0
  BN_clear_free(bn_modulus);
905
0
  BN_clear_free(bn_result);
906
0
  BN_CTX_free(ctx);
907
0
  return ret;
908
0
}
909
910
911
struct crypto_cipher {
912
  EVP_CIPHER_CTX *enc;
913
  EVP_CIPHER_CTX *dec;
914
};
915
916
917
struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg,
918
            const u8 *iv, const u8 *key,
919
            size_t key_len)
920
0
{
921
0
  struct crypto_cipher *ctx;
922
0
  const EVP_CIPHER *cipher;
923
924
0
  ctx = os_zalloc(sizeof(*ctx));
925
0
  if (ctx == NULL)
926
0
    return NULL;
927
928
0
  switch (alg) {
929
0
#ifndef CONFIG_NO_RC4
930
0
#ifndef OPENSSL_NO_RC4
931
0
  case CRYPTO_CIPHER_ALG_RC4:
932
0
    cipher = EVP_rc4();
933
0
    break;
934
0
#endif /* OPENSSL_NO_RC4 */
935
0
#endif /* CONFIG_NO_RC4 */
936
0
#ifndef OPENSSL_NO_AES
937
0
  case CRYPTO_CIPHER_ALG_AES:
938
0
    switch (key_len) {
939
0
    case 16:
940
0
      cipher = EVP_aes_128_cbc();
941
0
      break;
942
0
#ifndef OPENSSL_IS_BORINGSSL
943
0
    case 24:
944
0
      cipher = EVP_aes_192_cbc();
945
0
      break;
946
0
#endif /* OPENSSL_IS_BORINGSSL */
947
0
    case 32:
948
0
      cipher = EVP_aes_256_cbc();
949
0
      break;
950
0
    default:
951
0
      os_free(ctx);
952
0
      return NULL;
953
0
    }
954
0
    break;
955
0
#endif /* OPENSSL_NO_AES */
956
0
#ifndef OPENSSL_NO_DES
957
0
  case CRYPTO_CIPHER_ALG_3DES:
958
0
    cipher = EVP_des_ede3_cbc();
959
0
    break;
960
0
  case CRYPTO_CIPHER_ALG_DES:
961
0
    cipher = EVP_des_cbc();
962
0
    break;
963
0
#endif /* OPENSSL_NO_DES */
964
0
#ifndef OPENSSL_NO_NULL
965
0
  case CRYPTO_CIPHER_NULL:
966
0
    cipher = EVP_enc_null();
967
0
    break;
968
0
#endif /* OPENSSL_NO_NULL */
969
0
  default:
970
0
    os_free(ctx);
971
0
    return NULL;
972
0
  }
973
974
0
  if (!(ctx->enc = EVP_CIPHER_CTX_new()) ||
975
0
      !EVP_EncryptInit_ex(ctx->enc, cipher, NULL, NULL, NULL) ||
976
0
      !EVP_CIPHER_CTX_set_padding(ctx->enc, 0) ||
977
0
      !EVP_CIPHER_CTX_set_key_length(ctx->enc, key_len) ||
978
0
      !EVP_EncryptInit_ex(ctx->enc, NULL, NULL, key, iv)) {
979
0
    if (ctx->enc)
980
0
      EVP_CIPHER_CTX_free(ctx->enc);
981
0
    os_free(ctx);
982
0
    return NULL;
983
0
  }
984
985
0
  if (!(ctx->dec = EVP_CIPHER_CTX_new()) ||
986
0
      !EVP_DecryptInit_ex(ctx->dec, cipher, NULL, NULL, NULL) ||
987
0
      !EVP_CIPHER_CTX_set_padding(ctx->dec, 0) ||
988
0
      !EVP_CIPHER_CTX_set_key_length(ctx->dec, key_len) ||
989
0
      !EVP_DecryptInit_ex(ctx->dec, NULL, NULL, key, iv)) {
990
0
    EVP_CIPHER_CTX_free(ctx->enc);
991
0
    if (ctx->dec)
992
0
      EVP_CIPHER_CTX_free(ctx->dec);
993
0
    os_free(ctx);
994
0
    return NULL;
995
0
  }
996
997
0
  return ctx;
998
0
}
999
1000
1001
int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain,
1002
        u8 *crypt, size_t len)
1003
0
{
1004
0
  int outl;
1005
0
  if (!EVP_EncryptUpdate(ctx->enc, crypt, &outl, plain, len))
1006
0
    return -1;
1007
0
  return 0;
1008
0
}
1009
1010
1011
int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt,
1012
        u8 *plain, size_t len)
1013
0
{
1014
0
  int outl;
1015
0
  outl = len;
1016
0
  if (!EVP_DecryptUpdate(ctx->dec, plain, &outl, crypt, len))
1017
0
    return -1;
1018
0
  return 0;
1019
0
}
1020
1021
1022
void crypto_cipher_deinit(struct crypto_cipher *ctx)
1023
0
{
1024
0
  EVP_CIPHER_CTX_free(ctx->enc);
1025
0
  EVP_CIPHER_CTX_free(ctx->dec);
1026
0
  os_free(ctx);
1027
0
}
1028
1029
1030
void * dh5_init(struct wpabuf **priv, struct wpabuf **publ)
1031
0
{
1032
#if OPENSSL_VERSION_NUMBER < 0x10100000L
1033
  DH *dh;
1034
  struct wpabuf *pubkey = NULL, *privkey = NULL;
1035
  size_t publen, privlen;
1036
1037
  *priv = NULL;
1038
  wpabuf_free(*publ);
1039
  *publ = NULL;
1040
1041
  dh = DH_new();
1042
  if (dh == NULL)
1043
    return NULL;
1044
1045
  dh->g = BN_new();
1046
  if (dh->g == NULL || BN_set_word(dh->g, 2) != 1)
1047
    goto err;
1048
1049
  dh->p = get_group5_prime();
1050
  if (dh->p == NULL)
1051
    goto err;
1052
1053
  dh->q = get_group5_order();
1054
  if (!dh->q)
1055
    goto err;
1056
1057
  if (DH_generate_key(dh) != 1)
1058
    goto err;
1059
1060
  publen = BN_num_bytes(dh->pub_key);
1061
  pubkey = wpabuf_alloc(publen);
1062
  if (pubkey == NULL)
1063
    goto err;
1064
  privlen = BN_num_bytes(dh->priv_key);
1065
  privkey = wpabuf_alloc(privlen);
1066
  if (privkey == NULL)
1067
    goto err;
1068
1069
  BN_bn2bin(dh->pub_key, wpabuf_put(pubkey, publen));
1070
  BN_bn2bin(dh->priv_key, wpabuf_put(privkey, privlen));
1071
1072
  *priv = privkey;
1073
  *publ = pubkey;
1074
  return dh;
1075
1076
err:
1077
  wpabuf_clear_free(pubkey);
1078
  wpabuf_clear_free(privkey);
1079
  DH_free(dh);
1080
  return NULL;
1081
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
1082
  EVP_PKEY *pkey = NULL;
1083
  OSSL_PARAM params[2];
1084
  size_t pub_len = OSSL_PARAM_UNMODIFIED;
1085
  size_t priv_len;
1086
  struct wpabuf *pubkey = NULL, *privkey = NULL;
1087
  BIGNUM *priv_bn = NULL;
1088
  EVP_PKEY_CTX *gctx;
1089
  const char *propquery = NULL;
1090
1091
  *priv = NULL;
1092
  wpabuf_free(*publ);
1093
  *publ = NULL;
1094
1095
  if (OSSL_PROVIDER_available(NULL, "fips")) {
1096
    openssl_disable_fips();
1097
    openssl_load_default_provider_if_fips();
1098
    propquery = "provider!=fips";
1099
  }
1100
1101
  params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
1102
                 "modp_1536", 0);
1103
  params[1] = OSSL_PARAM_construct_end();
1104
1105
  gctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", propquery);
1106
  if (!gctx ||
1107
      EVP_PKEY_keygen_init(gctx) != 1 ||
1108
      EVP_PKEY_CTX_set_params(gctx, params) != 1 ||
1109
      EVP_PKEY_generate(gctx, &pkey) != 1 ||
1110
      EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_PRIV_KEY,
1111
          &priv_bn) != 1 ||
1112
      EVP_PKEY_get_octet_string_param(pkey,
1113
              OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
1114
              NULL, 0, &pub_len) < 0 ||
1115
      pub_len == OSSL_PARAM_UNMODIFIED ||
1116
      (priv_len = BN_num_bytes(priv_bn)) == 0 ||
1117
      !(pubkey = wpabuf_alloc(pub_len)) ||
1118
      !(privkey = wpabuf_alloc(priv_len)) ||
1119
      EVP_PKEY_get_octet_string_param(pkey,
1120
              OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
1121
              wpabuf_put(pubkey, pub_len),
1122
              pub_len, NULL) != 1) {
1123
    wpa_printf(MSG_INFO, "OpenSSL: failed: %s",
1124
         ERR_error_string(ERR_get_error(), NULL));
1125
    wpabuf_free(pubkey);
1126
    wpabuf_clear_free(privkey);
1127
    EVP_PKEY_free(pkey);
1128
    pkey = NULL;
1129
  } else {
1130
    BN_bn2bin(priv_bn, wpabuf_put(privkey, priv_len));
1131
1132
    *priv = privkey;
1133
    *publ = pubkey;
1134
  }
1135
1136
  BN_clear_free(priv_bn);
1137
  EVP_PKEY_CTX_free(gctx);
1138
  return pkey;
1139
#else
1140
0
  DH *dh;
1141
0
  struct wpabuf *pubkey = NULL, *privkey = NULL;
1142
0
  size_t publen, privlen;
1143
0
  BIGNUM *p, *g, *q;
1144
0
  const BIGNUM *priv_key = NULL, *pub_key = NULL;
1145
1146
0
  *priv = NULL;
1147
0
  wpabuf_free(*publ);
1148
0
  *publ = NULL;
1149
1150
0
  dh = DH_new();
1151
0
  if (dh == NULL)
1152
0
    return NULL;
1153
1154
0
  g = BN_new();
1155
0
  p = get_group5_prime();
1156
0
  q = get_group5_order();
1157
0
  if (!g || BN_set_word(g, 2) != 1 || !p || !q ||
1158
0
      DH_set0_pqg(dh, p, q, g) != 1)
1159
0
    goto err;
1160
0
  p = NULL;
1161
0
  q = NULL;
1162
0
  g = NULL;
1163
1164
0
  if (DH_generate_key(dh) != 1)
1165
0
    goto err;
1166
1167
0
  DH_get0_key(dh, &pub_key, &priv_key);
1168
0
  publen = BN_num_bytes(pub_key);
1169
0
  pubkey = wpabuf_alloc(publen);
1170
0
  if (!pubkey)
1171
0
    goto err;
1172
0
  privlen = BN_num_bytes(priv_key);
1173
0
  privkey = wpabuf_alloc(privlen);
1174
0
  if (!privkey)
1175
0
    goto err;
1176
1177
0
  BN_bn2bin(pub_key, wpabuf_put(pubkey, publen));
1178
0
  BN_bn2bin(priv_key, wpabuf_put(privkey, privlen));
1179
1180
0
  *priv = privkey;
1181
0
  *publ = pubkey;
1182
0
  return dh;
1183
1184
0
err:
1185
0
  BN_free(p);
1186
0
  BN_free(q);
1187
0
  BN_free(g);
1188
0
  wpabuf_clear_free(pubkey);
1189
0
  wpabuf_clear_free(privkey);
1190
0
  DH_free(dh);
1191
0
  return NULL;
1192
0
#endif
1193
0
}
1194
1195
1196
void * dh5_init_fixed(const struct wpabuf *priv, const struct wpabuf *publ)
1197
0
{
1198
#if OPENSSL_VERSION_NUMBER < 0x10100000L
1199
  DH *dh;
1200
1201
  dh = DH_new();
1202
  if (dh == NULL)
1203
    return NULL;
1204
1205
  dh->g = BN_new();
1206
  if (dh->g == NULL || BN_set_word(dh->g, 2) != 1)
1207
    goto err;
1208
1209
  dh->p = get_group5_prime();
1210
  if (dh->p == NULL)
1211
    goto err;
1212
1213
  dh->priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL);
1214
  if (dh->priv_key == NULL)
1215
    goto err;
1216
1217
  dh->pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL);
1218
  if (dh->pub_key == NULL)
1219
    goto err;
1220
1221
  if (DH_generate_key(dh) != 1)
1222
    goto err;
1223
1224
  return dh;
1225
1226
err:
1227
  DH_free(dh);
1228
  return NULL;
1229
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
1230
  EVP_PKEY *pkey = NULL;
1231
  OSSL_PARAM_BLD *bld;
1232
  OSSL_PARAM *params = NULL;
1233
  BIGNUM *priv_key, *pub_key;
1234
  EVP_PKEY_CTX *fctx;
1235
1236
  fctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);
1237
  priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL);
1238
  pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL);
1239
  bld = OSSL_PARAM_BLD_new();
1240
  if (!fctx || !priv_key || !pub_key || !bld ||
1241
      OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_PKEY_PARAM_GROUP_NAME,
1242
              "modp_1536", 0) != 1 ||
1243
      OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
1244
           priv_key) != 1 ||
1245
      OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
1246
           pub_key) != 1 ||
1247
      !(params = OSSL_PARAM_BLD_to_param(bld)) ||
1248
      EVP_PKEY_fromdata_init(fctx) != 1 ||
1249
      EVP_PKEY_fromdata(fctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
1250
    wpa_printf(MSG_INFO, "OpenSSL: EVP_PKEY_fromdata failed: %s",
1251
         ERR_error_string(ERR_get_error(), NULL));
1252
    EVP_PKEY_free(pkey);
1253
    pkey = NULL;
1254
  }
1255
1256
  BN_clear_free(priv_key);
1257
  BN_free(pub_key);
1258
  EVP_PKEY_CTX_free(fctx);
1259
  OSSL_PARAM_BLD_free(bld);
1260
  OSSL_PARAM_free(params);
1261
  return pkey;
1262
#else
1263
0
  DH *dh;
1264
0
  BIGNUM *p = NULL, *g, *priv_key = NULL, *pub_key = NULL;
1265
1266
0
  dh = DH_new();
1267
0
  if (dh == NULL)
1268
0
    return NULL;
1269
1270
0
  g = BN_new();
1271
0
  p = get_group5_prime();
1272
0
  if (!g || BN_set_word(g, 2) != 1 || !p ||
1273
0
      DH_set0_pqg(dh, p, NULL, g) != 1)
1274
0
    goto err;
1275
0
  p = NULL;
1276
0
  g = NULL;
1277
1278
0
  priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL);
1279
0
  pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL);
1280
0
  if (!priv_key || !pub_key || DH_set0_key(dh, pub_key, priv_key) != 1)
1281
0
    goto err;
1282
0
  pub_key = NULL;
1283
0
  priv_key = NULL;
1284
1285
0
  if (DH_generate_key(dh) != 1)
1286
0
    goto err;
1287
1288
0
  return dh;
1289
1290
0
err:
1291
0
  BN_free(p);
1292
0
  BN_free(g);
1293
0
  BN_free(pub_key);
1294
0
  BN_clear_free(priv_key);
1295
0
  DH_free(dh);
1296
0
  return NULL;
1297
0
#endif
1298
0
}
1299
1300
1301
struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public,
1302
          const struct wpabuf *own_private)
1303
0
{
1304
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1305
  EVP_PKEY *pkey = ctx;
1306
  EVP_PKEY *peer_pub;
1307
  size_t len;
1308
  struct wpabuf *res = NULL;
1309
  EVP_PKEY_CTX *dctx = NULL;
1310
1311
  peer_pub = EVP_PKEY_new();
1312
  if (!pkey || !peer_pub ||
1313
      EVP_PKEY_copy_parameters(peer_pub, pkey) != 1 ||
1314
      EVP_PKEY_set1_encoded_public_key(peer_pub, wpabuf_head(peer_public),
1315
               wpabuf_len(peer_public)) != 1 ||
1316
      !(dctx = EVP_PKEY_CTX_new(pkey, NULL)) ||
1317
      EVP_PKEY_derive_init(dctx) != 1 ||
1318
      EVP_PKEY_derive_set_peer(dctx, peer_pub) != 1 ||
1319
      EVP_PKEY_derive(dctx, NULL, &len) != 1 ||
1320
      !(res = wpabuf_alloc(len)) ||
1321
      EVP_PKEY_derive(dctx, wpabuf_mhead(res), &len) != 1) {
1322
    wpa_printf(MSG_INFO, "OpenSSL: EVP_PKEY_derive failed: %s",
1323
         ERR_error_string(ERR_get_error(), NULL));
1324
    wpabuf_free(res);
1325
    res = NULL;
1326
  } else {
1327
    wpabuf_put(res, len);
1328
  }
1329
1330
  EVP_PKEY_free(peer_pub);
1331
  EVP_PKEY_CTX_free(dctx);
1332
  return res;
1333
#else /* OpenSSL version >= 3.0 */
1334
0
  BIGNUM *pub_key;
1335
0
  struct wpabuf *res = NULL;
1336
0
  size_t rlen;
1337
0
  DH *dh = ctx;
1338
0
  int keylen;
1339
1340
0
  if (ctx == NULL)
1341
0
    return NULL;
1342
1343
0
  pub_key = BN_bin2bn(wpabuf_head(peer_public), wpabuf_len(peer_public),
1344
0
          NULL);
1345
0
  if (pub_key == NULL)
1346
0
    return NULL;
1347
1348
0
  rlen = DH_size(dh);
1349
0
  res = wpabuf_alloc(rlen);
1350
0
  if (res == NULL)
1351
0
    goto err;
1352
1353
0
  keylen = DH_compute_key(wpabuf_mhead(res), pub_key, dh);
1354
0
  if (keylen < 0)
1355
0
    goto err;
1356
0
  wpabuf_put(res, keylen);
1357
0
  BN_clear_free(pub_key);
1358
1359
0
  return res;
1360
1361
0
err:
1362
0
  BN_clear_free(pub_key);
1363
0
  wpabuf_clear_free(res);
1364
0
  return NULL;
1365
0
#endif /* OpenSSL version >= 3.0 */
1366
0
}
1367
1368
1369
void dh5_free(void *ctx)
1370
0
{
1371
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1372
  EVP_PKEY *pkey = ctx;
1373
1374
  EVP_PKEY_free(pkey);
1375
#else /* OpenSSL version >= 3.0 */
1376
0
  DH *dh;
1377
0
  if (ctx == NULL)
1378
0
    return;
1379
0
  dh = ctx;
1380
0
  DH_free(dh);
1381
0
#endif /* OpenSSL version >= 3.0 */
1382
0
}
1383
1384
1385
struct crypto_hash {
1386
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1387
  EVP_MAC_CTX *ctx;
1388
#else /* OpenSSL version >= 3.0 */
1389
  HMAC_CTX *ctx;
1390
#endif /* OpenSSL version >= 3.0 */
1391
  bool failed;
1392
};
1393
1394
1395
struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
1396
              size_t key_len)
1397
0
{
1398
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1399
  struct crypto_hash *ctx;
1400
  EVP_MAC *mac;
1401
  OSSL_PARAM params[2];
1402
  char *a = NULL;
1403
1404
  switch (alg) {
1405
#ifndef OPENSSL_NO_MD5
1406
  case CRYPTO_HASH_ALG_HMAC_MD5:
1407
    a = "MD5";
1408
    break;
1409
#endif /* OPENSSL_NO_MD5 */
1410
#ifndef OPENSSL_NO_SHA
1411
  case CRYPTO_HASH_ALG_HMAC_SHA1:
1412
    a = "SHA1";
1413
    break;
1414
#endif /* OPENSSL_NO_SHA */
1415
#ifndef OPENSSL_NO_SHA256
1416
#ifdef CONFIG_SHA256
1417
  case CRYPTO_HASH_ALG_HMAC_SHA256:
1418
    a = "SHA256";
1419
    break;
1420
#endif /* CONFIG_SHA256 */
1421
#endif /* OPENSSL_NO_SHA256 */
1422
  default:
1423
    return NULL;
1424
  }
1425
1426
  mac = EVP_MAC_fetch(NULL, "HMAC", NULL);
1427
  if (!mac)
1428
    return NULL;
1429
1430
  params[0] = OSSL_PARAM_construct_utf8_string("digest", a, 0);
1431
  params[1] = OSSL_PARAM_construct_end();
1432
1433
  ctx = os_zalloc(sizeof(*ctx));
1434
  if (!ctx)
1435
    goto fail;
1436
  ctx->ctx = EVP_MAC_CTX_new(mac);
1437
  if (!ctx->ctx) {
1438
    os_free(ctx);
1439
    ctx = NULL;
1440
    goto fail;
1441
  }
1442
1443
  if (EVP_MAC_init(ctx->ctx, key, key_len, params) != 1) {
1444
    wpa_printf(MSG_INFO,
1445
         "OpenSSL: EVP_MAC_init(hmac,digest=%s) failed: %s",
1446
         a, ERR_error_string(ERR_get_error(), NULL));
1447
    EVP_MAC_CTX_free(ctx->ctx);
1448
    bin_clear_free(ctx, sizeof(*ctx));
1449
    ctx = NULL;
1450
    goto fail;
1451
  }
1452
1453
fail:
1454
  EVP_MAC_free(mac);
1455
  return ctx;
1456
#else /* OpenSSL version >= 3.0 */
1457
0
  struct crypto_hash *ctx;
1458
0
  const EVP_MD *md;
1459
1460
0
  switch (alg) {
1461
0
#ifndef OPENSSL_NO_MD5
1462
0
  case CRYPTO_HASH_ALG_HMAC_MD5:
1463
0
    md = EVP_md5();
1464
0
    break;
1465
0
#endif /* OPENSSL_NO_MD5 */
1466
0
#ifndef OPENSSL_NO_SHA
1467
0
  case CRYPTO_HASH_ALG_HMAC_SHA1:
1468
0
    md = EVP_sha1();
1469
0
    break;
1470
0
#endif /* OPENSSL_NO_SHA */
1471
0
#ifndef OPENSSL_NO_SHA256
1472
0
#ifdef CONFIG_SHA256
1473
0
  case CRYPTO_HASH_ALG_HMAC_SHA256:
1474
0
    md = EVP_sha256();
1475
0
    break;
1476
0
#endif /* CONFIG_SHA256 */
1477
0
#endif /* OPENSSL_NO_SHA256 */
1478
0
  default:
1479
0
    return NULL;
1480
0
  }
1481
1482
0
  ctx = os_zalloc(sizeof(*ctx));
1483
0
  if (ctx == NULL)
1484
0
    return NULL;
1485
0
  ctx->ctx = HMAC_CTX_new();
1486
0
  if (!ctx->ctx) {
1487
0
    os_free(ctx);
1488
0
    return NULL;
1489
0
  }
1490
1491
0
  if (HMAC_Init_ex(ctx->ctx, key, key_len, md, NULL) != 1) {
1492
0
    HMAC_CTX_free(ctx->ctx);
1493
0
    bin_clear_free(ctx, sizeof(*ctx));
1494
0
    return NULL;
1495
0
  }
1496
1497
0
  return ctx;
1498
0
#endif /* OpenSSL version >= 3.0 */
1499
0
}
1500
1501
1502
void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len)
1503
0
{
1504
0
  if (ctx == NULL)
1505
0
    return;
1506
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1507
  if (!EVP_MAC_update(ctx->ctx, data, len))
1508
    ctx->failed = true;
1509
#else /* OpenSSL version >= 3.0 */
1510
0
  if (!HMAC_Update(ctx->ctx, data, len))
1511
0
    ctx->failed = true;
1512
0
#endif /* OpenSSL version >= 3.0 */
1513
0
}
1514
1515
1516
int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len)
1517
0
{
1518
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1519
  size_t mdlen;
1520
  int res;
1521
  bool failed;
1522
1523
  if (!ctx)
1524
    return -2;
1525
1526
  if (!mac || !len) {
1527
    EVP_MAC_CTX_free(ctx->ctx);
1528
    bin_clear_free(ctx, sizeof(*ctx));
1529
    return 0;
1530
  }
1531
1532
  res = EVP_MAC_final(ctx->ctx, NULL, &mdlen, 0);
1533
  if (res != 1) {
1534
    EVP_MAC_CTX_free(ctx->ctx);
1535
    bin_clear_free(ctx, sizeof(*ctx));
1536
    return -1;
1537
  }
1538
  res = EVP_MAC_final(ctx->ctx, mac, &mdlen, mdlen);
1539
  EVP_MAC_CTX_free(ctx->ctx);
1540
  failed = ctx->failed;
1541
  bin_clear_free(ctx, sizeof(*ctx));
1542
1543
  if (TEST_FAIL())
1544
    return -1;
1545
1546
  if (failed)
1547
    return -2;
1548
1549
  if (res == 1) {
1550
    *len = mdlen;
1551
    return 0;
1552
  }
1553
1554
  return -1;
1555
#else /* OpenSSL version >= 3.0 */
1556
0
  unsigned int mdlen;
1557
0
  int res;
1558
0
  bool failed;
1559
1560
0
  if (ctx == NULL)
1561
0
    return -2;
1562
1563
0
  if (mac == NULL || len == NULL) {
1564
0
    HMAC_CTX_free(ctx->ctx);
1565
0
    bin_clear_free(ctx, sizeof(*ctx));
1566
0
    return 0;
1567
0
  }
1568
1569
0
  mdlen = *len;
1570
0
  res = HMAC_Final(ctx->ctx, mac, &mdlen);
1571
0
  HMAC_CTX_free(ctx->ctx);
1572
0
  failed = ctx->failed;
1573
0
  bin_clear_free(ctx, sizeof(*ctx));
1574
1575
0
  if (TEST_FAIL())
1576
0
    return -1;
1577
1578
0
  if (failed)
1579
0
    return -2;
1580
1581
0
  if (res == 1) {
1582
0
    *len = mdlen;
1583
0
    return 0;
1584
0
  }
1585
1586
0
  return -1;
1587
0
#endif /* OpenSSL version >= 3.0 */
1588
0
}
1589
1590
1591
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1592
1593
static int openssl_hmac_vector(char *digest, const u8 *key,
1594
             size_t key_len, size_t num_elem,
1595
             const u8 *addr[], const size_t *len, u8 *mac,
1596
             unsigned int mdlen)
1597
{
1598
  EVP_MAC *hmac;
1599
  OSSL_PARAM params[2];
1600
  EVP_MAC_CTX *ctx;
1601
  size_t i, mlen;
1602
  int res;
1603
  const char *property_query = NULL;
1604
1605
  if (TEST_FAIL())
1606
    return -1;
1607
1608
#ifndef CONFIG_FIPS
1609
  if (os_strcmp(digest, "MD5") == 0) {
1610
    openssl_need_md5();
1611
    property_query = "provider!=fips";
1612
  } else if (key_len < 14 && OSSL_PROVIDER_available(NULL, "fips")) {
1613
    /* Need to use non-FIPS provider in OpenSSL to handle cases
1614
     * where HMAC is used with salt that is less than 112 bits
1615
     * instead of the HMAC uses with an actual key. */
1616
    openssl_disable_fips();
1617
    openssl_load_default_provider_if_fips();
1618
    property_query = "provider!=fips";
1619
  }
1620
#endif /* CONFIG_FIPS */
1621
  hmac = EVP_MAC_fetch(NULL, "HMAC", property_query);
1622
  if (!hmac) {
1623
    wpa_printf(MSG_INFO, "OpenSSL: EVP_MAC_fetch(HMAC) failed: %s",
1624
         ERR_error_string(ERR_get_error(), NULL));
1625
    return -1;
1626
  }
1627
1628
  params[0] = OSSL_PARAM_construct_utf8_string("digest", digest, 0);
1629
  params[1] = OSSL_PARAM_construct_end();
1630
1631
  ctx = EVP_MAC_CTX_new(hmac);
1632
  EVP_MAC_free(hmac);
1633
  if (!ctx)
1634
    return -1;
1635
1636
  if (EVP_MAC_init(ctx, key, key_len, params) != 1) {
1637
    wpa_printf(MSG_INFO,
1638
         "OpenSSL: EVP_MAC_init(hmac,digest=%s,key_len=%zu) failed: %s",
1639
         digest, key_len,
1640
         ERR_error_string(ERR_get_error(), NULL));
1641
    goto fail;
1642
  }
1643
1644
  for (i = 0; i < num_elem; i++) {
1645
    if (EVP_MAC_update(ctx, addr[i], len[i]) != 1)
1646
      goto fail;
1647
  }
1648
1649
  res = EVP_MAC_final(ctx, mac, &mlen, mdlen);
1650
  EVP_MAC_CTX_free(ctx);
1651
1652
  return res == 1 ? 0 : -1;
1653
fail:
1654
  EVP_MAC_CTX_free(ctx);
1655
  return -1;
1656
}
1657
1658
1659
#ifndef CONFIG_FIPS
1660
1661
int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem,
1662
        const u8 *addr[], const size_t *len, u8 *mac)
1663
{
1664
  return openssl_hmac_vector("MD5", key ,key_len, num_elem, addr, len,
1665
           mac, 16);
1666
}
1667
1668
1669
int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
1670
       u8 *mac)
1671
{
1672
  return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
1673
}
1674
1675
#endif /* CONFIG_FIPS */
1676
1677
1678
int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
1679
         const u8 *addr[], const size_t *len, u8 *mac)
1680
{
1681
  return openssl_hmac_vector("SHA1", key, key_len, num_elem, addr,
1682
           len, mac, 20);
1683
}
1684
1685
1686
int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
1687
         u8 *mac)
1688
{
1689
  return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
1690
}
1691
1692
1693
#ifdef CONFIG_SHA256
1694
1695
int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
1696
           const u8 *addr[], const size_t *len, u8 *mac)
1697
{
1698
  return openssl_hmac_vector("SHA256", key, key_len, num_elem, addr,
1699
           len, mac, 32);
1700
}
1701
1702
1703
int hmac_sha256(const u8 *key, size_t key_len, const u8 *data,
1704
    size_t data_len, u8 *mac)
1705
{
1706
  return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
1707
}
1708
1709
#endif /* CONFIG_SHA256 */
1710
1711
1712
#ifdef CONFIG_SHA384
1713
1714
int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem,
1715
           const u8 *addr[], const size_t *len, u8 *mac)
1716
{
1717
  return openssl_hmac_vector("SHA384", key, key_len, num_elem, addr,
1718
           len, mac, 48);
1719
}
1720
1721
1722
int hmac_sha384(const u8 *key, size_t key_len, const u8 *data,
1723
    size_t data_len, u8 *mac)
1724
{
1725
  return hmac_sha384_vector(key, key_len, 1, &data, &data_len, mac);
1726
}
1727
1728
#endif /* CONFIG_SHA384 */
1729
1730
1731
#ifdef CONFIG_SHA512
1732
1733
int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem,
1734
           const u8 *addr[], const size_t *len, u8 *mac)
1735
{
1736
  return openssl_hmac_vector("SHA512", key, key_len, num_elem, addr,
1737
           len, mac, 64);
1738
}
1739
1740
1741
int hmac_sha512(const u8 *key, size_t key_len, const u8 *data,
1742
    size_t data_len, u8 *mac)
1743
{
1744
  return hmac_sha512_vector(key, key_len, 1, &data, &data_len, mac);
1745
}
1746
1747
#endif /* CONFIG_SHA512 */
1748
1749
#else /* OpenSSL version >= 3.0 */
1750
1751
static int openssl_hmac_vector(const EVP_MD *type, const u8 *key,
1752
             size_t key_len, size_t num_elem,
1753
             const u8 *addr[], const size_t *len, u8 *mac,
1754
             unsigned int mdlen)
1755
449
{
1756
449
  HMAC_CTX *ctx;
1757
449
  size_t i;
1758
449
  int res;
1759
1760
449
  if (TEST_FAIL())
1761
0
    return -1;
1762
1763
449
  ctx = HMAC_CTX_new();
1764
449
  if (!ctx)
1765
0
    return -1;
1766
449
  res = HMAC_Init_ex(ctx, key, key_len, type, NULL);
1767
449
  if (res != 1)
1768
0
    goto done;
1769
1770
1.96k
  for (i = 0; i < num_elem; i++)
1771
1.51k
    HMAC_Update(ctx, addr[i], len[i]);
1772
1773
449
  res = HMAC_Final(ctx, mac, &mdlen);
1774
449
done:
1775
449
  HMAC_CTX_free(ctx);
1776
1777
449
  return res == 1 ? 0 : -1;
1778
449
}
1779
1780
1781
#ifndef CONFIG_FIPS
1782
1783
int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem,
1784
        const u8 *addr[], const size_t *len, u8 *mac)
1785
0
{
1786
0
  return openssl_hmac_vector(EVP_md5(), key ,key_len, num_elem, addr, len,
1787
0
           mac, 16);
1788
0
}
1789
1790
1791
int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
1792
       u8 *mac)
1793
0
{
1794
0
  return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
1795
0
}
1796
1797
#endif /* CONFIG_FIPS */
1798
1799
1800
int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
1801
         const u8 *addr[], const size_t *len, u8 *mac)
1802
0
{
1803
0
  return openssl_hmac_vector(EVP_sha1(), key, key_len, num_elem, addr,
1804
0
           len, mac, 20);
1805
0
}
1806
1807
1808
int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
1809
         u8 *mac)
1810
0
{
1811
0
  return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
1812
0
}
1813
1814
1815
#ifdef CONFIG_SHA256
1816
1817
int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
1818
           const u8 *addr[], const size_t *len, u8 *mac)
1819
449
{
1820
449
  return openssl_hmac_vector(EVP_sha256(), key, key_len, num_elem, addr,
1821
449
           len, mac, 32);
1822
449
}
1823
1824
1825
int hmac_sha256(const u8 *key, size_t key_len, const u8 *data,
1826
    size_t data_len, u8 *mac)
1827
93
{
1828
93
  return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
1829
93
}
1830
1831
#endif /* CONFIG_SHA256 */
1832
1833
1834
#ifdef CONFIG_SHA384
1835
1836
int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem,
1837
           const u8 *addr[], const size_t *len, u8 *mac)
1838
0
{
1839
0
  return openssl_hmac_vector(EVP_sha384(), key, key_len, num_elem, addr,
1840
0
           len, mac, 48);
1841
0
}
1842
1843
1844
int hmac_sha384(const u8 *key, size_t key_len, const u8 *data,
1845
    size_t data_len, u8 *mac)
1846
0
{
1847
0
  return hmac_sha384_vector(key, key_len, 1, &data, &data_len, mac);
1848
0
}
1849
1850
#endif /* CONFIG_SHA384 */
1851
1852
1853
#ifdef CONFIG_SHA512
1854
1855
int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem,
1856
           const u8 *addr[], const size_t *len, u8 *mac)
1857
{
1858
  return openssl_hmac_vector(EVP_sha512(), key, key_len, num_elem, addr,
1859
           len, mac, 64);
1860
}
1861
1862
1863
int hmac_sha512(const u8 *key, size_t key_len, const u8 *data,
1864
    size_t data_len, u8 *mac)
1865
{
1866
  return hmac_sha512_vector(key, key_len, 1, &data, &data_len, mac);
1867
}
1868
1869
#endif /* CONFIG_SHA512 */
1870
1871
#endif /* OpenSSL version >= 3.0 */
1872
1873
1874
int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len,
1875
    int iterations, u8 *buf, size_t buflen)
1876
0
{
1877
0
  if (PKCS5_PBKDF2_HMAC_SHA1(passphrase, os_strlen(passphrase), ssid,
1878
0
           ssid_len, iterations, buflen, buf) != 1)
1879
0
    return -1;
1880
0
  return 0;
1881
0
}
1882
1883
1884
#ifdef CONFIG_SHA256
1885
int pbkdf2_sha256(const char *passphrase, const u8 *salt, size_t salt_len,
1886
      int iterations, u8 *buf, size_t buflen)
1887
0
{
1888
0
  if (PKCS5_PBKDF2_HMAC(passphrase, os_strlen(passphrase), salt,
1889
0
            salt_len, iterations, EVP_sha256(), buflen,
1890
0
            buf) != 1)
1891
0
    return -1;
1892
0
  return 0;
1893
0
}
1894
#endif /* CONFIG_SHA256 */
1895
1896
1897
#ifdef CONFIG_SHA384
1898
int pbkdf2_sha384(const char *passphrase, const u8 *salt, size_t salt_len,
1899
      int iterations, u8 *buf, size_t buflen)
1900
0
{
1901
0
  if (PKCS5_PBKDF2_HMAC(passphrase, os_strlen(passphrase), salt,
1902
0
            salt_len, iterations, EVP_sha384(), buflen,
1903
0
            buf) != 1)
1904
0
    return -1;
1905
0
  return 0;
1906
0
}
1907
#endif /* CONFIG_SHA384 */
1908
1909
1910
int crypto_get_random(void *buf, size_t len)
1911
0
{
1912
0
  if (RAND_bytes(buf, len) != 1)
1913
0
    return -1;
1914
0
  return 0;
1915
0
}
1916
1917
1918
int omac1_aes_vector(const u8 *key, size_t key_len, size_t num_elem,
1919
         const u8 *addr[], const size_t *len, u8 *mac)
1920
0
{
1921
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1922
  EVP_MAC_CTX *ctx = NULL;
1923
  EVP_MAC *emac;
1924
  int ret = -1;
1925
  size_t outlen, i;
1926
  OSSL_PARAM params[2];
1927
  char *cipher = NULL;
1928
1929
  if (TEST_FAIL())
1930
    return -1;
1931
1932
  emac = EVP_MAC_fetch(NULL, "CMAC", NULL);
1933
1934
  if (key_len == 32)
1935
    cipher = "aes-256-cbc";
1936
  else if (key_len == 24)
1937
    cipher = "aes-192-cbc";
1938
  else if (key_len == 16)
1939
    cipher = "aes-128-cbc";
1940
1941
  params[0] = OSSL_PARAM_construct_utf8_string("cipher", cipher, 0);
1942
  params[1] = OSSL_PARAM_construct_end();
1943
1944
  if (!emac || !cipher ||
1945
      !(ctx = EVP_MAC_CTX_new(emac)) ||
1946
      EVP_MAC_init(ctx, key, key_len, params) != 1) {
1947
    wpa_printf(MSG_INFO,
1948
         "OpenSSL: EVP_MAC_init(cmac,cipher=%s) failed: %s",
1949
         cipher, ERR_error_string(ERR_get_error(), NULL));
1950
    goto fail;
1951
  }
1952
1953
  for (i = 0; i < num_elem; i++) {
1954
    if (!EVP_MAC_update(ctx, addr[i], len[i]))
1955
      goto fail;
1956
  }
1957
  if (EVP_MAC_final(ctx, mac, &outlen, 16) != 1 || outlen != 16)
1958
    goto fail;
1959
1960
  ret = 0;
1961
fail:
1962
  EVP_MAC_CTX_free(ctx);
1963
  EVP_MAC_free(emac);
1964
  return ret;
1965
#else /* OpenSSL version >= 3.0 */
1966
0
  CMAC_CTX *ctx;
1967
0
  int ret = -1;
1968
0
  size_t outlen, i;
1969
1970
0
  if (TEST_FAIL())
1971
0
    return -1;
1972
1973
0
  ctx = CMAC_CTX_new();
1974
0
  if (ctx == NULL)
1975
0
    return -1;
1976
1977
0
  if (key_len == 32) {
1978
0
    if (!CMAC_Init(ctx, key, 32, EVP_aes_256_cbc(), NULL))
1979
0
      goto fail;
1980
0
  } else if (key_len == 24) {
1981
0
    if (!CMAC_Init(ctx, key, 24, EVP_aes_192_cbc(), NULL))
1982
0
      goto fail;
1983
0
  } else if (key_len == 16) {
1984
0
    if (!CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL))
1985
0
      goto fail;
1986
0
  } else {
1987
0
    goto fail;
1988
0
  }
1989
0
  for (i = 0; i < num_elem; i++) {
1990
0
    if (!CMAC_Update(ctx, addr[i], len[i]))
1991
0
      goto fail;
1992
0
  }
1993
0
  if (!CMAC_Final(ctx, mac, &outlen) || outlen != 16)
1994
0
    goto fail;
1995
1996
0
  ret = 0;
1997
0
fail:
1998
0
  CMAC_CTX_free(ctx);
1999
0
  return ret;
2000
0
#endif /* OpenSSL version >= 3.0 */
2001
0
}
2002
2003
2004
int omac1_aes_128_vector(const u8 *key, size_t num_elem,
2005
       const u8 *addr[], const size_t *len, u8 *mac)
2006
0
{
2007
0
  return omac1_aes_vector(key, 16, num_elem, addr, len, mac);
2008
0
}
2009
2010
2011
int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
2012
0
{
2013
0
  return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
2014
0
}
2015
2016
2017
int omac1_aes_256(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
2018
0
{
2019
0
  return omac1_aes_vector(key, 32, 1, &data, &data_len, mac);
2020
0
}
2021
2022
2023
struct crypto_bignum * crypto_bignum_init(void)
2024
0
{
2025
0
  if (TEST_FAIL())
2026
0
    return NULL;
2027
0
  return (struct crypto_bignum *) BN_new();
2028
0
}
2029
2030
2031
struct crypto_bignum * crypto_bignum_init_set(const u8 *buf, size_t len)
2032
0
{
2033
0
  BIGNUM *bn;
2034
2035
0
  if (TEST_FAIL())
2036
0
    return NULL;
2037
2038
0
  bn = BN_bin2bn(buf, len, NULL);
2039
0
  return (struct crypto_bignum *) bn;
2040
0
}
2041
2042
2043
struct crypto_bignum * crypto_bignum_init_uint(unsigned int val)
2044
0
{
2045
0
  BIGNUM *bn;
2046
2047
0
  if (TEST_FAIL())
2048
0
    return NULL;
2049
2050
0
  bn = BN_new();
2051
0
  if (!bn)
2052
0
    return NULL;
2053
0
  if (BN_set_word(bn, val) != 1) {
2054
0
    BN_free(bn);
2055
0
    return NULL;
2056
0
  }
2057
0
  return (struct crypto_bignum *) bn;
2058
0
}
2059
2060
2061
void crypto_bignum_deinit(struct crypto_bignum *n, int clear)
2062
5.99k
{
2063
5.99k
  if (clear)
2064
0
    BN_clear_free((BIGNUM *) n);
2065
5.99k
  else
2066
5.99k
    BN_free((BIGNUM *) n);
2067
5.99k
}
2068
2069
2070
int crypto_bignum_to_bin(const struct crypto_bignum *a,
2071
       u8 *buf, size_t buflen, size_t padlen)
2072
2.99k
{
2073
2.99k
  int num_bytes, offset;
2074
2075
2.99k
  if (TEST_FAIL())
2076
0
    return -1;
2077
2078
2.99k
  if (padlen > buflen)
2079
0
    return -1;
2080
2081
2.99k
  if (padlen) {
2082
#ifdef OPENSSL_IS_BORINGSSL
2083
    if (BN_bn2bin_padded(buf, padlen, (const BIGNUM *) a) == 0)
2084
      return -1;
2085
    return padlen;
2086
#else /* OPENSSL_IS_BORINGSSL */
2087
2.99k
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
2088
2.99k
    return BN_bn2binpad((const BIGNUM *) a, buf, padlen);
2089
2.99k
#endif
2090
2.99k
#endif
2091
2.99k
  }
2092
2093
0
  num_bytes = BN_num_bytes((const BIGNUM *) a);
2094
0
  if ((size_t) num_bytes > buflen)
2095
0
    return -1;
2096
0
  if (padlen > (size_t) num_bytes)
2097
0
    offset = padlen - num_bytes;
2098
0
  else
2099
0
    offset = 0;
2100
2101
0
  os_memset(buf, 0, offset);
2102
0
  BN_bn2bin((const BIGNUM *) a, buf + offset);
2103
2104
0
  return num_bytes + offset;
2105
0
}
2106
2107
2108
int crypto_bignum_rand(struct crypto_bignum *r, const struct crypto_bignum *m)
2109
0
{
2110
0
  if (TEST_FAIL())
2111
0
    return -1;
2112
0
  return BN_rand_range((BIGNUM *) r, (const BIGNUM *) m) == 1 ? 0 : -1;
2113
0
}
2114
2115
2116
int crypto_bignum_add(const struct crypto_bignum *a,
2117
          const struct crypto_bignum *b,
2118
          struct crypto_bignum *c)
2119
0
{
2120
0
  return BN_add((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ?
2121
0
    0 : -1;
2122
0
}
2123
2124
2125
int crypto_bignum_mod(const struct crypto_bignum *a,
2126
          const struct crypto_bignum *b,
2127
          struct crypto_bignum *c)
2128
0
{
2129
0
  int res;
2130
0
  BN_CTX *bnctx;
2131
2132
0
  bnctx = BN_CTX_new();
2133
0
  if (bnctx == NULL)
2134
0
    return -1;
2135
0
  res = BN_mod((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b,
2136
0
         bnctx);
2137
0
  BN_CTX_free(bnctx);
2138
2139
0
  return res ? 0 : -1;
2140
0
}
2141
2142
2143
int crypto_bignum_exptmod(const struct crypto_bignum *a,
2144
        const struct crypto_bignum *b,
2145
        const struct crypto_bignum *c,
2146
        struct crypto_bignum *d)
2147
0
{
2148
0
  int res;
2149
0
  BN_CTX *bnctx;
2150
2151
0
  if (TEST_FAIL())
2152
0
    return -1;
2153
2154
0
  bnctx = BN_CTX_new();
2155
0
  if (bnctx == NULL)
2156
0
    return -1;
2157
0
  res = BN_mod_exp_mont_consttime((BIGNUM *) d, (const BIGNUM *) a,
2158
0
          (const BIGNUM *) b, (const BIGNUM *) c,
2159
0
          bnctx, NULL);
2160
0
  BN_CTX_free(bnctx);
2161
2162
0
  return res ? 0 : -1;
2163
0
}
2164
2165
2166
int crypto_bignum_inverse(const struct crypto_bignum *a,
2167
        const struct crypto_bignum *b,
2168
        struct crypto_bignum *c)
2169
0
{
2170
0
  BIGNUM *res;
2171
0
  BN_CTX *bnctx;
2172
2173
0
  if (TEST_FAIL())
2174
0
    return -1;
2175
0
  bnctx = BN_CTX_new();
2176
0
  if (bnctx == NULL)
2177
0
    return -1;
2178
#ifdef OPENSSL_IS_BORINGSSL
2179
  /* TODO: use BN_mod_inverse_blinded() ? */
2180
#else /* OPENSSL_IS_BORINGSSL */
2181
0
  BN_set_flags((BIGNUM *) a, BN_FLG_CONSTTIME);
2182
0
#endif /* OPENSSL_IS_BORINGSSL */
2183
0
  res = BN_mod_inverse((BIGNUM *) c, (const BIGNUM *) a,
2184
0
           (const BIGNUM *) b, bnctx);
2185
0
  BN_CTX_free(bnctx);
2186
2187
0
  return res ? 0 : -1;
2188
0
}
2189
2190
2191
int crypto_bignum_sub(const struct crypto_bignum *a,
2192
          const struct crypto_bignum *b,
2193
          struct crypto_bignum *c)
2194
0
{
2195
0
  if (TEST_FAIL())
2196
0
    return -1;
2197
0
  return BN_sub((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ?
2198
0
    0 : -1;
2199
0
}
2200
2201
2202
int crypto_bignum_div(const struct crypto_bignum *a,
2203
          const struct crypto_bignum *b,
2204
          struct crypto_bignum *c)
2205
0
{
2206
0
  int res;
2207
2208
0
  BN_CTX *bnctx;
2209
2210
0
  if (TEST_FAIL())
2211
0
    return -1;
2212
2213
0
  bnctx = BN_CTX_new();
2214
0
  if (bnctx == NULL)
2215
0
    return -1;
2216
0
#ifndef OPENSSL_IS_BORINGSSL
2217
0
  BN_set_flags((BIGNUM *) a, BN_FLG_CONSTTIME);
2218
0
#endif /* OPENSSL_IS_BORINGSSL */
2219
0
  res = BN_div((BIGNUM *) c, NULL, (const BIGNUM *) a,
2220
0
         (const BIGNUM *) b, bnctx);
2221
0
  BN_CTX_free(bnctx);
2222
2223
0
  return res ? 0 : -1;
2224
0
}
2225
2226
2227
int crypto_bignum_addmod(const struct crypto_bignum *a,
2228
       const struct crypto_bignum *b,
2229
       const struct crypto_bignum *c,
2230
       struct crypto_bignum *d)
2231
0
{
2232
0
  int res;
2233
0
  BN_CTX *bnctx;
2234
2235
0
  if (TEST_FAIL())
2236
0
    return -1;
2237
2238
0
  bnctx = BN_CTX_new();
2239
0
  if (!bnctx)
2240
0
    return -1;
2241
0
  res = BN_mod_add((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b,
2242
0
       (const BIGNUM *) c, bnctx);
2243
0
  BN_CTX_free(bnctx);
2244
2245
0
  return res ? 0 : -1;
2246
0
}
2247
2248
2249
int crypto_bignum_mulmod(const struct crypto_bignum *a,
2250
       const struct crypto_bignum *b,
2251
       const struct crypto_bignum *c,
2252
       struct crypto_bignum *d)
2253
0
{
2254
0
  int res;
2255
2256
0
  BN_CTX *bnctx;
2257
2258
0
  if (TEST_FAIL())
2259
0
    return -1;
2260
2261
0
  bnctx = BN_CTX_new();
2262
0
  if (bnctx == NULL)
2263
0
    return -1;
2264
0
  res = BN_mod_mul((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b,
2265
0
       (const BIGNUM *) c, bnctx);
2266
0
  BN_CTX_free(bnctx);
2267
2268
0
  return res ? 0 : -1;
2269
0
}
2270
2271
2272
int crypto_bignum_sqrmod(const struct crypto_bignum *a,
2273
       const struct crypto_bignum *b,
2274
       struct crypto_bignum *c)
2275
0
{
2276
0
  int res;
2277
0
  BN_CTX *bnctx;
2278
2279
0
  if (TEST_FAIL())
2280
0
    return -1;
2281
2282
0
  bnctx = BN_CTX_new();
2283
0
  if (!bnctx)
2284
0
    return -1;
2285
0
  res = BN_mod_sqr((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b,
2286
0
       bnctx);
2287
0
  BN_CTX_free(bnctx);
2288
2289
0
  return res ? 0 : -1;
2290
0
}
2291
2292
2293
int crypto_bignum_rshift(const struct crypto_bignum *a, int n,
2294
       struct crypto_bignum *r)
2295
0
{
2296
0
  return BN_rshift((BIGNUM *) r, (const BIGNUM *) a, n) == 1 ? 0 : -1;
2297
0
}
2298
2299
2300
int crypto_bignum_cmp(const struct crypto_bignum *a,
2301
          const struct crypto_bignum *b)
2302
0
{
2303
0
  return BN_cmp((const BIGNUM *) a, (const BIGNUM *) b);
2304
0
}
2305
2306
2307
int crypto_bignum_is_zero(const struct crypto_bignum *a)
2308
0
{
2309
0
  return BN_is_zero((const BIGNUM *) a);
2310
0
}
2311
2312
2313
int crypto_bignum_is_one(const struct crypto_bignum *a)
2314
0
{
2315
0
  return BN_is_one((const BIGNUM *) a);
2316
0
}
2317
2318
2319
int crypto_bignum_is_odd(const struct crypto_bignum *a)
2320
0
{
2321
0
  return BN_is_odd((const BIGNUM *) a);
2322
0
}
2323
2324
2325
int crypto_bignum_legendre(const struct crypto_bignum *a,
2326
         const struct crypto_bignum *p)
2327
0
{
2328
0
  BN_CTX *bnctx;
2329
0
  BIGNUM *exp = NULL, *tmp = NULL;
2330
0
  int res = -2;
2331
0
  unsigned int mask;
2332
2333
0
  if (TEST_FAIL())
2334
0
    return -2;
2335
2336
0
  bnctx = BN_CTX_new();
2337
0
  if (bnctx == NULL)
2338
0
    return -2;
2339
2340
0
  exp = BN_new();
2341
0
  tmp = BN_new();
2342
0
  if (!exp || !tmp ||
2343
      /* exp = (p-1) / 2 */
2344
0
      !BN_sub(exp, (const BIGNUM *) p, BN_value_one()) ||
2345
0
      !BN_rshift1(exp, exp) ||
2346
0
      !BN_mod_exp_mont_consttime(tmp, (const BIGNUM *) a, exp,
2347
0
               (const BIGNUM *) p, bnctx, NULL))
2348
0
    goto fail;
2349
2350
  /* Return 1 if tmp == 1, 0 if tmp == 0, or -1 otherwise. Need to use
2351
   * constant time selection to avoid branches here. */
2352
0
  res = -1;
2353
0
  mask = const_time_eq(BN_is_word(tmp, 1), 1);
2354
0
  res = const_time_select_int(mask, 1, res);
2355
0
  mask = const_time_eq(BN_is_zero(tmp), 1);
2356
0
  res = const_time_select_int(mask, 0, res);
2357
2358
0
fail:
2359
0
  BN_clear_free(tmp);
2360
0
  BN_clear_free(exp);
2361
0
  BN_CTX_free(bnctx);
2362
0
  return res;
2363
0
}
2364
2365
2366
#ifdef CONFIG_ECC
2367
2368
struct crypto_ec {
2369
  EC_GROUP *group;
2370
  int nid;
2371
  int iana_group;
2372
  BN_CTX *bnctx;
2373
  BIGNUM *prime;
2374
  BIGNUM *order;
2375
  BIGNUM *a;
2376
  BIGNUM *b;
2377
};
2378
2379
2380
static int crypto_ec_group_2_nid(int group)
2381
2.99k
{
2382
  /* Map from IANA registry for IKE D-H groups to OpenSSL NID */
2383
2.99k
  switch (group) {
2384
2.99k
  case 19:
2385
2.99k
    return NID_X9_62_prime256v1;
2386
0
  case 20:
2387
0
    return NID_secp384r1;
2388
0
  case 21:
2389
0
    return NID_secp521r1;
2390
0
  case 25:
2391
0
    return NID_X9_62_prime192v1;
2392
0
  case 26:
2393
0
    return NID_secp224r1;
2394
0
#ifdef NID_brainpoolP224r1
2395
0
  case 27:
2396
0
    return NID_brainpoolP224r1;
2397
0
#endif /* NID_brainpoolP224r1 */
2398
0
#ifdef NID_brainpoolP256r1
2399
0
  case 28:
2400
0
    return NID_brainpoolP256r1;
2401
0
#endif /* NID_brainpoolP256r1 */
2402
0
#ifdef NID_brainpoolP384r1
2403
0
  case 29:
2404
0
    return NID_brainpoolP384r1;
2405
0
#endif /* NID_brainpoolP384r1 */
2406
0
#ifdef NID_brainpoolP512r1
2407
0
  case 30:
2408
0
    return NID_brainpoolP512r1;
2409
0
#endif /* NID_brainpoolP512r1 */
2410
0
  default:
2411
0
    return -1;
2412
2.99k
  }
2413
2.99k
}
2414
2415
2416
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2417
static const char * crypto_ec_group_2_name(int group)
2418
{
2419
  /* Map from IANA registry for IKE D-H groups to OpenSSL group name */
2420
  switch (group) {
2421
  case 19:
2422
    return "prime256v1";
2423
  case 20:
2424
    return "secp384r1";
2425
  case 21:
2426
    return "secp521r1";
2427
  case 25:
2428
    return "prime192v1";
2429
  case 26:
2430
    return "secp224r1";
2431
#ifdef NID_brainpoolP224r1
2432
  case 27:
2433
    return "brainpoolP224r1";
2434
#endif /* NID_brainpoolP224r1 */
2435
#ifdef NID_brainpoolP256r1
2436
  case 28:
2437
    return "brainpoolP256r1";
2438
#endif /* NID_brainpoolP256r1 */
2439
#ifdef NID_brainpoolP384r1
2440
  case 29:
2441
    return "brainpoolP384r1";
2442
#endif /* NID_brainpoolP384r1 */
2443
#ifdef NID_brainpoolP512r1
2444
  case 30:
2445
    return "brainpoolP512r1";
2446
#endif /* NID_brainpoolP512r1 */
2447
  default:
2448
    return NULL;
2449
  }
2450
}
2451
#endif /* OpenSSL version >= 3.0 */
2452
2453
2454
struct crypto_ec * crypto_ec_init(int group)
2455
2.99k
{
2456
2.99k
  struct crypto_ec *e;
2457
2.99k
  int nid;
2458
2459
2.99k
  nid = crypto_ec_group_2_nid(group);
2460
2.99k
  if (nid < 0)
2461
0
    return NULL;
2462
2463
2.99k
  e = os_zalloc(sizeof(*e));
2464
2.99k
  if (e == NULL)
2465
0
    return NULL;
2466
2467
2.99k
  e->nid = nid;
2468
2.99k
  e->iana_group = group;
2469
2.99k
  e->bnctx = BN_CTX_new();
2470
2.99k
  e->group = EC_GROUP_new_by_curve_name(nid);
2471
2.99k
  e->prime = BN_new();
2472
2.99k
  e->order = BN_new();
2473
2.99k
  e->a = BN_new();
2474
2.99k
  e->b = BN_new();
2475
2.99k
  if (e->group == NULL || e->bnctx == NULL || e->prime == NULL ||
2476
2.99k
      e->order == NULL || e->a == NULL || e->b == NULL ||
2477
2.99k
      !EC_GROUP_get_curve(e->group, e->prime, e->a, e->b, e->bnctx) ||
2478
2.99k
      !EC_GROUP_get_order(e->group, e->order, e->bnctx)) {
2479
0
    crypto_ec_deinit(e);
2480
0
    e = NULL;
2481
0
  }
2482
2483
2.99k
  return e;
2484
2.99k
}
2485
2486
2487
void crypto_ec_deinit(struct crypto_ec *e)
2488
2.99k
{
2489
2.99k
  if (e == NULL)
2490
0
    return;
2491
2.99k
  BN_clear_free(e->b);
2492
2.99k
  BN_clear_free(e->a);
2493
2.99k
  BN_clear_free(e->order);
2494
2.99k
  BN_clear_free(e->prime);
2495
2.99k
  EC_GROUP_free(e->group);
2496
2.99k
  BN_CTX_free(e->bnctx);
2497
2.99k
  os_free(e);
2498
2.99k
}
2499
2500
2501
struct crypto_ec_point * crypto_ec_point_init(struct crypto_ec *e)
2502
0
{
2503
0
  if (TEST_FAIL())
2504
0
    return NULL;
2505
0
  if (e == NULL)
2506
0
    return NULL;
2507
0
  return (struct crypto_ec_point *) EC_POINT_new(e->group);
2508
0
}
2509
2510
2511
size_t crypto_ec_prime_len(struct crypto_ec *e)
2512
2.99k
{
2513
2.99k
  return BN_num_bytes(e->prime);
2514
2.99k
}
2515
2516
2517
size_t crypto_ec_prime_len_bits(struct crypto_ec *e)
2518
0
{
2519
0
  return BN_num_bits(e->prime);
2520
0
}
2521
2522
2523
size_t crypto_ec_order_len(struct crypto_ec *e)
2524
0
{
2525
0
  return BN_num_bytes(e->order);
2526
0
}
2527
2528
2529
const struct crypto_bignum * crypto_ec_get_prime(struct crypto_ec *e)
2530
0
{
2531
0
  return (const struct crypto_bignum *) e->prime;
2532
0
}
2533
2534
2535
const struct crypto_bignum * crypto_ec_get_order(struct crypto_ec *e)
2536
0
{
2537
0
  return (const struct crypto_bignum *) e->order;
2538
0
}
2539
2540
2541
const struct crypto_bignum * crypto_ec_get_a(struct crypto_ec *e)
2542
0
{
2543
0
  return (const struct crypto_bignum *) e->a;
2544
0
}
2545
2546
2547
const struct crypto_bignum * crypto_ec_get_b(struct crypto_ec *e)
2548
0
{
2549
0
  return (const struct crypto_bignum *) e->b;
2550
0
}
2551
2552
2553
const struct crypto_ec_point * crypto_ec_get_generator(struct crypto_ec *e)
2554
0
{
2555
0
  return (const struct crypto_ec_point *)
2556
0
    EC_GROUP_get0_generator(e->group);
2557
0
}
2558
2559
2560
void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear)
2561
0
{
2562
0
  if (clear)
2563
0
    EC_POINT_clear_free((EC_POINT *) p);
2564
0
  else
2565
0
    EC_POINT_free((EC_POINT *) p);
2566
0
}
2567
2568
2569
int crypto_ec_point_x(struct crypto_ec *e, const struct crypto_ec_point *p,
2570
          struct crypto_bignum *x)
2571
0
{
2572
0
  return EC_POINT_get_affine_coordinates(e->group,
2573
0
                 (const EC_POINT *) p,
2574
0
                 (BIGNUM *) x, NULL,
2575
0
                 e->bnctx) == 1 ? 0 : -1;
2576
0
}
2577
2578
2579
int crypto_ec_point_to_bin(struct crypto_ec *e,
2580
         const struct crypto_ec_point *point, u8 *x, u8 *y)
2581
0
{
2582
0
  BIGNUM *x_bn, *y_bn;
2583
0
  int ret = -1;
2584
0
  int len = BN_num_bytes(e->prime);
2585
2586
0
  if (TEST_FAIL())
2587
0
    return -1;
2588
2589
0
  x_bn = BN_new();
2590
0
  y_bn = BN_new();
2591
2592
0
  if (x_bn && y_bn &&
2593
0
      EC_POINT_get_affine_coordinates(e->group, (EC_POINT *) point,
2594
0
              x_bn, y_bn, e->bnctx)) {
2595
0
    if (x) {
2596
0
      ret = crypto_bignum_to_bin(
2597
0
        (struct crypto_bignum *) x_bn, x, len, len);
2598
0
    }
2599
0
    if (ret >= 0 && y) {
2600
0
      ret = crypto_bignum_to_bin(
2601
0
        (struct crypto_bignum *) y_bn, y, len, len);
2602
0
    }
2603
2604
0
    if (ret > 0)
2605
0
      ret = 0;
2606
0
  }
2607
2608
0
  BN_clear_free(x_bn);
2609
0
  BN_clear_free(y_bn);
2610
0
  return ret;
2611
0
}
2612
2613
2614
struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e,
2615
              const u8 *val)
2616
0
{
2617
0
  BIGNUM *x, *y;
2618
0
  EC_POINT *elem;
2619
0
  int len = BN_num_bytes(e->prime);
2620
2621
0
  if (TEST_FAIL())
2622
0
    return NULL;
2623
2624
0
  x = BN_bin2bn(val, len, NULL);
2625
0
  y = BN_bin2bn(val + len, len, NULL);
2626
0
  elem = EC_POINT_new(e->group);
2627
0
  if (x == NULL || y == NULL || elem == NULL) {
2628
0
    BN_clear_free(x);
2629
0
    BN_clear_free(y);
2630
0
    EC_POINT_clear_free(elem);
2631
0
    return NULL;
2632
0
  }
2633
2634
0
  if (!EC_POINT_set_affine_coordinates(e->group, elem, x, y, e->bnctx)) {
2635
0
    EC_POINT_clear_free(elem);
2636
0
    elem = NULL;
2637
0
  }
2638
2639
0
  BN_clear_free(x);
2640
0
  BN_clear_free(y);
2641
2642
0
  return (struct crypto_ec_point *) elem;
2643
0
}
2644
2645
2646
int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a,
2647
      const struct crypto_ec_point *b,
2648
      struct crypto_ec_point *c)
2649
0
{
2650
0
  if (TEST_FAIL())
2651
0
    return -1;
2652
0
  return EC_POINT_add(e->group, (EC_POINT *) c, (const EC_POINT *) a,
2653
0
          (const EC_POINT *) b, e->bnctx) ? 0 : -1;
2654
0
}
2655
2656
2657
int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p,
2658
      const struct crypto_bignum *b,
2659
      struct crypto_ec_point *res)
2660
0
{
2661
0
  if (TEST_FAIL())
2662
0
    return -1;
2663
0
  return EC_POINT_mul(e->group, (EC_POINT *) res, NULL,
2664
0
          (const EC_POINT *) p, (const BIGNUM *) b, e->bnctx)
2665
0
    ? 0 : -1;
2666
0
}
2667
2668
2669
int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p)
2670
0
{
2671
0
  if (TEST_FAIL())
2672
0
    return -1;
2673
0
  return EC_POINT_invert(e->group, (EC_POINT *) p, e->bnctx) ? 0 : -1;
2674
0
}
2675
2676
2677
struct crypto_bignum *
2678
crypto_ec_point_compute_y_sqr(struct crypto_ec *e,
2679
            const struct crypto_bignum *x)
2680
0
{
2681
0
  BIGNUM *tmp;
2682
2683
0
  if (TEST_FAIL())
2684
0
    return NULL;
2685
2686
0
  tmp = BN_new();
2687
2688
  /* y^2 = x^3 + ax + b = (x^2 + a)x + b */
2689
0
  if (tmp &&
2690
0
      BN_mod_sqr(tmp, (const BIGNUM *) x, e->prime, e->bnctx) &&
2691
0
      BN_mod_add_quick(tmp, e->a, tmp, e->prime) &&
2692
0
      BN_mod_mul(tmp, tmp, (const BIGNUM *) x, e->prime, e->bnctx) &&
2693
0
      BN_mod_add_quick(tmp, tmp, e->b, e->prime))
2694
0
    return (struct crypto_bignum *) tmp;
2695
2696
0
  BN_clear_free(tmp);
2697
0
  return NULL;
2698
0
}
2699
2700
2701
int crypto_ec_point_is_at_infinity(struct crypto_ec *e,
2702
           const struct crypto_ec_point *p)
2703
0
{
2704
0
  return EC_POINT_is_at_infinity(e->group, (const EC_POINT *) p);
2705
0
}
2706
2707
2708
int crypto_ec_point_is_on_curve(struct crypto_ec *e,
2709
        const struct crypto_ec_point *p)
2710
0
{
2711
0
  return EC_POINT_is_on_curve(e->group, (const EC_POINT *) p,
2712
0
            e->bnctx) == 1;
2713
0
}
2714
2715
2716
int crypto_ec_point_cmp(const struct crypto_ec *e,
2717
      const struct crypto_ec_point *a,
2718
      const struct crypto_ec_point *b)
2719
0
{
2720
0
  return EC_POINT_cmp(e->group, (const EC_POINT *) a,
2721
0
          (const EC_POINT *) b, e->bnctx);
2722
0
}
2723
2724
2725
void crypto_ec_point_debug_print(const struct crypto_ec *e,
2726
         const struct crypto_ec_point *p,
2727
         const char *title)
2728
0
{
2729
0
  BIGNUM *x, *y;
2730
0
  char *x_str = NULL, *y_str = NULL;
2731
2732
0
  x = BN_new();
2733
0
  y = BN_new();
2734
0
  if (!x || !y ||
2735
0
      EC_POINT_get_affine_coordinates(e->group, (const EC_POINT *) p,
2736
0
              x, y, e->bnctx) != 1)
2737
0
    goto fail;
2738
2739
0
  x_str = BN_bn2hex(x);
2740
0
  y_str = BN_bn2hex(y);
2741
0
  if (!x_str || !y_str)
2742
0
    goto fail;
2743
2744
0
  wpa_printf(MSG_DEBUG, "%s (%s,%s)", title, x_str, y_str);
2745
2746
0
fail:
2747
0
  OPENSSL_free(x_str);
2748
0
  OPENSSL_free(y_str);
2749
0
  BN_free(x);
2750
0
  BN_free(y);
2751
0
}
2752
2753
2754
struct crypto_ecdh {
2755
  struct crypto_ec *ec;
2756
  EVP_PKEY *pkey;
2757
};
2758
2759
struct crypto_ecdh * crypto_ecdh_init(int group)
2760
2.99k
{
2761
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2762
  struct crypto_ecdh *ecdh;
2763
  const char *name;
2764
2765
  ecdh = os_zalloc(sizeof(*ecdh));
2766
  if (!ecdh)
2767
    goto fail;
2768
2769
  ecdh->ec = crypto_ec_init(group);
2770
  if (!ecdh->ec)
2771
    goto fail;
2772
2773
  name = OSSL_EC_curve_nid2name(ecdh->ec->nid);
2774
  if (!name)
2775
    goto fail;
2776
2777
  ecdh->pkey = EVP_EC_gen(name);
2778
  if (!ecdh->pkey) {
2779
    wpa_printf(MSG_INFO,
2780
         "OpenSSL: EVP_EC_gen(group=%d) failed: %s",
2781
         group, ERR_error_string(ERR_get_error(), NULL));
2782
    goto fail;
2783
  }
2784
2785
done:
2786
  return ecdh;
2787
fail:
2788
  crypto_ecdh_deinit(ecdh);
2789
  ecdh = NULL;
2790
  goto done;
2791
#else /* OpenSSL version >= 3.0 */
2792
2.99k
  struct crypto_ecdh *ecdh;
2793
2.99k
  EVP_PKEY *params = NULL;
2794
2.99k
  EC_KEY *ec_params = NULL;
2795
2.99k
  EVP_PKEY_CTX *kctx = NULL;
2796
2797
2.99k
  ecdh = os_zalloc(sizeof(*ecdh));
2798
2.99k
  if (!ecdh)
2799
0
    goto fail;
2800
2801
2.99k
  ecdh->ec = crypto_ec_init(group);
2802
2.99k
  if (!ecdh->ec)
2803
0
    goto fail;
2804
2805
2.99k
  ec_params = EC_KEY_new_by_curve_name(ecdh->ec->nid);
2806
2.99k
  if (!ec_params) {
2807
0
    wpa_printf(MSG_ERROR,
2808
0
         "OpenSSL: Failed to generate EC_KEY parameters");
2809
0
    goto fail;
2810
0
  }
2811
2.99k
  EC_KEY_set_asn1_flag(ec_params, OPENSSL_EC_NAMED_CURVE);
2812
2.99k
  params = EVP_PKEY_new();
2813
2.99k
  if (!params || EVP_PKEY_set1_EC_KEY(params, ec_params) != 1) {
2814
0
    wpa_printf(MSG_ERROR,
2815
0
         "OpenSSL: Failed to generate EVP_PKEY parameters");
2816
0
    goto fail;
2817
0
  }
2818
2819
2.99k
  kctx = EVP_PKEY_CTX_new(params, NULL);
2820
2.99k
  if (!kctx)
2821
0
    goto fail;
2822
2823
2.99k
  if (EVP_PKEY_keygen_init(kctx) != 1) {
2824
0
    wpa_printf(MSG_ERROR,
2825
0
         "OpenSSL: EVP_PKEY_keygen_init failed: %s",
2826
0
         ERR_error_string(ERR_get_error(), NULL));
2827
0
    goto fail;
2828
0
  }
2829
2830
2.99k
  if (EVP_PKEY_keygen(kctx, &ecdh->pkey) != 1) {
2831
0
    wpa_printf(MSG_ERROR, "OpenSSL: EVP_PKEY_keygen failed: %s",
2832
0
         ERR_error_string(ERR_get_error(), NULL));
2833
0
    goto fail;
2834
0
  }
2835
2836
2.99k
done:
2837
2.99k
  EC_KEY_free(ec_params);
2838
2.99k
  EVP_PKEY_free(params);
2839
2.99k
  EVP_PKEY_CTX_free(kctx);
2840
2841
2.99k
  return ecdh;
2842
0
fail:
2843
0
  crypto_ecdh_deinit(ecdh);
2844
0
  ecdh = NULL;
2845
0
  goto done;
2846
2.99k
#endif /* OpenSSL version >= 3.0 */
2847
2.99k
}
2848
2849
2850
struct crypto_ecdh * crypto_ecdh_init2(int group, struct crypto_ec_key *own_key)
2851
0
{
2852
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2853
  struct crypto_ecdh *ecdh;
2854
2855
  ecdh = os_zalloc(sizeof(*ecdh));
2856
  if (!ecdh)
2857
    goto fail;
2858
2859
  ecdh->ec = crypto_ec_init(group);
2860
  if (!ecdh->ec)
2861
    goto fail;
2862
2863
  ecdh->pkey = EVP_PKEY_dup((EVP_PKEY *) own_key);
2864
  if (!ecdh->pkey)
2865
    goto fail;
2866
2867
  return ecdh;
2868
fail:
2869
  crypto_ecdh_deinit(ecdh);
2870
  return NULL;
2871
#else /* OpenSSL version >= 3.0 */
2872
0
  struct crypto_ecdh *ecdh;
2873
2874
0
  ecdh = os_zalloc(sizeof(*ecdh));
2875
0
  if (!ecdh)
2876
0
    goto fail;
2877
2878
0
  ecdh->ec = crypto_ec_init(group);
2879
0
  if (!ecdh->ec)
2880
0
    goto fail;
2881
2882
0
  ecdh->pkey = EVP_PKEY_new();
2883
0
  if (!ecdh->pkey ||
2884
0
      EVP_PKEY_assign_EC_KEY(ecdh->pkey,
2885
0
           EVP_PKEY_get1_EC_KEY((EVP_PKEY *) own_key))
2886
0
      != 1)
2887
0
    goto fail;
2888
2889
0
  return ecdh;
2890
0
fail:
2891
0
  crypto_ecdh_deinit(ecdh);
2892
0
  return NULL;
2893
0
#endif /* OpenSSL version >= 3.0 */
2894
0
}
2895
2896
2897
struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y)
2898
2.99k
{
2899
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2900
  struct wpabuf *buf = NULL;
2901
  unsigned char *pub;
2902
  size_t len, exp_len;
2903
2904
  len = EVP_PKEY_get1_encoded_public_key(ecdh->pkey, &pub);
2905
  if (len == 0)
2906
    return NULL;
2907
2908
  /* Encoded using SECG SEC 1, Sec. 2.3.4 format */
2909
  exp_len = 1 + 2 * crypto_ec_prime_len(ecdh->ec);
2910
  if (len != exp_len) {
2911
    wpa_printf(MSG_ERROR,
2912
         "OpenSSL:%s: Unexpected encoded public key length %zu (expected %zu)",
2913
         __func__, len, exp_len);
2914
    goto fail;
2915
  }
2916
  buf = wpabuf_alloc_copy(pub + 1, inc_y ? len - 1 : len / 2);
2917
fail:
2918
  OPENSSL_free(pub);
2919
  return buf;
2920
#else /* OpenSSL version >= 3.0 */
2921
2.99k
  struct wpabuf *buf = NULL;
2922
2.99k
  EC_KEY *eckey;
2923
2.99k
  const EC_POINT *pubkey;
2924
2.99k
  BIGNUM *x, *y = NULL;
2925
2.99k
  int len = BN_num_bytes(ecdh->ec->prime);
2926
2.99k
  int res;
2927
2928
2.99k
  eckey = EVP_PKEY_get1_EC_KEY(ecdh->pkey);
2929
2.99k
  if (!eckey)
2930
0
    return NULL;
2931
2932
2.99k
  pubkey = EC_KEY_get0_public_key(eckey);
2933
2.99k
  if (!pubkey)
2934
0
    return NULL;
2935
2936
2.99k
  x = BN_new();
2937
2.99k
  if (inc_y) {
2938
0
    y = BN_new();
2939
0
    if (!y)
2940
0
      goto fail;
2941
0
  }
2942
2.99k
  buf = wpabuf_alloc(inc_y ? 2 * len : len);
2943
2.99k
  if (!x || !buf)
2944
0
    goto fail;
2945
2946
2.99k
  if (EC_POINT_get_affine_coordinates(ecdh->ec->group, pubkey,
2947
2.99k
              x, y, ecdh->ec->bnctx) != 1) {
2948
0
    wpa_printf(MSG_ERROR,
2949
0
         "OpenSSL: EC_POINT_get_affine_coordinates failed: %s",
2950
0
         ERR_error_string(ERR_get_error(), NULL));
2951
0
    goto fail;
2952
0
  }
2953
2954
2.99k
  res = crypto_bignum_to_bin((struct crypto_bignum *) x,
2955
2.99k
           wpabuf_put(buf, len), len, len);
2956
2.99k
  if (res < 0)
2957
0
    goto fail;
2958
2959
2.99k
  if (inc_y) {
2960
0
    res = crypto_bignum_to_bin((struct crypto_bignum *) y,
2961
0
             wpabuf_put(buf, len), len, len);
2962
0
    if (res < 0)
2963
0
      goto fail;
2964
0
  }
2965
2966
2.99k
done:
2967
2.99k
  BN_clear_free(x);
2968
2.99k
  BN_clear_free(y);
2969
2.99k
  EC_KEY_free(eckey);
2970
2971
2.99k
  return buf;
2972
0
fail:
2973
0
  wpabuf_free(buf);
2974
0
  buf = NULL;
2975
0
  goto done;
2976
2.99k
#endif /* OpenSSL version >= 3.0 */
2977
2.99k
}
2978
2979
2980
struct wpabuf * crypto_ecdh_set_peerkey(struct crypto_ecdh *ecdh, int inc_y,
2981
          const u8 *key, size_t len)
2982
186
{
2983
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2984
  EVP_PKEY *peerkey = EVP_PKEY_new();
2985
  EVP_PKEY_CTX *ctx;
2986
  size_t res_len;
2987
  struct wpabuf *res = NULL;
2988
  u8 *peer;
2989
2990
  /* Encode using SECG SEC 1, Sec. 2.3.4 format */
2991
  peer = os_malloc(1 + len);
2992
  if (!peer) {
2993
    EVP_PKEY_free(peerkey);
2994
    return NULL;
2995
  }
2996
  peer[0] = inc_y ? 0x04 : 0x02;
2997
  os_memcpy(peer + 1, key, len);
2998
2999
  if (!peerkey ||
3000
      EVP_PKEY_copy_parameters(peerkey, ecdh->pkey) != 1 ||
3001
      EVP_PKEY_set1_encoded_public_key(peerkey, peer, 1 + len) != 1) {
3002
    wpa_printf(MSG_INFO, "OpenSSL: EVP_PKEY_set1_encoded_public_key failed: %s",
3003
         ERR_error_string(ERR_get_error(), NULL));
3004
    EVP_PKEY_free(peerkey);
3005
    os_free(peer);
3006
    return NULL;
3007
  }
3008
  os_free(peer);
3009
3010
  ctx = EVP_PKEY_CTX_new(ecdh->pkey, NULL);
3011
  if (!ctx ||
3012
      EVP_PKEY_derive_init(ctx) != 1 ||
3013
      EVP_PKEY_derive_set_peer(ctx, peerkey) != 1 ||
3014
      EVP_PKEY_derive(ctx, NULL, &res_len) != 1 ||
3015
      !(res = wpabuf_alloc(res_len)) ||
3016
      EVP_PKEY_derive(ctx, wpabuf_mhead(res), &res_len) != 1) {
3017
    wpa_printf(MSG_INFO, "OpenSSL: EVP_PKEY_derive failed: %s",
3018
         ERR_error_string(ERR_get_error(), NULL));
3019
    wpabuf_free(res);
3020
    res = NULL;
3021
  } else {
3022
    wpabuf_put(res, res_len);
3023
  }
3024
3025
  EVP_PKEY_free(peerkey);
3026
  EVP_PKEY_CTX_free(ctx);
3027
  return res;
3028
#else /* OpenSSL version >= 3.0 */
3029
186
  BIGNUM *x, *y = NULL;
3030
186
  EVP_PKEY_CTX *ctx = NULL;
3031
186
  EVP_PKEY *peerkey = NULL;
3032
186
  struct wpabuf *secret = NULL;
3033
186
  size_t secret_len;
3034
186
  EC_POINT *pub;
3035
186
  EC_KEY *eckey = NULL;
3036
3037
186
  x = BN_bin2bn(key, inc_y ? len / 2 : len, NULL);
3038
186
  pub = EC_POINT_new(ecdh->ec->group);
3039
186
  if (!x || !pub)
3040
0
    goto fail;
3041
3042
186
  if (inc_y) {
3043
2
    y = BN_bin2bn(key + len / 2, len / 2, NULL);
3044
2
    if (!y)
3045
0
      goto fail;
3046
2
    if (!EC_POINT_set_affine_coordinates(ecdh->ec->group, pub,
3047
2
                 x, y, ecdh->ec->bnctx)) {
3048
2
      wpa_printf(MSG_ERROR,
3049
2
           "OpenSSL: EC_POINT_set_affine_coordinates failed: %s",
3050
2
           ERR_error_string(ERR_get_error(), NULL));
3051
2
      goto fail;
3052
2
    }
3053
184
  } else if (!EC_POINT_set_compressed_coordinates(ecdh->ec->group,
3054
184
              pub, x, 0,
3055
184
              ecdh->ec->bnctx)) {
3056
1
    wpa_printf(MSG_ERROR,
3057
1
         "OpenSSL: EC_POINT_set_compressed_coordinates failed: %s",
3058
1
         ERR_error_string(ERR_get_error(), NULL));
3059
1
    goto fail;
3060
1
  }
3061
3062
183
  if (!EC_POINT_is_on_curve(ecdh->ec->group, pub, ecdh->ec->bnctx)) {
3063
0
    wpa_printf(MSG_ERROR,
3064
0
         "OpenSSL: ECDH peer public key is not on curve");
3065
0
    goto fail;
3066
0
  }
3067
3068
183
  eckey = EC_KEY_new_by_curve_name(ecdh->ec->nid);
3069
183
  if (!eckey || EC_KEY_set_public_key(eckey, pub) != 1) {
3070
0
    wpa_printf(MSG_ERROR,
3071
0
         "OpenSSL: EC_KEY_set_public_key failed: %s",
3072
0
         ERR_error_string(ERR_get_error(), NULL));
3073
0
    goto fail;
3074
0
  }
3075
3076
183
  peerkey = EVP_PKEY_new();
3077
183
  if (!peerkey || EVP_PKEY_set1_EC_KEY(peerkey, eckey) != 1)
3078
0
    goto fail;
3079
3080
183
  ctx = EVP_PKEY_CTX_new(ecdh->pkey, NULL);
3081
183
  if (!ctx || EVP_PKEY_derive_init(ctx) != 1 ||
3082
183
      EVP_PKEY_derive_set_peer(ctx, peerkey) != 1 ||
3083
183
      EVP_PKEY_derive(ctx, NULL, &secret_len) != 1) {
3084
0
    wpa_printf(MSG_ERROR,
3085
0
         "OpenSSL: EVP_PKEY_derive(1) failed: %s",
3086
0
         ERR_error_string(ERR_get_error(), NULL));
3087
0
    goto fail;
3088
0
  }
3089
3090
183
  secret = wpabuf_alloc(secret_len);
3091
183
  if (!secret)
3092
0
    goto fail;
3093
183
  if (EVP_PKEY_derive(ctx, wpabuf_put(secret, 0), &secret_len) != 1) {
3094
0
    wpa_printf(MSG_ERROR,
3095
0
         "OpenSSL: EVP_PKEY_derive(2) failed: %s",
3096
0
         ERR_error_string(ERR_get_error(), NULL));
3097
0
    goto fail;
3098
0
  }
3099
183
  if (secret->size != secret_len)
3100
0
    wpa_printf(MSG_DEBUG,
3101
0
         "OpenSSL: EVP_PKEY_derive(2) changed secret_len %d -> %d",
3102
0
         (int) secret->size, (int) secret_len);
3103
183
  wpabuf_put(secret, secret_len);
3104
3105
186
done:
3106
186
  BN_free(x);
3107
186
  BN_free(y);
3108
186
  EC_KEY_free(eckey);
3109
186
  EC_POINT_free(pub);
3110
186
  EVP_PKEY_CTX_free(ctx);
3111
186
  EVP_PKEY_free(peerkey);
3112
186
  return secret;
3113
3
fail:
3114
3
  wpabuf_free(secret);
3115
3
  secret = NULL;
3116
3
  goto done;
3117
183
#endif /* OpenSSL version >= 3.0 */
3118
183
}
3119
3120
3121
void crypto_ecdh_deinit(struct crypto_ecdh *ecdh)
3122
2.99k
{
3123
2.99k
  if (ecdh) {
3124
2.99k
    crypto_ec_deinit(ecdh->ec);
3125
2.99k
    EVP_PKEY_free(ecdh->pkey);
3126
2.99k
    os_free(ecdh);
3127
2.99k
  }
3128
2.99k
}
3129
3130
3131
size_t crypto_ecdh_prime_len(struct crypto_ecdh *ecdh)
3132
2.99k
{
3133
2.99k
  return crypto_ec_prime_len(ecdh->ec);
3134
2.99k
}
3135
3136
3137
struct crypto_ec_key * crypto_ec_key_parse_priv(const u8 *der, size_t der_len)
3138
0
{
3139
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3140
  EVP_PKEY *pkey = NULL;
3141
  OSSL_DECODER_CTX *ctx;
3142
3143
  ctx = OSSL_DECODER_CTX_new_for_pkey(
3144
    &pkey, "DER", NULL, "EC",
3145
    OSSL_KEYMGMT_SELECT_KEYPAIR |
3146
    OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
3147
    NULL, NULL);
3148
  if (!ctx ||
3149
      OSSL_DECODER_from_data(ctx, &der, &der_len) != 1) {
3150
    wpa_printf(MSG_INFO,
3151
         "OpenSSL: Decoding EC private key (DER) failed: %s",
3152
         ERR_error_string(ERR_get_error(), NULL));
3153
    if (ctx)
3154
      OSSL_DECODER_CTX_free(ctx);
3155
    goto fail;
3156
  }
3157
3158
  OSSL_DECODER_CTX_free(ctx);
3159
  return (struct crypto_ec_key *) pkey;
3160
fail:
3161
  crypto_ec_key_deinit((struct crypto_ec_key *) pkey);
3162
  return NULL;
3163
#else /* OpenSSL version >= 3.0 */
3164
0
  EVP_PKEY *pkey = NULL;
3165
0
  EC_KEY *eckey;
3166
3167
0
  eckey = d2i_ECPrivateKey(NULL, &der, der_len);
3168
0
  if (!eckey) {
3169
0
    wpa_printf(MSG_INFO, "OpenSSL: d2i_ECPrivateKey() failed: %s",
3170
0
         ERR_error_string(ERR_get_error(), NULL));
3171
0
    goto fail;
3172
0
  }
3173
0
  EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
3174
3175
0
  pkey = EVP_PKEY_new();
3176
0
  if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, eckey) != 1) {
3177
0
    EC_KEY_free(eckey);
3178
0
    goto fail;
3179
0
  }
3180
3181
0
  return (struct crypto_ec_key *) pkey;
3182
0
fail:
3183
0
  crypto_ec_key_deinit((struct crypto_ec_key *) pkey);
3184
0
  return NULL;
3185
0
#endif /* OpenSSL version >= 3.0 */
3186
0
}
3187
3188
3189
struct crypto_ec_key * crypto_ec_key_set_priv(int group,
3190
                const u8 *raw, size_t raw_len)
3191
0
{
3192
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3193
  const char *group_name;
3194
  OSSL_PARAM params[4];
3195
  EVP_PKEY_CTX *ctx = NULL;
3196
  EVP_PKEY *pkey = NULL;
3197
  BIGNUM *priv;
3198
  EC_POINT *pub = NULL;
3199
  EC_GROUP *ec_group = NULL;
3200
  size_t len;
3201
  u8 *pub_bin = NULL;
3202
  u8 *priv_bin = NULL;
3203
  int priv_bin_len;
3204
3205
  group_name = crypto_ec_group_2_name(group);
3206
  if (!group_name)
3207
    return NULL;
3208
3209
  priv = BN_bin2bn(raw, raw_len, NULL);
3210
  if (!priv)
3211
    return NULL;
3212
  priv_bin = os_malloc(raw_len);
3213
  if (!priv_bin)
3214
    goto fail;
3215
  priv_bin_len = BN_bn2lebinpad(priv, priv_bin, raw_len);
3216
  if (priv_bin_len < 0)
3217
    goto fail;
3218
3219
  ec_group = EC_GROUP_new_by_curve_name(crypto_ec_group_2_nid(group));
3220
  if (!ec_group)
3221
    goto fail;
3222
  pub = EC_POINT_new(ec_group);
3223
  if (!pub ||
3224
      EC_POINT_mul(ec_group, pub, priv, NULL, NULL, NULL) != 1)
3225
    goto fail;
3226
  len = EC_POINT_point2oct(ec_group, pub, POINT_CONVERSION_UNCOMPRESSED,
3227
         NULL, 0, NULL);
3228
  if (len == 0)
3229
    goto fail;
3230
  pub_bin = os_malloc(len);
3231
  if (!pub_bin)
3232
    goto fail;
3233
  len = EC_POINT_point2oct(ec_group, pub, POINT_CONVERSION_UNCOMPRESSED,
3234
         pub_bin, len, NULL);
3235
  if (len == 0)
3236
    goto fail;
3237
3238
  params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
3239
                 (char *) group_name, 0);
3240
  params[1] = OSSL_PARAM_construct_BN(OSSL_PKEY_PARAM_PRIV_KEY,
3241
              priv_bin, priv_bin_len);
3242
  params[2] = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
3243
                  pub_bin, len);
3244
  params[3] = OSSL_PARAM_construct_end();
3245
3246
  ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
3247
  if (!ctx ||
3248
      EVP_PKEY_fromdata_init(ctx) <= 0 ||
3249
      EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0)
3250
    goto fail;
3251
3252
out:
3253
  bin_clear_free(priv_bin, raw_len);
3254
  os_free(pub_bin);
3255
  BN_clear_free(priv);
3256
  EVP_PKEY_CTX_free(ctx);
3257
  EC_POINT_free(pub);
3258
  EC_GROUP_free(ec_group);
3259
  return (struct crypto_ec_key *) pkey;
3260
3261
fail:
3262
  EVP_PKEY_free(pkey);
3263
  pkey = NULL;
3264
  goto out;
3265
#else /* OpenSSL version >= 3.0 */
3266
0
  EC_KEY *eckey = NULL;
3267
0
  EVP_PKEY *pkey = NULL;
3268
0
  BIGNUM *priv = NULL;
3269
0
  int nid;
3270
0
  const EC_GROUP *ec_group;
3271
0
  EC_POINT *pub = NULL;
3272
3273
0
  nid = crypto_ec_group_2_nid(group);
3274
0
  if (nid < 0) {
3275
0
    wpa_printf(MSG_ERROR, "OpenSSL: Unsupported group %d", group);
3276
0
    return NULL;
3277
0
  }
3278
3279
0
  eckey = EC_KEY_new_by_curve_name(nid);
3280
0
  priv = BN_bin2bn(raw, raw_len, NULL);
3281
0
  if (!eckey || !priv ||
3282
0
      EC_KEY_set_private_key(eckey, priv) != 1) {
3283
0
    wpa_printf(MSG_ERROR,
3284
0
         "OpenSSL: Failed to set EC_KEY: %s",
3285
0
         ERR_error_string(ERR_get_error(), NULL));
3286
0
    goto fail;
3287
0
  }
3288
3289
0
  ec_group = EC_KEY_get0_group(eckey);
3290
0
  if (!ec_group)
3291
0
    goto fail;
3292
0
  pub = EC_POINT_new(ec_group);
3293
0
  if (!pub ||
3294
0
      EC_POINT_mul(ec_group, pub, priv, NULL, NULL, NULL) != 1 ||
3295
0
      EC_KEY_set_public_key(eckey, pub) != 1) {
3296
0
    wpa_printf(MSG_ERROR,
3297
0
         "OpenSSL: Failed to set EC_KEY(pub): %s",
3298
0
         ERR_error_string(ERR_get_error(), NULL));
3299
0
    goto fail;
3300
0
  }
3301
3302
0
  EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
3303
3304
0
  pkey = EVP_PKEY_new();
3305
0
  if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, eckey) != 1) {
3306
0
    wpa_printf(MSG_ERROR, "OpenSSL: Could not create EVP_PKEY");
3307
0
    goto fail;
3308
0
  }
3309
3310
0
out:
3311
0
  BN_clear_free(priv);
3312
0
  EC_POINT_free(pub);
3313
0
  return (struct crypto_ec_key *) pkey;
3314
3315
0
fail:
3316
0
  EC_KEY_free(eckey);
3317
0
  EVP_PKEY_free(pkey);
3318
0
  pkey = NULL;
3319
0
  goto out;
3320
0
#endif /* OpenSSL version >= 3.0 */
3321
0
}
3322
3323
3324
struct crypto_ec_key * crypto_ec_key_parse_pub(const u8 *der, size_t der_len)
3325
0
{
3326
0
  EVP_PKEY *pkey;
3327
3328
0
  pkey = d2i_PUBKEY(NULL, &der, der_len);
3329
0
  if (!pkey) {
3330
0
    wpa_printf(MSG_INFO, "OpenSSL: d2i_PUBKEY() failed: %s",
3331
0
         ERR_error_string(ERR_get_error(), NULL));
3332
0
    goto fail;
3333
0
  }
3334
3335
  /* Ensure this is an EC key */
3336
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3337
  if (!EVP_PKEY_is_a(pkey, "EC"))
3338
    goto fail;
3339
#else /* OpenSSL version >= 3.0 */
3340
0
  if (!EVP_PKEY_get0_EC_KEY(pkey))
3341
0
    goto fail;
3342
0
#endif /* OpenSSL version >= 3.0 */
3343
0
  return (struct crypto_ec_key *) pkey;
3344
0
fail:
3345
0
  crypto_ec_key_deinit((struct crypto_ec_key *) pkey);
3346
0
  return NULL;
3347
0
}
3348
3349
3350
struct crypto_ec_key * crypto_ec_key_set_pub(int group, const u8 *buf_x,
3351
               const u8 *buf_y, size_t len)
3352
0
{
3353
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3354
  const char *group_name;
3355
  OSSL_PARAM params[3];
3356
  u8 *pub;
3357
  EVP_PKEY_CTX *ctx;
3358
  EVP_PKEY *pkey = NULL;
3359
3360
  group_name = crypto_ec_group_2_name(group);
3361
  if (!group_name)
3362
    return NULL;
3363
3364
  pub = os_malloc(1 + len * 2);
3365
  if (!pub)
3366
    return NULL;
3367
  pub[0] = 0x04; /* uncompressed */
3368
  os_memcpy(pub + 1, buf_x, len);
3369
  os_memcpy(pub + 1 + len, buf_y, len);
3370
3371
  params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
3372
                 (char *) group_name, 0);
3373
  params[1] = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
3374
                  pub, 1 + len * 2);
3375
  params[2] = OSSL_PARAM_construct_end();
3376
3377
  ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
3378
  if (!ctx) {
3379
    os_free(pub);
3380
    return NULL;
3381
  }
3382
  if (EVP_PKEY_fromdata_init(ctx) <= 0 ||
3383
      EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0) {
3384
    os_free(pub);
3385
    EVP_PKEY_CTX_free(ctx);
3386
    return NULL;
3387
  }
3388
3389
  os_free(pub);
3390
  EVP_PKEY_CTX_free(ctx);
3391
3392
  return (struct crypto_ec_key *) pkey;
3393
#else /* OpenSSL version >= 3.0 */
3394
0
  EC_KEY *eckey = NULL;
3395
0
  EVP_PKEY *pkey = NULL;
3396
0
  EC_GROUP *ec_group = NULL;
3397
0
  BN_CTX *ctx;
3398
0
  EC_POINT *point = NULL;
3399
0
  BIGNUM *x = NULL, *y = NULL;
3400
0
  int nid;
3401
3402
0
  if (!buf_x || !buf_y)
3403
0
    return NULL;
3404
3405
0
  nid = crypto_ec_group_2_nid(group);
3406
0
  if (nid < 0) {
3407
0
    wpa_printf(MSG_ERROR, "OpenSSL: Unsupported group %d", group);
3408
0
    return NULL;
3409
0
  }
3410
3411
0
  ctx = BN_CTX_new();
3412
0
  if (!ctx)
3413
0
    goto fail;
3414
3415
0
  ec_group = EC_GROUP_new_by_curve_name(nid);
3416
0
  if (!ec_group)
3417
0
    goto fail;
3418
3419
0
  x = BN_bin2bn(buf_x, len, NULL);
3420
0
  y = BN_bin2bn(buf_y, len, NULL);
3421
0
  point = EC_POINT_new(ec_group);
3422
0
  if (!x || !y || !point)
3423
0
    goto fail;
3424
3425
0
  if (!EC_POINT_set_affine_coordinates(ec_group, point, x, y, ctx)) {
3426
0
    wpa_printf(MSG_ERROR,
3427
0
         "OpenSSL: EC_POINT_set_affine_coordinates failed: %s",
3428
0
         ERR_error_string(ERR_get_error(), NULL));
3429
0
    goto fail;
3430
0
  }
3431
3432
0
  if (!EC_POINT_is_on_curve(ec_group, point, ctx) ||
3433
0
      EC_POINT_is_at_infinity(ec_group, point)) {
3434
0
    wpa_printf(MSG_ERROR, "OpenSSL: Invalid point");
3435
0
    goto fail;
3436
0
  }
3437
3438
0
  eckey = EC_KEY_new();
3439
0
  if (!eckey ||
3440
0
      EC_KEY_set_group(eckey, ec_group) != 1 ||
3441
0
      EC_KEY_set_public_key(eckey, point) != 1) {
3442
0
    wpa_printf(MSG_ERROR,
3443
0
         "OpenSSL: Failed to set EC_KEY: %s",
3444
0
         ERR_error_string(ERR_get_error(), NULL));
3445
0
    goto fail;
3446
0
  }
3447
0
  EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
3448
3449
0
  pkey = EVP_PKEY_new();
3450
0
  if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, eckey) != 1) {
3451
0
    wpa_printf(MSG_ERROR, "OpenSSL: Could not create EVP_PKEY");
3452
0
    goto fail;
3453
0
  }
3454
3455
0
out:
3456
0
  EC_GROUP_free(ec_group);
3457
0
  BN_free(x);
3458
0
  BN_free(y);
3459
0
  EC_POINT_free(point);
3460
0
  BN_CTX_free(ctx);
3461
0
  return (struct crypto_ec_key *) pkey;
3462
3463
0
fail:
3464
0
  EC_KEY_free(eckey);
3465
0
  EVP_PKEY_free(pkey);
3466
0
  pkey = NULL;
3467
0
  goto out;
3468
0
#endif /* OpenSSL version >= 3.0 */
3469
0
}
3470
3471
3472
struct crypto_ec_key *
3473
crypto_ec_key_set_pub_point(struct crypto_ec *ec,
3474
          const struct crypto_ec_point *pub)
3475
0
{
3476
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3477
  int len = BN_num_bytes(ec->prime);
3478
  struct crypto_ec_key *key;
3479
  u8 *buf;
3480
3481
  buf = os_malloc(2 * len);
3482
  if (!buf)
3483
    return NULL;
3484
  if (crypto_ec_point_to_bin(ec, pub, buf, buf + len) < 0) {
3485
    os_free(buf);
3486
    return NULL;
3487
  }
3488
3489
  key = crypto_ec_key_set_pub(ec->iana_group, buf, buf + len, len);
3490
  os_free(buf);
3491
3492
  return key;
3493
#else /* OpenSSL version >= 3.0 */
3494
0
  EC_KEY *eckey;
3495
0
  EVP_PKEY *pkey = NULL;
3496
3497
0
  eckey = EC_KEY_new();
3498
0
  if (!eckey ||
3499
0
      EC_KEY_set_group(eckey, ec->group) != 1 ||
3500
0
      EC_KEY_set_public_key(eckey, (const EC_POINT *) pub) != 1) {
3501
0
    wpa_printf(MSG_ERROR,
3502
0
         "OpenSSL: Failed to set EC_KEY: %s",
3503
0
         ERR_error_string(ERR_get_error(), NULL));
3504
0
    goto fail;
3505
0
  }
3506
0
  EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
3507
3508
0
  pkey = EVP_PKEY_new();
3509
0
  if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, eckey) != 1) {
3510
0
    wpa_printf(MSG_ERROR, "OpenSSL: Could not create EVP_PKEY");
3511
0
    goto fail;
3512
0
  }
3513
3514
0
out:
3515
0
  return (struct crypto_ec_key *) pkey;
3516
3517
0
fail:
3518
0
  EVP_PKEY_free(pkey);
3519
0
  EC_KEY_free(eckey);
3520
0
  pkey = NULL;
3521
0
  goto out;
3522
0
#endif /* OpenSSL version >= 3.0 */
3523
0
}
3524
3525
3526
struct crypto_ec_key * crypto_ec_key_gen(int group)
3527
0
{
3528
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3529
  EVP_PKEY_CTX *ctx;
3530
  OSSL_PARAM params[2];
3531
  const char *group_name;
3532
  EVP_PKEY *pkey = NULL;
3533
3534
  group_name = crypto_ec_group_2_name(group);
3535
  if (!group_name)
3536
    return NULL;
3537
3538
  params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
3539
                 (char *) group_name, 0);
3540
  params[1] = OSSL_PARAM_construct_end();
3541
3542
  ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
3543
  if (!ctx ||
3544
      EVP_PKEY_keygen_init(ctx) != 1 ||
3545
      EVP_PKEY_CTX_set_params(ctx, params) != 1 ||
3546
      EVP_PKEY_generate(ctx, &pkey) != 1) {
3547
    wpa_printf(MSG_INFO,
3548
         "OpenSSL: Failed to generate EC keypair (group=%d): %s",
3549
         group, ERR_error_string(ERR_get_error(), NULL));
3550
    pkey = NULL;
3551
  }
3552
3553
  EVP_PKEY_CTX_free(ctx);
3554
3555
  return (struct crypto_ec_key *) pkey;
3556
#else /* OpenSSL version >= 3.0 */
3557
0
  EVP_PKEY_CTX *kctx = NULL;
3558
0
  EC_KEY *ec_params = NULL, *eckey;
3559
0
  EVP_PKEY *params = NULL, *key = NULL;
3560
0
  int nid;
3561
3562
0
  nid = crypto_ec_group_2_nid(group);
3563
0
  if (nid < 0) {
3564
0
    wpa_printf(MSG_ERROR, "OpenSSL: Unsupported group %d", group);
3565
0
    return NULL;
3566
0
  }
3567
3568
0
  ec_params = EC_KEY_new_by_curve_name(nid);
3569
0
  if (!ec_params) {
3570
0
    wpa_printf(MSG_ERROR,
3571
0
         "OpenSSL: Failed to generate EC_KEY parameters");
3572
0
    goto fail;
3573
0
  }
3574
0
  EC_KEY_set_asn1_flag(ec_params, OPENSSL_EC_NAMED_CURVE);
3575
0
  params = EVP_PKEY_new();
3576
0
  if (!params || EVP_PKEY_set1_EC_KEY(params, ec_params) != 1) {
3577
0
    wpa_printf(MSG_ERROR,
3578
0
         "OpenSSL: Failed to generate EVP_PKEY parameters");
3579
0
    goto fail;
3580
0
  }
3581
3582
0
  kctx = EVP_PKEY_CTX_new(params, NULL);
3583
0
  if (!kctx ||
3584
0
      EVP_PKEY_keygen_init(kctx) != 1 ||
3585
0
      EVP_PKEY_keygen(kctx, &key) != 1) {
3586
0
    wpa_printf(MSG_ERROR, "OpenSSL: Failed to generate EC key");
3587
0
    key = NULL;
3588
0
    goto fail;
3589
0
  }
3590
3591
0
  eckey = EVP_PKEY_get1_EC_KEY(key);
3592
0
  if (!eckey) {
3593
0
    key = NULL;
3594
0
    goto fail;
3595
0
  }
3596
0
  EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
3597
0
  EC_KEY_free(eckey);
3598
3599
0
fail:
3600
0
  EC_KEY_free(ec_params);
3601
0
  EVP_PKEY_free(params);
3602
0
  EVP_PKEY_CTX_free(kctx);
3603
0
  return (struct crypto_ec_key *) key;
3604
0
#endif /* OpenSSL version >= 3.0 */
3605
0
}
3606
3607
3608
void crypto_ec_key_deinit(struct crypto_ec_key *key)
3609
0
{
3610
0
  EVP_PKEY_free((EVP_PKEY *) key);
3611
0
}
3612
3613
3614
#ifdef OPENSSL_IS_BORINGSSL
3615
3616
/* BoringSSL version of i2d_PUBKEY() always outputs public EC key using
3617
 * uncompressed form so define a custom function to export EC pubkey using
3618
 * the compressed format that is explicitly required for some protocols. */
3619
3620
#include <openssl/asn1.h>
3621
#include <openssl/asn1t.h>
3622
3623
typedef struct {
3624
  /* AlgorithmIdentifier ecPublicKey with optional parameters present
3625
   * as an OID identifying the curve */
3626
  X509_ALGOR *alg;
3627
  /* Compressed format public key per ANSI X9.63 */
3628
  ASN1_BIT_STRING *pub_key;
3629
} EC_COMP_PUBKEY;
3630
3631
ASN1_SEQUENCE(EC_COMP_PUBKEY) = {
3632
  ASN1_SIMPLE(EC_COMP_PUBKEY, alg, X509_ALGOR),
3633
  ASN1_SIMPLE(EC_COMP_PUBKEY, pub_key, ASN1_BIT_STRING)
3634
} ASN1_SEQUENCE_END(EC_COMP_PUBKEY);
3635
3636
IMPLEMENT_ASN1_FUNCTIONS(EC_COMP_PUBKEY);
3637
3638
#endif /* OPENSSL_IS_BORINGSSL */
3639
3640
3641
struct wpabuf * crypto_ec_key_get_subject_public_key(struct crypto_ec_key *key)
3642
0
{
3643
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
3644
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3645
  OSSL_ENCODER_CTX *ctx;
3646
  int selection;
3647
  unsigned char *pdata = NULL;
3648
  size_t pdata_len = 0;
3649
  EVP_PKEY *copy = NULL;
3650
  struct wpabuf *buf = NULL;
3651
3652
  if (EVP_PKEY_get_ec_point_conv_form(pkey) !=
3653
      POINT_CONVERSION_COMPRESSED) {
3654
    copy = EVP_PKEY_dup(pkey);
3655
    if (!copy)
3656
      return NULL;
3657
    if (EVP_PKEY_set_utf8_string_param(
3658
          copy, OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT,
3659
          OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_COMPRESSED) !=
3660
        1) {
3661
      wpa_printf(MSG_INFO,
3662
           "OpenSSL: Failed to set compressed format");
3663
      EVP_PKEY_free(copy);
3664
      return NULL;
3665
    }
3666
    pkey = copy;
3667
  }
3668
3669
  selection = OSSL_KEYMGMT_SELECT_ALL_PARAMETERS |
3670
    OSSL_KEYMGMT_SELECT_PUBLIC_KEY;
3671
3672
  ctx = OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER",
3673
              "SubjectPublicKeyInfo",
3674
              NULL);
3675
  if (!ctx || OSSL_ENCODER_to_data(ctx, &pdata, &pdata_len) != 1) {
3676
    wpa_printf(MSG_INFO,
3677
         "OpenSSL: Failed to encode SubjectPublicKeyInfo: %s",
3678
         ERR_error_string(ERR_get_error(), NULL));
3679
    pdata = NULL;
3680
  }
3681
  OSSL_ENCODER_CTX_free(ctx);
3682
  if (pdata) {
3683
    buf = wpabuf_alloc_copy(pdata, pdata_len);
3684
    OPENSSL_free(pdata);
3685
  }
3686
3687
  EVP_PKEY_free(copy);
3688
3689
  return buf;
3690
#else /* OpenSSL version >= 3.0 */
3691
#ifdef OPENSSL_IS_BORINGSSL
3692
  unsigned char *der = NULL;
3693
  int der_len;
3694
  const EC_KEY *eckey;
3695
  struct wpabuf *ret = NULL;
3696
  size_t len;
3697
  const EC_GROUP *group;
3698
  const EC_POINT *point;
3699
  BN_CTX *ctx;
3700
  EC_COMP_PUBKEY *pubkey = NULL;
3701
  int nid;
3702
3703
  ctx = BN_CTX_new();
3704
  eckey = EVP_PKEY_get0_EC_KEY(pkey);
3705
  if (!ctx || !eckey)
3706
    goto fail;
3707
3708
  group = EC_KEY_get0_group(eckey);
3709
  point = EC_KEY_get0_public_key(eckey);
3710
  if (!group || !point)
3711
    goto fail;
3712
  nid = EC_GROUP_get_curve_name(group);
3713
3714
  pubkey = EC_COMP_PUBKEY_new();
3715
  if (!pubkey ||
3716
      X509_ALGOR_set0(pubkey->alg, OBJ_nid2obj(EVP_PKEY_EC),
3717
          V_ASN1_OBJECT, (void *) OBJ_nid2obj(nid)) != 1)
3718
    goto fail;
3719
3720
  len = EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED,
3721
         NULL, 0, ctx);
3722
  if (len == 0)
3723
    goto fail;
3724
3725
  der = OPENSSL_malloc(len);
3726
  if (!der)
3727
    goto fail;
3728
  len = EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED,
3729
         der, len, ctx);
3730
3731
  OPENSSL_free(pubkey->pub_key->data);
3732
  pubkey->pub_key->data = der;
3733
  der = NULL;
3734
  pubkey->pub_key->length = len;
3735
  /* No unused bits */
3736
  pubkey->pub_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
3737
  pubkey->pub_key->flags |= ASN1_STRING_FLAG_BITS_LEFT;
3738
3739
  der_len = i2d_EC_COMP_PUBKEY(pubkey, &der);
3740
  if (der_len <= 0) {
3741
    wpa_printf(MSG_ERROR,
3742
         "BoringSSL: Failed to build DER encoded public key");
3743
    goto fail;
3744
  }
3745
3746
  ret = wpabuf_alloc_copy(der, der_len);
3747
fail:
3748
  EC_COMP_PUBKEY_free(pubkey);
3749
  OPENSSL_free(der);
3750
  BN_CTX_free(ctx);
3751
  return ret;
3752
#else /* OPENSSL_IS_BORINGSSL */
3753
0
  unsigned char *der = NULL;
3754
0
  int der_len;
3755
0
  struct wpabuf *buf;
3756
0
  EC_KEY *eckey;
3757
3758
0
  eckey = EVP_PKEY_get1_EC_KEY(pkey);
3759
0
  if (!eckey)
3760
0
    return NULL;
3761
3762
  /* For now, all users expect COMPRESSED form */
3763
0
  EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
3764
3765
0
  der_len = i2d_PUBKEY((EVP_PKEY *) key, &der);
3766
0
  EC_KEY_free(eckey);
3767
0
  if (der_len <= 0) {
3768
0
    wpa_printf(MSG_INFO, "OpenSSL: i2d_PUBKEY() failed: %s",
3769
0
         ERR_error_string(ERR_get_error(), NULL));
3770
0
    return NULL;
3771
0
  }
3772
3773
0
  buf = wpabuf_alloc_copy(der, der_len);
3774
0
  OPENSSL_free(der);
3775
0
  return buf;
3776
0
#endif /* OPENSSL_IS_BORINGSSL */
3777
0
#endif /* OpenSSL version >= 3.0 */
3778
0
}
3779
3780
3781
struct wpabuf * crypto_ec_key_get_ecprivate_key(struct crypto_ec_key *key,
3782
            bool include_pub)
3783
0
{
3784
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
3785
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3786
  OSSL_ENCODER_CTX *ctx;
3787
  int selection;
3788
  unsigned char *pdata = NULL;
3789
  size_t pdata_len = 0;
3790
  struct wpabuf *buf;
3791
  EVP_PKEY *copy = NULL;
3792
3793
  selection = OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS |
3794
    OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
3795
  if (include_pub) {
3796
    selection |= OSSL_KEYMGMT_SELECT_PUBLIC_KEY;
3797
  } else {
3798
    /* Not including OSSL_KEYMGMT_SELECT_PUBLIC_KEY does not seem
3799
     * to really be sufficient, so clone the key and explicitly
3800
     * mark it not to include the public key. */
3801
    copy = EVP_PKEY_dup(pkey);
3802
    if (!copy)
3803
      return NULL;
3804
    EVP_PKEY_set_int_param(copy, OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC,
3805
               0);
3806
    pkey = copy;
3807
  }
3808
3809
  ctx = OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER",
3810
              "type-specific", NULL);
3811
  if (!ctx || OSSL_ENCODER_to_data(ctx, &pdata, &pdata_len) != 1) {
3812
    wpa_printf(MSG_INFO, "OpenSSL: OSSL_ENCODER failed: %s",
3813
         ERR_error_string(ERR_get_error(), NULL));
3814
    OSSL_ENCODER_CTX_free(ctx);
3815
    EVP_PKEY_free(copy);
3816
    return NULL;
3817
  }
3818
  OSSL_ENCODER_CTX_free(ctx);
3819
  buf = wpabuf_alloc_copy(pdata, pdata_len);
3820
  OPENSSL_free(pdata);
3821
  EVP_PKEY_free(copy);
3822
  return buf;
3823
#else /* OpenSSL version >= 3.0 */
3824
0
  EC_KEY *eckey;
3825
0
  unsigned char *der = NULL;
3826
0
  int der_len;
3827
0
  struct wpabuf *buf;
3828
0
  unsigned int key_flags;
3829
3830
0
  eckey = EVP_PKEY_get1_EC_KEY(pkey);
3831
0
  if (!eckey)
3832
0
    return NULL;
3833
3834
0
  key_flags = EC_KEY_get_enc_flags(eckey);
3835
0
  if (include_pub)
3836
0
    key_flags &= ~EC_PKEY_NO_PUBKEY;
3837
0
  else
3838
0
    key_flags |= EC_PKEY_NO_PUBKEY;
3839
0
  EC_KEY_set_enc_flags(eckey, key_flags);
3840
3841
0
  EC_KEY_set_conv_form(eckey, POINT_CONVERSION_UNCOMPRESSED);
3842
3843
0
  der_len = i2d_ECPrivateKey(eckey, &der);
3844
0
  EC_KEY_free(eckey);
3845
0
  if (der_len <= 0)
3846
0
    return NULL;
3847
0
  buf = wpabuf_alloc_copy(der, der_len);
3848
0
  OPENSSL_free(der);
3849
3850
0
  return buf;
3851
0
#endif /* OpenSSL version >= 3.0 */
3852
0
}
3853
3854
3855
struct wpabuf * crypto_ec_key_get_pubkey_point(struct crypto_ec_key *key,
3856
                 int prefix)
3857
0
{
3858
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
3859
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3860
  struct wpabuf *buf;
3861
  unsigned char *pos;
3862
  size_t pub_len = OSSL_PARAM_UNMODIFIED;
3863
3864
  buf = NULL;
3865
  if (!EVP_PKEY_is_a(pkey, "EC") ||
3866
      EVP_PKEY_get_octet_string_param(pkey,
3867
              OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
3868
              NULL, 0, &pub_len) < 0 ||
3869
      pub_len == OSSL_PARAM_UNMODIFIED ||
3870
      !(buf = wpabuf_alloc(pub_len)) ||
3871
      EVP_PKEY_get_octet_string_param(pkey,
3872
              OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
3873
              wpabuf_put(buf, pub_len),
3874
              pub_len, NULL) != 1 ||
3875
      wpabuf_head_u8(buf)[0] != 0x04) {
3876
    wpa_printf(MSG_INFO,
3877
         "OpenSSL: Failed to get encoded public key: %s",
3878
         ERR_error_string(ERR_get_error(), NULL));
3879
    wpabuf_free(buf);
3880
    return NULL;
3881
  }
3882
3883
  if (!prefix) {
3884
    /* Remove 0x04 prefix if requested */
3885
    pos = wpabuf_mhead(buf);
3886
    os_memmove(pos, pos + 1, pub_len - 1);
3887
    buf->used--;
3888
  }
3889
3890
  return buf;
3891
#else /* OpenSSL version >= 3.0 */
3892
0
  int len, res;
3893
0
  EC_KEY *eckey;
3894
0
  struct wpabuf *buf;
3895
0
  unsigned char *pos;
3896
3897
0
  eckey = EVP_PKEY_get1_EC_KEY(pkey);
3898
0
  if (!eckey)
3899
0
    return NULL;
3900
0
  EC_KEY_set_conv_form(eckey, POINT_CONVERSION_UNCOMPRESSED);
3901
0
  len = i2o_ECPublicKey(eckey, NULL);
3902
0
  if (len <= 0) {
3903
0
    wpa_printf(MSG_ERROR,
3904
0
         "OpenSSL: Failed to determine public key encoding length");
3905
0
    EC_KEY_free(eckey);
3906
0
    return NULL;
3907
0
  }
3908
3909
0
  buf = wpabuf_alloc(len);
3910
0
  if (!buf) {
3911
0
    EC_KEY_free(eckey);
3912
0
    return NULL;
3913
0
  }
3914
3915
0
  pos = wpabuf_put(buf, len);
3916
0
  res = i2o_ECPublicKey(eckey, &pos);
3917
0
  EC_KEY_free(eckey);
3918
0
  if (res != len) {
3919
0
    wpa_printf(MSG_ERROR,
3920
0
         "OpenSSL: Failed to encode public key (res=%d/%d)",
3921
0
         res, len);
3922
0
    wpabuf_free(buf);
3923
0
    return NULL;
3924
0
  }
3925
3926
0
  if (!prefix) {
3927
    /* Remove 0x04 prefix if requested */
3928
0
    pos = wpabuf_mhead(buf);
3929
0
    os_memmove(pos, pos + 1, len - 1);
3930
0
    buf->used--;
3931
0
  }
3932
3933
0
  return buf;
3934
0
#endif /* OpenSSL version >= 3.0 */
3935
0
}
3936
3937
3938
struct crypto_ec_point *
3939
crypto_ec_key_get_public_key(struct crypto_ec_key *key)
3940
0
{
3941
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
3942
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
3943
  char group[64];
3944
  unsigned char pub[256];
3945
  size_t len;
3946
  EC_POINT *point = NULL;
3947
  EC_GROUP *grp;
3948
  int res = 0;
3949
  OSSL_PARAM params[2];
3950
3951
  if (!EVP_PKEY_is_a(pkey, "EC") ||
3952
      EVP_PKEY_get_utf8_string_param(pkey, OSSL_PKEY_PARAM_GROUP_NAME,
3953
             group, sizeof(group), &len) != 1 ||
3954
      EVP_PKEY_get_octet_string_param(pkey, OSSL_PKEY_PARAM_PUB_KEY,
3955
              pub, sizeof(pub), &len) != 1)
3956
    return NULL;
3957
3958
  params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
3959
                 group, 0);
3960
  params[1] = OSSL_PARAM_construct_end();
3961
  grp = EC_GROUP_new_from_params(params, NULL, NULL);
3962
  if (!grp)
3963
    goto fail;
3964
  point = EC_POINT_new(grp);
3965
  if (!point)
3966
    goto fail;
3967
  res = EC_POINT_oct2point(grp, point, pub, len, NULL);
3968
3969
fail:
3970
  if (res != 1) {
3971
    EC_POINT_free(point);
3972
    point = NULL;
3973
  }
3974
3975
  EC_GROUP_free(grp);
3976
3977
  return (struct crypto_ec_point *) point;
3978
#else /* OpenSSL version >= 3.0 */
3979
0
  const EC_KEY *eckey;
3980
0
  const EC_POINT *point;
3981
0
  const EC_GROUP *group;
3982
3983
0
  eckey = EVP_PKEY_get0_EC_KEY(pkey);
3984
0
  if (!eckey)
3985
0
    return NULL;
3986
0
  group = EC_KEY_get0_group(eckey);
3987
0
  if (!group)
3988
0
    return NULL;
3989
0
  point = EC_KEY_get0_public_key(eckey);
3990
0
  if (!point)
3991
0
    return NULL;
3992
0
  return (struct crypto_ec_point *) EC_POINT_dup(point, group);
3993
0
#endif /* OpenSSL version >= 3.0 */
3994
0
}
3995
3996
3997
struct crypto_bignum *
3998
crypto_ec_key_get_private_key(struct crypto_ec_key *key)
3999
0
{
4000
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
4001
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4002
  BIGNUM *bn = NULL;
4003
4004
  if (!EVP_PKEY_is_a(pkey, "EC") ||
4005
      EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_PRIV_KEY, &bn) != 1)
4006
    return NULL;
4007
  return (struct crypto_bignum *) bn;
4008
#else /* OpenSSL version >= 3.0 */
4009
0
  const EC_KEY *eckey;
4010
0
  const BIGNUM *bn;
4011
4012
0
  eckey = EVP_PKEY_get0_EC_KEY(pkey);
4013
0
  if (!eckey)
4014
0
    return NULL;
4015
0
  bn = EC_KEY_get0_private_key(eckey);
4016
0
  if (!bn)
4017
0
    return NULL;
4018
0
  return (struct crypto_bignum *) BN_dup(bn);
4019
0
#endif /* OpenSSL version >= 3.0 */
4020
0
}
4021
4022
4023
struct wpabuf * crypto_ec_key_sign(struct crypto_ec_key *key, const u8 *data,
4024
           size_t len)
4025
0
{
4026
0
  EVP_PKEY_CTX *pkctx;
4027
0
  struct wpabuf *sig_der;
4028
0
  size_t sig_len;
4029
4030
0
  sig_len = EVP_PKEY_size((EVP_PKEY *) key);
4031
0
  sig_der = wpabuf_alloc(sig_len);
4032
0
  if (!sig_der)
4033
0
    return NULL;
4034
4035
0
  pkctx = EVP_PKEY_CTX_new((EVP_PKEY *) key, NULL);
4036
0
  if (!pkctx ||
4037
0
      EVP_PKEY_sign_init(pkctx) <= 0 ||
4038
0
      EVP_PKEY_sign(pkctx, wpabuf_put(sig_der, 0), &sig_len,
4039
0
        data, len) <= 0) {
4040
0
    wpabuf_free(sig_der);
4041
0
    sig_der = NULL;
4042
0
  } else {
4043
0
    wpabuf_put(sig_der, sig_len);
4044
0
  }
4045
4046
0
  EVP_PKEY_CTX_free(pkctx);
4047
0
  return sig_der;
4048
0
}
4049
4050
4051
static int openssl_evp_pkey_ec_prime_len(struct crypto_ec_key *key)
4052
0
{
4053
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4054
  char gname[50];
4055
  int nid;
4056
  EC_GROUP *group;
4057
  BIGNUM *prime = NULL;
4058
  int prime_len = -1;
4059
4060
  if (EVP_PKEY_get_group_name((EVP_PKEY *) key, gname, sizeof(gname),
4061
            NULL) != 1)
4062
    return -1;
4063
  nid = OBJ_txt2nid(gname);
4064
  group = EC_GROUP_new_by_curve_name(nid);
4065
  prime = BN_new();
4066
  if (!group || !prime)
4067
    goto fail;
4068
  if (EC_GROUP_get_curve(group, prime, NULL, NULL, NULL) == 1)
4069
    prime_len = BN_num_bytes(prime);
4070
fail:
4071
  EC_GROUP_free(group);
4072
  BN_free(prime);
4073
  return prime_len;
4074
#else
4075
0
  const EC_GROUP *group;
4076
0
  const EC_KEY *eckey;
4077
0
  BIGNUM *prime = NULL;
4078
0
  int prime_len = -1;
4079
4080
0
  eckey = EVP_PKEY_get0_EC_KEY((EVP_PKEY *) key);
4081
0
  if (!eckey)
4082
0
    goto fail;
4083
0
  group = EC_KEY_get0_group(eckey);
4084
0
  prime = BN_new();
4085
0
  if (!prime || !group ||
4086
0
      !EC_GROUP_get_curve(group, prime, NULL, NULL, NULL))
4087
0
    goto fail;
4088
0
  prime_len = BN_num_bytes(prime);
4089
0
fail:
4090
0
  BN_free(prime);
4091
0
  return prime_len;
4092
0
#endif
4093
0
}
4094
4095
4096
struct wpabuf * crypto_ec_key_sign_r_s(struct crypto_ec_key *key,
4097
               const u8 *data, size_t len)
4098
0
{
4099
0
  ECDSA_SIG *sig = NULL;
4100
0
  const BIGNUM *r, *s;
4101
0
  u8 *r_buf, *s_buf;
4102
0
  struct wpabuf *buf;
4103
0
  const unsigned char *p;
4104
0
  int prime_len;
4105
4106
0
  prime_len = openssl_evp_pkey_ec_prime_len(key);
4107
0
  if (prime_len < 0)
4108
0
    return NULL;
4109
4110
0
  buf = crypto_ec_key_sign(key, data, len);
4111
0
  if (!buf)
4112
0
    return NULL;
4113
4114
  /* Extract (r,s) from Ecdsa-Sig-Value */
4115
4116
0
  p = wpabuf_head(buf);
4117
0
  sig = d2i_ECDSA_SIG(NULL, &p, wpabuf_len(buf));
4118
0
  if (!sig)
4119
0
    goto fail;
4120
0
  ECDSA_SIG_get0(sig, &r, &s);
4121
4122
  /* Re-use wpabuf returned by crypto_ec_key_sign() */
4123
0
  buf->used = 0;
4124
0
  r_buf = wpabuf_put(buf, prime_len);
4125
0
  s_buf = wpabuf_put(buf, prime_len);
4126
0
  if (crypto_bignum_to_bin((const struct crypto_bignum *) r, r_buf,
4127
0
         prime_len, prime_len) < 0 ||
4128
0
      crypto_bignum_to_bin((const struct crypto_bignum *) s, s_buf,
4129
0
         prime_len, prime_len) < 0)
4130
0
    goto fail;
4131
4132
0
out:
4133
0
  ECDSA_SIG_free(sig);
4134
0
  return buf;
4135
0
fail:
4136
0
  wpabuf_clear_free(buf);
4137
0
  buf = NULL;
4138
0
  goto out;
4139
0
}
4140
4141
4142
int crypto_ec_key_verify_signature(struct crypto_ec_key *key, const u8 *data,
4143
           size_t len, const u8 *sig, size_t sig_len)
4144
0
{
4145
0
  EVP_PKEY_CTX *pkctx;
4146
0
  int ret;
4147
4148
0
  pkctx = EVP_PKEY_CTX_new((EVP_PKEY *) key, NULL);
4149
0
  if (!pkctx || EVP_PKEY_verify_init(pkctx) <= 0) {
4150
0
    EVP_PKEY_CTX_free(pkctx);
4151
0
    return -1;
4152
0
  }
4153
4154
0
  ret = EVP_PKEY_verify(pkctx, sig, sig_len, data, len);
4155
0
  EVP_PKEY_CTX_free(pkctx);
4156
0
  if (ret == 1)
4157
0
    return 1; /* signature ok */
4158
0
  if (ret == 0)
4159
0
    return 0; /* incorrect signature */
4160
0
  return -1;
4161
0
}
4162
4163
4164
int crypto_ec_key_verify_signature_r_s(struct crypto_ec_key *key,
4165
               const u8 *data, size_t len,
4166
               const u8 *r, size_t r_len,
4167
               const u8 *s, size_t s_len)
4168
0
{
4169
0
  ECDSA_SIG *sig;
4170
0
  BIGNUM *r_bn, *s_bn;
4171
0
  unsigned char *der = NULL;
4172
0
  int der_len;
4173
0
  int ret = -1;
4174
4175
0
  r_bn = BN_bin2bn(r, r_len, NULL);
4176
0
  s_bn = BN_bin2bn(s, s_len, NULL);
4177
0
  sig = ECDSA_SIG_new();
4178
0
  if (!r_bn || !s_bn || !sig || ECDSA_SIG_set0(sig, r_bn, s_bn) != 1)
4179
0
    goto fail;
4180
0
  r_bn = NULL;
4181
0
  s_bn = NULL;
4182
4183
0
  der_len = i2d_ECDSA_SIG(sig, &der);
4184
0
  if (der_len <= 0) {
4185
0
    wpa_printf(MSG_DEBUG,
4186
0
         "OpenSSL: Could not DER encode signature");
4187
0
    goto fail;
4188
0
  }
4189
4190
0
  ret = crypto_ec_key_verify_signature(key, data, len, der, der_len);
4191
4192
0
fail:
4193
0
  OPENSSL_free(der);
4194
0
  BN_free(r_bn);
4195
0
  BN_free(s_bn);
4196
0
  ECDSA_SIG_free(sig);
4197
0
  return ret;
4198
0
}
4199
4200
4201
int crypto_ec_key_group(struct crypto_ec_key *key)
4202
0
{
4203
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4204
  char gname[50];
4205
  int nid;
4206
4207
  if (EVP_PKEY_get_group_name((EVP_PKEY *) key, gname, sizeof(gname),
4208
            NULL) != 1)
4209
    return -1;
4210
  nid = OBJ_txt2nid(gname);
4211
#else
4212
0
  const EC_KEY *eckey;
4213
0
  const EC_GROUP *group;
4214
0
  int nid;
4215
4216
0
  eckey = EVP_PKEY_get0_EC_KEY((EVP_PKEY *) key);
4217
0
  if (!eckey)
4218
0
    return -1;
4219
0
  group = EC_KEY_get0_group(eckey);
4220
0
  if (!group)
4221
0
    return -1;
4222
0
  nid = EC_GROUP_get_curve_name(group);
4223
0
#endif
4224
0
  switch (nid) {
4225
0
  case NID_X9_62_prime256v1:
4226
0
    return 19;
4227
0
  case NID_secp384r1:
4228
0
    return 20;
4229
0
  case NID_secp521r1:
4230
0
    return 21;
4231
0
#ifdef NID_brainpoolP256r1
4232
0
  case NID_brainpoolP256r1:
4233
0
    return 28;
4234
0
#endif /* NID_brainpoolP256r1 */
4235
0
#ifdef NID_brainpoolP384r1
4236
0
  case NID_brainpoolP384r1:
4237
0
    return 29;
4238
0
#endif /* NID_brainpoolP384r1 */
4239
0
#ifdef NID_brainpoolP512r1
4240
0
  case NID_brainpoolP512r1:
4241
0
    return 30;
4242
0
#endif /* NID_brainpoolP512r1 */
4243
0
  default:
4244
0
    wpa_printf(MSG_ERROR,
4245
0
         "OpenSSL: Unsupported curve (nid=%d) in EC key",
4246
0
         nid);
4247
0
    return -1;
4248
0
  }
4249
0
}
4250
4251
4252
int crypto_ec_key_cmp(struct crypto_ec_key *key1, struct crypto_ec_key *key2)
4253
0
{
4254
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4255
  if (EVP_PKEY_eq((EVP_PKEY *) key1, (EVP_PKEY *) key2) != 1)
4256
    return -1;
4257
#else
4258
0
  if (EVP_PKEY_cmp((EVP_PKEY *) key1, (EVP_PKEY *) key2) != 1)
4259
0
    return -1;
4260
0
#endif
4261
0
  return 0;
4262
0
}
4263
4264
4265
void crypto_ec_key_debug_print(const struct crypto_ec_key *key,
4266
             const char *title)
4267
0
{
4268
0
  BIO *out;
4269
0
  size_t rlen;
4270
0
  char *txt;
4271
0
  int res;
4272
4273
0
  out = BIO_new(BIO_s_mem());
4274
0
  if (!out)
4275
0
    return;
4276
4277
0
  EVP_PKEY_print_private(out, (EVP_PKEY *) key, 0, NULL);
4278
0
  rlen = BIO_ctrl_pending(out);
4279
0
  txt = os_malloc(rlen + 1);
4280
0
  if (txt) {
4281
0
    res = BIO_read(out, txt, rlen);
4282
0
    if (res > 0) {
4283
0
      txt[res] = '\0';
4284
0
      wpa_printf(MSG_DEBUG, "%s: %s", title, txt);
4285
0
    }
4286
0
    os_free(txt);
4287
0
  }
4288
0
  BIO_free(out);
4289
0
}
4290
4291
4292
struct wpabuf * crypto_pkcs7_get_certificates(const struct wpabuf *pkcs7)
4293
0
{
4294
#ifdef OPENSSL_IS_BORINGSSL
4295
  CBS pkcs7_cbs;
4296
#else /* OPENSSL_IS_BORINGSSL */
4297
0
  PKCS7 *p7 = NULL;
4298
0
  const unsigned char *p = wpabuf_head(pkcs7);
4299
0
#endif /* OPENSSL_IS_BORINGSSL */
4300
0
  STACK_OF(X509) *certs;
4301
0
  int i, num;
4302
0
  BIO *out = NULL;
4303
0
  size_t rlen;
4304
0
  struct wpabuf *pem = NULL;
4305
0
  int res;
4306
4307
#ifdef OPENSSL_IS_BORINGSSL
4308
  certs = sk_X509_new_null();
4309
  if (!certs)
4310
    goto fail;
4311
  CBS_init(&pkcs7_cbs, wpabuf_head(pkcs7), wpabuf_len(pkcs7));
4312
  if (!PKCS7_get_certificates(certs, &pkcs7_cbs)) {
4313
    wpa_printf(MSG_INFO,
4314
         "OpenSSL: Could not parse PKCS#7 object: %s",
4315
         ERR_error_string(ERR_get_error(), NULL));
4316
    goto fail;
4317
  }
4318
#else /* OPENSSL_IS_BORINGSSL */
4319
0
  p7 = d2i_PKCS7(NULL, &p, wpabuf_len(pkcs7));
4320
0
  if (!p7) {
4321
0
    wpa_printf(MSG_INFO,
4322
0
         "OpenSSL: Could not parse PKCS#7 object: %s",
4323
0
         ERR_error_string(ERR_get_error(), NULL));
4324
0
    goto fail;
4325
0
  }
4326
4327
0
  switch (OBJ_obj2nid(p7->type)) {
4328
0
  case NID_pkcs7_signed:
4329
0
    certs = p7->d.sign->cert;
4330
0
    break;
4331
0
  case NID_pkcs7_signedAndEnveloped:
4332
0
    certs = p7->d.signed_and_enveloped->cert;
4333
0
    break;
4334
0
  default:
4335
0
    certs = NULL;
4336
0
    break;
4337
0
  }
4338
0
#endif /* OPENSSL_IS_BORINGSSL */
4339
4340
0
  if (!certs || ((num = sk_X509_num(certs)) == 0)) {
4341
0
    wpa_printf(MSG_INFO,
4342
0
         "OpenSSL: No certificates found in PKCS#7 object");
4343
0
    goto fail;
4344
0
  }
4345
4346
0
  out = BIO_new(BIO_s_mem());
4347
0
  if (!out)
4348
0
    goto fail;
4349
4350
0
  for (i = 0; i < num; i++) {
4351
0
    X509 *cert = sk_X509_value(certs, i);
4352
4353
0
    PEM_write_bio_X509(out, cert);
4354
0
  }
4355
4356
0
  rlen = BIO_ctrl_pending(out);
4357
0
  pem = wpabuf_alloc(rlen);
4358
0
  if (!pem)
4359
0
    goto fail;
4360
0
  res = BIO_read(out, wpabuf_put(pem, 0), rlen);
4361
0
  if (res <= 0) {
4362
0
    wpabuf_free(pem);
4363
0
    pem = NULL;
4364
0
    goto fail;
4365
0
  }
4366
0
  wpabuf_put(pem, res);
4367
4368
0
fail:
4369
#ifdef OPENSSL_IS_BORINGSSL
4370
  if (certs)
4371
    sk_X509_pop_free(certs, X509_free);
4372
#else /* OPENSSL_IS_BORINGSSL */
4373
0
  PKCS7_free(p7);
4374
0
#endif /* OPENSSL_IS_BORINGSSL */
4375
0
  if (out)
4376
0
    BIO_free_all(out);
4377
4378
0
  return pem;
4379
0
}
4380
4381
4382
struct crypto_csr * crypto_csr_init(void)
4383
0
{
4384
0
  return (struct crypto_csr *)X509_REQ_new();
4385
0
}
4386
4387
4388
struct crypto_csr * crypto_csr_verify(const struct wpabuf *req)
4389
0
{
4390
0
  X509_REQ *csr;
4391
0
  EVP_PKEY *pkey = NULL;
4392
0
  const u8 *der = wpabuf_head(req);
4393
4394
0
  csr = d2i_X509_REQ(NULL, &der, wpabuf_len(req));
4395
0
  if (!csr)
4396
0
    return NULL;
4397
4398
0
  pkey = X509_REQ_get_pubkey((X509_REQ *)csr);
4399
0
  if (!pkey)
4400
0
    goto fail;
4401
4402
0
  if (X509_REQ_verify((X509_REQ *)csr, pkey) != 1)
4403
0
    goto fail;
4404
4405
0
  EVP_PKEY_free(pkey);
4406
0
  return (struct crypto_csr *)csr;
4407
0
fail:
4408
0
  EVP_PKEY_free(pkey);
4409
0
  X509_REQ_free(csr);
4410
0
  return NULL;
4411
0
}
4412
4413
4414
void crypto_csr_deinit(struct crypto_csr *csr)
4415
0
{
4416
0
  X509_REQ_free((X509_REQ *)csr);
4417
0
}
4418
4419
4420
int crypto_csr_set_ec_public_key(struct crypto_csr *csr, struct crypto_ec_key *key)
4421
0
{
4422
0
  if (!X509_REQ_set_pubkey((X509_REQ *)csr, (EVP_PKEY *)key))
4423
0
    return -1;
4424
4425
0
  return 0;
4426
0
}
4427
4428
4429
int crypto_csr_set_name(struct crypto_csr *csr, enum crypto_csr_name type,
4430
      const char *name)
4431
0
{
4432
0
  X509_NAME *n;
4433
0
  int nid;
4434
0
  int ret = -1;
4435
4436
0
  switch (type) {
4437
0
  case CSR_NAME_CN:
4438
0
    nid = NID_commonName;
4439
0
    break;
4440
0
  case CSR_NAME_SN:
4441
0
    nid = NID_surname;
4442
0
    break;
4443
0
  case CSR_NAME_C:
4444
0
    nid = NID_countryName;
4445
0
    break;
4446
0
  case CSR_NAME_O:
4447
0
    nid = NID_organizationName;
4448
0
    break;
4449
0
  case CSR_NAME_OU:
4450
0
    nid = NID_organizationalUnitName;
4451
0
    break;
4452
0
  default:
4453
0
    return -1;
4454
0
  }
4455
4456
0
  n = X509_NAME_new();
4457
0
  if (!n)
4458
0
    return -1;
4459
4460
#if OPENSSL_VERSION_NUMBER < 0x10100000L
4461
  if (!X509_NAME_add_entry_by_NID(n, nid, MBSTRING_UTF8,
4462
          (unsigned char *) name,
4463
          os_strlen(name), -1, 0))
4464
    goto fail;
4465
#else
4466
0
  if (!X509_NAME_add_entry_by_NID(n, nid, MBSTRING_UTF8,
4467
0
          (const unsigned char *) name,
4468
0
          os_strlen(name), -1, 0))
4469
0
    goto fail;
4470
0
#endif
4471
4472
0
  if (X509_REQ_set_subject_name((X509_REQ *) csr, n) != 1)
4473
0
    goto fail;
4474
4475
0
  ret = 0;
4476
0
fail:
4477
0
  X509_NAME_free(n);
4478
0
  return ret;
4479
0
}
4480
4481
4482
int crypto_csr_set_attribute(struct crypto_csr *csr, enum crypto_csr_attr attr,
4483
           int attr_type, const u8 *value, size_t len)
4484
0
{
4485
0
  int nid;
4486
4487
0
  switch (attr) {
4488
0
  case CSR_ATTR_CHALLENGE_PASSWORD:
4489
0
    nid = NID_pkcs9_challengePassword;
4490
0
    break;
4491
0
  default:
4492
0
    return -1;
4493
0
  }
4494
4495
0
  if (!X509_REQ_add1_attr_by_NID((X509_REQ *) csr, nid, attr_type, value,
4496
0
               len))
4497
0
    return -1;
4498
4499
0
  return 0;
4500
0
}
4501
4502
4503
const u8 * crypto_csr_get_attribute(struct crypto_csr *csr,
4504
            enum crypto_csr_attr attr,
4505
            size_t *len, int *type)
4506
0
{
4507
0
  X509_ATTRIBUTE *attrib;
4508
0
  const ASN1_TYPE *attrib_type;
4509
0
  const ASN1_STRING *data;
4510
0
  int loc;
4511
0
  int nid;
4512
4513
0
  switch (attr) {
4514
0
  case CSR_ATTR_CHALLENGE_PASSWORD:
4515
0
    nid = NID_pkcs9_challengePassword;
4516
0
    break;
4517
0
  default:
4518
0
    return NULL;
4519
0
  }
4520
4521
0
  loc = X509_REQ_get_attr_by_NID((X509_REQ *) csr, nid, -1);
4522
0
  if (loc < 0)
4523
0
    return NULL;
4524
4525
0
  attrib = X509_REQ_get_attr((X509_REQ *) csr, loc);
4526
0
  if (!attrib)
4527
0
    return NULL;
4528
4529
0
  attrib_type = X509_ATTRIBUTE_get0_type(attrib, 0);
4530
0
  if (!attrib_type)
4531
0
    return NULL;
4532
0
  *type = ASN1_TYPE_get(attrib_type);
4533
0
  data = X509_ATTRIBUTE_get0_data(attrib, 0, *type, NULL);
4534
0
  if (!data)
4535
0
    return NULL;
4536
0
  *len = ASN1_STRING_length(data);
4537
0
  return ASN1_STRING_get0_data(data);
4538
0
}
4539
4540
4541
struct wpabuf * crypto_csr_sign(struct crypto_csr *csr,
4542
        struct crypto_ec_key *key,
4543
        enum crypto_hash_alg algo)
4544
0
{
4545
0
  const EVP_MD *sign_md;
4546
0
  struct wpabuf *buf;
4547
0
  unsigned char *der = NULL;
4548
0
  int der_len;
4549
4550
0
  switch (algo) {
4551
0
  case CRYPTO_HASH_ALG_SHA256:
4552
0
    sign_md = EVP_sha256();
4553
0
    break;
4554
0
  case CRYPTO_HASH_ALG_SHA384:
4555
0
    sign_md = EVP_sha384();
4556
0
    break;
4557
0
  case CRYPTO_HASH_ALG_SHA512:
4558
0
    sign_md = EVP_sha512();
4559
0
    break;
4560
0
  default:
4561
0
    return NULL;
4562
0
  }
4563
4564
0
  if (!X509_REQ_sign((X509_REQ *) csr, (EVP_PKEY *) key, sign_md))
4565
0
    return NULL;
4566
4567
0
  der_len = i2d_X509_REQ((X509_REQ *) csr, &der);
4568
0
  if (der_len < 0)
4569
0
    return NULL;
4570
4571
0
  buf = wpabuf_alloc_copy(der, der_len);
4572
0
  OPENSSL_free(der);
4573
4574
0
  return buf;
4575
0
}
4576
4577
#endif /* CONFIG_ECC */
4578
4579
4580
static EVP_PKEY * crypto_rsa_key_read_public(FILE *f)
4581
0
{
4582
0
  EVP_PKEY *pkey;
4583
0
  X509 *x509;
4584
0
  const ASN1_TIME *not_before, *not_after;
4585
0
  int res_before, res_after;
4586
4587
0
  pkey = PEM_read_PUBKEY(f, NULL, NULL, NULL);
4588
0
  if (pkey)
4589
0
    return pkey;
4590
4591
0
  rewind(f);
4592
0
  x509 = PEM_read_X509(f, NULL, NULL, NULL);
4593
0
  if (!x509)
4594
0
    return NULL;
4595
4596
0
  not_before = X509_get0_notBefore(x509);
4597
0
  not_after = X509_get0_notAfter(x509);
4598
0
  if (!not_before || !not_after)
4599
0
    goto fail;
4600
0
  res_before = X509_cmp_current_time(not_before);
4601
0
  res_after = X509_cmp_current_time(not_after);
4602
0
  if (!res_before || !res_after)
4603
0
    goto fail;
4604
0
  if (res_before > 0 || res_after < 0) {
4605
0
    wpa_printf(MSG_INFO,
4606
0
         "OpenSSL: Certificate for RSA public key is not valid at this time (%d %d)",
4607
0
         res_before, res_after);
4608
0
    goto fail;
4609
0
  }
4610
4611
0
  pkey = X509_get_pubkey(x509);
4612
0
  X509_free(x509);
4613
4614
0
  if (!pkey)
4615
0
    return NULL;
4616
0
  if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) {
4617
0
    wpa_printf(MSG_INFO, "OpenSSL: No RSA public key found");
4618
0
    EVP_PKEY_free(pkey);
4619
0
    return NULL;
4620
0
  }
4621
4622
0
  return pkey;
4623
0
fail:
4624
0
  X509_free(x509);
4625
0
  return NULL;
4626
0
}
4627
4628
4629
struct crypto_rsa_key * crypto_rsa_key_read(const char *file, bool private_key)
4630
0
{
4631
0
  FILE *f;
4632
0
  EVP_PKEY *pkey;
4633
4634
0
  f = fopen(file, "r");
4635
0
  if (!f)
4636
0
    return NULL;
4637
0
  if (private_key)
4638
0
    pkey = PEM_read_PrivateKey(f, NULL, NULL, NULL);
4639
0
  else
4640
0
    pkey = crypto_rsa_key_read_public(f);
4641
0
  fclose(f);
4642
0
  return (struct crypto_rsa_key *) pkey;
4643
0
}
4644
4645
4646
#ifndef OPENSSL_NO_SHA256
4647
4648
struct wpabuf * crypto_rsa_oaep_sha256_encrypt(struct crypto_rsa_key *key,
4649
                 const struct wpabuf *in)
4650
0
{
4651
0
#if !defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER >= 0x30400000L
4652
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
4653
0
  EVP_PKEY_CTX *pkctx;
4654
0
  struct wpabuf *res = NULL;
4655
0
  size_t outlen;
4656
4657
0
  pkctx = EVP_PKEY_CTX_new(pkey, NULL);
4658
0
  if (!pkctx)
4659
0
    goto fail;
4660
4661
0
  if (EVP_PKEY_encrypt_init(pkctx) != 1 ||
4662
0
      EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_OAEP_PADDING) <= 0 ||
4663
0
      EVP_PKEY_CTX_set_rsa_oaep_md(pkctx, EVP_sha256()) <= 0 ||
4664
0
      EVP_PKEY_encrypt(pkctx, NULL, &outlen, wpabuf_head(in),
4665
0
           wpabuf_len(in)) != 1 ||
4666
0
      !(res = wpabuf_alloc(outlen)) ||
4667
0
      EVP_PKEY_encrypt(pkctx, wpabuf_put(res, 0), &outlen,
4668
0
           wpabuf_head(in), wpabuf_len(in)) != 1) {
4669
0
    wpabuf_free(res);
4670
0
    res = NULL;
4671
0
    goto fail;
4672
0
  }
4673
0
  wpabuf_put(res, outlen);
4674
4675
0
fail:
4676
0
  EVP_PKEY_CTX_free(pkctx);
4677
0
  return res;
4678
#else
4679
  wpa_printf(MSG_ERROR, "%s() not supported", __func__);
4680
  return NULL;
4681
#endif
4682
0
}
4683
4684
4685
struct wpabuf * crypto_rsa_oaep_sha256_decrypt(struct crypto_rsa_key *key,
4686
                 const struct wpabuf *in)
4687
0
{
4688
0
#if !defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER >= 0x30400000L
4689
0
  EVP_PKEY *pkey = (EVP_PKEY *) key;
4690
0
  EVP_PKEY_CTX *pkctx;
4691
0
  struct wpabuf *res = NULL;
4692
0
  size_t outlen;
4693
4694
0
  pkctx = EVP_PKEY_CTX_new(pkey, NULL);
4695
0
  if (!pkctx)
4696
0
    goto fail;
4697
4698
0
  if (EVP_PKEY_decrypt_init(pkctx) != 1 ||
4699
0
      EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_OAEP_PADDING) <= 0 ||
4700
0
      EVP_PKEY_CTX_set_rsa_oaep_md(pkctx, EVP_sha256()) <= 0 ||
4701
0
      EVP_PKEY_decrypt(pkctx, NULL, &outlen, wpabuf_head(in),
4702
0
           wpabuf_len(in)) != 1 ||
4703
0
      !(res = wpabuf_alloc(outlen)) ||
4704
0
      EVP_PKEY_decrypt(pkctx, wpabuf_put(res, 0), &outlen,
4705
0
           wpabuf_head(in), wpabuf_len(in)) != 1) {
4706
0
    wpabuf_free(res);
4707
0
    res = NULL;
4708
0
    goto fail;
4709
0
  }
4710
0
  wpabuf_put(res, outlen);
4711
4712
0
fail:
4713
0
  EVP_PKEY_CTX_free(pkctx);
4714
0
  return res;
4715
#else
4716
  wpa_printf(MSG_ERROR, "%s() not supported", __func__);
4717
  return NULL;
4718
#endif
4719
0
}
4720
4721
#endif /* OPENSSL_NO_SHA256 */
4722
4723
4724
void crypto_rsa_key_free(struct crypto_rsa_key *key)
4725
0
{
4726
0
  EVP_PKEY_free((EVP_PKEY *) key);
4727
0
}
4728
4729
4730
#ifdef CONFIG_DPP3
4731
4732
#define HPKE_MAX_SHARED_SECRET_LEN 66
4733
#define HPKE_MAX_HASH_LEN 64
4734
#define HPKE_MAX_KEY_LEN 32
4735
#define HPKE_MAX_NONCE_LEN 12
4736
#define HPKE_MAX_PUB_LEN (1 + 2 * 66)
4737
4738
struct hpke_context {
4739
  /* KEM */
4740
  enum hpke_kem_id kem_id;
4741
  int kem_nid;
4742
  int iana_group;
4743
  size_t n_pk;
4744
  size_t n_secret;
4745
  const EVP_MD *kem_h;
4746
  size_t kem_n_h;
4747
4748
  /* KDF */
4749
  enum hpke_kdf_id kdf_id;
4750
  const EVP_MD *kdf_h;
4751
  size_t n_h;
4752
4753
  /* AEAD */
4754
  enum hpke_aead_id aead_id;
4755
  const EVP_CIPHER *cipher;
4756
  size_t n_k;
4757
  size_t n_n;
4758
  size_t n_t;
4759
  u8 key[HPKE_MAX_KEY_LEN];
4760
  u8 base_nonce[HPKE_MAX_NONCE_LEN];
4761
};
4762
4763
4764
static void hpke_free_context(struct hpke_context *ctx)
4765
{
4766
  bin_clear_free(ctx, sizeof(*ctx));
4767
}
4768
4769
4770
static struct hpke_context * hpke_get_context(enum hpke_kem_id kem_id,
4771
                enum hpke_kdf_id kdf_id,
4772
                enum hpke_aead_id aead_id,
4773
                struct crypto_ec_key *key)
4774
{
4775
  struct hpke_context *ctx;
4776
  int group;
4777
4778
  ctx = os_zalloc(sizeof(*ctx));
4779
  if (!ctx)
4780
    return NULL;
4781
4782
  ctx->kem_id = kem_id;
4783
  switch (kem_id) {
4784
  case HPKE_DHKEM_P256_HKDF_SHA256:
4785
    ctx->kem_nid = NID_X9_62_prime256v1;
4786
    ctx->iana_group = 19;
4787
    ctx->n_pk = 65;
4788
    ctx->n_secret = 32;
4789
    ctx->kem_h = EVP_sha256();
4790
    ctx->kem_n_h = 32;
4791
    break;
4792
  case HPKE_DHKEM_P384_HKDF_SHA384:
4793
    ctx->kem_nid = NID_secp384r1;
4794
    ctx->iana_group = 20;
4795
    ctx->n_pk = 97;
4796
    ctx->n_secret = 48;
4797
    ctx->kem_h = EVP_sha384();
4798
    ctx->kem_n_h = 48;
4799
    break;
4800
  case HPKE_DHKEM_P521_HKDF_SHA512:
4801
    ctx->kem_nid = NID_secp521r1;
4802
    ctx->iana_group = 21;
4803
    ctx->n_pk = 133;
4804
    ctx->n_secret = 64;
4805
    ctx->kem_h = EVP_sha512();
4806
    ctx->kem_n_h = 64;
4807
    break;
4808
  default:
4809
    goto fail;
4810
  }
4811
4812
  ctx->kdf_id = kdf_id;
4813
  switch (kdf_id) {
4814
  case HPKE_KDF_HKDF_SHA256:
4815
    ctx->kdf_h = EVP_sha256();
4816
    ctx->n_h = 32;
4817
    break;
4818
  case HPKE_KDF_HKDF_SHA384:
4819
    ctx->kdf_h = EVP_sha384();
4820
    ctx->n_h = 48;
4821
    break;
4822
  case HPKE_KDF_HKDF_SHA512:
4823
    ctx->kdf_h = EVP_sha512();
4824
    ctx->n_h = 64;
4825
    break;
4826
  default:
4827
    goto fail;
4828
  }
4829
4830
  ctx->aead_id = aead_id;
4831
  switch (aead_id) {
4832
  case HPKE_AEAD_AES_128_GCM:
4833
    ctx->cipher = EVP_aes_128_gcm();
4834
    ctx->n_k = 16;
4835
    ctx->n_n = 12;
4836
    ctx->n_t = 16;
4837
    break;
4838
  case HPKE_AEAD_AES_256_GCM:
4839
    ctx->cipher = EVP_aes_256_gcm();
4840
    ctx->n_k = 32;
4841
    ctx->n_n = 12;
4842
    ctx->n_t = 16;
4843
    break;
4844
  default:
4845
    goto fail;
4846
  }
4847
4848
  /* Convert BP-256/384/512 to P-256/384/521 for DPP */
4849
  group = crypto_ec_key_group(key);
4850
  if (group == 28 && ctx->iana_group == 19) {
4851
    ctx->iana_group = 28;
4852
  } else if (group == 29 && ctx->iana_group == 20) {
4853
    ctx->iana_group = 29;
4854
  } else if (group == 30 && ctx->iana_group == 21) {
4855
    ctx->iana_group = 30;
4856
    ctx->n_pk = 129;
4857
  }
4858
  if (group != ctx->iana_group) {
4859
    wpa_printf(MSG_INFO, "OpenSSL:%s:group mismatch (%d != %d)",
4860
         __func__, group, ctx->iana_group);
4861
    goto fail;
4862
  }
4863
4864
  return ctx;
4865
fail:
4866
  hpke_free_context(ctx);
4867
  return NULL;
4868
}
4869
4870
4871
static size_t hpke_suite_id(struct hpke_context *ctx, bool kem, u8 *suite_id)
4872
{
4873
  size_t suite_id_len;
4874
4875
  if (kem) {
4876
    os_memcpy(suite_id, "KEM", 3);
4877
    WPA_PUT_BE16(&suite_id[3], ctx->kem_id);
4878
    suite_id_len = 5;
4879
  } else {
4880
    os_memcpy(suite_id, "HPKE", 4);
4881
    WPA_PUT_BE16(&suite_id[4], ctx->kem_id);
4882
    WPA_PUT_BE16(&suite_id[6], ctx->kdf_id);
4883
    WPA_PUT_BE16(&suite_id[8], ctx->aead_id);
4884
    suite_id_len = 10;
4885
  }
4886
  return suite_id_len;
4887
}
4888
4889
4890
static int hpke_labeled_extract(struct hpke_context *ctx, bool kem,
4891
        const u8 *salt, size_t salt_len,
4892
        const char *label,
4893
        const u8 *ikm, size_t ikm_len, u8 *prk)
4894
{
4895
  u8 zero[HPKE_MAX_HASH_LEN];
4896
  u8 suite_id[10];
4897
  size_t suite_id_len;
4898
  unsigned int mdlen = kem ? ctx->kem_n_h : ctx->n_h;
4899
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4900
  EVP_MAC *hmac;
4901
  OSSL_PARAM params[2];
4902
  EVP_MAC_CTX *hctx;
4903
  size_t mlen;
4904
  int res;
4905
#else /* OpenSSL version >= 3.0 */
4906
  HMAC_CTX *hctx;
4907
  int res;
4908
#endif /* OpenSSL version >= 3.0 */
4909
4910
  if (!salt || !salt_len) {
4911
    salt_len = mdlen;
4912
    os_memset(zero, 0, salt_len);
4913
    salt = zero;
4914
  }
4915
4916
  suite_id_len = hpke_suite_id(ctx, kem, suite_id);
4917
4918
  /* labeled_ikm = concat("HPKE-v1", suite_id, label, ikm)
4919
   * return Extract(salt, labeled_ikm) */
4920
4921
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4922
  hmac = EVP_MAC_fetch(NULL, "HMAC", NULL);
4923
  if (!hmac)
4924
    return -1;
4925
4926
  params[0] = OSSL_PARAM_construct_utf8_string(
4927
    "digest",
4928
    (char *) EVP_MD_get0_name(kem ? ctx->kem_h : ctx->kdf_h), 0);
4929
  params[1] = OSSL_PARAM_construct_end();
4930
4931
  hctx = EVP_MAC_CTX_new(hmac);
4932
  EVP_MAC_free(hmac);
4933
  if (!hctx)
4934
    return -1;
4935
4936
  if (EVP_MAC_init(hctx, salt, salt_len, params) != 1) {
4937
    wpa_printf(MSG_INFO,
4938
         "OpenSSL: EVP_MAC_init(hmac,digest/HPKE) failed: %s",
4939
         ERR_error_string(ERR_get_error(), NULL));
4940
    goto fail;
4941
  }
4942
4943
  if (EVP_MAC_update(hctx, (const unsigned char *) "HPKE-v1", 7) != 1 ||
4944
      EVP_MAC_update(hctx, suite_id, suite_id_len) != 1 ||
4945
      EVP_MAC_update(hctx, (const unsigned char *) label,
4946
         os_strlen(label)) != 1 ||
4947
      EVP_MAC_update(hctx, ikm, ikm_len) != 1)
4948
    goto fail;
4949
4950
  res = EVP_MAC_final(hctx, prk, &mlen, mdlen);
4951
  EVP_MAC_CTX_free(hctx);
4952
4953
  return res == 1 ? 0 : -1;
4954
fail:
4955
  EVP_MAC_CTX_free(hctx);
4956
  return -1;
4957
#else /* OpenSSL version >= 3.0 */
4958
  hctx = HMAC_CTX_new();
4959
  if (!hctx)
4960
    return -1;
4961
  res = HMAC_Init_ex(hctx, salt, salt_len, kem ? ctx->kem_h : ctx->kdf_h,
4962
         NULL);
4963
  if (res != 1)
4964
    goto done;
4965
4966
  HMAC_Update(hctx, (const unsigned char *) "HPKE-v1", 7);
4967
  HMAC_Update(hctx, suite_id, suite_id_len);
4968
  HMAC_Update(hctx, (const unsigned char *) label, os_strlen(label));
4969
  HMAC_Update(hctx, ikm, ikm_len);
4970
4971
  res = HMAC_Final(hctx, prk, &mdlen);
4972
done:
4973
  HMAC_CTX_free(hctx);
4974
4975
  return res == 1 ? 0 : -1;
4976
#endif /* OpenSSL version >= 3.0 */
4977
}
4978
4979
4980
static int
4981
hpke_labeled_expand(struct hpke_context *ctx, bool kem, const u8 *prk,
4982
        const char *label, const u8 *info, size_t info_len,
4983
        u8 *out, size_t out_len)
4984
{
4985
  u8 suite_id[10];
4986
  size_t suite_id_len;
4987
  u8 hash[HPKE_MAX_HASH_LEN];
4988
  u8 iter = 0;
4989
  size_t label_len = os_strlen(label);
4990
  u8 *pos;
4991
  size_t left = out_len, clen;
4992
  int res = -1;
4993
  u8 *labeled_info;
4994
  size_t labeled_info_len;
4995
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
4996
  EVP_MAC *hmac;
4997
  OSSL_PARAM params[2];
4998
  EVP_MAC_CTX *hctx = NULL;
4999
  size_t mdlen;
5000
#else /* OpenSSL version >= 3.0 */
5001
  HMAC_CTX *hctx;
5002
  unsigned int mdlen;
5003
#endif /* OpenSSL version >= 3.0 */
5004
5005
  /* labeled_info = concat(I2OSP(L, 2), "HPKE-v1", suite_id,
5006
   *                       label, info)
5007
   * return Expand(prk, labeled_info, L) */
5008
  suite_id_len = hpke_suite_id(ctx, kem, suite_id);
5009
  labeled_info_len = 2 + 7 + suite_id_len + label_len + info_len;
5010
  labeled_info = os_malloc(labeled_info_len);
5011
  if (!labeled_info)
5012
    return -1;
5013
  pos = labeled_info;
5014
  WPA_PUT_BE16(pos, out_len);
5015
  pos += 2;
5016
  os_memcpy(pos, "HPKE-v1", 7);
5017
  pos += 7;
5018
  os_memcpy(pos, suite_id, suite_id_len);
5019
  pos += suite_id_len;
5020
  os_memcpy(pos, label, label_len);
5021
  pos += label_len;
5022
  if (info && info_len)
5023
    os_memcpy(pos, info, info_len);
5024
5025
  pos = out;
5026
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
5027
  hmac = EVP_MAC_fetch(NULL, "HMAC", NULL);
5028
  if (!hmac)
5029
    goto fail;
5030
5031
  params[0] = OSSL_PARAM_construct_utf8_string(
5032
    "digest",
5033
    (char *) EVP_MD_get0_name(kem ? ctx->kem_h : ctx->kdf_h), 0);
5034
  params[1] = OSSL_PARAM_construct_end();
5035
#else /* OpenSSL version >= 3.0 */
5036
  hctx = HMAC_CTX_new();
5037
  if (!hctx)
5038
    goto fail;
5039
#endif /* OpenSSL version >= 3.0 */
5040
5041
  while (left > 0) {
5042
    mdlen = kem ? ctx->kem_n_h : ctx->n_h;
5043
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
5044
    EVP_MAC_CTX_free(hctx);
5045
    hctx = EVP_MAC_CTX_new(hmac);
5046
    if (!hctx)
5047
      goto fail;
5048
5049
    if (EVP_MAC_init(hctx, prk, mdlen, params) != 1) {
5050
      wpa_printf(MSG_INFO,
5051
           "OpenSSL: EVP_MAC_init(hmac,digest/HPKE) failed: %s",
5052
           ERR_error_string(ERR_get_error(), NULL));
5053
      goto fail;
5054
    }
5055
5056
    if (iter > 0 && EVP_MAC_update(hctx, hash, mdlen) != 1)
5057
      goto fail;
5058
    if (iter == 255)
5059
      goto fail;
5060
    iter++;
5061
5062
    if (EVP_MAC_update(hctx, labeled_info, labeled_info_len) != 1 ||
5063
        EVP_MAC_update(hctx, &iter, sizeof(iter)) != 1)
5064
      goto fail;
5065
5066
    if (EVP_MAC_final(hctx, hash, &mdlen, mdlen) != 1)
5067
      goto fail;
5068
#else /* OpenSSL version >= 3.0 */
5069
    if (HMAC_Init_ex(hctx, prk, mdlen,
5070
         kem ? ctx->kem_h : ctx->kdf_h,
5071
         NULL) != 1)
5072
      goto fail;
5073
5074
    if (iter > 0)
5075
      HMAC_Update(hctx, hash, mdlen);
5076
    if (iter == 255)
5077
      goto fail;
5078
    iter++;
5079
    HMAC_Update(hctx, labeled_info, labeled_info_len);
5080
    HMAC_Update(hctx, &iter, sizeof(iter));
5081
5082
    if (HMAC_Final(hctx, hash, &mdlen) != 1)
5083
      goto fail;
5084
    HMAC_CTX_reset(hctx);
5085
#endif /* OpenSSL version >= 3.0 */
5086
5087
    clen = left > mdlen ? mdlen : left;
5088
    os_memcpy(pos, hash, clen);
5089
    pos += clen;
5090
    left -= clen;
5091
  }
5092
  res = 0;
5093
fail:
5094
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
5095
  EVP_MAC_free(hmac);
5096
  EVP_MAC_CTX_free(hctx);
5097
#else /* OpenSSL version >= 3.0 */
5098
  HMAC_CTX_free(hctx);
5099
#endif /* OpenSSL version >= 3.0 */
5100
  os_free(labeled_info);
5101
5102
  return res;
5103
}
5104
5105
5106
static int hpke_extract_and_expand(struct hpke_context *ctx,
5107
           const u8 *dhss, size_t dhss_len,
5108
           const u8 *enc, size_t enc_len,
5109
           const u8 *pk_rm, size_t pk_rm_len,
5110
           u8 *shared_secret)
5111
{
5112
  u8 kem_context[2 * HPKE_MAX_PUB_LEN];
5113
  u8 eae_prk[HPKE_MAX_HASH_LEN];
5114
5115
  /* eae_prk = LabeledExtract("", "eae_prk", dh) */
5116
  if (hpke_labeled_extract(ctx, true, NULL, 0, "eae_prk", dhss, dhss_len,
5117
         eae_prk) < 0)
5118
    return -1;
5119
5120
  if (enc_len > HPKE_MAX_PUB_LEN || pk_rm_len > HPKE_MAX_PUB_LEN)
5121
    return -1;
5122
  /* kem_context = concat(enc, pkRm) */
5123
  os_memcpy(kem_context, enc, enc_len);
5124
  os_memcpy(&kem_context[enc_len], pk_rm, pk_rm_len);
5125
5126
  /* shared_secret = LabeledExpand(eae_prk, "shared_secret",
5127
   *                               kem_context, Nsecret) */
5128
  if (hpke_labeled_expand(ctx, true, eae_prk, "shared_secret",
5129
        kem_context, enc_len + pk_rm_len,
5130
        shared_secret, ctx->n_secret) < 0)
5131
    return -1;
5132
5133
  forced_memzero(eae_prk, sizeof(eae_prk));
5134
  return 0;
5135
}
5136
5137
5138
static int hpke_key_schedule(struct hpke_context *ctx, const u8 *shared_secret,
5139
           const u8 *info, size_t info_len)
5140
{
5141
  u8 key_schedule_context[1 + 2 * HPKE_MAX_HASH_LEN];
5142
  u8 secret[HPKE_MAX_HASH_LEN];
5143
  int res = -1;
5144
5145
  /* key_schedule_context = concat(mode, psk_id_hash, info_hash) */
5146
  key_schedule_context[0] = HPKE_MODE_BASE;
5147
5148
  /* psk_id_hash = LabeledExtract("", "psk_id_hash", psk_id) */
5149
  if (hpke_labeled_extract(ctx, false, NULL, 0, "psk_id_hash",
5150
         NULL, 0, &key_schedule_context[1]) < 0)
5151
    goto fail;
5152
5153
  /* info_hash = LabeledExtract("", "info_hash", info) */
5154
  if (hpke_labeled_extract(ctx, false, NULL, 0, "info_hash",
5155
         info, info_len,
5156
         &key_schedule_context[1 + ctx->n_h]) < 0)
5157
    goto fail;
5158
5159
  /* secret = LabeledExtract(shared_secret, "secret", psk) */
5160
  if (hpke_labeled_extract(ctx, false, shared_secret, ctx->n_secret,
5161
         "secret", NULL, 0, secret) < 0)
5162
    goto fail;
5163
5164
  /* key = LabeledExpand(secret, "key", key_schedule_context, Nk) */
5165
  if (hpke_labeled_expand(ctx, false, secret, "key",
5166
        key_schedule_context, 1 + 2 * ctx->n_h,
5167
        ctx->key, ctx->n_k) < 0)
5168
    goto fail;
5169
5170
  /* base_nonce = LabeledExpand(secret, "base_nonce",
5171
   *                            key_schedule_context, Nn) */
5172
  if (hpke_labeled_expand(ctx, false, secret, "base_nonce",
5173
        key_schedule_context, 1 + 2 * ctx->n_h,
5174
        ctx->base_nonce, ctx->n_n) < 0)
5175
    goto fail;
5176
  res = 0;
5177
fail:
5178
  forced_memzero(key_schedule_context, sizeof(key_schedule_context));
5179
  forced_memzero(secret, sizeof(secret));
5180
  return res;
5181
}
5182
5183
5184
static int hpke_encap(struct hpke_context *ctx, struct crypto_ec_key *pk_r,
5185
          u8 *shared_secret, u8 *enc)
5186
{
5187
  EVP_PKEY_CTX *pctx = NULL;
5188
  struct crypto_ec_key *sk_e;
5189
  int res = -1;
5190
  u8 *dhss = NULL;
5191
  size_t dhss_len = 0;
5192
  struct wpabuf *enc_buf = NULL, *pk_rm = NULL;
5193
5194
  /* skE, pkE = GenerateKeyPair() */
5195
  sk_e = crypto_ec_key_gen(ctx->iana_group);
5196
  if (!sk_e) {
5197
    wpa_printf(MSG_INFO, "OpenSSL:%s:Could not generate key pair",
5198
         __func__);
5199
    goto fail;
5200
  }
5201
5202
  /* dh = DH(skE, pkR) */
5203
  dhss_len = sizeof(dhss);
5204
  pctx = EVP_PKEY_CTX_new((EVP_PKEY *) sk_e, NULL);
5205
  if (!pctx ||
5206
      EVP_PKEY_derive_init(pctx) != 1 ||
5207
      EVP_PKEY_derive_set_peer(pctx, (EVP_PKEY *) pk_r) != 1 ||
5208
      EVP_PKEY_derive(pctx, NULL, &dhss_len) != 1 ||
5209
      !(dhss = os_malloc(dhss_len)) ||
5210
      EVP_PKEY_derive(pctx, dhss, &dhss_len) != 1 ||
5211
      dhss_len > HPKE_MAX_SHARED_SECRET_LEN) {
5212
    wpa_printf(MSG_INFO,
5213
         "OpenSSL: hpke_encap: EVP_PKEY_derive failed (dhss_len=%zu): %s",
5214
         dhss_len, ERR_error_string(ERR_get_error(), NULL));
5215
    goto fail;
5216
  }
5217
5218
  /* enc = SerializePublicKey(pkE) */
5219
  enc_buf = crypto_ec_key_get_pubkey_point(sk_e, 1);
5220
  if (!enc_buf)
5221
    goto fail;
5222
  os_memcpy(enc, wpabuf_head(enc_buf), wpabuf_len(enc_buf));
5223
5224
  /* pkRm = SerializePublicKey(pkR) */
5225
  pk_rm = crypto_ec_key_get_pubkey_point(pk_r, 1);
5226
  if (!pk_rm)
5227
    goto fail;
5228
5229
  /* kem_context = concat(enc, pkRm) */
5230
  /* shared_secret = ExtractAndExpand(dh, kem_context) */
5231
  /* return shared_secret, enc */
5232
  res = hpke_extract_and_expand(ctx, dhss, dhss_len, enc, ctx->n_pk,
5233
              wpabuf_head(pk_rm),
5234
              wpabuf_len(pk_rm), shared_secret);
5235
fail:
5236
  bin_clear_free(dhss, dhss_len);
5237
  crypto_ec_key_deinit(sk_e);
5238
  EVP_PKEY_CTX_free(pctx);
5239
  wpabuf_free(enc_buf);
5240
  wpabuf_free(pk_rm);
5241
  return res;
5242
}
5243
5244
5245
static struct wpabuf *
5246
hpke_aead_seal(struct hpke_context *ctx, const u8 *aad, size_t aad_len,
5247
         const u8 *pt, size_t pt_len)
5248
{
5249
  EVP_CIPHER_CTX *cctx;
5250
  int len = 0;
5251
  struct wpabuf *ct = NULL;
5252
5253
  /* No need to xor in sequence number since we support only the
5254
   * single-shot API, i.e., base_nonce can be used as-is. */
5255
5256
  cctx = EVP_CIPHER_CTX_new();
5257
  if (!cctx ||
5258
      EVP_EncryptInit_ex(cctx, ctx->cipher, NULL, ctx->key,
5259
             ctx->base_nonce) != 1) {
5260
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptInit_ex failed",
5261
         __func__);
5262
    goto fail;
5263
  }
5264
  if (aad && aad_len &&
5265
      EVP_EncryptUpdate(cctx, NULL, &len, aad, aad_len) != 1) {
5266
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_EncryptUpdate(AAD) failed",
5267
         __func__);
5268
    goto fail;
5269
  }
5270
  ct = wpabuf_alloc(pt_len + AES_BLOCK_SIZE + ctx->n_t);
5271
  if (!ct)
5272
    goto fail;
5273
  if (EVP_EncryptUpdate(cctx, wpabuf_put(ct, 0), &len, pt, pt_len) != 1) {
5274
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_EncryptUpdate failed",
5275
         __func__);
5276
    goto fail;
5277
  }
5278
  wpabuf_put(ct, len);
5279
5280
  if (EVP_EncryptFinal(cctx, wpabuf_put(ct, 0), &len) != 1) {
5281
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptFinal failed",
5282
         __func__);
5283
    wpabuf_free(ct);
5284
    ct = NULL;
5285
    goto fail;
5286
  }
5287
5288
  if (EVP_CIPHER_CTX_ctrl(cctx, EVP_CTRL_AEAD_GET_TAG, ctx->n_t,
5289
        wpabuf_put(ct, ctx->n_t)) != 1) {
5290
    wpa_printf(MSG_INFO, "OpenSSL:%s:Could not get tag",
5291
         __func__);
5292
    wpabuf_free(ct);
5293
    ct = NULL;
5294
    goto fail;
5295
  }
5296
fail:
5297
  EVP_CIPHER_CTX_free(cctx);
5298
  return ct;
5299
}
5300
5301
5302
static struct wpabuf * hpke_base_seal_int(enum hpke_kem_id kem_id,
5303
            enum hpke_kdf_id kdf_id,
5304
            enum hpke_aead_id aead_id,
5305
            struct crypto_ec_key *peer_pub,
5306
            const u8 *info, size_t info_len,
5307
            const u8 *aad, size_t aad_len,
5308
            const u8 *pt, size_t pt_len)
5309
{
5310
  struct hpke_context *ctx;
5311
  u8 shared_secret[HPKE_MAX_SHARED_SECRET_LEN];
5312
  u8 enc[1 + 2 * HPKE_MAX_PUB_LEN];
5313
  struct wpabuf *ct = NULL, *enc_ct = NULL;
5314
5315
  ctx = hpke_get_context(kem_id, kdf_id, aead_id, peer_pub);
5316
  if (!ctx)
5317
    return NULL;
5318
5319
  /* shared_secret, enc = Encap(pkR) */
5320
  if (hpke_encap(ctx, peer_pub, shared_secret, enc) < 0)
5321
    goto fail;
5322
5323
  /* KeyScheduleS(mode_base, shared_secret, info,
5324
   *              default_psk, default_psk_id) */
5325
  if (hpke_key_schedule(ctx, shared_secret, info, info_len) < 0)
5326
    goto fail;
5327
5328
  /* ct = ctx.Seal(aad, pt) */
5329
  ct = hpke_aead_seal(ctx, aad, aad_len, pt, pt_len);
5330
  if (!ct)
5331
    goto fail;
5332
5333
  /* return enc, ct */
5334
  enc_ct = wpabuf_alloc(ctx->n_pk + wpabuf_len(ct));
5335
  if (!enc_ct)
5336
    goto fail;
5337
  wpabuf_put_data(enc_ct, enc, ctx->n_pk);
5338
  wpabuf_put_buf(enc_ct, ct);
5339
5340
fail:
5341
  forced_memzero(shared_secret, sizeof(shared_secret));
5342
  hpke_free_context(ctx);
5343
  wpabuf_free(ct);
5344
  return enc_ct;
5345
}
5346
5347
5348
static int hpke_decap(struct hpke_context *ctx, const u8 *enc,
5349
          size_t enc_ct_len, struct crypto_ec_key *sk_r,
5350
          u8 *shared_secret)
5351
{
5352
  EVP_PKEY_CTX *pctx = NULL;
5353
  struct wpabuf *pk_rm = NULL;
5354
  size_t len;
5355
  int res = -1;
5356
  struct crypto_ec_key *pk_e = NULL;
5357
  u8 *dhss = NULL;
5358
  size_t dhss_len = 0;
5359
5360
  /* pkE = DeserializePublicKey(enc) */
5361
  if (enc_ct_len < ctx->n_pk)
5362
    return -1; /* not enough room for enc */
5363
  if (enc[0] != 0x04)
5364
    return -1; /* not in uncompressed form */
5365
  len = (ctx->n_pk - 1) / 2;
5366
  pk_e = crypto_ec_key_set_pub(ctx->iana_group, &enc[1],
5367
             &enc[1 + len], len);
5368
  if (!pk_e)
5369
    return -1; /* invalid public key point */
5370
  /* dh = DH(skR, pkE) */
5371
  pctx = EVP_PKEY_CTX_new((EVP_PKEY *) sk_r, NULL);
5372
  if (!pctx ||
5373
      EVP_PKEY_derive_init(pctx) != 1 ||
5374
      EVP_PKEY_derive_set_peer(pctx, (EVP_PKEY *) pk_e) != 1 ||
5375
      EVP_PKEY_derive(pctx, NULL, &dhss_len) != 1 ||
5376
      !(dhss = os_malloc(dhss_len)) ||
5377
      EVP_PKEY_derive(pctx, dhss, &dhss_len) != 1 ||
5378
      dhss_len > HPKE_MAX_SHARED_SECRET_LEN) {
5379
    wpa_printf(MSG_INFO,
5380
         "OpenSSL: hpke_decap: EVP_PKEY_derive failed (dhss_len=%zu): %s",
5381
         dhss_len, ERR_error_string(ERR_get_error(), NULL));
5382
    goto fail;
5383
  }
5384
5385
  /* pkRm = SerializePublicKey(pk(skR)) */
5386
  pk_rm = crypto_ec_key_get_pubkey_point(sk_r, 1);
5387
  if (!pk_rm)
5388
    goto fail;
5389
5390
  /* kem_context = concat(enc, pkRm) */
5391
  /* shared_secret = ExtractAndExpand(dh, kem_context) */
5392
  res = hpke_extract_and_expand(ctx, dhss, dhss_len, enc, ctx->n_pk,
5393
              wpabuf_head(pk_rm),
5394
              wpabuf_len(pk_rm), shared_secret);
5395
fail:
5396
  bin_clear_free(dhss, dhss_len);
5397
  crypto_ec_key_deinit(pk_e);
5398
  EVP_PKEY_CTX_free(pctx);
5399
  wpabuf_free(pk_rm);
5400
  return res;
5401
}
5402
5403
5404
static struct wpabuf *
5405
hpke_aead_open(struct hpke_context *ctx, const u8 *aad, size_t aad_len,
5406
         const u8 *ct, size_t ct_len)
5407
{
5408
  EVP_CIPHER_CTX *cctx;
5409
  int len = 0;
5410
  const u8 *tag;
5411
  struct wpabuf *pt = NULL;
5412
5413
  if (ct_len < ctx->n_t)
5414
    return NULL;
5415
  tag = ct + ct_len - ctx->n_t;
5416
  ct_len -= ctx->n_t;
5417
5418
  /* No need to xor in sequence number since we support only the
5419
   * single-shot API, i.e., base_nonce can be used as-is. */
5420
5421
  cctx = EVP_CIPHER_CTX_new();
5422
  if (!cctx ||
5423
      EVP_DecryptInit_ex(cctx, ctx->cipher, NULL, ctx->key,
5424
             ctx->base_nonce) != 1) {
5425
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptInit_ex failed",
5426
         __func__);
5427
    goto fail;
5428
  }
5429
  if (aad && aad_len &&
5430
      EVP_DecryptUpdate(cctx, NULL, &len, aad, aad_len) != 1) {
5431
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptUpdate(AAD) failed",
5432
         __func__);
5433
    goto fail;
5434
  }
5435
  pt = wpabuf_alloc(ct_len + AES_BLOCK_SIZE);
5436
  if (!pt)
5437
    goto fail;
5438
  if (EVP_DecryptUpdate(cctx, wpabuf_put(pt, 0), &len, ct, ct_len) != 1) {
5439
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptUpdate failed",
5440
         __func__);
5441
    goto fail;
5442
  }
5443
  wpabuf_put(pt, len);
5444
5445
  if (EVP_CIPHER_CTX_ctrl(cctx, EVP_CTRL_AEAD_SET_TAG, ctx->n_t,
5446
        (void *) tag) != 1) {
5447
    wpa_printf(MSG_INFO, "OpenSSL:%s:Could not set tag",
5448
         __func__);
5449
    wpabuf_free(pt);
5450
    pt = NULL;
5451
    goto fail;
5452
  }
5453
5454
  if (EVP_DecryptFinal(cctx, wpabuf_put(pt, 0), &len) != 1) {
5455
    wpa_printf(MSG_INFO, "OpenSSL:%s:EVP_DecryptFinal failed",
5456
         __func__);
5457
    wpabuf_free(pt);
5458
    pt = NULL;
5459
  }
5460
fail:
5461
  EVP_CIPHER_CTX_free(cctx);
5462
  return pt;
5463
}
5464
5465
5466
static struct wpabuf * hpke_base_open_int(enum hpke_kem_id kem_id,
5467
            enum hpke_kdf_id kdf_id,
5468
            enum hpke_aead_id aead_id,
5469
            struct crypto_ec_key *own_priv,
5470
            const u8 *info, size_t info_len,
5471
            const u8 *aad, size_t aad_len,
5472
            const u8 *enc_ct, size_t enc_ct_len)
5473
{
5474
  struct hpke_context *ctx;
5475
  u8 shared_secret[HPKE_MAX_SHARED_SECRET_LEN];
5476
  struct wpabuf *pt = NULL;
5477
5478
  ctx = hpke_get_context(kem_id, kdf_id, aead_id, own_priv);
5479
  if (!ctx)
5480
    return NULL;
5481
5482
  /* shared_secret = Decap(enc, skR) */
5483
  if (hpke_decap(ctx, enc_ct, enc_ct_len, own_priv, shared_secret) < 0)
5484
    goto fail;
5485
5486
  /* KeyScheduleR(mode_base, shared_secret, info,
5487
   *              default_psk, default_psk_id) */
5488
  if (hpke_key_schedule(ctx, shared_secret, info, info_len) < 0)
5489
    goto fail;
5490
5491
  /* return ctx.Open(aad, ct) */
5492
  pt = hpke_aead_open(ctx, aad, aad_len,
5493
          &enc_ct[ctx->n_pk], enc_ct_len - ctx->n_pk);
5494
5495
fail:
5496
  forced_memzero(shared_secret, sizeof(shared_secret));
5497
  hpke_free_context(ctx);
5498
  return pt;
5499
}
5500
5501
5502
#if OPENSSL_VERSION_NUMBER >= 0x30200000L
5503
5504
static bool hpke_set_suite(OSSL_HPKE_SUITE *suite,
5505
         enum hpke_kem_id kem_id,
5506
         enum hpke_kdf_id kdf_id,
5507
         enum hpke_aead_id aead_id)
5508
{
5509
  os_memset(suite, 0, sizeof(*suite));
5510
5511
  switch (kem_id) {
5512
  case HPKE_DHKEM_P256_HKDF_SHA256:
5513
    suite->kem_id = OSSL_HPKE_KEM_ID_P256;
5514
    break;
5515
  case HPKE_DHKEM_P384_HKDF_SHA384:
5516
    suite->kem_id = OSSL_HPKE_KEM_ID_P384;
5517
    break;
5518
  case HPKE_DHKEM_P521_HKDF_SHA512:
5519
    suite->kem_id = OSSL_HPKE_KEM_ID_P521;
5520
    break;
5521
  default:
5522
    return false;
5523
  }
5524
5525
  switch (kdf_id) {
5526
  case HPKE_KDF_HKDF_SHA256:
5527
    suite->kdf_id = OSSL_HPKE_KDF_ID_HKDF_SHA256;
5528
    break;
5529
  case HPKE_KDF_HKDF_SHA384:
5530
    suite->kdf_id = OSSL_HPKE_KDF_ID_HKDF_SHA384;
5531
    break;
5532
  case HPKE_KDF_HKDF_SHA512:
5533
    suite->kdf_id = OSSL_HPKE_KDF_ID_HKDF_SHA512;
5534
    break;
5535
  default:
5536
    return false;
5537
  }
5538
5539
  switch (aead_id) {
5540
  case HPKE_AEAD_AES_128_GCM:
5541
    suite->aead_id = OSSL_HPKE_AEAD_ID_AES_GCM_128;
5542
    break;
5543
  case HPKE_AEAD_AES_256_GCM:
5544
    suite->aead_id = OSSL_HPKE_AEAD_ID_AES_GCM_256;
5545
    break;
5546
  default:
5547
    return false;
5548
  }
5549
5550
  if (!OSSL_HPKE_suite_check(*suite)) {
5551
    wpa_printf(MSG_INFO,
5552
         "OpenSSL: HPKE suite kem_id=%d kdf_id=%d aead_id=%d not supported",
5553
         kem_id, kdf_id, aead_id);
5554
    return false;
5555
  }
5556
5557
  return true;
5558
}
5559
5560
5561
struct wpabuf * hpke_base_seal(enum hpke_kem_id kem_id,
5562
             enum hpke_kdf_id kdf_id,
5563
             enum hpke_aead_id aead_id,
5564
             struct crypto_ec_key *peer_pub,
5565
             const u8 *info, size_t info_len,
5566
             const u8 *aad, size_t aad_len,
5567
             const u8 *pt, size_t pt_len)
5568
{
5569
  OSSL_HPKE_SUITE suite;
5570
  OSSL_HPKE_CTX *ctx = NULL;
5571
  struct wpabuf *res = NULL, *buf, *pub = NULL;
5572
  size_t enc_len, ct_len;
5573
  int group;
5574
5575
  group = crypto_ec_key_group(peer_pub);
5576
  if (group == 28 || group == 29 || group == 30) {
5577
    /* Use the internal routines for the special DPP use case with
5578
     * brainpool curves, */
5579
    return hpke_base_seal_int(kem_id, kdf_id, aead_id, peer_pub,
5580
            info, info_len, aad, aad_len,
5581
            pt, pt_len);
5582
  }
5583
5584
5585
  if (!hpke_set_suite(&suite, kem_id, kdf_id, aead_id))
5586
    return NULL;
5587
5588
  enc_len = OSSL_HPKE_get_public_encap_size(suite);
5589
  ct_len = OSSL_HPKE_get_ciphertext_size(suite, pt_len);
5590
  buf = wpabuf_alloc(enc_len + ct_len);
5591
  if (!buf)
5592
    goto out;
5593
5594
  pub = crypto_ec_key_get_pubkey_point(peer_pub, 1);
5595
  if (!pub)
5596
    goto out;
5597
5598
  ctx = OSSL_HPKE_CTX_new(OSSL_HPKE_MODE_BASE, suite,
5599
        OSSL_HPKE_ROLE_SENDER, NULL, NULL);
5600
  if (!ctx)
5601
    goto out;
5602
5603
  if (OSSL_HPKE_encap(ctx, wpabuf_put(buf, 0), &enc_len,
5604
          wpabuf_head(pub), wpabuf_len(pub),
5605
          info, info_len) != 1) {
5606
    wpa_printf(MSG_DEBUG, "OpenSSL: OSSL_HPKE_encap failed: %s",
5607
         ERR_error_string(ERR_get_error(), NULL));
5608
    goto out;
5609
  }
5610
  wpabuf_put(buf, enc_len);
5611
5612
  if (OSSL_HPKE_seal(ctx, wpabuf_put(buf, 0), &ct_len, aad, aad_len,
5613
         pt, pt_len) != 1) {
5614
    wpa_printf(MSG_DEBUG, "OpenSSL: OSSL_HPKE_seal failed: %s",
5615
         ERR_error_string(ERR_get_error(), NULL));
5616
    goto out;
5617
  }
5618
  wpabuf_put(buf, ct_len);
5619
  res = buf;
5620
  buf = NULL;
5621
5622
out:
5623
  OSSL_HPKE_CTX_free(ctx);
5624
  wpabuf_free(buf);
5625
  wpabuf_free(pub);
5626
  return res;
5627
}
5628
5629
5630
struct wpabuf * hpke_base_open(enum hpke_kem_id kem_id,
5631
             enum hpke_kdf_id kdf_id,
5632
             enum hpke_aead_id aead_id,
5633
             struct crypto_ec_key *own_priv,
5634
             const u8 *info, size_t info_len,
5635
             const u8 *aad, size_t aad_len,
5636
             const u8 *enc_ct, size_t enc_ct_len)
5637
{
5638
  OSSL_HPKE_SUITE suite;
5639
  OSSL_HPKE_CTX *ctx;
5640
  struct wpabuf *buf = NULL, *res = NULL;
5641
  size_t len, enc_len;
5642
  int group;
5643
5644
  group = crypto_ec_key_group(own_priv);
5645
  if (group == 28 || group == 29 || group == 30) {
5646
    /* Use the internal routines for the special DPP use case with
5647
     * brainpool curves, */
5648
    return hpke_base_open_int(kem_id, kdf_id, aead_id, own_priv,
5649
            info, info_len, aad, aad_len,
5650
            enc_ct, enc_ct_len);
5651
  }
5652
5653
  if (!hpke_set_suite(&suite, kem_id, kdf_id, aead_id))
5654
    return NULL;
5655
5656
  enc_len = OSSL_HPKE_get_public_encap_size(suite);
5657
  if (enc_ct_len < enc_len) {
5658
    wpa_printf(MSG_DEBUG, "OpenSSL: Too short HPKE enc_ct data");
5659
    return NULL;
5660
  }
5661
5662
  ctx = OSSL_HPKE_CTX_new(OSSL_HPKE_MODE_BASE, suite,
5663
        OSSL_HPKE_ROLE_RECEIVER, NULL, NULL);
5664
  if (!ctx)
5665
    goto out;
5666
5667
  if (OSSL_HPKE_decap(ctx, enc_ct, enc_len, (EVP_PKEY *) own_priv,
5668
          info, info_len) != 1) {
5669
    wpa_printf(MSG_DEBUG, "OpenSSL: OSSL_HPKE_decap failed: %s",
5670
         ERR_error_string(ERR_get_error(), NULL));
5671
    goto out;
5672
  }
5673
5674
  len = enc_ct_len;
5675
  buf = wpabuf_alloc(len);
5676
  if (!buf)
5677
    goto out;
5678
5679
  if (OSSL_HPKE_open(ctx, wpabuf_put(buf, 0), &len, aad, aad_len,
5680
         enc_ct + enc_len, enc_ct_len - enc_len) != 1) {
5681
    wpa_printf(MSG_DEBUG, "OpenSSL: OSSL_HPKE_open failed: %s",
5682
         ERR_error_string(ERR_get_error(), NULL));
5683
    goto out;
5684
  }
5685
5686
  wpabuf_put(buf, len);
5687
  res = buf;
5688
  buf = NULL;
5689
5690
out:
5691
  OSSL_HPKE_CTX_free(ctx);
5692
  wpabuf_free(buf);
5693
  return res;
5694
}
5695
5696
#else /* OpenSSL < 3.2 */
5697
5698
struct wpabuf * hpke_base_seal(enum hpke_kem_id kem_id,
5699
             enum hpke_kdf_id kdf_id,
5700
             enum hpke_aead_id aead_id,
5701
             struct crypto_ec_key *peer_pub,
5702
             const u8 *info, size_t info_len,
5703
             const u8 *aad, size_t aad_len,
5704
             const u8 *pt, size_t pt_len)
5705
{
5706
  return hpke_base_seal_int(kem_id, kdf_id, aead_id, peer_pub,
5707
          info, info_len, aad, aad_len, pt, pt_len);
5708
}
5709
5710
5711
struct wpabuf * hpke_base_open(enum hpke_kem_id kem_id,
5712
             enum hpke_kdf_id kdf_id,
5713
             enum hpke_aead_id aead_id,
5714
             struct crypto_ec_key *own_priv,
5715
             const u8 *info, size_t info_len,
5716
             const u8 *aad, size_t aad_len,
5717
             const u8 *enc_ct, size_t enc_ct_len)
5718
{
5719
  return hpke_base_open_int(kem_id, kdf_id, aead_id, own_priv,
5720
          info, info_len, aad, aad_len,
5721
          enc_ct, enc_ct_len);
5722
}
5723
5724
#endif /* OpenSSL < 3.2 */
5725
5726
#endif /* CONFIG_DPP3 */
5727
5728
5729
void crypto_unload(void)
5730
0
{
5731
0
  openssl_unload_legacy_provider();
5732
0
  openssl_unload_default_provider();
5733
0
}