mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
75 lines
2.5 KiB
C
75 lines
2.5 KiB
C
/**
|
|
* @file aes.h
|
|
* @brief Hardware accelerated AES-ECB implementation.
|
|
* @copyright libnx Authors
|
|
*/
|
|
#pragma once
|
|
#include "../types.h"
|
|
|
|
#ifndef AES_BLOCK_SIZE
|
|
#define AES_BLOCK_SIZE 0x10
|
|
#endif
|
|
#ifndef AES_128_KEY_SIZE
|
|
#define AES_128_KEY_SIZE 0x10
|
|
#endif
|
|
#ifndef AES_128_U32_PER_KEY
|
|
#define AES_128_U32_PER_KEY (AES_128_KEY_SIZE / sizeof(u32))
|
|
#endif
|
|
#ifndef AES_128_NUM_ROUNDS
|
|
#define AES_128_NUM_ROUNDS 10
|
|
#endif
|
|
#ifndef AES_192_KEY_SIZE
|
|
#define AES_192_KEY_SIZE 0x18
|
|
#endif
|
|
#ifndef AES_192_U32_PER_KEY
|
|
#define AES_192_U32_PER_KEY (AES_192_KEY_SIZE / sizeof(u32))
|
|
#endif
|
|
#ifndef AES_192_NUM_ROUNDS
|
|
#define AES_192_NUM_ROUNDS 12
|
|
#endif
|
|
#ifndef AES_256_KEY_SIZE
|
|
#define AES_256_KEY_SIZE 0x20
|
|
#endif
|
|
#ifndef AES_256_U32_PER_KEY
|
|
#define AES_256_U32_PER_KEY (AES_256_KEY_SIZE / sizeof(u32))
|
|
#endif
|
|
#ifndef AES_256_NUM_ROUNDS
|
|
#define AES_256_NUM_ROUNDS 14
|
|
#endif
|
|
|
|
/// Context for AES-128 operations.
|
|
typedef struct {
|
|
u8 round_keys[AES_128_NUM_ROUNDS+1][AES_BLOCK_SIZE];
|
|
} Aes128Context;
|
|
|
|
/// Context for AES-192 operations.
|
|
typedef struct {
|
|
u8 round_keys[AES_192_NUM_ROUNDS+1][AES_BLOCK_SIZE];
|
|
} Aes192Context;
|
|
|
|
/// Context for AES-256 operations.
|
|
typedef struct {
|
|
u8 round_keys[AES_256_NUM_ROUNDS+1][AES_BLOCK_SIZE];
|
|
} Aes256Context;
|
|
|
|
/// Initialize a 128-bit AES context.
|
|
void aes128ContextCreate(Aes128Context *out, const void *key, bool is_encryptor);
|
|
/// Encrypt using an AES context (Requires is_encryptor when initializing)
|
|
void aes128EncryptBlock(const Aes128Context *ctx, void *dst, const void *src);
|
|
/// Decrypt using an AES context (Requires !is_encryptor when initializing)
|
|
void aes128DecryptBlock(const Aes128Context *ctx, void *dst, const void *src);
|
|
|
|
/// Initialize a 192-bit AES context.
|
|
void aes192ContextCreate(Aes192Context *out, const void *key, bool is_encryptor);
|
|
/// Encrypt using an AES context (Requires is_encryptor when initializing)
|
|
void aes192EncryptBlock(const Aes192Context *ctx, void *dst, const void *src);
|
|
/// Decrypt using an AES context (Requires !is_encryptor when initializing)
|
|
void aes192DecryptBlock(const Aes192Context *ctx, void *dst, const void *src);
|
|
|
|
/// Initialize a 256-bit AES context.
|
|
void aes256ContextCreate(Aes256Context *out, const void *key, bool is_encryptor);
|
|
/// Encrypt using an AES context (Requires is_encryptor when initializing)
|
|
void aes256EncryptBlock(const Aes256Context *ctx, void *dst, const void *src);
|
|
/// Decrypt using an AES context (Requires !is_encryptor when initializing)
|
|
void aes256DecryptBlock(const Aes256Context *ctx, void *dst, const void *src);
|