2023-04-26

[JSON] 순서보장없는 json파일간 비교를위해 dict 정렬하여 해쉬만드는 예제.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <cjson/cJSON.h>

#define BUFFER_SIZE 1024

// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, input, input_len);
    SHA256_Final(hash, &sha256);
}

// 딕셔너리 정렬 함수
cJSON* sort_dict(cJSON *json)
{
    cJSON *sorted = cJSON_CreateObject();

    // 딕셔너리의 키를 저장할 배열 생성
    const char *keys[cJSON_GetArraySize(json)];
    int i = 0;
    cJSON *child;
    cJSON_ArrayForEach(child, json) {
        keys[i] = child->string;
        i++;
    }

    // 키를 알파벳순으로 정렬
    qsort(keys, cJSON_GetArraySize(json), sizeof(const char*), strcmp);

    // 정렬된 키로 딕셔너리 재구성
    for (i = 0; i < cJSON_GetArraySize(json); i++) {
        child = cJSON_GetObjectItemCaseSensitive(json, keys[i]);
        cJSON_AddItemToObject(sorted, keys[i], cJSON_Duplicate(child, 1));
    }

    return sorted;
}

int main(int argc, char *argv[])
{
    char buffer[BUFFER_SIZE];
    size_t nread;
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;

    // JSON 파일 열기
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        fprintf(stderr, "파일 열기 실패\n");
        exit(1);
    }

    // JSON 파일 읽기
    nread = fread(buffer, 1, BUFFER_SIZE, fp);
    fclose(fp);

    // JSON 파싱
    cJSON *json = cJSON_Parse(buffer);

    // 딕셔너리 정렬
    cJSON *sorted_json = sort_dict(json);

    // JSON 문자열로 변환
    char *sorted_str = cJSON_Print(sorted_json);

    // SHA256 해시값 생성
    sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);

    // 해시값 출력
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    // 메모리 해제
    cJSON_Delete(json);
    cJSON_Delete(sorted_json);
    free(sorted_str);

    return 0;
}
//==========================================================================
위의 소스중 cJSON을 쓰지않고 json-c를 사용하는 소스

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <json-c/json.h>

#define BUFFER_SIZE 1024

// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, input, input_len);
    SHA256_Final(hash, &sha256);
}

// 딕셔너리 정렬 함수
int cmp(const void *a, const void *b) 
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

json_object* sort_dict(json_object *json)
{
    json_object *sorted = json_object_new_object();

    // 딕셔너리의 키를 저장할 배열 생성
    const char *keys[json_object_object_length(json)];
    int i = 0;
    json_object_object_foreach(json, key, val) {
        keys[i] = key;
        i++;
    }

    // 키를 알파벳순으로 정렬
    qsort(keys, json_object_object_length(json), sizeof(const char*), cmp);

    // 정렬된 키로 딕셔너리 재구성
    for (i = 0; i < json_object_object_length(json); i++) {
        json_object *child = json_object_object_get(json, keys[i]);
        json_object_object_add(sorted, keys[i], json_object_get(child));
    }

    return sorted;
}

int main(int argc, char *argv[])
{
    char buffer[BUFFER_SIZE];
    size_t nread;
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;

    // JSON 파일 열기
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        fprintf(stderr, "파일 열기 실패\n");
        exit(1);
    }

    // JSON 파일 읽기
    nread = fread(buffer, 1, BUFFER_SIZE, fp);
    fclose(fp);

    // JSON 파싱
    json_object *json = json_tokener_parse(buffer);

    // 딕셔너리 정렬
    json_object *sorted_json = sort_dict(json);

    // JSON 문자열로 변환
    char *sorted_str = json_object_to_json_string(sorted_json);

    // SHA256 해시값 생성
    sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);

    // 해시값 출력
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    // 메모리 해제
    json_object_put(json);
    json_object_put(sorted_json);
    free(sorted_str);

    return 0;
}







2023-04-24

[UNITY] TESTCASE 구조 프로젝트 만드는법

project/
├── CMakeLists.txt
├── app/
│   ├── CMakeLists.txt
│   └── myfunc.c
├── include/
│   ├── myfunc.h
│   └── unity.h
├── test/
│   ├── CMakeLists.txt
│   └── test_myfunc.c
└── unity/
    ├── unity.c
    └── unity.h


project/CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

# Set project name and version
project(my_project VERSION 1.0)

# Add app and test subdirectories
add_subdirectory(app)
add_subdirectory(test)


project/test/CMakeLists.txt

# Add executable target
add_executable(my_test test_myfunc.c)

# Add include directories
target_include_directories(my_test PRIVATE ${PROJECT_SOURCE_DIR}/include)

# Link with Unity and app libraries
target_link_libraries(my_test PRIVATE unity my_app)







2023-04-19

도커설치 docker install

새 리눅스 컴퓨터에 도커설치하는 한방
긁어 붙여주세요.

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
sudo docker run hello-world
sudo systemctl status docker


암호화 + base64 하고 쉘스크립트.

 #!/bin/bash # IV와 UserKey를 설정합니다 (아스키 문자열을 그대로 사용). IV="0123456789abcdef"  UserKey="0123456789abcdef" # IV와 UserKey를 16...