Lines Matching +full:forward +full:- +full:channel

2  * Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
28 * an item structure, and another matching a SRT-derived value to an item
30 * and duplicate SRTs, are handled using sorted singly-linked lists.
59 LHASH_OF(SRTM_ITEM) *items_fwd; /* (opaque) -> SRTM_ITEM */
60 LHASH_OF(SRTM_ITEM) *items_rev; /* (H(srt)) -> SRTM_ITEM */
71 return (unsigned long)(uintptr_t)item->opaque; in items_fwd_hash()
76 return a->opaque != b->opaque; in items_fwd_cmp()
82 * srt_blinded has already been through a crypto-grade hash function, so we in items_rev_hash()
87 memcpy(&l, item->srt_blinded, sizeof(l)); in items_rev_hash()
97 return memcmp(a->srt_blinded, b->srt_blinded, sizeof(a->srt_blinded)); in items_rev_cmp()
103 srtm->alloc_failed = 1; in srtm_check_lh()
122 /* Use AES-128-ECB as a permutation over 128-bit SRTs. */ in ossl_quic_srtm_new()
123 if ((ecb = EVP_CIPHER_fetch(libctx, "AES-128-ECB", propq)) == NULL) in ossl_quic_srtm_new()
126 if ((srtm->blind_ctx = EVP_CIPHER_CTX_new()) == NULL) in ossl_quic_srtm_new()
129 if (!EVP_EncryptInit_ex2(srtm->blind_ctx, ecb, key, NULL, NULL)) in ossl_quic_srtm_new()
136 if ((srtm->items_fwd = lh_SRTM_ITEM_new(items_fwd_hash, items_fwd_cmp)) == NULL in ossl_quic_srtm_new()
137 || (srtm->items_rev = lh_SRTM_ITEM_new(items_rev_hash, items_rev_cmp)) == NULL) in ossl_quic_srtm_new()
144 * No cleansing of key needed as blinding exists only for side channel in ossl_quic_srtm_new()
156 for (item = item->next_by_seq_num; item != NULL; item = inext) { in srtm_free_each()
157 inext = item->next_by_seq_num; in srtm_free_each()
169 lh_SRTM_ITEM_free(srtm->items_rev); in ossl_quic_srtm_free()
170 if (srtm->items_fwd != NULL) { in ossl_quic_srtm_free()
171 lh_SRTM_ITEM_doall(srtm->items_fwd, srtm_free_each); in ossl_quic_srtm_free()
172 lh_SRTM_ITEM_free(srtm->items_fwd); in ossl_quic_srtm_free()
175 EVP_CIPHER_CTX_free(srtm->blind_ctx); in ossl_quic_srtm_free()
181 * If head is non-NULL, writes the head of the relevant opaque list to *head if
183 * If prev is non-NULL, writes the previous node to *prev or NULL if it is
193 item = lh_SRTM_ITEM_retrieve(srtm->items_fwd, &key); in srtm_find()
197 for (; item != NULL; prev = item, item = item->next_by_seq_num) in srtm_find()
198 if (item->seq_num == seq_num) { in srtm_find()
200 } else if (item->seq_num < seq_num) { in srtm_find()
216 * Inserts a SRTM_ITEM into the singly-linked by-sequence-number linked list.
222 uint64_t seq_num = item->seq_num; in sorted_insert_seq_num()
227 while (cur != NULL && cur->seq_num > seq_num) { in sorted_insert_seq_num()
228 fixup = &cur->next_by_seq_num; in sorted_insert_seq_num()
229 cur = cur->next_by_seq_num; in sorted_insert_seq_num()
232 item->next_by_seq_num = *fixup; in sorted_insert_seq_num()
237 * Inserts a SRTM_ITEM into the singly-linked by-SRT list.
243 uintptr_t opaque = (uintptr_t)item->opaque; in sorted_insert_srt()
248 while (cur != NULL && (uintptr_t)cur->opaque > opaque) { in sorted_insert_srt()
249 fixup = &cur->next_by_srt_blinded; in sorted_insert_srt()
250 cur = cur->next_by_srt_blinded; in sorted_insert_srt()
253 item->next_by_srt_blinded = *fixup; in sorted_insert_srt()
258 * Computes the blinded SRT value used for internal lookup for side channel
268 * We use AES-128-ECB as a permutation using a random key to facilitate in srtm_compute_blinded()
269 * blinding for side-channel purposes. Encrypt the token as a single AES in srtm_compute_blinded()
272 if (!EVP_EncryptUpdate(srtm->blind_ctx, item->srt_blinded, &outl, in srtm_compute_blinded()
287 if (srtm->alloc_failed) in ossl_quic_srtm_add()
297 item->opaque = opaque; in ossl_quic_srtm_add()
298 item->seq_num = seq_num; in ossl_quic_srtm_add()
299 item->srt = *token; in ossl_quic_srtm_add()
300 if (!srtm_compute_blinded(srtm, item, &item->srt)) { in ossl_quic_srtm_add()
305 /* Add to forward mapping. */ in ossl_quic_srtm_add()
308 lh_SRTM_ITEM_insert(srtm->items_fwd, item); in ossl_quic_srtm_add()
309 if (!srtm_check_lh(srtm, srtm->items_fwd)) { in ossl_quic_srtm_add()
316 lh_SRTM_ITEM_insert(srtm->items_fwd, new_head); in ossl_quic_srtm_add()
317 if (!srtm_check_lh(srtm, srtm->items_fwd)) { in ossl_quic_srtm_add()
325 r_item = lh_SRTM_ITEM_retrieve(srtm->items_rev, item); in ossl_quic_srtm_add()
328 lh_SRTM_ITEM_insert(srtm->items_rev, item); in ossl_quic_srtm_add()
329 if (!srtm_check_lh(srtm, srtm->items_rev)) in ossl_quic_srtm_add()
332 * into the forward mapping which would require an insert operation in ossl_quic_srtm_add()
340 lh_SRTM_ITEM_insert(srtm->items_rev, new_head); in ossl_quic_srtm_add()
341 if (!srtm_check_lh(srtm, srtm->items_rev)) in ossl_quic_srtm_add()
355 rh_item = lh_SRTM_ITEM_retrieve(srtm->items_rev, item); in srtm_remove_from_rev()
362 if (item->next_by_srt_blinded != NULL) { in srtm_remove_from_rev()
363 lh_SRTM_ITEM_insert(srtm->items_rev, item->next_by_srt_blinded); in srtm_remove_from_rev()
364 if (!srtm_check_lh(srtm, srtm->items_rev)) in srtm_remove_from_rev()
367 lh_SRTM_ITEM_delete(srtm->items_rev, item); in srtm_remove_from_rev()
371 for (; rh_item->next_by_srt_blinded != item; in srtm_remove_from_rev()
372 rh_item = rh_item->next_by_srt_blinded); in srtm_remove_from_rev()
373 rh_item->next_by_srt_blinded = item->next_by_srt_blinded; in srtm_remove_from_rev()
383 if (srtm->alloc_failed) in ossl_quic_srtm_remove()
390 /* Remove from forward mapping. */ in ossl_quic_srtm_remove()
396 if (item->next_by_seq_num != NULL) { in ossl_quic_srtm_remove()
397 lh_SRTM_ITEM_insert(srtm->items_fwd, item->next_by_seq_num); in ossl_quic_srtm_remove()
398 if (!srtm_check_lh(srtm, srtm->items_fwd)) in ossl_quic_srtm_remove()
401 lh_SRTM_ITEM_delete(srtm->items_fwd, item); in ossl_quic_srtm_remove()
404 prev->next_by_seq_num = item->next_by_seq_num; in ossl_quic_srtm_remove()
421 if (srtm->alloc_failed) in ossl_quic_srtm_cull()
424 if ((ihead = lh_SRTM_ITEM_retrieve(srtm->items_fwd, &key)) == NULL) in ossl_quic_srtm_cull()
428 inext = item->next_by_seq_num; in ossl_quic_srtm_cull()
435 lh_SRTM_ITEM_delete(srtm->items_fwd, ihead); in ossl_quic_srtm_cull()
448 if (srtm->alloc_failed) in ossl_quic_srtm_lookup()
454 item = lh_SRTM_ITEM_retrieve(srtm->items_rev, &key); in ossl_quic_srtm_lookup()
455 for (; idx > 0 && item != NULL; --idx, item = item->next_by_srt_blinded); in ossl_quic_srtm_lookup()
460 *opaque = item->opaque; in ossl_quic_srtm_lookup()
462 *seq_num = item->seq_num; in ossl_quic_srtm_lookup()
480 uint32_t token = arg_->token; in check_mark()
489 assert(!(item->opaque == prev_opaque && item->seq_num == prev_seq_num)); in check_mark()
490 if (!arg_->mode) in check_mark()
491 assert(item->opaque != prev_opaque || item->seq_num < prev_seq_num); in check_mark()
495 item->debug_token = token; in check_mark()
496 prev_opaque = item->opaque; in check_mark()
497 prev_seq_num = item->seq_num; in check_mark()
500 if (arg_->mode) in check_mark()
501 item = item->next_by_srt_blinded; in check_mark()
503 item = item->next_by_seq_num; in check_mark()
510 uint32_t token = arg_->token; in check_count()
516 assert(item->debug_token == token); in check_count()
518 if (arg_->mode) in check_count()
519 item = item->next_by_seq_num; in check_count()
521 item = item->next_by_srt_blinded; in check_count()
537 assert(srtm->blind_ctx != NULL); in ossl_quic_srtm_check()
538 assert(srtm->items_fwd != NULL); in ossl_quic_srtm_check()
539 assert(srtm->items_rev != NULL); in ossl_quic_srtm_check()
542 lh_SRTM_ITEM_doall_arg(srtm->items_fwd, check_mark, &args); in ossl_quic_srtm_check()
546 lh_SRTM_ITEM_doall_arg(srtm->items_rev, check_count, &args); in ossl_quic_srtm_check()
556 lh_SRTM_ITEM_doall_arg(srtm->items_rev, check_mark, &args); in ossl_quic_srtm_check()
560 lh_SRTM_ITEM_doall_arg(srtm->items_fwd, check_count, &args); in ossl_quic_srtm_check()