cosmopolitan/libc/crypto/rijndael.h

59 lines
3.6 KiB
C

#ifndef COSMOPOLITAN_LIBC_CRYPTO_RIJNDAEL_H_
#define COSMOPOLITAN_LIBC_CRYPTO_RIJNDAEL_H_
#ifndef __STRICT_ANSI__
#include "libc/str/str.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
/*───────────────────────────────────────────────────────────────────────────│─╗
│ cosmopolitan § cryptography » advanced encryption standard ─╬─│┼
╚────────────────────────────────────────────────────────────────────────────│─┘
AES-256 Latency x86 2010+ SSE2
─────────────── ───────── ──────
rijndael(14, block, &ctx) 23 ns 218 ns
unrijndael(14, block, &ctx) 23 ns 690 ns
rijndaelinit(&ctx, 14, k1, k2) 136 ns 135 ns
unrijndaelinit(&ctx, 14, k1, k2) 186 ns 639 ns
Untrustworthy System Viability x86 2010+ SSE2
────────────────────────────── ───────── ──────
rijndael(14, block, &ctx) A C
unrijndael(14, block, &ctx) A C
rijndaelinit(&ctx, 14, k1, k2) B B
unrijndaelinit(&ctx, 14, k1, k2) B C
Comparison Cosmo Rijndael Tiny-AES
────────────────────────────── ─────── ──────── ────────
Generalized Math Yes Yes No
Footprint 1,782 b 9,258 b 903 b
Performance (New Hardware) ~20 ns ~40 ns ~400 ns
Performance (Old Hardware) ~400 ns ~40 ns ~400 ns */
typedef uint32_t aes_block_t _Vector_size(16) aligned(16);
struct Rijndael {
union {
aes_block_t xmm;
uint32_t u32[4];
uint8_t u8[16];
} rk[15];
};
void rijndaelinit(struct Rijndael *, uint32_t, aes_block_t, aes_block_t);
aes_block_t rijndael(uint32_t, aes_block_t, const struct Rijndael *);
void unrijndaelinit(struct Rijndael *, uint32_t, aes_block_t, aes_block_t);
aes_block_t unrijndael(uint32_t, aes_block_t, const struct Rijndael *);
/*───────────────────────────────────────────────────────────────────────────│─╗
│ cosmopolitan § cryptography » implementation details ─╬─│┼
╚────────────────────────────────────────────────────────────────────────────│*/
extern const uint8_t kAesSbox[256] aligned(64);
extern const uint8_t kAesSboxInverse[256] aligned(64);
aes_block_t InvMixColumns(aes_block_t) hidden;
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* !ANSI */
#endif /* COSMOPOLITAN_LIBC_CRYPTO_RIJNDAEL_H_ */