/* ============================================================================= * sig_cli.c - 호스트 C 패리티 드라이버 * * 펌웨어의 실제 서명 구현(common/sig.c: sig_raw_body)을 호스트에서 그대로 컴파일· * 실행하여, Python 레퍼런스(reference.py: sign_raw)와 서버(php verify_signature_raw) * 와 *바이트 단위로* 일치하는지 검증한다. 이렇게 해야 "C 는 컴파일·실행되지 않아 * 손으로만 맞춘" 갭이 닫힌다(C↔Python↔PHP 3자 패리티). * * 사용: sig_cli (본문은 stdin, 바이너리 그대로) * 출력: lowercase_hex(HMAC-SHA256(key=api_key, msg=body)) (개행 없음) * * parity_test.py 가 common/{sig.c,sha256_sw.c,hexutil.c} 와 함께 컴파일한다. * ===========================================================================*/ #include "sig.h" #include #include int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "usage: %s (body on stdin)\n", argv[0]); return 2; } const char *key = argv[1]; /* stdin 전체를 바이너리 그대로 읽는다(서명은 본문 바이트에 대해 계산되므로 * 어떤 변환도 하지 않는다). */ size_t cap = 4096, len = 0; char *body = (char *)malloc(cap); if (body == NULL) { return 3; } int c; while ((c = getchar()) != EOF) { if (len + 1 > cap) { cap *= 2; char *n = (char *)realloc(body, cap); if (n == NULL) { free(body); return 3; } body = n; } body[len++] = (char)c; } char out_hex[SIG_HEX_BUFSZ]; sig_raw_body(key, body, len, out_hex); fputs(out_hex, stdout); free(body); return 0; }