ASN.1 DER로 인코딩되지 않은 ECDSA 서명이 포함 된 일부 데이터 패킷을 확인하려고합니다.openSSL : r 대신 압축 된 CurvePoint R을 사용하여 원시 데이터에서 ECDSA 서명 가져 오기
openSSL (버전 1.1.0)을 사용하여 필요한 모든 기능을 수행하는 것으로 보입니다.
현재 데이터 패킷에서 서명을 가져오고 있습니다. 서명은 다음과 같다 :
tshark를 이런 제품 관련 표시 (마지막 4 바이트 서명의 부분으로 표시되어서는 안된다)
을"gn.sh.sig": { "gn.st.pka": "0", "gn.st.eccpointtype": "3", "gn.st.opaque": "1f:f8:ad:a7:fd:99:b2:a8:a2:69:d4:d6:67:e5:ee:5b:3f:8b:e8:7f:49:fc:b4:79:95:98:15:0d:cb:bd:06:3c", "gn.st.opaque": "61:a4:6a:c9:a7:dd:bd:0d:9c:0a:0e:73:db:52:06:bb:79:53:99:51:16:45:45:81:4e:df:94:5c:58:59:40:14" }
인코딩은 ETSI TS 103 097 v1.2.1
opaque
은 ECC Point type
과 함께 EccPoint는 R
이고 두 번째 필드 opaque
은 s
입니다.
첫 번째 단계는 openSSL에서 서명을 만들어 데이터를 가져 오는 것입니다.
내 코드 (오류 처리가 크기를 줄이기 위해 제거) 다음과 같습니다
#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/bn.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
void verify_signature(void)
{
int res;
// Which value is correct for r-part?
static const char sig_r_hex[] = "1ff8ada7fd99b2a8a269d4d667e5ee5b3f8be87f49fcb4799598150dcbbd063c";
static const char sig_s_hex[] = "61a46ac9a7ddbd0d9c0a0e73db5206bb79539951164545814edf945c58594014";
BN_CTX *bn_ctx = BN_CTX_new();
BN_CTX_start(bn_ctx);
// Create signature and import from packet.
BIGNUM *bn_r = BN_CTX_get(bn_ctx);
BIGNUM *bn_s = BN_CTX_get(bn_ctx);
res = BN_hex2bn(&bn_r, sig_r_hex);
res = BN_hex2bn(&bn_s, sig_s_hex);
ECDSA_SIG *signature = ECDSA_SIG_new();
res = ECDSA_SIG_set0(signature, bn_r, bn_s);
printf("ECDSA_SIG_set0(): %d\n", res);
// ...
// Create hash of message and verify signature with public key
//...
}
int main(int arc, char *argv[])
{
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(NULL);
verify_signature();
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_free_strings();
return 0;
}
는 내가 현재 실종 것은 내가 제대로 값 R
을 처리하는 방법입니다. 압축 된 CurvePoint의 어떤 부분을 r
으로 사용하여 서명을 초기화해야합니까? y
부분의 압축을 풀어야합니까? 압축 된 y
값에 대한 표시를 추가해야합니까?
힌트를 환영합니다.
편집 : IEEE1609.2와 SEC-1은 r
에서 R
의 빠른 계산을 허용하기위한 추가 정보를 추가 할 수 있습니다에서 읽은 내용에서
. 이것은 R
그 자체 일 수 있습니다. r = xR mod n
으로 EccPoint에서 r
을 계산할 수 있어야합니다.
검증을 가속화하기 위해이 메커니즘을 지원합니까? 아니면 OpenSSL에 r
을 공급하기 위해 추가 정보를 제거해야합니까?