3

この質問: Openssl C++ get expiry dateで説明されているように、ASN1 時間を BIO バッファーに書き込み、それをカスタム バッファーに読み戻す可能性がありますbuf

BIO *bio;
int write = 0;
bio = BIO_new(BIO_s_mem());
if (bio) {
  if (ASN1_TIME_print(bio, tm))
    write = BIO_read(bio, buf, len-1);
  BIO_free(bio);
}
buf[write]='\0';
return write;

BIO をまったく使用せずにこれを達成するにはどうすればよいでしょうか? ASN1_TIME_print関数は、 が定義されていない場合にのみ存在しますOPENSSL_NO_BIO。特定のバッファに時間を直接書き込む方法はありますか?

4

2 に答える 2

4

以下のサンプルコードを試すことができます。BIO は使用しませんが、OP の例と同じ出力が得られるはずです。ASN1_TIME 文字列が信頼できない場合は、次のエラー チェックを追加する必要があります。

  • notBefore->data is > 10 chars
  • 各文字値は「0」から「9」の間です
  • 年、月、日、時、分、秒の値
  • タイプ

複数のタイプが予想される場合は、タイプ (つまり UTC) をテストする必要があります。

また、日付/時刻が GMT であるかどうかをテストし、BIO を使用しているかのように出力を正確に一致させたい場合は、それを文字列に追加する必要があります。参照: openssl/crypto/asn1/t_x509.c - ASN1_UTCTIME_print または ASN1_GENERALIZEDTIME_print


ASN1_TIME* notBefore = NULL;
int len = 32;
char buf[len];
struct tm tm_time;

notBefore = X509_get_notBefore(x509_cert);

// Format ASN1_TIME  with type UTC into a tm struct
if(notBefore->type == V_ASN1_UTCTIME){
    strptime((const char*)notBefore->data, "%y%m%d%H%M%SZ" , &tm_time);
    strftime(buf, sizeof(char) * len, "%h %d %H:%M:%S %Y", &tm_time);
}

// Format ASN1_TIME with type "Generalized" into a tm struct
if(notBefore->type == V_ASN1_GENERALIZEDTIME){
     // I didn't look this format up, but it shouldn't be too difficult
}
于 2016-10-11T23:19:05.447 に答える
0

少なくとも時間を特定のバッファに直接書き込むという点では、これは可能であると思いますが、それでも BIO を使用する必要があります。

理想的にBIO_new_mem_bufは、特定のバッファーをソースとして使用してメモリ内 BIO を作成することを考えると、適しています。残念ながら、その関数は指定されたバッファをread-onlyとして扱いますが、これは私たちが望んでいるものではありません。ただし、ソースコードBIO_new_mem_buf2に基づいて独自の関数を作成できます (それを と呼びましょう) 。BIO_new_mem_buf

BIO *BIO_new_mem_buf2(void *buf, int len)
{
    BIO *ret;
    BUF_MEM *b;
    size_t sz;

    if (!buf) {
        BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER);
        return NULL;
    }
    sz = (size_t)len;
    if (!(ret = BIO_new(BIO_s_mem())))
        return NULL;
    b = (BUF_MEM *)ret->ptr;
    b->data = buf;
    b->length = sz;
    b->max = sz;
    return ret;
}

これは と同じですが、BIO_new_mem_bufa )引数lenは指定されたバッファのサイズを示す必要があり、 b) BIO は「読み取り専用」とマークされていません。

上記により、次のように呼び出すことができるはずです。

ASN1_TIME_print(bio, tm)

指定されたバッファに時間を表示します。

上記のコードはテストしていないので、YMMV. お役に立てれば!

于 2016-02-21T22:44:28.677 に答える