WA-SDK  3.0.4.0
WA-SDK
issacapi/ka/sample_ka_basic.c
#include <stdio.h>
#include "issacapi_ka.h"
static int sample_setup() {
ISSAC_RETURN result;
result = ISSAC_Initialize();
if (result != ISSAC_SUCCESS) {
printf("[ERROR] %s\n", ISSAC_GetErrorMessage(result));
return 1;
}
return 0;
}
static ISSAC_RETURN sample_ka_initialize(unsigned char *sessionInfo, int *sessionInfoSize, int sessionInfoBufferSize, KACONTEXT *kacontext) {
ISSAC_RETURN result;
// Param 설정
// KDF 설정
if (result == ISSAC_SUCCESS) {
result = ISSAC_KACONTEXT_SetKDF(kacontext, -1, ISSACAPI_SHA256);
}
if (result == ISSAC_SUCCESS) {
result = ISSAC_KA_Initialize(sessionInfo, sessionInfoSize, sessionInfoBufferSize, kacontext);
}
return result;
}
static ISSAC_RETURN sample_ka_finalize(unsigned char *sessionKey, int sessionKeySize, unsigned char *peerSessionInfo, int peerSessionInfoSize, KACONTEXT *kacontext) {
ISSAC_RETURN result;
result = ISSAC_KA_Finalize(kacontext, peerSessionInfo, peerSessionInfoSize);
// 세션키 얻기
if (result == ISSAC_SUCCESS) {
result = ISSAC_KA_GetSessionKey(sessionKey, sessionKeySize, kacontext);
}
return result;
}
static int sample_ka_basic() {
ISSAC_RETURN result;
KACONTEXT peerA;
KACONTEXT peerB;
unsigned char sessionInfoA[2048] = { 0, };
int sessionInfoLenA = 0;
unsigned char sessionInfoB[2048] = { 0, };
int sessionInfoLenB = 0;
unsigned char sessionKeyA[16] = { 0, };
unsigned char sessionKeyB[16] = { 0, };
printf("sample_ka_basic() => ");
// KA 는 키합의 기능으로 서로 다른 PC 에서 실행되는 것이 일반적이다. 따라서 샘플도 각각에 맞게 분리하였다.
// A : 세션 정보 생성 (B 에 세션정보 전달 필요)
result = sample_ka_initialize(sessionInfoA, &sessionInfoLenA, sizeof(sessionInfoA), &peerA);
// B : 세션 정보 생성
if (result == ISSAC_SUCCESS) {
result = sample_ka_initialize(sessionInfoB, &sessionInfoLenB, sizeof(sessionInfoB), &peerB);
}
// B : A 의 세션정보를 사용하여 세션키 생성 (A 에 세션정보 전달 필요)
if (result == ISSAC_SUCCESS) {
result = sample_ka_finalize(sessionKeyB, sizeof(sessionKeyB), sessionInfoA, sessionInfoLenA, &peerB);
}
// A : B 의 세션정보를 사용하여 세션키 생성
if (result == ISSAC_SUCCESS) {
result = sample_ka_finalize(sessionKeyA, sizeof(sessionKeyA), sessionInfoB, sessionInfoLenB, &peerA);
}
if (result == ISSAC_SUCCESS) {
printf("[OK]\n");
return 0;
} else {
printf("[ERROR] %s\n", ISSAC_GetErrorMessage(result));
return 1;
}
}
int main() {
int result;
result = sample_setup();
if (result != 0) {
return result;
}
return sample_ka_basic();
}
unsigned int ISSAC_RETURN
ISSAC-API 실행 결과 [ ISSACAPI_BASIC_RETURN, ISSACAPI_ERRORS, ISSAC_LICENSE_ERR ]
Definition: issacapi_bs_definitions.h:32
@ ISSACAPI_EC_CURVE_P256
(2) NIST curve P-256
Definition: issacapi_bs_definitions.h:77
@ ISSAC_SUCCESS
(0) 성공
Definition: issacapi_bs_definitions.h:37
@ ISSACAPI_SHA256
(6) SHA256
Definition: issacapi_bs_definitions.h:89
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_Initialize(void)
모듈을 초기화한다.
WA_SDK_API const char *FUNCCALL ISSAC_GetErrorMessage(ISSAC_RETURN errorCode)
ISSAC-API 의 에러코드에 대한 에러메시지를 가져온다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KA_Finalize(KACONTEXT *kacontext, void *sessioninfo, int sessioninfo_len)
상대방의 세션정보를 조합하여 키합의를 마무리한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KACONTEXT_SetKDF(KACONTEXT *kacontext, int unused, int hashAlg)
키유도 함수에 필요한 키길이와 해시 알고리즘을 설정한다. (호출하지 않으면 32, ISSACAPI_SHA256)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KA_GetSessionKey(void *key, int key_len, KACONTEXT *kacontext)
키합의가 완료된 KACONTEXT 를 통해 세션키를 생성한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KA_Initialize(void *sessioninfo, int *sessioninfo_len, int sessioninfo_alloc_len, KACONTEXT *kacontext)
자신의 세션정보를 생성하고, 상대방에게 전달할 세션정보를 출력한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KACONTEXT_Create_Ex(KACONTEXT *kacontext, KEX_type type)
KACONTEXT 구조체를 초기화한다. (키합의 종류에 따라 임의의 기본값 설정)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KACONTEXT_SetParam_ECDH(KACONTEXT *kacontext, unsigned int curve_id)
ECDH 에 사용할 커브를 설정한다. (호출하지 않으면 ISSACAPI_EC_CURVE_P256)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_KACONTEXT_Delete(KACONTEXT *kacontext)
KACONTEXT 에 할당된 메모리를 해제한다.
@ KEX_ECDH
Definition: issacapi_ka.h:35
키합의 컨텍스트
Definition: issacapi_ka.h:25