/*
ARIA256-ECB Test vector => ARIA 비킬키 256bits의 전자 코드북(electronic codebook, ECB) 운영모드의 검증 값
======================
Set 1 vector 1
mode=aria-256
key=00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff <= 비밀 키
plain=11 11 11 11 aa aa aa aa 11 11 11 11 bb bb bb bb <= 평문
cipher=58 a8 75 e6 04 4a d7 ff fa 4f 58 42 0f 7f 44 2d <= 암호문(검증 값)
*/
#include "hwport_aria.h"
uint8_t s_key[ def_hwport_aria256_user_key_size ] = { /* 암호 키 */
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
};
uint8_t s_data[ /* def_hwport_aria256_block_size * n */ ] = { /* 평문/암호문 버퍼 */
0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb
};
const uint8_t s_cipher[ /* def_hwport_aria256_block_size * n */ ] = { /* 평문을 암호화 했을때의 암호문 결과 기대치 값 (검증 값) */
0x58, 0xa8, 0x75, 0xe6, 0x04, 0x4a, 0xd7, 0xff, 0xfa, 0x4f, 0x58, 0x42, 0x0f, 0x7f, 0x44, 0x2d
};
uint8_t s_round_key[ def_hwport_aria256_round_key_size ]; /* 비밀 키 */
(void)hwport_dump("key", (const void *)(&s_key[0]), sizeof(s_key)); /* 암호 키 덤프 */
/* 주어진 s_key(User key, Master Key, Password, ...) 를 s_round_key(Round Key, 라운드 키, 비밀 키)로 확장합니다.
s_key는 def_hwport_ariaX_user_key_size 상수로 고정된 크기입니다.
s_round_key는 def_hwport_ariaX_encrypt_round_key_size 와 def_hwport_ariaX_decrypt_round_key_size 가 덧 붙여진 def_hwport_aria256_round_key_size 상수로 고정된 크기입니다.
*/
(void)hwport_make_round_key_aria256((void *)(&s_round_key[0]), (const void *)(&s_key[0]));
(void)hwport_dump("round_key", (const void *)(&s_round_key[0]), sizeof(s_round_key)); /* 비밀 키 덤프 */
(void)hwport_dump("plain", (const void *)(&s_data[0]), sizeof(s_data)); /* 평문 덤프 */
/* 주어진 평문(s_data)을 비밀 키(s_round_key)로 암호화하여 s_data에 암호문을 저장합니다.
이 때 주어진 s_data는 def_hwport_aria_block_size 상수로 정렬된 크기를 가져야 합니다.
만약 주어진 크기가 정렬되지 않은 크기라면 def_hwport_aria_block_size 에 정렬된 크기만큼만 암호화 하고 나머지 부분은 그대로 평문으로 유지됩니다.
*/
(void)hwport_encrypt_aria256_ecb(
(void *)(&s_data[0]),
sizeof(s_data),
(const void *)(&s_round_key[def_hwport_aria256_encrypt_round_key_offset])
);
/* 암호문(s_data)가 검증값와 일치하는지 검사하는 부분 */
(void)fprintf(stdout, "cipher(encrypted) %s:\n",
(memcmp((const void *)(&s_data[0]), (const void *)(&s_cipher[0]), sizeof(s_data)) == 0) ? "PASSED" : "FAILED"
);
(void)hwport_dump("===>", (const void *)(&s_data[0]), sizeof(s_data)); /* 암호문 덤프 */
/* 주어진 암호문(s_data)을 비밀 키(s_round_key)로 복호화하여 s_data에 평문을 저장합니다.
이 때 주어진 s_data는 def_hwport_aria_block_size 상수로 정렬된 크기를 가져야 합니다.
만약 주어진 크기가 정렬되지 않은 크기라면 def_hwport_aria_block_size 에 정렬된 크기만큼만 복호화 하고 나머지 부분은 그대로 암호문으로 유지됩니다.
*/
(void)hwport_decrypt_aria256_ecb(
(void *)(&s_data[0]),
sizeof(s_data),
(const void *)(&s_round_key[def_hwport_aria256_decrypt_round_key_offset])
);
(void)hwport_dump("plain(decrypted)", (const void *)(&s_data[0]), sizeof(s_data)); /* 환원된 평문 덤프 */