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


2023-03-28

[GPT] 쓰지않는 ipv6 다 지워버리기.

필요없는 ipv6주소가 자꾸 중복되어 거슬린다. 
삭제해버리자.

#!/bin/bash
for interface in $(ifconfig | grep '^[a-zA-Z0-9]' | awk '{print $1}')
do
    ip -6 addr flush dev $interface
done

스크립트만들고 sudo로 실행.

2023-03-23

u-boot menuconfig 보는곳.

~/work/wrlinux/lts-21/build/tmp-glibc/work/stm32mp153d_ssonic-wrs-linux-gnueabi/u-boot-stm32mp/2020.10.r1-r0/build/stm32mp153d-ssonic_trusted_defconfig# make menuconfig

2023-03-10

인터넷연결 확인방법

단순히 인터넷이 되는지만 확인하고자 한다면,

DNS서버에 접속만 확인한다.

PING은 지연시간까지 표시해주지만 필요없다. 복잡도도 상당하다.

8.8.8.8 주소, 53번포트에 connect만 하여 성공실패여부만 확인하고 끝.

소스는 리눅스에서는 바로되고, 필요한만큼만, 수정해서 쓰자.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <hostname> <port>\n", argv[0]);
exit(1);
}

char *hostname = argv[1];
char *port = argv[2];
struct addrinfo hints, *res;
int status, sock;

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if ((status = getaddrinfo(hostname, port, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}

sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) {
printf("Success\n");
} else {
printf("Failed\n");
}

close(sock);
freeaddrinfo(res);
return 0;
}


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

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