ptls_fusion_quiclb
diff --git a/include/picotls/fusion.h b/include/picotls/fusion.h index 10e58c6..8aa0712 100644 --- a/include/picotls/fusion.h +++ b/include/picotls/fusion.h
@@ -103,6 +103,8 @@ extern ptls_aead_algorithm_t ptls_fusion_aes128gcm, ptls_fusion_aes256gcm; extern ptls_aead_algorithm_t ptls_non_temporal_aes128gcm, ptls_non_temporal_aes256gcm; +extern ptls_cipher_algorithm_t ptls_fusion_quiclb; + /** * Returns a boolean indicating if fusion can be used. */
diff --git a/lib/fusion.c b/lib/fusion.c index 35fe579..370ce15 100644 --- a/lib/fusion.c +++ b/lib/fusion.c
@@ -47,6 +47,7 @@ #include <wmmintrin.h> #include "picotls.h" #include "picotls/fusion.h" +#include "./quiclb-impl.h" #if defined(__clang__) #if __has_feature(address_sanitizer) @@ -2178,6 +2179,57 @@ sizeof(struct aesgcm_context), non_temporal_aes256gcm_setup}; +struct fusion_quiclb_context { + ptls_cipher_context_t super; + ptls_fusion_aesecb_context_t aesecb; +}; + +static void fusion_quiclb_dispose(ptls_cipher_context_t *_ctx) +{ + struct fusion_quiclb_context *ctx = (struct fusion_quiclb_context *)_ctx; + ptls_fusion_aesecb_dispose(&ctx->aesecb); +} + +static inline void fusion_quiclb_aes(void *aesecb, union picotls_quiclb_block *block) +{ + block->m128 = aesecb_encrypt(aesecb, block->m128); +} + +static void fusion_quiclb_encrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t len) +{ + struct fusion_quiclb_context *ctx = (struct fusion_quiclb_context *)_ctx; + return picotls_quiclb_transform(fusion_quiclb_aes, &ctx->aesecb, output, input, len, 1); +} + +static void fusion_quiclb_decrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t len) +{ + struct fusion_quiclb_context *ctx = (struct fusion_quiclb_context *)_ctx; + return picotls_quiclb_transform(fusion_quiclb_aes, &ctx->aesecb, output, input, len, 0); +} + +static int fusion_quiclb_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key) +{ + struct fusion_quiclb_context *ctx = (struct fusion_quiclb_context *)_ctx; + + *ctx = (struct fusion_quiclb_context){ + .super.do_dispose = fusion_quiclb_dispose, + .super.do_init = picotls_quiclb_do_init, + .super.do_transform = is_enc ? fusion_quiclb_encrypt : fusion_quiclb_decrypt, + }; + ptls_fusion_aesecb_init(&ctx->aesecb, 1, key, PTLS_AES128_KEY_SIZE, 0); + + return 0; +} + +ptls_cipher_algorithm_t ptls_fusion_quiclb = { + .name = "QUICLB", + .key_size = PTLS_QUICLB_KEY_SIZE, + .block_size = 8, + .iv_size = 0, + .context_size = sizeof(struct fusion_quiclb_context), + .setup_crypto = fusion_quiclb_setup_crypto, +}; + #ifdef _WINDOWS /** * ptls_fusion_is_supported_by_cpu: