result_t X509Cert::get_serial(exlib::string &retVal) { mbedtls_x509_crt *crt = get_crt(); if (!crt) return CHECK_ERROR(CALL_E_INVALID_CALL); int32_t ret; mbedtls_mpi serial; mbedtls_mpi_init(&serial); ret = mbedtls_mpi_read_binary(&serial, crt->serial.p, crt->serial.len); if (ret != 0) return CHECK_ERROR(_ssl::setError(ret)); retVal.resize(8192); size_t sz = retVal.length(); ret = mbedtls_mpi_write_string(&serial, 10, &retVal[0], sz, &sz); mbedtls_mpi_free(&serial); if (ret != 0) return CHECK_ERROR(_ssl::setError(ret)); retVal.resize(sz - 1); return 0; }
inline void _escape(const char* str, int32_t sz, bool mysql, exlib::string& retVal) { int32_t len, l; const char* src; char* bstr; char ch; for (len = 0, src = str, l = sz; l > 0; len++, l--) { ch = (unsigned char)*src++; if (ch == '\'') len++; else if (mysql) { if (ch == 0 || ch == 0x1a || ch == '\r' || ch == '\n' || ch == '\\' || ch == '\"') len++; } } retVal.resize(len); bstr = &retVal[0]; for (src = str, l = sz; l > 0; l--) { ch = (unsigned char)*src++; if (ch == '\'') { *bstr++ = '\''; *bstr++ = '\''; } else if (mysql) { switch (ch) { case 0: *bstr++ = '\\'; *bstr++ = '0'; break; case 0x1a: *bstr++ = '\\'; *bstr++ = 0x1a; break; case '\r': *bstr++ = '\\'; *bstr++ = 'r'; break; case '\n': *bstr++ = '\\'; *bstr++ = 'n'; break; case '\\': *bstr++ = '\\'; *bstr++ = '\\'; break; case '\"': *bstr++ = '\\'; *bstr++ = '\"'; break; default: *bstr++ = ch; break; } } else *bstr++ = ch; } }