openssl ECDSA 서명검증함수의 이상한 리턴값

Necromancer의 이미지

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 입니다.

ymir의 이미지

verify 코드도 예제와 별 차이 없어 보이고, 함수 자체에 문제가 있을 가능성은 거의 없을 테니, 아무래도 입력이 이상하다는 결론이 나와야 할 것 같은데요.
그런데 여러 번 실행했을 때, 계속해서 동일한 입력이 들어가는데도 결과 값이 랜덤하게 나온다는 건가요?

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

Necromancer의 이미지

네 그렇습니다. 입력은 바뀐것 없습니다.
검증 실패할때 0 나오는것은 확실한데 성공할때는 어떤 경우 1, 어떤 경우 -1이 나옵니다.

구글 검색해도 자료가 안보여서 혹시나 해서 여기 올려봤습니다.
openssl 정확한 버전은 아치리눅스에 있는 3.3.1-1 버전이어서 배포판 패치가 적용되어 있는데 이것과도 연관 있을지 몰라서 시간되면 다른 배포판에서도 시도해봐야 할 것 같습니다.

Written By the Black Knight of Destruction

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.