/* 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)); /* 환원된 평문 덤프 */