WA-SDK  3.0.4.0
WA-SDK
issacapi/sg/sample_sg_rawbytes.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_rawbytes() {
ISSAC_RETURN result;
char signature[4096]; // 전자서명 메시지가 저장될 버퍼
int signature_len; // 전자서명 메시지의 길이
const char *message = "this is a test!"; // 전자 서명 대상 메시지
int message_len = strlen(message); // 원본 메시지의 길이
printf("sample_sg_rawbytes() => ");
// 인증서 읽기
result = ISSAC_CERTIFICATE_Read_Memory(&cert, certBytes, certBytesLen);
// 서명 생성
if (result == ISSAC_SUCCESS) {
PUBLICKEY pubKey;
PRIVATEKEY priKey;
// 인증서에서 공개키 가져오기
result = ISSAC_PUBLICKEY_ReadFromCertificate(&pubKey, &cert);
// 개인키 읽기
if (result == ISSAC_SUCCESS) {
result = ISSAC_PRIVATEKEY_Read_Memory(&priKey, priKeyBytes, priKeyBytesLen, password);
}
// 서명 생성
if (result == ISSAC_SUCCESS) {
result = ISSAC_SignRawBytes_WithHashNid(signature, &signature_len, sizeof(signature), message, message_len, &priKey, &pubKey, 385);
}
}
// 서명 검증
if (result == ISSAC_SUCCESS) {
result = ISSAC_SG_VerifySignature_Core_WithHashNid(signature, signature_len, message, message_len, &cert, 0, 385);
}
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_rawbytes();
}
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_PUBLICKEY_ReadFromCertificate(PUBLICKEY *destKey, CERTIFICATE *cert)
인증서에서 공개키를 가져온다.
#define ISSAC_PUBLICKEY_Create(a)
Definition: issacapi_bs_publickey.h:27
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_PUBLICKEY_Finalize(PUBLICKEY *key)
PUBLICKEY 에 할당된 메모리를 해제한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SG_VerifySignature_Core_WithHashNid(void *signature_value, int signature_value_len, const void *message, int message_len, CERTIFICATE *certificate, time_t sign_time, int hashNid)
PKCS #7의 서명자 정보가 없는 SignedData를 생성한 후 서명값만 재조합하여 서명값을 검증한다.
WA_SDK_API ISSAC_RETURN FUNCCALL ISSAC_SignRawBytes_WithHashNid(void *sigVal, int *sigValLen, int sigValAllocLen, const void *message, int messageLen, PRIVATEKEY *privateKey, PUBLICKEY *publicKey, int hashNid)
입력한 메시지를 서명한다.
인증서에 대한 컨텍스트
Definition: issacapi_bs_definitions.h:106
PKCS#8 형식의 개인키에 대한 컨텍스트
Definition: issacapi_bs_definitions.h:152
공개키에 대한 컨텍스트
Definition: issacapi_bs_definitions.h:158