WA-SDK  3.0.4.0
WA-SDK
issacapi/sg/sample_sg_signeddata.c
#include <stdio.h>
#include "issacapi_bs.h"
#include "issacapi_sg.h"
static const char *certB64 =
"MIICZzCCAh6gAwIBAgIGAOjUpRACMAoGCCqGSM49BAMCMDsxCzAJBgNVBAYTAktSMQ4wDAYDVQQKDAVQRU5UQTEMMAoGA1UECwwDUEtJMQ4wDAYD"
"VQQDDAVFQ0NDQTAeFw0xNzA3MTkxNTAwMDBaFw0xODA3MjAxNDU5NTlaMEUxCzAJBgNVBAYTAktSMQ4wDAYDVQQKDAVQRU5UQTEMMAoGA1UECwwD"
"UEtJMRgwFgYDVQQDDA9FQ0RTQV9zZWNwMTkycjEwSTATBgcqhkjOPQIBBggqhkjOPQMBAQMyAAQwfngoTe35z/5fShA3saeGqfrcDi0NF9wr8b5b"
"3DJGXhVObNFqLrh8IadKOR6kjR6jggESMIIBDjBkBgNVHSMEXTBbgBT0gEWgUNnasgeM2CjTJuYtHHkiFaFApD4wPDELMAkGA1UEBhMCS1IxDjAM"
"BgNVBAoMBVBFTlRBMQwwCgYDVQQLDANQS0kxDzANBgNVBAMMBkVDQ1JDQYIBAjAdBgNVHQ4EFgQU++yqycDRrNEZTorCL1OUCGWyGZYwDgYDVR0P"
"AQH/BAQDAgPoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBYBgNVHR8EUTBPME2gS6BJhkdsZGFwOi8vMTAuMC44MS41OjM4OS9jbj1k"
"cF9rXy1vQ0RQNFFPLWlxZl9EQUVkM2lncDAsb3U9UEtJLG89UEVOVEEsYz1LUjAKBggqhkjOPQQDAgM3ADA0AhgjNG0Ojm5DQNd+/mppOYIuqX+6"
"LesJHtUCGFzr6NzVgCsc4dxJYI7/M5nXCkz9Yn2eDA==";
static unsigned char certBytes[4096] = { 0, };
static int certBytesLen = 0;
static const char *priKeyB64 =
"MIGfMBoGCCqDGoyaRAEPMA4ECIdWIwZIMicUAgIFSQSBgCYPLXhPSN6vCQFt7TjDTmQivYIyl9q/Je2YbX2QTGRMCxEXPliYiQNdk4EjP6KV43Uh"
"HLeu9zR4NCf59DQAisTn5eHB3m1j3U6Xo801e27aiSGPEh6bKCctfKYHjBhJrLUJt6126McBlTWTtoP2hxlGgY8o1ySin96fy5K+IMHJ";
static unsigned char priKeyBytes[2048] = { 0, };
static int priKeyBytesLen = 0;
static const char *password = "jkljkl..";
static int sample_setup() {
ISSAC_RETURN result;
result = ISSAC_Initialize();
if (result != ISSAC_SUCCESS) {
printf("[ERROR] %s\n", ISSAC_GetErrorMessage(result));
return 1;
}
result = ISSAC_BASE64_Decode(certBytes, &certBytesLen, sizeof(certBytes), certB64);
if (result != ISSAC_SUCCESS) {
printf("[ERROR] %s\n", ISSAC_GetErrorMessage(result));
return 1;
}
result = ISSAC_BASE64_Decode(priKeyBytes, &priKeyBytesLen, sizeof(priKeyBytes), priKeyB64);
if (result != ISSAC_SUCCESS) {
printf("[ERROR] %s\n", ISSAC_GetErrorMessage(result));
return 1;
}
return 0;
}
static int sample_sg_signeddata() {
ISSAC_RETURN result;
char signature[4096]; // 전자서명 메시지가 저장될 버퍼
int signature_len; // 전자서명 메시지의 길이
const char *message = "this is a test!"; // 전자 서명 대상 메시지
int message_len = strlen(message); // 원본 메시지의 길이
printf("sample_sg_signeddata() => ");
// 서명 생성
{
CERTIFICATE certificate;
// 구조체 초기화
ISSAC_CERTIFICATE_Create(&certificate);
// 전자 서명자의 인증서와 개인키 읽기
result = ISSAC_CERTIFICATE_Read_Memory(&certificate, certBytes, certBytesLen);
if (result == ISSAC_SUCCESS) {
result = ISSAC_PRIVATEKEY_Read_Memory(&key, priKeyBytes, priKeyBytesLen, password);
}
// 전자서명 생성하기
if (result == ISSAC_SUCCESS) {
result = ISSAC_SG_MakeSignature_WithHashNid(signature, &signature_len, sizeof(signature), message, message_len, &key, &certificate, 10, 385);
}
// 구조체 메모리 환원
ISSAC_CERTIFICATE_Delete(&certificate);
}
// 서명 검증 및 데이터 추출
if (result == ISSAC_SUCCESS) {
// 서명 검증
result = ISSAC_SG_VerifySignature_WithHashNid(signature, signature_len, 385);
// 서명 대상 메시지 추출
if (result == ISSAC_SUCCESS) {
char original_message[256]; // 전자 서명 된 메시지에서 분리된 원본 메시지가 저장될 버퍼
int original_message_len; // 전자 서명 된 메시지에서 분리된 원본 메시지의 길이
time_t sign_time;
result = ISSAC_SG_GetOriginalMessage(&sign_time, original_message, &original_message_len, sizeof(original_message), signature, signature_len);
}
// 서명에서 인증서 추출
if (result == ISSAC_SUCCESS) {
CERTIFICATE tmpcert;
result = ISSAC_SG_GetSignerCertificate(&tmpcert, signature, signature_len);
}
}
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_sg_signeddata();
}
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_CERTIFICATE_Delete(CERTIFICATE *cert)
CERTIFICATE 에 할당된 메모리를 해제한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_CERTIFICATE_Create(CERTIFICATE *cert)
CERTIFICATE 를 초기화한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_CERTIFICATE_Read_Memory(CERTIFICATE *cert, const void *buffer, int buffer_len)
인증서를 버퍼에서 읽어들인다. (DER, BASE64, PEM)
unsigned int ISSAC_RETURN
ISSAC-API 실행 결과 [ ISSACAPI_BASIC_RETURN, ISSACAPI_ERRORS, ISSAC_LICENSE_ERR ]
Definition: issacapi_bs_definitions.h:32
@ ISSAC_SUCCESS
(0) 성공
Definition: issacapi_bs_definitions.h:37
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_BASE64_Decode(void *data, int *data_len, int data_alloc_len, const char *code)
입력한 BASE64 문자열을 바이너리 데이터로 디코딩한다.
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_PRIVATEKEY_Read_Memory(PRIVATEKEY *privatekey, const void *buffer, int buffer_len, const char *pin)
PKCS#8 개인키를 버퍼에서 읽어들인다. (DER)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_PRIVATEKEY_Create(PRIVATEKEY *key)
PRIVATEKEY 를 초기화한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_PRIVATEKEY_Delete(PRIVATEKEY *key)
PRIVATEKEY 에 할당된 메모리를 해제한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SG_VerifySignature_WithHashNid(const void *signature, int signature_len, int hashNid)
PKCS #7 SignedData를 검증한다. (PKCS #7 메시지 아님)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SG_GetSignerCertificate(CERTIFICATE *certificate, const void *signature, int signature_len)
PKCS #7 SignedData 에서 서명자의 인증서를 가져온다. (첫번째 서명자)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SG_MakeSignature_WithHashNid(void *signature, int *signature_len, int signature_alloc_len, const void *message, int message_len, PRIVATEKEY *private_key, CERTIFICATE *certificate, time_t sign_time, int hashNid)
PKCS #7 - SignedData를 생성한다. (PKCS #7 메시지 아님)
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SG_GetOriginalMessage(time_t *sign_time, void *original_message, int *original_message_len, int original_message_alloc_len, const void *signature, int signature_len)
PKCS #7 SignedData 에서 서명 원문을 가져온다.
인증서에 대한 컨텍스트
Definition: issacapi_bs_definitions.h:106
PKCS#8 형식의 개인키에 대한 컨텍스트
Definition: issacapi_bs_definitions.h:152