/**
 * @file aes_ctr.h
 * @brief Hardware accelerated AES-CTR implementation.
 * @copyright libnx Authors
 */
#pragma once
#include "aes.h"

/// Context for AES-128 CTR.
typedef struct {
    Aes128Context aes_ctx;
    u8 ctr[AES_BLOCK_SIZE];
    u8 enc_ctr_buffer[AES_BLOCK_SIZE];
    size_t buffer_offset;
} Aes128CtrContext;

/// Context for AES-192 CTR.
typedef struct {
    Aes192Context aes_ctx;
    u8 ctr[AES_BLOCK_SIZE];
    u8 enc_ctr_buffer[AES_BLOCK_SIZE];
    size_t buffer_offset;
} Aes192CtrContext;

/// Context for AES-256 CTR.
typedef struct {
    Aes256Context aes_ctx;
    u8 ctr[AES_BLOCK_SIZE];
    u8 enc_ctr_buffer[AES_BLOCK_SIZE];
    size_t buffer_offset;
} Aes256CtrContext;

/// 128-bit CTR API.
void aes128CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr);
void aes128CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr);
void aes128CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size);

/// 192-bit CTR API.
void aes192CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr);
void aes192CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr);
void aes192CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size);

/// 256-bit CTR API.
void aes256CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr);
void aes256CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr);
void aes256CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size);