openssl ECDSA 서명검증함수의 이상한 리턴값
글쓴이: Necromancer / 작성시간: 목, 2024/06/20 - 4:31오후
OpenSSL로 ECC 전자서명 검증 시험을 하고 있는데 서명 검증 함수(EVP_PKEY_verify())의 리턴값이 이상한 부분이 있습니다.
서명을 검증하는 부분의 코드는 다음과 같습니다.
/* 서명 확인한다 */ int verify_sig(EVP_PKEY *publickey,unsigned char *msg,size_t msglen,unsigned char *signature,size_t siglen) { EVP_PKEY_CTX *ctx; unsigned long code; int r=-3; ctx=EVP_PKEY_CTX_new(publickey,NULL); if(EVP_PKEY_verify_init(ctx)==1) { if(EVP_PKEY_CTX_set_signature_md(ctx,EVP_sha256())==1) { r=EVP_PKEY_verify(ctx,signature,siglen,msg,msglen); if(r<0) { printf("Verify Error Found! %d\n",r); code=ERR_get_error(); printf("ERROR CODE %016X\n",code); //ERR_print_errors_fp(stdout); printf("\n"); } } else printf("VERIFY Fail 1\n"); } else printf("VERIFY Fail 2\n"); EVP_PKEY_CTX_free(ctx); return r; }
인수로 들어가는 public key, 서명값(signature,siglen), 원본메시지(msg,msglen) 모두 이상 없는것 확인했습니다.
그런데 실행하면 해당 부분의 출력은 다음과 같이 됩니다.
Verify Error Found! -1 ERROR CODE 0000000000000000
EVP_PKEY_verify()에 대한 man page를 확인해보면 리턴값은 서명검증 성공시 1,실패시 0이며, 음수는 서명 검증과정에 에러가 있는거라고 나옵니다.
EVP_PKEY_verify_init() and EVP_PKEY_verify() return 1 if the verification was successful and 0 if it failed. Unlike other functions the return value 0 from EVP_PKEY_verify() only indicates that the signature did not verify successfully (that is tbs did not match the original data or the signature was of invalid form) it is not an indication of a more serious error. A negative value indicates an error other that signature verification failure. In particular a return value of -2 indicates the operation is not supported by the public key algorithm.
그런데 EVP_PKEY_verify()가 -1을 리턴하는데, 에러를 알려주는 ERR_get_error()는 에러가 없다는 뜻의 0을 리턴하고 있습니다. 물론 항상 -1 리턴하는건 아니고 어떤 경우는 -1, 어떤 경우는 1을 리턴합니다. 대략 절반 정도는 -1, 절반 정도는 성공했다는 1을 리턴하는 것 같습니다.
어떤 경우에 이런 일이 발생하는지, 경험하신 분 계신지 해서 올려봅니다.
사용하는 OpenSSL 버전은 3.3.1 입니다.
Forums:
음 ..
verify 코드도 예제와 별 차이 없어 보이고, 함수 자체에 문제가 있을 가능성은 거의 없을 테니, 아무래도 입력이 이상하다는 결론이 나와야 할 것 같은데요.
그런데 여러 번 실행했을 때, 계속해서 동일한 입력이 들어가는데도 결과 값이 랜덤하게 나온다는 건가요?
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
네 그렇습니다.
네 그렇습니다. 입력은 바뀐것 없습니다.
검증 실패할때 0 나오는것은 확실한데 성공할때는 어떤 경우 1, 어떤 경우 -1이 나옵니다.
구글 검색해도 자료가 안보여서 혹시나 해서 여기 올려봤습니다.
openssl 정확한 버전은 아치리눅스에 있는 3.3.1-1 버전이어서 배포판 패치가 적용되어 있는데 이것과도 연관 있을지 몰라서 시간되면 다른 배포판에서도 시도해봐야 할 것 같습니다.
Written By the Black Knight of Destruction
댓글 달기