#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>

#include "tagwire.h"
#include "fssdefine.h"

#define HEADERINDEX 13

int main(int argc, char *argv[])
{
FILE *fp=NULL;
char rbuf[4096 * 2L];

if(argc != 2) return -1;

if((fp=fopen(argv[1], "rt"))==NULL) return -1;

while(1)
{
memset(rbuf, 0x00, sizeof(rbuf));
if(fgets(rbuf, sizeof(rbuf), fp)==NULL) break;
rbuf[strlen(rbuf)-1]=0x00;

        if(memcmp(rbuf+HEADERINDEX,"296=",4)==0)
{
struct TradableInstrument *ie=NULL;

ie = TradableInstrument(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.4s],", rbuf+HEADERINDEX);
printf("shortName:[%s],", ie->shortName);
printf("orderBookId:[%ld],", ie->orderBookId);
printf("closingPrice:[%ld],", ie->closingPrice);
printf("isDeleted:[%c],", ie->isDeleted);
printf("upperPriceLimit:[%ld],", ie->upperPriceLimit);
printf("lowerPriceLimit:[%ld],", ie->lowerPriceLimit);
printf("closingDate:[%s]", ie->closingDate);

printf("\n");
}
}
else if(memcmp(rbuf+HEADERINDEX,"496=",4)==0)
{
struct IndexEvent *ie=NULL;

ie = IndexEvent(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.4s],", rbuf+HEADERINDEX);
printf("sequenceNumber[%ld],", ie->sequenceNumber);
printf("timeOfEvent[%s]", ie->timeOfEvent);

printf("\n");
}
}
else if(memcmp(rbuf + HEADERINDEX,"140=",3)==0)
{
struct MarketByLevelEvent *ie=NULL;

ie = MarketByLevelEvent(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.3s],", rbuf+HEADERINDEX);
printf("timeOfEvent[%s],",ie->timeOfEvent);
printf("orderBook[%ld],",ie->orderBook);
printf("isBid[%c],",ie->isBid);
printf("price[%ld],",ie->price);
printf("volume[%ld],",ie->volume);
printf("correspondingPrice[%ld]",ie->correspondingPrice);

printf("\n");
}
}
else if(memcmp(rbuf + HEADERINDEX,"51=",3)==0)
{
struct OrderBookStateChangeEvent *ie=NULL;

ie = OrderBookStateChangeEvent(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.3s],", rbuf+HEADERINDEX);
printf("timeOfEvent:[%s],", ie->timeOfEvent);
printf("orderBookRuleGroup:[%s]", ie->orderBookRuleGroup);

printf("\n");
}
}
else if(memcmp(rbuf + HEADERINDEX,"49=",3)==0)
{
struct TradeEvent *ie=NULL;

ie = TradeEvent(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.3s],", rbuf+HEADERINDEX);
printf("timeOfTrade[%s],", ie->timeOfTrade);
printf("orderQty[%ld],", ie->orderQty);
printf("price[%ld],", ie->price);
printf("highPrice[%ld],", ie->highPrice);
printf("lowPrice[%ld],", ie->lowPrice);
printf("totalTurnover[%ld],", ie->totalTurnover);
printf("correspondingPrice[%ld],", ie->correspondingPrice);
printf("tradeId[%s],", ie->tradeId);
printf("dealId[%s]", ie->dealId);

printf("\n");
}
}
else if(memcmp(rbuf + HEADERINDEX,"62=",3)==0)
{
struct AuctionEvent *ie=NULL;

ie = AuctionEvent(rbuf + HEADERINDEX);

if(ie != NULL)
{
//printf("%s", rbuf);
printf("SEQ[%07ld],", kk+1);
printf("MessageID[%.3s],", rbuf+HEADERINDEX);
printf("timeOfEvent[%s],",ie->timeOfEvent);
printf("orderBook[%ld],",ie->orderBook);
printf("calculatedAuctionPrice[%ld],",ie->calculatedAuctionPrice);
printf("matchedQuantity[%ld]",ie->matchedQuantity);

printf("\n");
}
}
}
if(fp != NULL) fclose(fp);
return(0);
}

※ 요약
윈도우 환경에 OpenSSL 개발 환경을 구축하는 방법이다. 
OpenSSL은 보안 및 암호화와 관련된 라이브러리인 만큼 최신 버전으로 개발 환경을 구축하기 바란다.

 

※ 다운로드 주소
http://slproweb.com/products/Win32OpenSSL.html
FILE:Win32 OpenSSL v1.1.0f​

/*

 *  AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex encoding

 *  AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding

 *

 *  (암호화 방법) TEXT를 암호화 한다. > 암호화되어진코드는 READ DISABLE하다. > HEXA ENCODING을 한다.

 *  (복호화 방법) HEXA DECODING을 한다. > 복호화되어진 코드는 READ DISABLE하다. > 복호화를 진행한다.

 */

 

/* FILE PATH REGISTERED CASE

 * gcc AES.c -lcrypto -o AES

 * gcc AES.c -lcurl -o AES

 * gcc AES.c -ljason-c -o AES​

 */

/* NEEDED FILE

 1. 2017-08-29  오전 08:40             3,433 aes.h
 2. 2017-08-29  오전 08:46             6,610 AES_TEST.c
 3. 2017-05-25  오후 09:20           928,710 libcrypto.lib
 4. 2017-05-25  오후 09:20             4,155 opensslconf.h

 *

 * gcc -c AES_TEST.c

 * gcc -o AES_TEST AES_TEST.o libcrypto.lib

 */


#include <stdio.h>
#include <string.h>
#include <time.h>

#include "aes.h"​ 

 

#define MAX_AES_BUFF_SIZE 2048

 

const unsigned char fw_aes_key[16+1] = {0X33, 0X67, 0X33, 0X33, 0XAB, 0X69, 0X6C, 0XC0, 0X73, 0X30, 0X6C, 0X75, 0X74, 0X69, 0X6F, 0X6E, 0x00};

 

static void e_hex_convert(const void* pv, size_t len, char *outBuff) {
    const unsigned char * p = (const unsigned char*)pv;
  
    if (NULL == pv) {
        return;
    }
    else

    {
        size_t i = 0;
        int hexLen = 0;
        char editb[8];


        memset (editb, 0x00, sizeof(editb));
        for (; i<len;++i) {
            sprintf(editb, "%02X", *p++);
            memcpy(outBuff+hexLen, editb, 2);
            hexLen += 2; 
        }
    }
    return;
}

static void d_hex_convert(unsigned char *pv, size_t len, char *outBuff) {
    const unsigned char * p = (const unsigned char*)pv;
 
    int ii, kk, jj;
 
    kk=0;
    ii=0;
    while(1)
    {
        if(ii >= len) break;
  
        jj=0;
        if(pv[ii] == 'F') pv[ii] = 15;
        else if(pv[ii] == 'E') pv[ii] = 14;
        else if(pv[ii] == 'D') pv[ii] = 13;
        else if(pv[ii] == 'C') pv[ii] = 12;
        else if(pv[ii] == 'B') pv[ii] = 11;
        else if(pv[ii] == 'A') pv[ii] = 10;
        else if(pv[ii] == '9') pv[ii] = 9;
        else if(pv[ii] == '8') pv[ii] = 8;
        else if(pv[ii] == '7') pv[ii] = 7;
        else if(pv[ii] == '6') pv[ii] = 6;
        else if(pv[ii] == '5') pv[ii] = 5;
        else if(pv[ii] == '4') pv[ii] = 4;
        else if(pv[ii] == '3') pv[ii] = 3;
        else if(pv[ii] == '2') pv[ii] = 2;
        else if(pv[ii] == '1') pv[ii] = 1;
        else if(pv[ii] == '0') pv[ii] = 0;
  
        if((pv[ii] & 0x08) > 0) jj = jj + 128;
        if((pv[ii] & 0x04) > 0) jj = jj + 64;
        if((pv[ii] & 0x02) > 0) jj = jj + 32;
        if((pv[ii] & 0x01) > 0) jj = jj + 16;
  
        if(pv[ii+1] == 'F') pv[ii+1] = 15;
        else if(pv[ii+1] == 'E') pv[ii+1] = 14;
        else if(pv[ii+1] == 'D') pv[ii+1] = 13;
        else if(pv[ii+1] == 'C') pv[ii+1] = 12;
        else if(pv[ii+1] == 'B') pv[ii+1] = 11;
        else if(pv[ii+1] == 'A') pv[ii+1] = 10;
        else if(pv[ii+1] == '9') pv[ii+1] = 9;
        else if(pv[ii+1] == '8') pv[ii+1] = 8;
        else if(pv[ii+1] == '7') pv[ii+1] = 7;
        else if(pv[ii+1] == '6') pv[ii+1] = 6;
        else if(pv[ii+1] == '5') pv[ii+1] = 5;
        else if(pv[ii+1] == '4') pv[ii+1] = 4;
        else if(pv[ii+1] == '3') pv[ii+1] = 3;
        else if(pv[ii+1] == '2') pv[ii+1] = 2;
        else if(pv[ii+1] == '1') pv[ii+1] = 1;
        else if(pv[ii+1] == '0') pv[ii+1] = 0;
  
        if((pv[ii+1] & 0x08) > 0) jj = jj + 8;
        if((pv[ii+1] & 0x04) > 0) jj = jj + 4;
        if((pv[ii+1] & 0x02) > 0) jj = jj + 2;
        if((pv[ii+1] & 0x01) > 0) jj = jj + 1;
  
        outBuff[kk] = jj;
  
        kk = kk + 1;
        ii = ii + 2;
    }
    return;
}

 

//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex encoding

static int e_makeAesPacket(char *EncryptText, int EncryptTextLen, char *DecryptText) {
 
    AES_KEY enc_key;
    long idx=0;
    unsigned char padBuff[MAX_AES_BUFF_SIZE];
    unsigned char encBuff[MAX_AES_BUFF_SIZE];
    int ii;

    const size_t encPadLen = ((EncryptTextLen + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;

 

    memset(padBuff, 0x00, MAX_AES_BUFF_SIZE);
    memset(encBuff, 0x00, MAX_AES_BUFF_SIZE);
 
    AES_set_encrypt_key(fw_aes_key, 128, &enc_key);

    memcpy(padBuff, EncryptText, EncryptTextLen);
    for (ii = EncryptTextLen; ii < encPadLen; ii++) {
        padBuff[ii] = (encPadLen - EncryptTextLen);
    }

    while(idx < encPadLen) {
        AES_ecb_encrypt(padBuff+idx, encBuff+idx, &enc_key, AES_ENCRYPT);
        idx += AES_BLOCK_SIZE;
    }

    e_hex_convert(encBuff, encPadLen, DecryptText);

    return(strlen(DecryptText));
}

//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding

//AES 128 bits Algorithm AES/ECB/PKCS7Padding and hex decoding 

static int d_makeAesPacket(char *DecryptText, int DecryptTextLen, char *PlainText) {
 
    AES_KEY dec_key;
    long idx=0;
    unsigned char padBuff[MAX_AES_BUFF_SIZE];
    unsigned char encBuff[MAX_AES_BUFF_SIZE];
    unsigned char outBuff[MAX_AES_BUFF_SIZE];
    int ii, kk, jj;

    memset(padBuff, 0x00, MAX_AES_BUFF_SIZE);
    memset(outBuff, 0x00, MAX_AES_BUFF_SIZE);
 
    AES_set_decrypt_key(fw_aes_key, 128, &dec_key);
 
    size_t encPadLen = strlen(DecryptText) / 2;
    d_hex_convert(DecryptText, DecryptTextLen, outBuff);

    while(idx < encPadLen) {
        AES_ecb_encrypt(outBuff+idx, PlainText+idx, &dec_key, AES_DECRYPT);
        idx += AES_BLOCK_SIZE;
    }

    jj=PlainText[encPadLen-1];

    if(jj<=32) PlainText[encPadLen-1] = 0x00;

    if(jj<=32)
    for(kk=encPadLen-2; kk>0; kk--)
    {
        if(PlainText[kk] == jj) PlainText[kk]=0x00;

        else break;
    }
    return(strlen(PlainText));
}

 

 

char TEXT[1204L * 128L];

int main(int argc, char *argv[])
{
     char ENCRYPTEXT[MAX_AES_BUFF_SIZE];
     char DECRYPTEXT[MAX_AES_BUFF_SIZE];
 
     int ii, kk, jj;
     int rlen;
 

     memset(TEXT, 0x00, sizeof(TEXT));

     strcpy(TEXT, "!@#$%^&*()(*&^%$#@!Input/Output Format from CIMS v9.00");​ 


     printf("[PLAIN   TEXT]%s\n", TEXT);
     printf("---------------------------------------------------------------------------------\n");
 
     memset(ENCRYPTEXT,0x00,sizeof(ENCRYPTEXT));
     memset(DECRYPTEXT,0x00,sizeof(DECRYPTEXT));
 
     rlen = e_makeAesPacket(TEXT, strlen(TEXT), ENCRYPTEXT);
     if (rlen < 0)

     {
        printf("AES_ENCRYPT FAILURE(%s)", TEXT);
        return (-1);
     }
     printf("[ENCRYPT TEXT]%s\n", ENCRYPTEXT);
     printf("---------------------------------------------------------------------------------\n");
 
     rlen = d_makeAesPacket(ENCRYPTEXT,strlen(ENCRYPTEXT),DECRYPTEXT);
     if (rlen < 0)

     {
        printf("AES_DECRYPT FAILURE(%s)", TEXT);
        return (-1);
     }
     printf("[DECRYPT TEXT]%s\n", DECRYPTEXT);
     printf("---------------------------------------------------------------------------------\n");
 
     return(0);
}
 
 
  

{
    "MSGCODE":"RCP",
    "RESULT":"0",
    "REASON":"complete",
    "ACCNO":"",
    "TAMOUNT":"0.00",
    "TMKTVALUE":"0.00",
    "PAGE":"1",
    "NEXTPAGE":"2",
    "COUNT":"2",

"STOCKLISTS":
[
    {
        "STOCKSYMBOL":"",
        "GRADE":"",
        "SECURITYTYPE":"",
        "MARGINRATE":"0",
        "ACTUALVOLUME":"0",
        "AVGCOST":"0.000000",
        "AMOUNT":"0.00",
        "LASTPRICE":"0.00",
        "MKTVALUE":"0.00",
        "MR":"0.00"
    },
    {
        "STOCKSYMBOL":"",
        "GRADE":"",
        "SECURITYTYPE":"",
        "MARGINRATE":"0",
        "ACTUALVOLUME":"0",
        "AVGCOST":"0.000000",
        "AMOUNT":"0.00",
        "LASTPRICE":"0.00",
        "MKTVALUE":"0.00",
        "MR":"0.00"
    }
]
}



/**
* sample.c
*
* Created on: Jun 2, 2017
* Description : https://json-c.github.io/json-c/json-c-0.10/doc/html/json__object_8h.html
*/

#include <json/json.h>
#include 
#include 



char buf[1204L * 128L];



int main(int argc, char *argv[])
{
    FILE *fp = fopen(argv[1], "r");

    if(NULL == fp)
    {
        fprintf(stderr, "fopen() failed");
        return -1;
    }

    int n = fread(buf, 1, sizeof(buf), fp);
    buf[n] = 0;

    struct json_object *jobj;

    jobj = json_tokener_parse(buf);
    if(NULL == jobj) {
        return -1;
    }

    char KEY[100], SUBKEY[100];

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "MSGCODE");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "RESULT");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "REASON");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "ACCNO");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "TAMOUNT");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "TMKTVALUE");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "PAGE");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "NEXTPAGE");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    memset(KEY, 0x00, sizeof(KEY));
    strcpy(KEY, "COUNT");
    printf("[%s][%s]\n", KEY, json_object_get_string(json_object_object_get(jobj, KEY)) );

    struct json_object *pdata = NULL;
    if(json_object_object_get_ex(jobj, "STOCKLISTS", &pdata)) 
    {
        int i;
        for (i = 0; i < json_object_array_length(pdata); i++) 
        {
            struct json_object *tmp = json_object_array_get_idx(pdata, i);
            printf("-----------------------------------\n");
            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "STOCKSYMBOL");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "GRADE");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "SECURITYTYPE");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "MARGINRATE");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "ACTUALVOLUME");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "AVGCOST");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "AMOUNT");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "LASTPRICE");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "MKTVALUE");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );

            memset(KEY, 0x00, sizeof(KEY));
            strcpy(KEY, "MR");
            printf("[%.3d][%s][%s]\n", i + 1, KEY, json_object_get_string(json_object_object_get(tmp, KEY)) );
        }
    }
    return 0;
​}




struct PriceLevel
{
 char timeOfEvent[STRING_MAX+1];   // ID :3
 int  price;                       // ID :7
 int  volume;                      // ID :8
 int  levels;                      // ID :10
 int  numberOfOrders;              // ID :11
}; 
struct MarketByLevel5Event
{
 int  subscriptionGroup;           // ID :1
 long sequenceNumber;              // ID :2
 char timeOfEvent[STRING_MAX+1];   // ID :3
 char sequenceIndicator;           // ID :4
 long orderBook;                   // ID :5
 int  askCount;
 struct PriceLevel askPriceLevels[5]; // ID :21
 int  bidCount;
 struct PriceLevel bidPriceLevels[5]; // ID :22
};

 

//위의 구조체에 아래의 데이타를 파싱및 매핑해서, 출력해본다.


3001=[1=258|2=1125000|3=2017-04-26T14:29:33.350|5=2170|21=[[3=2017-04-26T14:29:33.350|7=168000000|8=400000000|10=0]]]
>>>MarketByLevel5Event---------------------------------------------------
subscriptionGroup(1) = 258
sequenceNumber   (2) = 1125000
timeOfEvent      (3) = 2017-04-26T14:29:33.350
sequenceIndicator(4) = 
orderBook        (5) = 2170
    :ASK:::timeOfEvent(3)     = [1][0]2017-04-26T14:29:33.350
    :ASK:::price      (7)     = [1][0]16800
    :ASK:::volume     (8)     = [1][0]400
    :ASK:::levels     (10)    = [1][0]0
    :ASK:::numberOfOrders(11) = [1][0]0
>>>------------------------------------------------------------

3001=[1=258|2=1172210|3=2017-04-26T14:55:16.034|5=2170|21=[[3=2017-04-26T14:29:33.350|7=168000000|8=400000000|10=0]]|22=[[3=2017-04-26T14:55:16.034|7=121000000|8=100000000|10=0]]]
>>>MarketByLevel5Event---------------------------------------------------
subscriptionGroup(1) = 258
sequenceNumber   (2) = 1172210
timeOfEvent      (3) = 2017-04-26T14:55:16.034
sequenceIndicator(4) = 
orderBook        (5) = 2170
    :ASK:::timeOfEvent(3)     = [1][0]2017-04-26T14:29:33.350
    :ASK:::price      (7)     = [1][0]16800
    :ASK:::volume     (8)     = [1][0]400
    :ASK:::levels     (10)    = [1][0]0
    :ASK:::numberOfOrders(11) = [1][0]0
    :BID:::timeOfEvent(3)     = [1][0]2017-04-26T14:55:16.034
    :BID:::price      (7)     = [1][0]12100
    :BID:::volume     (8)     = [1][0]100
    :BID:::levels     (10)    = [1][0]0
    :BID:::numberOfOrders(11) = [1][0]0
>>>------------------------------------------------------------

3001=[1=258|2=1043350|3=2017-04-26T14:29:28.340|5=2202|21=[[3=2017-04-26T14:29:28.340|7=50000000|8=500000000|10=0]]]
>>>MarketByLevel5Event---------------------------------------------------
subscriptionGroup(1) = 258
sequenceNumber   (2) = 1043350
timeOfEvent      (3) = 2017-04-26T14:29:28.340
sequenceIndicator(4) = 
orderBook        (5) = 2202
    :ASK:::timeOfEvent(3)     = [1][0]2017-04-26T14:29:28.340
    :ASK:::price      (7)     = [1][0]5000
    :ASK:::volume     (8)     = [1][0]500
    :ASK:::levels     (10)    = [1][0]0
    :ASK:::numberOfOrders(11) = [1][0]0
>>>------------------------------------------------------------
 

+ Recent posts