/* * Copyright (c) 2026 Egor Tensin * This file is part of the "AES tools" project. * For details, see https://github.com/egor-tensin/aes-tools. * Distributed under the MIT License. */ #include #include #include #include #include #include static AES_Block reverse_byte_order(AES_Block block) { return _mm_shuffle_epi8(block, aes_make_block(0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f)); } AES_Block aes_inc_block(AES_Block x) { x = reverse_byte_order(x); x = _mm_add_epi32(x, aes_make_block(0, 0, 0, 1)); x = reverse_byte_order(x); return x; } AES_StatusCode aes_format_block( AES_BlockString* str, const AES_Block* block, AES_ErrorDetails* err_details ) { if (str == NULL) return aes_error_null_argument(err_details, "str"); if (block == NULL) return aes_error_null_argument(err_details, "block"); char* cursor = aes_format_block_hex(str->str, *block); *cursor = '\0'; return AES_SUCCESS; } AES_StatusCode aes_format_block_as_matrix( AES_BlockMatrixString* str, const AES_Block* block, AES_ErrorDetails* err_details ) { if (str == NULL) return aes_error_null_argument(err_details, "str"); if (block == NULL) return aes_error_null_argument(err_details, "block"); char* cursor = str->str; AES_ALIGN(unsigned char, 16) bytes[4][4]; aes_store_block_aligned(bytes, *block); for (int i = 0; i < 4; ++i, cursor += 3) { for (int j = 0; j < 3; ++j, cursor += 3) sprintf(cursor, "%02x ", bytes[j][i]); sprintf(cursor, "%02x\n", bytes[3][i]); } *cursor = '\0'; return AES_SUCCESS; } AES_StatusCode aes_parse_block(AES_Block* dest, const char* src, AES_ErrorDetails* err_details) { if (dest == NULL) return aes_error_null_argument(err_details, "dest"); if (src == NULL) return aes_error_null_argument(err_details, "src"); AES_ALIGN(unsigned char, 16) bytes[16]; AES_StatusCode status = aes_parse_hex_string(bytes, src, sizeof(bytes), err_details); if (aes_is_error(status)) return status; *dest = aes_load_block_aligned(bytes); return status; }