1 /* 2 * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 * 9 * RFC 9106 Argon2 (see https://www.rfc-editor.org/rfc/rfc9106.txt) 10 * 11 */ 12 13 #include <stdlib.h> 14 #include <stddef.h> 15 #include <stdarg.h> 16 #include <string.h> 17 #include <openssl/e_os2.h> 18 #include <openssl/evp.h> 19 #include <openssl/objects.h> 20 #include <openssl/crypto.h> 21 #include <openssl/kdf.h> 22 #include <openssl/err.h> 23 #include <openssl/core_names.h> 24 #include <openssl/params.h> 25 #include <openssl/thread.h> 26 #include <openssl/proverr.h> 27 #include "internal/thread.h" 28 #include "internal/numbers.h" 29 #include "internal/endian.h" 30 #include "crypto/evp.h" 31 #include "prov/implementations.h" 32 #include "prov/provider_ctx.h" 33 #include "prov/providercommon.h" 34 #include "prov/blake2.h" 35 36 #if defined(OPENSSL_NO_DEFAULT_THREAD_POOL) && defined(OPENSSL_NO_THREAD_POOL) 37 #define ARGON2_NO_THREADS 38 #endif 39 40 #if !defined(OPENSSL_THREADS) 41 #define ARGON2_NO_THREADS 42 #endif 43 44 #ifndef OPENSSL_NO_ARGON2 45 46 #define ARGON2_MIN_LANES 1u 47 #define ARGON2_MAX_LANES 0xFFFFFFu 48 #define ARGON2_MIN_THREADS 1u 49 #define ARGON2_MAX_THREADS 0xFFFFFFu 50 #define ARGON2_SYNC_POINTS 4u 51 #define ARGON2_MIN_OUT_LENGTH 4u 52 #define ARGON2_MAX_OUT_LENGTH 0xFFFFFFFFu 53 #define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) 54 #define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b)) 55 #define ARGON2_MAX_MEMORY 0xFFFFFFFFu 56 #define ARGON2_MIN_TIME 1u 57 #define ARGON2_MAX_TIME 0xFFFFFFFFu 58 #define ARGON2_MIN_PWD_LENGTH 0u 59 #define ARGON2_MAX_PWD_LENGTH 0xFFFFFFFFu 60 #define ARGON2_MIN_AD_LENGTH 0u 61 #define ARGON2_MAX_AD_LENGTH 0xFFFFFFFFu 62 #define ARGON2_MIN_SALT_LENGTH 8u 63 #define ARGON2_MAX_SALT_LENGTH 0xFFFFFFFFu 64 #define ARGON2_MIN_SECRET 0u 65 #define ARGON2_MAX_SECRET 0xFFFFFFFFu 66 #define ARGON2_BLOCK_SIZE 1024 67 #define ARGON2_QWORDS_IN_BLOCK ((ARGON2_BLOCK_SIZE) / 8) 68 #define ARGON2_OWORDS_IN_BLOCK ((ARGON2_BLOCK_SIZE) / 16) 69 #define ARGON2_HWORDS_IN_BLOCK ((ARGON2_BLOCK_SIZE) / 32) 70 #define ARGON2_512BIT_WORDS_IN_BLOCK ((ARGON2_BLOCK_SIZE) / 64) 71 #define ARGON2_ADDRESSES_IN_BLOCK 128 72 #define ARGON2_PREHASH_DIGEST_LENGTH 64 73 #define ARGON2_PREHASH_SEED_LENGTH \ 74 (ARGON2_PREHASH_DIGEST_LENGTH + (2 * sizeof(uint32_t))) 75 76 #define ARGON2_DEFAULT_OUTLEN 64u 77 #define ARGON2_DEFAULT_T_COST 3u 78 #define ARGON2_DEFAULT_M_COST ARGON2_MIN_MEMORY 79 #define ARGON2_DEFAULT_LANES 1u 80 #define ARGON2_DEFAULT_THREADS 1u 81 #define ARGON2_DEFAULT_VERSION ARGON2_VERSION_NUMBER 82 83 #undef G 84 #define G(a, b, c, d) \ 85 do { \ 86 a = a + b + 2 * mul_lower(a, b); \ 87 d = rotr64(d ^ a, 32); \ 88 c = c + d + 2 * mul_lower(c, d); \ 89 b = rotr64(b ^ c, 24); \ 90 a = a + b + 2 * mul_lower(a, b); \ 91 d = rotr64(d ^ a, 16); \ 92 c = c + d + 2 * mul_lower(c, d); \ 93 b = rotr64(b ^ c, 63); \ 94 } while ((void)0, 0) 95 96 #undef PERMUTATION_P 97 #define PERMUTATION_P(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, \ 98 v12, v13, v14, v15) \ 99 do { \ 100 G(v0, v4, v8, v12); \ 101 G(v1, v5, v9, v13); \ 102 G(v2, v6, v10, v14); \ 103 G(v3, v7, v11, v15); \ 104 G(v0, v5, v10, v15); \ 105 G(v1, v6, v11, v12); \ 106 G(v2, v7, v8, v13); \ 107 G(v3, v4, v9, v14); \ 108 } while ((void)0, 0) 109 110 #undef PERMUTATION_P_COLUMN 111 #define PERMUTATION_P_COLUMN(x, i) \ 112 do { \ 113 uint64_t *base = &x[16 * i]; \ 114 PERMUTATION_P( \ 115 *base, *(base + 1), *(base + 2), *(base + 3), \ 116 *(base + 4), *(base + 5), *(base + 6), *(base + 7), \ 117 *(base + 8), *(base + 9), *(base + 10), *(base + 11), \ 118 *(base + 12), *(base + 13), *(base + 14), *(base + 15)); \ 119 } while ((void)0, 0) 120 121 #undef PERMUTATION_P_ROW 122 #define PERMUTATION_P_ROW(x, i) \ 123 do { \ 124 uint64_t *base = &x[2 * i]; \ 125 PERMUTATION_P( \ 126 *base, *(base + 1), *(base + 16), *(base + 17), \ 127 *(base + 32), *(base + 33), *(base + 48), *(base + 49), \ 128 *(base + 64), *(base + 65), *(base + 80), *(base + 81), \ 129 *(base + 96), *(base + 97), *(base + 112), *(base + 113)); \ 130 } while ((void)0, 0) 131 132 typedef struct { 133 uint64_t v[ARGON2_QWORDS_IN_BLOCK]; 134 } BLOCK; 135 136 typedef enum { 137 ARGON2_VERSION_10 = 0x10, 138 ARGON2_VERSION_13 = 0x13, 139 ARGON2_VERSION_NUMBER = ARGON2_VERSION_13 140 } ARGON2_VERSION; 141 142 typedef enum { 143 ARGON2_D = 0, 144 ARGON2_I = 1, 145 ARGON2_ID = 2 146 } ARGON2_TYPE; 147 148 typedef struct { 149 uint32_t pass; 150 uint32_t lane; 151 uint8_t slice; 152 uint32_t index; 153 } ARGON2_POS; 154 155 typedef struct { 156 void *provctx; 157 uint32_t outlen; 158 uint8_t *pwd; 159 uint32_t pwdlen; 160 uint8_t *salt; 161 uint32_t saltlen; 162 uint8_t *secret; 163 uint32_t secretlen; 164 uint8_t *ad; 165 uint32_t adlen; 166 uint32_t t_cost; 167 uint32_t m_cost; 168 uint32_t lanes; 169 uint32_t threads; 170 uint32_t version; 171 uint32_t early_clean; 172 ARGON2_TYPE type; 173 BLOCK *memory; 174 uint32_t passes; 175 uint32_t memory_blocks; 176 uint32_t segment_length; 177 uint32_t lane_length; 178 OSSL_LIB_CTX *libctx; 179 EVP_MD *md; 180 EVP_MAC *mac; 181 char *propq; 182 } KDF_ARGON2; 183 184 typedef struct { 185 ARGON2_POS pos; 186 KDF_ARGON2 *ctx; 187 } ARGON2_THREAD_DATA; 188 189 static OSSL_FUNC_kdf_newctx_fn kdf_argon2i_new; 190 static OSSL_FUNC_kdf_newctx_fn kdf_argon2d_new; 191 static OSSL_FUNC_kdf_newctx_fn kdf_argon2id_new; 192 static OSSL_FUNC_kdf_freectx_fn kdf_argon2_free; 193 static OSSL_FUNC_kdf_reset_fn kdf_argon2_reset; 194 static OSSL_FUNC_kdf_derive_fn kdf_argon2_derive; 195 static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_argon2_settable_ctx_params; 196 static OSSL_FUNC_kdf_set_ctx_params_fn kdf_argon2_set_ctx_params; 197 198 static void kdf_argon2_init(KDF_ARGON2 *ctx, ARGON2_TYPE t); 199 static void *kdf_argon2d_new(void *provctx); 200 static void *kdf_argon2i_new(void *provctx); 201 static void *kdf_argon2id_new(void *provctx); 202 static void kdf_argon2_free(void *vctx); 203 static int kdf_argon2_derive(void *vctx, unsigned char *out, size_t outlen, 204 const OSSL_PARAM params[]); 205 static void kdf_argon2_reset(void *vctx); 206 static int kdf_argon2_ctx_set_threads(KDF_ARGON2 *ctx, uint32_t threads); 207 static int kdf_argon2_ctx_set_lanes(KDF_ARGON2 *ctx, uint32_t lanes); 208 static int kdf_argon2_ctx_set_t_cost(KDF_ARGON2 *ctx, uint32_t t_cost); 209 static int kdf_argon2_ctx_set_m_cost(KDF_ARGON2 *ctx, uint32_t m_cost); 210 static int kdf_argon2_ctx_set_out_length(KDF_ARGON2 *ctx, uint32_t outlen); 211 static int kdf_argon2_ctx_set_secret(KDF_ARGON2 *ctx, const OSSL_PARAM *p); 212 static int kdf_argon2_ctx_set_pwd(KDF_ARGON2 *ctx, const OSSL_PARAM *p); 213 static int kdf_argon2_ctx_set_salt(KDF_ARGON2 *ctx, const OSSL_PARAM *p); 214 static int kdf_argon2_ctx_set_ad(KDF_ARGON2 *ctx, const OSSL_PARAM *p); 215 static int kdf_argon2_set_ctx_params(void *vctx, const OSSL_PARAM params[]); 216 static int kdf_argon2_get_ctx_params(void *vctx, OSSL_PARAM params[]); 217 static int kdf_argon2_ctx_set_version(KDF_ARGON2 *ctx, uint32_t version); 218 static const OSSL_PARAM *kdf_argon2_settable_ctx_params(ossl_unused void *ctx, 219 ossl_unused void *p_ctx); 220 static const OSSL_PARAM *kdf_argon2_gettable_ctx_params(ossl_unused void *ctx, 221 ossl_unused void *p_ctx); 222 223 static ossl_inline uint64_t load64(const uint8_t *src); 224 static ossl_inline void store32(uint8_t *dst, uint32_t w); 225 static ossl_inline void store64(uint8_t *dst, uint64_t w); 226 static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned int c); 227 static ossl_inline uint64_t mul_lower(uint64_t x, uint64_t y); 228 229 static void init_block_value(BLOCK *b, uint8_t in); 230 static void copy_block(BLOCK *dst, const BLOCK *src); 231 static void xor_block(BLOCK *dst, const BLOCK *src); 232 static void load_block(BLOCK *dst, const void *input); 233 static void store_block(void *output, const BLOCK *src); 234 static void fill_first_blocks(uint8_t *blockhash, const KDF_ARGON2 *ctx); 235 static void fill_block(const BLOCK *prev, const BLOCK *ref, BLOCK *next, 236 int with_xor); 237 238 static void next_addresses(BLOCK *address_block, BLOCK *input_block, 239 const BLOCK *zero_block); 240 static int data_indep_addressing(const KDF_ARGON2 *ctx, uint32_t pass, 241 uint8_t slice); 242 static uint32_t index_alpha(const KDF_ARGON2 *ctx, uint32_t pass, 243 uint8_t slice, uint32_t index, 244 uint32_t pseudo_rand, int same_lane); 245 246 static void fill_segment(const KDF_ARGON2 *ctx, uint32_t pass, uint32_t lane, 247 uint8_t slice); 248 249 #if !defined(ARGON2_NO_THREADS) 250 static uint32_t fill_segment_thr(void *thread_data); 251 static int fill_mem_blocks_mt(KDF_ARGON2 *ctx); 252 #endif 253 254 static int fill_mem_blocks_st(KDF_ARGON2 *ctx); 255 static ossl_inline int fill_memory_blocks(KDF_ARGON2 *ctx); 256 257 static void initial_hash(uint8_t *blockhash, KDF_ARGON2 *ctx); 258 static int initialize(KDF_ARGON2 *ctx); 259 static void finalize(const KDF_ARGON2 *ctx, void *out); 260 261 static int blake2b(EVP_MD *md, EVP_MAC *mac, void *out, size_t outlen, 262 const void *in, size_t inlen, const void *key, 263 size_t keylen); 264 static int blake2b_long(EVP_MD *md, EVP_MAC *mac, unsigned char *out, 265 size_t outlen, const void *in, size_t inlen); 266 267 static ossl_inline uint64_t load64(const uint8_t *src) 268 { 269 return (((uint64_t)src[0]) << 0) 270 | (((uint64_t)src[1]) << 8) 271 | (((uint64_t)src[2]) << 16) 272 | (((uint64_t)src[3]) << 24) 273 | (((uint64_t)src[4]) << 32) 274 | (((uint64_t)src[5]) << 40) 275 | (((uint64_t)src[6]) << 48) 276 | (((uint64_t)src[7]) << 56); 277 } 278 279 static ossl_inline void store32(uint8_t *dst, uint32_t w) 280 { 281 dst[0] = (uint8_t)(w >> 0); 282 dst[1] = (uint8_t)(w >> 8); 283 dst[2] = (uint8_t)(w >> 16); 284 dst[3] = (uint8_t)(w >> 24); 285 } 286 287 static ossl_inline void store64(uint8_t *dst, uint64_t w) 288 { 289 dst[0] = (uint8_t)(w >> 0); 290 dst[1] = (uint8_t)(w >> 8); 291 dst[2] = (uint8_t)(w >> 16); 292 dst[3] = (uint8_t)(w >> 24); 293 dst[4] = (uint8_t)(w >> 32); 294 dst[5] = (uint8_t)(w >> 40); 295 dst[6] = (uint8_t)(w >> 48); 296 dst[7] = (uint8_t)(w >> 56); 297 } 298 299 static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned int c) 300 { 301 return (w >> c) | (w << (64 - c)); 302 } 303 304 static ossl_inline uint64_t mul_lower(uint64_t x, uint64_t y) 305 { 306 const uint64_t m = 0xFFFFFFFFUL; 307 return (x & m) * (y & m); 308 } 309 310 static void init_block_value(BLOCK *b, uint8_t in) 311 { 312 memset(b->v, in, sizeof(b->v)); 313 } 314 315 static void copy_block(BLOCK *dst, const BLOCK *src) 316 { 317 memcpy(dst->v, src->v, sizeof(uint64_t) * ARGON2_QWORDS_IN_BLOCK); 318 } 319 320 static void xor_block(BLOCK *dst, const BLOCK *src) 321 { 322 int i; 323 324 for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) 325 dst->v[i] ^= src->v[i]; 326 } 327 328 static void load_block(BLOCK *dst, const void *input) 329 { 330 unsigned i; 331 332 for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) 333 dst->v[i] = load64((const uint8_t *)input + i * sizeof(dst->v[i])); 334 } 335 336 static void store_block(void *output, const BLOCK *src) 337 { 338 unsigned i; 339 340 for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) 341 store64((uint8_t *)output + i * sizeof(src->v[i]), src->v[i]); 342 } 343 344 static void fill_first_blocks(uint8_t *blockhash, const KDF_ARGON2 *ctx) 345 { 346 uint32_t l; 347 uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; 348 349 /* 350 * Make the first and second block in each lane as G(H0||0||i) 351 * or G(H0||1||i). 352 */ 353 for (l = 0; l < ctx->lanes; ++l) { 354 store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0); 355 store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l); 356 blake2b_long(ctx->md, ctx->mac, blockhash_bytes, ARGON2_BLOCK_SIZE, 357 blockhash, ARGON2_PREHASH_SEED_LENGTH); 358 load_block(&ctx->memory[l * ctx->lane_length + 0], 359 blockhash_bytes); 360 store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1); 361 blake2b_long(ctx->md, ctx->mac, blockhash_bytes, ARGON2_BLOCK_SIZE, 362 blockhash, ARGON2_PREHASH_SEED_LENGTH); 363 load_block(&ctx->memory[l * ctx->lane_length + 1], 364 blockhash_bytes); 365 } 366 OPENSSL_cleanse(blockhash_bytes, ARGON2_BLOCK_SIZE); 367 } 368 369 static void fill_block(const BLOCK *prev, const BLOCK *ref, 370 BLOCK *next, int with_xor) 371 { 372 BLOCK blockR, tmp; 373 unsigned i; 374 375 copy_block(&blockR, ref); 376 xor_block(&blockR, prev); 377 copy_block(&tmp, &blockR); 378 379 if (with_xor) 380 xor_block(&tmp, next); 381 382 for (i = 0; i < 8; ++i) 383 PERMUTATION_P_COLUMN(blockR.v, i); 384 385 for (i = 0; i < 8; ++i) 386 PERMUTATION_P_ROW(blockR.v, i); 387 388 copy_block(next, &tmp); 389 xor_block(next, &blockR); 390 } 391 392 static void next_addresses(BLOCK *address_block, BLOCK *input_block, 393 const BLOCK *zero_block) 394 { 395 input_block->v[6]++; 396 fill_block(zero_block, input_block, address_block, 0); 397 fill_block(zero_block, address_block, address_block, 0); 398 } 399 400 static int data_indep_addressing(const KDF_ARGON2 *ctx, uint32_t pass, 401 uint8_t slice) 402 { 403 switch (ctx->type) { 404 case ARGON2_I: 405 return 1; 406 case ARGON2_ID: 407 return (pass == 0) && (slice < ARGON2_SYNC_POINTS / 2); 408 case ARGON2_D: 409 default: 410 return 0; 411 } 412 } 413 414 /* 415 * Pass 0 (pass = 0): 416 * This lane: all already finished segments plus already constructed blocks 417 * in this segment 418 * Other lanes: all already finished segments 419 * 420 * Pass 1+: 421 * This lane: (SYNC_POINTS - 1) last segments plus already constructed 422 * blocks in this segment 423 * Other lanes: (SYNC_POINTS - 1) last segments 424 */ 425 static uint32_t index_alpha(const KDF_ARGON2 *ctx, uint32_t pass, 426 uint8_t slice, uint32_t index, 427 uint32_t pseudo_rand, int same_lane) 428 { 429 uint32_t ref_area_sz; 430 uint64_t rel_pos; 431 uint32_t start_pos, abs_pos; 432 433 start_pos = 0; 434 switch (pass) { 435 case 0: 436 if (slice == 0) 437 ref_area_sz = index - 1; 438 else if (same_lane) 439 ref_area_sz = slice * ctx->segment_length + index - 1; 440 else 441 ref_area_sz = slice * ctx->segment_length + ((index == 0) ? (-1) : 0); 442 break; 443 default: 444 if (same_lane) 445 ref_area_sz = ctx->lane_length - ctx->segment_length + index - 1; 446 else 447 ref_area_sz = ctx->lane_length - ctx->segment_length + ((index == 0) ? (-1) : 0); 448 if (slice != ARGON2_SYNC_POINTS - 1) 449 start_pos = (slice + 1) * ctx->segment_length; 450 break; 451 } 452 453 rel_pos = pseudo_rand; 454 rel_pos = rel_pos * rel_pos >> 32; 455 rel_pos = ref_area_sz - 1 - (ref_area_sz * rel_pos >> 32); 456 abs_pos = (start_pos + rel_pos) % ctx->lane_length; 457 458 return abs_pos; 459 } 460 461 static void fill_segment(const KDF_ARGON2 *ctx, uint32_t pass, uint32_t lane, 462 uint8_t slice) 463 { 464 BLOCK *ref_block = NULL, *curr_block = NULL; 465 BLOCK address_block, input_block, zero_block; 466 uint64_t rnd, ref_index, ref_lane; 467 uint32_t prev_offset; 468 uint32_t start_idx; 469 uint32_t j; 470 uint32_t curr_offset; /* Offset of the current block */ 471 472 memset(&input_block, 0, sizeof(BLOCK)); 473 474 if (ctx == NULL) 475 return; 476 477 if (data_indep_addressing(ctx, pass, slice)) { 478 init_block_value(&zero_block, 0); 479 init_block_value(&input_block, 0); 480 481 input_block.v[0] = pass; 482 input_block.v[1] = lane; 483 input_block.v[2] = slice; 484 input_block.v[3] = ctx->memory_blocks; 485 input_block.v[4] = ctx->passes; 486 input_block.v[5] = ctx->type; 487 } 488 489 start_idx = 0; 490 491 /* We've generated the first two blocks. Generate the 1st block of addrs. */ 492 if ((pass == 0) && (slice == 0)) { 493 start_idx = 2; 494 if (data_indep_addressing(ctx, pass, slice)) 495 next_addresses(&address_block, &input_block, &zero_block); 496 } 497 498 curr_offset = lane * ctx->lane_length + slice * ctx->segment_length 499 + start_idx; 500 501 if ((curr_offset % ctx->lane_length) == 0) 502 prev_offset = curr_offset + ctx->lane_length - 1; 503 else 504 prev_offset = curr_offset - 1; 505 506 for (j = start_idx; j < ctx->segment_length; ++j, ++curr_offset, ++prev_offset) { 507 if (curr_offset % ctx->lane_length == 1) 508 prev_offset = curr_offset - 1; 509 510 /* Taking pseudo-random value from the previous block. */ 511 if (data_indep_addressing(ctx, pass, slice)) { 512 if (j % ARGON2_ADDRESSES_IN_BLOCK == 0) 513 next_addresses(&address_block, &input_block, &zero_block); 514 rnd = address_block.v[j % ARGON2_ADDRESSES_IN_BLOCK]; 515 } else { 516 rnd = ctx->memory[prev_offset].v[0]; 517 } 518 519 /* Computing the lane of the reference block */ 520 ref_lane = ((rnd >> 32)) % ctx->lanes; 521 /* Can not reference other lanes yet */ 522 if ((pass == 0) && (slice == 0)) 523 ref_lane = lane; 524 525 /* Computing the number of possible reference block within the lane. */ 526 ref_index = index_alpha(ctx, pass, slice, j, rnd & 0xFFFFFFFF, 527 ref_lane == lane); 528 529 /* Creating a new block */ 530 ref_block = ctx->memory + ctx->lane_length * ref_lane + ref_index; 531 curr_block = ctx->memory + curr_offset; 532 if (ARGON2_VERSION_10 == ctx->version) { 533 /* Version 1.2.1 and earlier: overwrite, not XOR */ 534 fill_block(ctx->memory + prev_offset, ref_block, curr_block, 0); 535 continue; 536 } 537 538 fill_block(ctx->memory + prev_offset, ref_block, curr_block, 539 pass == 0 ? 0 : 1); 540 } 541 } 542 543 #if !defined(ARGON2_NO_THREADS) 544 545 static uint32_t fill_segment_thr(void *thread_data) 546 { 547 ARGON2_THREAD_DATA *my_data; 548 549 my_data = (ARGON2_THREAD_DATA *)thread_data; 550 fill_segment(my_data->ctx, my_data->pos.pass, my_data->pos.lane, 551 my_data->pos.slice); 552 553 return 0; 554 } 555 556 static int fill_mem_blocks_mt(KDF_ARGON2 *ctx) 557 { 558 uint32_t r, s, l, ll; 559 void **t; 560 ARGON2_THREAD_DATA *t_data; 561 562 t = OPENSSL_zalloc(sizeof(void *) * ctx->lanes); 563 t_data = OPENSSL_zalloc(ctx->lanes * sizeof(ARGON2_THREAD_DATA)); 564 565 if (t == NULL || t_data == NULL) 566 goto fail; 567 568 for (r = 0; r < ctx->passes; ++r) { 569 for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { 570 for (l = 0; l < ctx->lanes; ++l) { 571 ARGON2_POS p; 572 if (l >= ctx->threads) { 573 if (ossl_crypto_thread_join(t[l - ctx->threads], NULL) == 0) 574 goto fail; 575 if (ossl_crypto_thread_clean(t[l - ctx->threads]) == 0) 576 goto fail; 577 t[l] = NULL; 578 } 579 580 p.pass = r; 581 p.lane = l; 582 p.slice = (uint8_t)s; 583 p.index = 0; 584 585 t_data[l].ctx = ctx; 586 memcpy(&(t_data[l].pos), &p, sizeof(ARGON2_POS)); 587 t[l] = ossl_crypto_thread_start(ctx->libctx, &fill_segment_thr, 588 (void *)&t_data[l]); 589 if (t[l] == NULL) { 590 for (ll = 0; ll < l; ++ll) { 591 if (ossl_crypto_thread_join(t[ll], NULL) == 0) 592 goto fail; 593 if (ossl_crypto_thread_clean(t[ll]) == 0) 594 goto fail; 595 t[ll] = NULL; 596 } 597 goto fail; 598 } 599 } 600 for (l = ctx->lanes - ctx->threads; l < ctx->lanes; ++l) { 601 if (ossl_crypto_thread_join(t[l], NULL) == 0) 602 goto fail; 603 if (ossl_crypto_thread_clean(t[l]) == 0) 604 goto fail; 605 t[l] = NULL; 606 } 607 } 608 } 609 610 OPENSSL_free(t_data); 611 OPENSSL_free(t); 612 613 return 1; 614 615 fail: 616 if (t_data != NULL) 617 OPENSSL_free(t_data); 618 if (t != NULL) 619 OPENSSL_free(t); 620 return 0; 621 } 622 623 #endif /* !defined(ARGON2_NO_THREADS) */ 624 625 static int fill_mem_blocks_st(KDF_ARGON2 *ctx) 626 { 627 uint32_t r, s, l; 628 629 for (r = 0; r < ctx->passes; ++r) 630 for (s = 0; s < ARGON2_SYNC_POINTS; ++s) 631 for (l = 0; l < ctx->lanes; ++l) 632 fill_segment(ctx, r, l, s); 633 return 1; 634 } 635 636 static ossl_inline int fill_memory_blocks(KDF_ARGON2 *ctx) 637 { 638 #if !defined(ARGON2_NO_THREADS) 639 return ctx->threads == 1 ? fill_mem_blocks_st(ctx) : fill_mem_blocks_mt(ctx); 640 #else 641 return ctx->threads == 1 ? fill_mem_blocks_st(ctx) : 0; 642 #endif 643 } 644 645 static void initial_hash(uint8_t *blockhash, KDF_ARGON2 *ctx) 646 { 647 EVP_MD_CTX *mdctx; 648 uint8_t value[sizeof(uint32_t)]; 649 unsigned int tmp; 650 uint32_t args[7]; 651 652 if (ctx == NULL || blockhash == NULL) 653 return; 654 655 args[0] = ctx->lanes; 656 args[1] = ctx->outlen; 657 args[2] = ctx->m_cost; 658 args[3] = ctx->t_cost; 659 args[4] = ctx->version; 660 args[5] = (uint32_t)ctx->type; 661 args[6] = ctx->pwdlen; 662 663 mdctx = EVP_MD_CTX_create(); 664 if (mdctx == NULL || EVP_DigestInit_ex(mdctx, ctx->md, NULL) != 1) 665 goto fail; 666 667 for (tmp = 0; tmp < sizeof(args) / sizeof(uint32_t); ++tmp) { 668 store32((uint8_t *)&value, args[tmp]); 669 if (EVP_DigestUpdate(mdctx, &value, sizeof(value)) != 1) 670 goto fail; 671 } 672 673 if (ctx->pwd != NULL) { 674 if (EVP_DigestUpdate(mdctx, ctx->pwd, ctx->pwdlen) != 1) 675 goto fail; 676 if (ctx->early_clean) { 677 OPENSSL_cleanse(ctx->pwd, ctx->pwdlen); 678 ctx->pwdlen = 0; 679 } 680 } 681 682 store32((uint8_t *)&value, ctx->saltlen); 683 684 if (EVP_DigestUpdate(mdctx, &value, sizeof(value)) != 1) 685 goto fail; 686 687 if (ctx->salt != NULL) 688 if (EVP_DigestUpdate(mdctx, ctx->salt, ctx->saltlen) != 1) 689 goto fail; 690 691 store32((uint8_t *)&value, ctx->secretlen); 692 if (EVP_DigestUpdate(mdctx, &value, sizeof(value)) != 1) 693 goto fail; 694 695 if (ctx->secret != NULL) { 696 if (EVP_DigestUpdate(mdctx, ctx->secret, ctx->secretlen) != 1) 697 goto fail; 698 if (ctx->early_clean) { 699 OPENSSL_cleanse(ctx->secret, ctx->secretlen); 700 ctx->secretlen = 0; 701 } 702 } 703 704 store32((uint8_t *)&value, ctx->adlen); 705 if (EVP_DigestUpdate(mdctx, &value, sizeof(value)) != 1) 706 goto fail; 707 708 if (ctx->ad != NULL) 709 if (EVP_DigestUpdate(mdctx, ctx->ad, ctx->adlen) != 1) 710 goto fail; 711 712 tmp = ARGON2_PREHASH_DIGEST_LENGTH; 713 if (EVP_DigestFinal_ex(mdctx, blockhash, &tmp) != 1) 714 goto fail; 715 716 fail: 717 EVP_MD_CTX_destroy(mdctx); 718 } 719 720 static int initialize(KDF_ARGON2 *ctx) 721 { 722 uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; 723 724 if (ctx == NULL) 725 return 0; 726 727 if (ctx->memory_blocks * sizeof(BLOCK) / sizeof(BLOCK) != ctx->memory_blocks) 728 return 0; 729 730 if (ctx->type != ARGON2_D) 731 ctx->memory = OPENSSL_secure_zalloc(ctx->memory_blocks * sizeof(BLOCK)); 732 else 733 ctx->memory = OPENSSL_zalloc(ctx->memory_blocks * sizeof(BLOCK)); 734 735 if (ctx->memory == NULL) { 736 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_MEMORY_SIZE, 737 "cannot allocate required memory"); 738 return 0; 739 } 740 741 initial_hash(blockhash, ctx); 742 OPENSSL_cleanse(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 743 ARGON2_PREHASH_SEED_LENGTH - ARGON2_PREHASH_DIGEST_LENGTH); 744 fill_first_blocks(blockhash, ctx); 745 OPENSSL_cleanse(blockhash, ARGON2_PREHASH_SEED_LENGTH); 746 747 return 1; 748 } 749 750 static void finalize(const KDF_ARGON2 *ctx, void *out) 751 { 752 BLOCK blockhash; 753 uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; 754 uint32_t last_block_in_lane; 755 uint32_t l; 756 757 if (ctx == NULL) 758 return; 759 760 copy_block(&blockhash, ctx->memory + ctx->lane_length - 1); 761 762 /* XOR the last blocks */ 763 for (l = 1; l < ctx->lanes; ++l) { 764 last_block_in_lane = l * ctx->lane_length + (ctx->lane_length - 1); 765 xor_block(&blockhash, ctx->memory + last_block_in_lane); 766 } 767 768 /* Hash the result */ 769 store_block(blockhash_bytes, &blockhash); 770 blake2b_long(ctx->md, ctx->mac, out, ctx->outlen, blockhash_bytes, 771 ARGON2_BLOCK_SIZE); 772 OPENSSL_cleanse(blockhash.v, ARGON2_BLOCK_SIZE); 773 OPENSSL_cleanse(blockhash_bytes, ARGON2_BLOCK_SIZE); 774 775 if (ctx->type != ARGON2_D) 776 OPENSSL_secure_clear_free(ctx->memory, 777 ctx->memory_blocks * sizeof(BLOCK)); 778 else 779 OPENSSL_clear_free(ctx->memory, 780 ctx->memory_blocks * sizeof(BLOCK)); 781 } 782 783 static int blake2b_mac(EVP_MAC *mac, void *out, size_t outlen, const void *in, 784 size_t inlen, const void *key, size_t keylen) 785 { 786 int ret = 0; 787 size_t par_n = 0, out_written; 788 EVP_MAC_CTX *ctx = NULL; 789 OSSL_PARAM par[3]; 790 791 if ((ctx = EVP_MAC_CTX_new(mac)) == NULL) 792 goto fail; 793 794 par[par_n++] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY, 795 (void *)key, keylen); 796 par[par_n++] = OSSL_PARAM_construct_size_t(OSSL_MAC_PARAM_SIZE, &outlen); 797 par[par_n++] = OSSL_PARAM_construct_end(); 798 799 ret = EVP_MAC_CTX_set_params(ctx, par) == 1 800 && EVP_MAC_init(ctx, NULL, 0, NULL) == 1 801 && EVP_MAC_update(ctx, in, inlen) == 1 802 && EVP_MAC_final(ctx, out, (size_t *)&out_written, outlen) == 1; 803 804 fail: 805 EVP_MAC_CTX_free(ctx); 806 return ret; 807 } 808 809 static int blake2b_md(EVP_MD *md, void *out, size_t outlen, const void *in, 810 size_t inlen) 811 { 812 int ret = 0; 813 EVP_MD_CTX *ctx = NULL; 814 OSSL_PARAM par[2]; 815 816 if ((ctx = EVP_MD_CTX_create()) == NULL) 817 return 0; 818 819 par[0] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_SIZE, &outlen); 820 par[1] = OSSL_PARAM_construct_end(); 821 822 ret = EVP_DigestInit_ex2(ctx, md, par) == 1 823 && EVP_DigestUpdate(ctx, in, inlen) == 1 824 && EVP_DigestFinal_ex(ctx, out, NULL) == 1; 825 826 EVP_MD_CTX_free(ctx); 827 return ret; 828 } 829 830 static int blake2b(EVP_MD *md, EVP_MAC *mac, void *out, size_t outlen, 831 const void *in, size_t inlen, const void *key, size_t keylen) 832 { 833 if (out == NULL || outlen == 0) 834 return 0; 835 836 if (key == NULL || keylen == 0) 837 return blake2b_md(md, out, outlen, in, inlen); 838 839 return blake2b_mac(mac, out, outlen, in, inlen, key, keylen); 840 } 841 842 static int blake2b_long(EVP_MD *md, EVP_MAC *mac, unsigned char *out, 843 size_t outlen, const void *in, size_t inlen) 844 { 845 int ret = 0; 846 EVP_MD_CTX *ctx = NULL; 847 uint32_t outlen_curr; 848 uint8_t outbuf[BLAKE2B_OUTBYTES]; 849 uint8_t inbuf[BLAKE2B_OUTBYTES]; 850 uint8_t outlen_bytes[sizeof(uint32_t)] = { 0 }; 851 OSSL_PARAM par[2]; 852 size_t outlen_md; 853 854 if (out == NULL || outlen == 0) 855 return 0; 856 857 /* Ensure little-endian byte order */ 858 store32(outlen_bytes, (uint32_t)outlen); 859 860 if ((ctx = EVP_MD_CTX_create()) == NULL) 861 return 0; 862 863 outlen_md = (outlen <= BLAKE2B_OUTBYTES) ? outlen : BLAKE2B_OUTBYTES; 864 par[0] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_SIZE, &outlen_md); 865 par[1] = OSSL_PARAM_construct_end(); 866 867 ret = EVP_DigestInit_ex2(ctx, md, par) == 1 868 && EVP_DigestUpdate(ctx, outlen_bytes, sizeof(outlen_bytes)) == 1 869 && EVP_DigestUpdate(ctx, in, inlen) == 1 870 && EVP_DigestFinal_ex(ctx, (outlen > BLAKE2B_OUTBYTES) ? outbuf : out, 871 NULL) 872 == 1; 873 874 if (ret == 0) 875 goto fail; 876 877 if (outlen > BLAKE2B_OUTBYTES) { 878 memcpy(out, outbuf, BLAKE2B_OUTBYTES / 2); 879 out += BLAKE2B_OUTBYTES / 2; 880 outlen_curr = (uint32_t)outlen - BLAKE2B_OUTBYTES / 2; 881 882 while (outlen_curr > BLAKE2B_OUTBYTES) { 883 memcpy(inbuf, outbuf, BLAKE2B_OUTBYTES); 884 if (blake2b(md, mac, outbuf, BLAKE2B_OUTBYTES, inbuf, 885 BLAKE2B_OUTBYTES, NULL, 0) 886 != 1) 887 goto fail; 888 memcpy(out, outbuf, BLAKE2B_OUTBYTES / 2); 889 out += BLAKE2B_OUTBYTES / 2; 890 outlen_curr -= BLAKE2B_OUTBYTES / 2; 891 } 892 893 memcpy(inbuf, outbuf, BLAKE2B_OUTBYTES); 894 if (blake2b(md, mac, outbuf, outlen_curr, inbuf, BLAKE2B_OUTBYTES, 895 NULL, 0) 896 != 1) 897 goto fail; 898 memcpy(out, outbuf, outlen_curr); 899 } 900 ret = 1; 901 902 fail: 903 EVP_MD_CTX_free(ctx); 904 return ret; 905 } 906 907 static void kdf_argon2_init(KDF_ARGON2 *c, ARGON2_TYPE type) 908 { 909 OSSL_LIB_CTX *libctx; 910 911 libctx = c->libctx; 912 memset(c, 0, sizeof(*c)); 913 914 c->libctx = libctx; 915 c->outlen = ARGON2_DEFAULT_OUTLEN; 916 c->t_cost = ARGON2_DEFAULT_T_COST; 917 c->m_cost = ARGON2_DEFAULT_M_COST; 918 c->lanes = ARGON2_DEFAULT_LANES; 919 c->threads = ARGON2_DEFAULT_THREADS; 920 c->version = ARGON2_DEFAULT_VERSION; 921 c->type = type; 922 } 923 924 static void *kdf_argon2d_new(void *provctx) 925 { 926 KDF_ARGON2 *ctx; 927 928 if (!ossl_prov_is_running()) 929 return NULL; 930 931 ctx = OPENSSL_zalloc(sizeof(*ctx)); 932 if (ctx == NULL) { 933 ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); 934 return NULL; 935 } 936 937 ctx->libctx = PROV_LIBCTX_OF(provctx); 938 939 kdf_argon2_init(ctx, ARGON2_D); 940 return ctx; 941 } 942 943 static void *kdf_argon2i_new(void *provctx) 944 { 945 KDF_ARGON2 *ctx; 946 947 if (!ossl_prov_is_running()) 948 return NULL; 949 950 ctx = OPENSSL_zalloc(sizeof(*ctx)); 951 if (ctx == NULL) { 952 ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); 953 return NULL; 954 } 955 956 ctx->libctx = PROV_LIBCTX_OF(provctx); 957 958 kdf_argon2_init(ctx, ARGON2_I); 959 return ctx; 960 } 961 962 static void *kdf_argon2id_new(void *provctx) 963 { 964 KDF_ARGON2 *ctx; 965 966 if (!ossl_prov_is_running()) 967 return NULL; 968 969 ctx = OPENSSL_zalloc(sizeof(*ctx)); 970 if (ctx == NULL) { 971 ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); 972 return NULL; 973 } 974 975 ctx->libctx = PROV_LIBCTX_OF(provctx); 976 977 kdf_argon2_init(ctx, ARGON2_ID); 978 return ctx; 979 } 980 981 static void kdf_argon2_free(void *vctx) 982 { 983 KDF_ARGON2 *ctx = (KDF_ARGON2 *)vctx; 984 985 if (ctx == NULL) 986 return; 987 988 if (ctx->pwd != NULL) 989 OPENSSL_clear_free(ctx->pwd, ctx->pwdlen); 990 991 if (ctx->salt != NULL) 992 OPENSSL_clear_free(ctx->salt, ctx->saltlen); 993 994 if (ctx->secret != NULL) 995 OPENSSL_clear_free(ctx->secret, ctx->secretlen); 996 997 if (ctx->ad != NULL) 998 OPENSSL_clear_free(ctx->ad, ctx->adlen); 999 1000 EVP_MD_free(ctx->md); 1001 EVP_MAC_free(ctx->mac); 1002 1003 OPENSSL_free(ctx->propq); 1004 1005 memset(ctx, 0, sizeof(*ctx)); 1006 1007 OPENSSL_free(ctx); 1008 } 1009 1010 static int kdf_argon2_derive(void *vctx, unsigned char *out, size_t outlen, 1011 const OSSL_PARAM params[]) 1012 { 1013 KDF_ARGON2 *ctx; 1014 uint32_t memory_blocks, segment_length; 1015 1016 ctx = (KDF_ARGON2 *)vctx; 1017 1018 if (!ossl_prov_is_running() || !kdf_argon2_set_ctx_params(vctx, params)) 1019 return 0; 1020 1021 if (ctx->mac == NULL) 1022 ctx->mac = EVP_MAC_fetch(ctx->libctx, "blake2bmac", ctx->propq); 1023 if (ctx->mac == NULL) { 1024 ERR_raise_data(ERR_LIB_PROV, PROV_R_MISSING_MAC, 1025 "cannot fetch blake2bmac"); 1026 return 0; 1027 } 1028 1029 if (ctx->md == NULL) 1030 ctx->md = EVP_MD_fetch(ctx->libctx, "blake2b512", ctx->propq); 1031 if (ctx->md == NULL) { 1032 ERR_raise_data(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST, 1033 "cannot fetch blake2b512"); 1034 return 0; 1035 } 1036 1037 if (ctx->salt == NULL || ctx->saltlen == 0) { 1038 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SALT); 1039 return 0; 1040 } 1041 1042 if (outlen != ctx->outlen) { 1043 if (OSSL_PARAM_locate((OSSL_PARAM *)params, "size") != NULL) { 1044 ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL); 1045 return 0; 1046 } 1047 if (!kdf_argon2_ctx_set_out_length(ctx, (uint32_t)outlen)) 1048 return 0; 1049 } 1050 1051 switch (ctx->type) { 1052 case ARGON2_D: 1053 case ARGON2_I: 1054 case ARGON2_ID: 1055 break; 1056 default: 1057 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_MODE, "invalid Argon2 type"); 1058 return 0; 1059 } 1060 1061 if (ctx->threads > 1) { 1062 #ifdef ARGON2_NO_THREADS 1063 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE, 1064 "requested %u threads, single-threaded mode supported only", 1065 ctx->threads); 1066 return 0; 1067 #else 1068 if (ctx->threads > ossl_get_avail_threads(ctx->libctx)) { 1069 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE, 1070 "requested %u threads, available: %u", 1071 ctx->threads, ossl_get_avail_threads(ctx->libctx)); 1072 return 0; 1073 } 1074 #endif 1075 if (ctx->threads > ctx->lanes) { 1076 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE, 1077 "requested more threads (%u) than lanes (%u)", 1078 ctx->threads, ctx->lanes); 1079 return 0; 1080 } 1081 } 1082 1083 if (ctx->m_cost < 8 * ctx->lanes) { 1084 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_MEMORY_SIZE, 1085 "m_cost must be greater or equal than 8 times the number of lanes"); 1086 return 0; 1087 } 1088 1089 memory_blocks = ctx->m_cost; 1090 if (memory_blocks < 2 * ARGON2_SYNC_POINTS * ctx->lanes) 1091 memory_blocks = 2 * ARGON2_SYNC_POINTS * ctx->lanes; 1092 1093 /* Ensure that all segments have equal length */ 1094 segment_length = memory_blocks / (ctx->lanes * ARGON2_SYNC_POINTS); 1095 memory_blocks = segment_length * (ctx->lanes * ARGON2_SYNC_POINTS); 1096 1097 ctx->memory = NULL; 1098 ctx->memory_blocks = memory_blocks; 1099 ctx->segment_length = segment_length; 1100 ctx->passes = ctx->t_cost; 1101 ctx->lane_length = segment_length * ARGON2_SYNC_POINTS; 1102 1103 if (initialize(ctx) != 1) 1104 return 0; 1105 1106 if (fill_memory_blocks(ctx) != 1) 1107 return 0; 1108 1109 finalize(ctx, out); 1110 1111 return 1; 1112 } 1113 1114 static void kdf_argon2_reset(void *vctx) 1115 { 1116 OSSL_LIB_CTX *libctx; 1117 KDF_ARGON2 *ctx; 1118 ARGON2_TYPE type; 1119 1120 ctx = (KDF_ARGON2 *)vctx; 1121 type = ctx->type; 1122 libctx = ctx->libctx; 1123 1124 EVP_MD_free(ctx->md); 1125 EVP_MAC_free(ctx->mac); 1126 1127 OPENSSL_free(ctx->propq); 1128 1129 if (ctx->pwd != NULL) 1130 OPENSSL_clear_free(ctx->pwd, ctx->pwdlen); 1131 1132 if (ctx->salt != NULL) 1133 OPENSSL_clear_free(ctx->salt, ctx->saltlen); 1134 1135 if (ctx->secret != NULL) 1136 OPENSSL_clear_free(ctx->secret, ctx->secretlen); 1137 1138 if (ctx->ad != NULL) 1139 OPENSSL_clear_free(ctx->ad, ctx->adlen); 1140 1141 memset(ctx, 0, sizeof(*ctx)); 1142 ctx->libctx = libctx; 1143 kdf_argon2_init(ctx, type); 1144 } 1145 1146 static int kdf_argon2_ctx_set_threads(KDF_ARGON2 *ctx, uint32_t threads) 1147 { 1148 if (threads < ARGON2_MIN_THREADS) { 1149 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE, 1150 "min threads: %u", ARGON2_MIN_THREADS); 1151 return 0; 1152 } 1153 1154 if (threads > ARGON2_MAX_THREADS) { 1155 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE, 1156 "max threads: %u", ARGON2_MAX_THREADS); 1157 return 0; 1158 } 1159 1160 ctx->threads = threads; 1161 return 1; 1162 } 1163 1164 static int kdf_argon2_ctx_set_lanes(KDF_ARGON2 *ctx, uint32_t lanes) 1165 { 1166 if (lanes > ARGON2_MAX_LANES) { 1167 ERR_raise_data(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER, 1168 "max lanes: %u", ARGON2_MAX_LANES); 1169 return 0; 1170 } 1171 1172 if (lanes < ARGON2_MIN_LANES) { 1173 ERR_raise_data(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER, 1174 "min lanes: %u", ARGON2_MIN_LANES); 1175 return 0; 1176 } 1177 1178 ctx->lanes = lanes; 1179 return 1; 1180 } 1181 1182 static int kdf_argon2_ctx_set_t_cost(KDF_ARGON2 *ctx, uint32_t t_cost) 1183 { 1184 /* ARGON2_MAX_MEMORY == max m_cost value, so skip check */ 1185 1186 if (t_cost < ARGON2_MIN_TIME) { 1187 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_ITERATION_COUNT, 1188 "min: %u", ARGON2_MIN_TIME); 1189 return 0; 1190 } 1191 1192 ctx->t_cost = t_cost; 1193 return 1; 1194 } 1195 1196 static int kdf_argon2_ctx_set_m_cost(KDF_ARGON2 *ctx, uint32_t m_cost) 1197 { 1198 /* ARGON2_MAX_MEMORY == max m_cost value, so skip check */ 1199 1200 if (m_cost < ARGON2_MIN_MEMORY) { 1201 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_MEMORY_SIZE, "min: %u", 1202 ARGON2_MIN_MEMORY); 1203 return 0; 1204 } 1205 1206 ctx->m_cost = m_cost; 1207 return 1; 1208 } 1209 1210 static int kdf_argon2_ctx_set_out_length(KDF_ARGON2 *ctx, uint32_t outlen) 1211 { 1212 /* 1213 * ARGON2_MAX_OUT_LENGTH == max outlen value, so upper bounds checks 1214 * are always satisfied; to suppress compiler if statement tautology 1215 * warnings, these checks are skipped. 1216 */ 1217 1218 if (outlen < ARGON2_MIN_OUT_LENGTH) { 1219 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_OUTPUT_LENGTH, "min: %u", 1220 ARGON2_MIN_OUT_LENGTH); 1221 return 0; 1222 } 1223 1224 ctx->outlen = outlen; 1225 return 1; 1226 } 1227 1228 static int kdf_argon2_ctx_set_secret(KDF_ARGON2 *ctx, const OSSL_PARAM *p) 1229 { 1230 size_t buflen; 1231 1232 if (p->data == NULL) 1233 return 0; 1234 1235 if (ctx->secret != NULL) { 1236 OPENSSL_clear_free(ctx->secret, ctx->secretlen); 1237 ctx->secret = NULL; 1238 ctx->secretlen = 0U; 1239 } 1240 1241 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->secret, 0, &buflen)) 1242 return 0; 1243 1244 if (buflen > ARGON2_MAX_SECRET) { 1245 OPENSSL_free(ctx->secret); 1246 ctx->secret = NULL; 1247 ctx->secretlen = 0U; 1248 return 0; 1249 } 1250 1251 ctx->secretlen = (uint32_t)buflen; 1252 return 1; 1253 } 1254 1255 static int kdf_argon2_ctx_set_pwd(KDF_ARGON2 *ctx, const OSSL_PARAM *p) 1256 { 1257 size_t buflen; 1258 1259 if (p->data == NULL) 1260 return 0; 1261 1262 if (ctx->pwd != NULL) { 1263 OPENSSL_clear_free(ctx->pwd, ctx->pwdlen); 1264 ctx->pwd = NULL; 1265 ctx->pwdlen = 0U; 1266 } 1267 1268 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->pwd, 0, &buflen)) 1269 return 0; 1270 1271 if (buflen > ARGON2_MAX_PWD_LENGTH) { 1272 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH, "max: %u", 1273 ARGON2_MAX_PWD_LENGTH); 1274 goto fail; 1275 } 1276 1277 ctx->pwdlen = (uint32_t)buflen; 1278 return 1; 1279 1280 fail: 1281 OPENSSL_free(ctx->pwd); 1282 ctx->pwd = NULL; 1283 ctx->pwdlen = 0U; 1284 return 0; 1285 } 1286 1287 static int kdf_argon2_ctx_set_salt(KDF_ARGON2 *ctx, const OSSL_PARAM *p) 1288 { 1289 size_t buflen; 1290 1291 if (p->data == NULL) 1292 return 0; 1293 1294 if (ctx->salt != NULL) { 1295 OPENSSL_clear_free(ctx->salt, ctx->saltlen); 1296 ctx->salt = NULL; 1297 ctx->saltlen = 0U; 1298 } 1299 1300 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->salt, 0, &buflen)) 1301 return 0; 1302 1303 if (buflen < ARGON2_MIN_SALT_LENGTH) { 1304 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH, "min: %u", 1305 ARGON2_MIN_SALT_LENGTH); 1306 goto fail; 1307 } 1308 1309 if (buflen > ARGON2_MAX_SALT_LENGTH) { 1310 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH, "max: %u", 1311 ARGON2_MAX_SALT_LENGTH); 1312 goto fail; 1313 } 1314 1315 ctx->saltlen = (uint32_t)buflen; 1316 return 1; 1317 1318 fail: 1319 OPENSSL_free(ctx->salt); 1320 ctx->salt = NULL; 1321 ctx->saltlen = 0U; 1322 return 0; 1323 } 1324 1325 static int kdf_argon2_ctx_set_ad(KDF_ARGON2 *ctx, const OSSL_PARAM *p) 1326 { 1327 size_t buflen; 1328 1329 if (p->data == NULL) 1330 return 0; 1331 1332 if (ctx->ad != NULL) { 1333 OPENSSL_clear_free(ctx->ad, ctx->adlen); 1334 ctx->ad = NULL; 1335 ctx->adlen = 0U; 1336 } 1337 1338 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->ad, 0, &buflen)) 1339 return 0; 1340 1341 if (buflen > ARGON2_MAX_AD_LENGTH) { 1342 OPENSSL_free(ctx->ad); 1343 ctx->ad = NULL; 1344 ctx->adlen = 0U; 1345 return 0; 1346 } 1347 1348 ctx->adlen = (uint32_t)buflen; 1349 return 1; 1350 } 1351 1352 static void kdf_argon2_ctx_set_flag_early_clean(KDF_ARGON2 *ctx, uint32_t f) 1353 { 1354 ctx->early_clean = !!(f); 1355 } 1356 1357 static int kdf_argon2_ctx_set_version(KDF_ARGON2 *ctx, uint32_t version) 1358 { 1359 switch (version) { 1360 case ARGON2_VERSION_10: 1361 case ARGON2_VERSION_13: 1362 ctx->version = version; 1363 return 1; 1364 default: 1365 ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_MODE, 1366 "invalid Argon2 version"); 1367 return 0; 1368 } 1369 } 1370 1371 static int set_property_query(KDF_ARGON2 *ctx, const char *propq) 1372 { 1373 OPENSSL_free(ctx->propq); 1374 ctx->propq = NULL; 1375 if (propq != NULL) { 1376 ctx->propq = OPENSSL_strdup(propq); 1377 if (ctx->propq == NULL) 1378 return 0; 1379 } 1380 EVP_MD_free(ctx->md); 1381 ctx->md = NULL; 1382 EVP_MAC_free(ctx->mac); 1383 ctx->mac = NULL; 1384 return 1; 1385 } 1386 1387 static int kdf_argon2_set_ctx_params(void *vctx, const OSSL_PARAM params[]) 1388 { 1389 const OSSL_PARAM *p; 1390 KDF_ARGON2 *ctx; 1391 uint32_t u32_value; 1392 1393 if (ossl_param_is_empty(params)) 1394 return 1; 1395 1396 ctx = (KDF_ARGON2 *)vctx; 1397 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PASSWORD)) != NULL) 1398 if (!kdf_argon2_ctx_set_pwd(ctx, p)) 1399 return 0; 1400 1401 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SALT)) != NULL) 1402 if (!kdf_argon2_ctx_set_salt(ctx, p)) 1403 return 0; 1404 1405 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SECRET)) != NULL) 1406 if (!kdf_argon2_ctx_set_secret(ctx, p)) 1407 return 0; 1408 1409 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ARGON2_AD)) != NULL) 1410 if (!kdf_argon2_ctx_set_ad(ctx, p)) 1411 return 0; 1412 1413 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SIZE)) != NULL) { 1414 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1415 return 0; 1416 if (!kdf_argon2_ctx_set_out_length(ctx, u32_value)) 1417 return 0; 1418 } 1419 1420 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ITER)) != NULL) { 1421 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1422 return 0; 1423 if (!kdf_argon2_ctx_set_t_cost(ctx, u32_value)) 1424 return 0; 1425 } 1426 1427 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_THREADS)) != NULL) { 1428 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1429 return 0; 1430 if (!kdf_argon2_ctx_set_threads(ctx, u32_value)) 1431 return 0; 1432 } 1433 1434 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ARGON2_LANES)) != NULL) { 1435 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1436 return 0; 1437 if (!kdf_argon2_ctx_set_lanes(ctx, u32_value)) 1438 return 0; 1439 } 1440 1441 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ARGON2_MEMCOST)) != NULL) { 1442 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1443 return 0; 1444 if (!kdf_argon2_ctx_set_m_cost(ctx, u32_value)) 1445 return 0; 1446 } 1447 1448 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_EARLY_CLEAN)) != NULL) { 1449 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1450 return 0; 1451 kdf_argon2_ctx_set_flag_early_clean(ctx, u32_value); 1452 } 1453 1454 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ARGON2_VERSION)) != NULL) { 1455 if (!OSSL_PARAM_get_uint32(p, &u32_value)) 1456 return 0; 1457 if (!kdf_argon2_ctx_set_version(ctx, u32_value)) 1458 return 0; 1459 } 1460 1461 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PROPERTIES)) != NULL) { 1462 if (p->data_type != OSSL_PARAM_UTF8_STRING 1463 || !set_property_query(ctx, p->data)) 1464 return 0; 1465 } 1466 1467 return 1; 1468 } 1469 1470 static const OSSL_PARAM *kdf_argon2_settable_ctx_params(ossl_unused void *ctx, 1471 ossl_unused void *p_ctx) 1472 { 1473 static const OSSL_PARAM known_settable_ctx_params[] = { 1474 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_PASSWORD, NULL, 0), 1475 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SALT, NULL, 0), 1476 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SECRET, NULL, 0), 1477 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_ARGON2_AD, NULL, 0), 1478 OSSL_PARAM_uint32(OSSL_KDF_PARAM_SIZE, NULL), 1479 OSSL_PARAM_uint32(OSSL_KDF_PARAM_ITER, NULL), 1480 OSSL_PARAM_uint32(OSSL_KDF_PARAM_THREADS, NULL), 1481 OSSL_PARAM_uint32(OSSL_KDF_PARAM_ARGON2_LANES, NULL), 1482 OSSL_PARAM_uint32(OSSL_KDF_PARAM_ARGON2_MEMCOST, NULL), 1483 OSSL_PARAM_uint32(OSSL_KDF_PARAM_EARLY_CLEAN, NULL), 1484 OSSL_PARAM_uint32(OSSL_KDF_PARAM_ARGON2_VERSION, NULL), 1485 OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0), 1486 OSSL_PARAM_END 1487 }; 1488 1489 return known_settable_ctx_params; 1490 } 1491 1492 static int kdf_argon2_get_ctx_params(void *vctx, OSSL_PARAM params[]) 1493 { 1494 OSSL_PARAM *p; 1495 1496 (void)vctx; 1497 if ((p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_SIZE)) != NULL) 1498 return OSSL_PARAM_set_size_t(p, SIZE_MAX); 1499 1500 return -2; 1501 } 1502 1503 static const OSSL_PARAM *kdf_argon2_gettable_ctx_params(ossl_unused void *ctx, 1504 ossl_unused void *p_ctx) 1505 { 1506 static const OSSL_PARAM known_gettable_ctx_params[] = { 1507 OSSL_PARAM_size_t(OSSL_KDF_PARAM_SIZE, NULL), 1508 OSSL_PARAM_END 1509 }; 1510 1511 return known_gettable_ctx_params; 1512 } 1513 1514 const OSSL_DISPATCH ossl_kdf_argon2i_functions[] = { 1515 { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_argon2i_new }, 1516 { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_argon2_free }, 1517 { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_argon2_reset }, 1518 { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_argon2_derive }, 1519 { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS, 1520 (void (*)(void))kdf_argon2_settable_ctx_params }, 1521 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_argon2_set_ctx_params }, 1522 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, 1523 (void (*)(void))kdf_argon2_gettable_ctx_params }, 1524 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_argon2_get_ctx_params }, 1525 OSSL_DISPATCH_END 1526 }; 1527 1528 const OSSL_DISPATCH ossl_kdf_argon2d_functions[] = { 1529 { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_argon2d_new }, 1530 { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_argon2_free }, 1531 { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_argon2_reset }, 1532 { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_argon2_derive }, 1533 { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS, 1534 (void (*)(void))kdf_argon2_settable_ctx_params }, 1535 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_argon2_set_ctx_params }, 1536 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, 1537 (void (*)(void))kdf_argon2_gettable_ctx_params }, 1538 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_argon2_get_ctx_params }, 1539 OSSL_DISPATCH_END 1540 }; 1541 1542 const OSSL_DISPATCH ossl_kdf_argon2id_functions[] = { 1543 { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_argon2id_new }, 1544 { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_argon2_free }, 1545 { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_argon2_reset }, 1546 { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_argon2_derive }, 1547 { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS, 1548 (void (*)(void))kdf_argon2_settable_ctx_params }, 1549 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_argon2_set_ctx_params }, 1550 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, 1551 (void (*)(void))kdf_argon2_gettable_ctx_params }, 1552 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_argon2_get_ctx_params }, 1553 OSSL_DISPATCH_END 1554 }; 1555 1556 #endif 1557