From 5c11e1440fc48a287624c4c0a563c0103baf10ea Mon Sep 17 00:00:00 2001 From: Go Hosohara Date: Wed, 16 May 2018 14:07:34 +0900 Subject: [PATCH] ASN1_TIME_to_generalizedtime --- src/ssl.c | 134 ++++++++++++++++++++++++++++++++++++---------------- tests/api.c | 77 +++++++++++++++++++++++++++--- 2 files changed, 165 insertions(+), 46 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index be347fc6b..42292bd02 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -1476,7 +1476,7 @@ int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); if (ssl->buffers.serverDH_P.buffer == NULL) - return MEMORY_E; + return MEMORY_E; ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); @@ -14364,15 +14364,19 @@ WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len) return newX509; } + + #ifndef NO_WOLFSSL_STUB +#ifndef NO_FILESYSTEM WOLFSSL_X509* wolfSSL_d2i_X509_fp(FILE *fp, WOLFSSL_X509 **x509) { - WOLFSSL_STUB("d2i_X509_fp"); + WOLFSSL_STUB("wolfSSL_d2i_X509_fp"); (void)fp; (void)x509; return 0; } -#endif +#endif /* !NO_FILESYSTEM */ +#endif /* !NO_WOLFSSL_STUB */ #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ @@ -32638,6 +32642,7 @@ int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509) return 0; } + int wolfSSL_d2i_PKCS12_fp(FILE *fp, WC_PKCS12 *pkcs12) { WOLFSSL_STUB("d2i_PKCS12_fp"); @@ -32645,6 +32650,8 @@ int wolfSSL_d2i_PKCS12_fp(FILE *fp, WC_PKCS12 *pkcs12) (void)pkcs12; return 0; } +#endif /* NO_WOLFSSL_STUB */ + const char *wolfSSL_ASN1_tag2str(int tag){ static const char *const tag_label[] = { @@ -32664,59 +32671,61 @@ const char *wolfSSL_ASN1_tag2str(int tag){ return tag_label[tag]; } + int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str, unsigned long flags) { - WOLFSSL_STUB("ASN1_STRING_PRINT_ex"); - int strLen = 0; - unsigned char *strBuf = NULL; + WOLFSSL_MSG("ASN1_STRING_PRINT_ex"); + int str_len = 0; + unsigned char *strbuf = NULL; if (out == NULL || str == NULL) return WOLFSSL_FAILURE; if (flags & ASN1_STRFLGS_SHOW_TYPE){ const char *tag = wolfSSL_ASN1_tag2str(str->type); - strLen += XSTRLEN(tag); - strBuf = (unsigned char *)XMALLOC(strLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (strBuf == NULL){ + str_len += (int)XSTRLEN(tag); + strbuf = (unsigned char *)XMALLOC(str_len + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (strbuf == NULL){ WOLFSSL_MSG("memory alloc failed."); return WOLFSSL_FAILURE; } - XMEMSET(strBuf, 0, strLen + 1); - XSNPRINTF((char*)strBuf, strLen + 1, "%s:", tag); - if (wolfSSL_BIO_write(out, strBuf, strLen) <= 0){ - XFREE(strBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XMEMSET(strbuf, 0, str_len + 1); + XSNPRINTF((char*)strbuf, str_len + 1, "%s:", tag); + if (wolfSSL_BIO_write(out, strbuf, str_len) <= 0){ + XFREE(strbuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } - strLen++; - XFREE(strBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + str_len++; + XFREE(strbuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); } if (flags & ASN1_STRFLGS_DUMP_ALL){ if (!(flags & ASN1_STRFLGS_DUMP_DER)){ - static const char hexChar[] = { '0', '1', '2', '3', '4', '5', '6', + static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - char hextmp[2]; - char *strPtr, *strEnd; + char hex_tmp[2]; + char *str_ptr, *str_end; - strPtr = str->data; - strEnd = str->data + str->length; - while (strPtr != strEnd){ - hextmp[0] = hexChar[*strPtr >> 4]; - hextmp[1] = hexChar[*strPtr & 0xf]; - if (wolfSSL_BIO_write(out, hextmp, 2) <= 0){ + str_ptr = str->data; + str_end = str->data + str->length; + while (str_ptr < str_end){ + hex_tmp[0] = hex_char[*str_ptr >> 4]; + hex_tmp[1] = hex_char[*str_ptr & 0xf]; + if (wolfSSL_BIO_write(out, hex_tmp, 2) <= 0){ return WOLFSSL_FAILURE; } - strPtr++; - strLen += 2; + str_ptr++; + str_len += 2; } - return strLen; + return str_len; } /* ASN1_STRFLGS_DUMP_DER */ - wolfSSL_BIO_write(out, str->data, str->length); - strLen += str->length; - return strLen; + if (wolfSSL_BIO_write(out, str->data, str->length) <= 0) + return WOLFSSL_FAILURE; + str_len += str->length; + return str_len; } if (flags & ASN1_STRFLGS_UTF8_CONVERT){ @@ -32726,15 +32735,58 @@ int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str, return 0; } -WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t, - WOLFSSL_ASN1_TIME **out) -{ - WOLFSSL_STUB("ASN1_TIME_to_generalizedtime"); - (void)t; - (void)out; - return 0; -} +#ifndef NO_ASN_TIME +WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t, + WOLFSSL_ASN1_TIME **out) +{ + WOLFSSL_ENTER("ASN1_TIME_to_generalizedtime"); + unsigned char time_type; + WOLFSSL_ASN1_TIME *ret = NULL; + unsigned char *data_ptr = NULL; + + if (t == NULL) + return NULL; + + time_type = t->data[0]; + if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){ + WOLFSSL_MSG("Invalid ASN_TIME type."); + return NULL; + } + if (out == NULL || *out == NULL){ + ret = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (ret == NULL){ + WOLFSSL_MSG("memory alloc failed."); + return NULL; + } + XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME)); + } else + ret = *out; + + if (time_type == ASN_GENERALIZED_TIME){ + XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE); + return ret; + } else if (time_type == ASN_UTC_TIME){ + ret->data[0] = ASN_GENERALIZED_TIME; + ret->data[1] = ASN_GENERALIZED_TIME_SIZE; + data_ptr = ret->data + 2; + if (t->data[2] >= '5') + XSNPRINTF((char*)data_ptr, ASN_UTC_TIME_SIZE + 2, "19%s", t->data + 2); + else + XSNPRINTF((char*)data_ptr, ASN_UTC_TIME_SIZE + 2, "20%s", t->data + 2); + + return ret; + } + + WOLFSSL_MSG("Invalid ASN_TIME value"); + return NULL; +} +#endif /* !NO_ASN_TIME */ + + +#ifndef NO_WOLFSSL_STUB +#ifndef NO_ASN int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER **a, unsigned char **pp) { WOLFSSL_STUB("i2c_ASN1_INTEGER"); @@ -32742,6 +32794,9 @@ int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER **a, unsigned char **pp) (void)pp; return 0; } +#endif /* !NO_ASN */ +#endif /* !NO_WOLFSSL_STUB */ + int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *ctx, WOLFSSL_X509_CRL *x) { @@ -32750,5 +32805,4 @@ int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *ctx, WOLFSSL_X509_CRL *x) return 0; } -#endif -#endif \ No newline at end of file +#endif /* OPENSSLEXTRA */ \ No newline at end of file diff --git a/tests/api.c b/tests/api.c index 487ad3531..0fc7d146d 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15556,14 +15556,15 @@ static void test_wolfSSL_ASN1_GENERALIZEDTIME_free(){ unsigned char nullstr[32]; XMEMSET(nullstr, 0, 32); - asn1_gtime = XMALLOC(sizeof(ASN1_GENERALIZEDTIME), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - XMEMCPY(asn1_gtime->data,"20180504123500Z",15); + asn1_gtime = (WOLFSSL_ASN1_GENERALIZEDTIME*)XMALLOC( + sizeof(WOLFSSL_ASN1_GENERALIZEDTIME), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + XMEMCPY(asn1_gtime->data,"20180504123500Z",ASN_GENERALIZED_TIME_SIZE); wolfSSL_ASN1_GENERALIZEDTIME_free(asn1_gtime); AssertIntEQ(0, XMEMCMP(asn1_gtime->data, nullstr, 32)); XFREE(asn1_gtime, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif /* opensslextra */ + #endif /* OPENSSL_EXTRA */ } @@ -17974,6 +17975,7 @@ static void test_wolfSSL_verify_depth(void) WOLFSSL_CTX* ctx; long depth; + printf(testingFmt, "test_wolfSSL_verify_depth()"); AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, SSL_FILETYPE_PEM)); @@ -18439,8 +18441,69 @@ static void test_wolfSSL_X509_get_serialNumber(void) static void test_wolfSSL_OPENSSL_add_all_algorithms(void){ #if defined(OPENSSL_EXTRA) - AssertIntEQ(wolfSSL_OPENSSL_add_all_algorithms_noconf(),WOLFSSL_SUCCESS); - wolfSSL_Cleanup(); + printf(testingFmt, "wolfSSL_OPENSSL_add_all_algorithms()"); + + AssertIntEQ(wolfSSL_OPENSSL_add_all_algorithms_noconf(),WOLFSSL_SUCCESS); + wolfSSL_Cleanup(); + + printf(resultFmt, passed); +#endif +} + +static void test_wolfSSL_ASN1_STRING_print_ex(void){ +#if defined(OPENSSL_EXTRA) +#endif +} + + +static void test_wolfSSL_ASN1_TIME_to_generalizedtime(void){ +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN1_TIME) + WOLFSSL_ASN1_TIME *t; + WOLFSSL_ASN1_TIME *out; + WOLFSSL_ASN1_TIME *gtime; + + printf(testingFmt, "wolfSSL_ASN1_TIME_to_generalizedtime()"); + + /* UTC Time test */ + t = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_TMP_BUFFER); + XMEMSET(t->data, 0, ASN_GENERALIZED_TIME_SIZE); + out = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_TMP_BUFFER); + t->data[0] = ASN_UTC_TIME; + t->data[1] = ASN_UTC_TIME_SIZE; + XMEMCPY(t->data + 2,"050727123456Z",ASN_UTC_TIME_SIZE); + + gtime = wolfSSL_ASN1_TIME_to_generalizedtime(t, &out); + AssertIntEQ(gtime->data[0], ASN_GENERALIZED_TIME); + AssertIntEQ(gtime->data[1], ASN_GENERALIZED_TIME_SIZE); + AssertStrEQ((char*)gtime->data + 2, "20050727123456Z"); + + /* Generalized Time test */ + XMEMSET(t, 0, ASN_GENERALIZED_TIME_SIZE); + XMEMSET(out, 0, ASN_GENERALIZED_TIME_SIZE); + gtime = NULL; + t->data[0] = ASN_GENERALIZED_TIME; + t->data[1] = ASN_GENERALIZED_TIME_SIZE; + XMEMCPY(t->data + 2,"20050727123456Z",ASN_GENERALIZED_TIME_SIZE); + gtime = wolfSSL_ASN1_TIME_to_generalizedtime(t, &out); + AssertIntEQ(gtime->data[0], ASN_GENERALIZED_TIME); + AssertIntEQ(gtime->data[1], ASN_GENERALIZED_TIME_SIZE); + AssertStrEQ((char*)gtime->data + 2, "20050727123456Z"); + XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + /* Null parameter test */ + XMEMSET(t, 0, ASN_GENERALIZED_TIME_SIZE); + gtime = NULL; + out = NULL; + t->data[0] = ASN_UTC_TIME; + t->data[1] = ASN_UTC_TIME_SIZE; + XMEMCPY(t->data + 2,"050727123456Z",ASN_UTC_TIME_SIZE); + AssertNotNull(gtime = wolfSSL_ASN1_TIME_to_generalizedtime(t, NULL)); + AssertIntEQ(gtime->data[0], ASN_GENERALIZED_TIME); + AssertIntEQ(gtime->data[1], ASN_GENERALIZED_TIME_SIZE); + AssertStrEQ((char*)gtime->data + 2, "20050727123456Z"); + + XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); + printf(resultFmt, passed); #endif } @@ -19450,6 +19513,8 @@ void ApiTest(void) test_wolfSSL_X509_get_serialNumber(); test_wolfSSL_X509_CRL(); test_wolfSSL_OPENSSL_add_all_algorithms(); + test_wolfSSL_ASN1_STRING_print_ex(); + test_wolfSSL_ASN1_TIME_to_generalizedtime(); /* test the no op functions for compatibility */ test_no_op_functions();