/*
 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <openssl/rc4.h>
#include <openssl/md5.h>
#include "prov/ciphercommon.h"

typedef struct prov_rc4_hmac_md5_ctx_st {
    PROV_CIPHER_CTX base;      /* Must be first */
    union {
        OSSL_UNION_ALIGN;
        RC4_KEY ks;
    } ks;
    MD5_CTX head, tail, md;
    size_t payload_length;
    size_t tls_aad_pad_sz;
} PROV_RC4_HMAC_MD5_CTX;

typedef struct prov_cipher_hw_rc4_hmac_md5_st {
    PROV_CIPHER_HW base; /* Must be first */
    int (*tls_init)(PROV_CIPHER_CTX *ctx, unsigned char *aad, size_t aad_len);
    void (*init_mackey)(PROV_CIPHER_CTX *ctx, const unsigned char *key,
                        size_t len);

} PROV_CIPHER_HW_RC4_HMAC_MD5;

const PROV_CIPHER_HW *ossl_prov_cipher_hw_rc4_hmac_md5(size_t keybits);
