result_t PKey::exportPem(std::string &retVal) { result_t hr; bool priv; hr = isPrivate(priv); if (hr < 0) return hr; int32_t ret; std::string buf; buf.resize(mbedtls_pk_get_len(&m_key) * 8 + 128); if (priv) ret = mbedtls_pk_write_key_pem(&m_key, (unsigned char *)&buf[0], buf.length()); else ret = mbedtls_pk_write_pubkey_pem(&m_key, (unsigned char *)&buf[0], buf.length()); if (ret != 0) return CHECK_ERROR(_ssl::setError(ret)); buf.resize(qstrlen(buf.c_str())); retVal = buf; return 0; }
static int write_public_key( mbedtls_pk_context *key, const char *output_file ) { int ret; FILE *f; unsigned char output_buf[16000]; unsigned char *c = output_buf; size_t len = 0; memset(output_buf, 0, 16000); #if defined(MBEDTLS_PEM_WRITE_C) if( opt.output_format == OUTPUT_FORMAT_PEM ) { if( ( ret = mbedtls_pk_write_pubkey_pem( key, output_buf, 16000 ) ) != 0 ) return( ret ); len = strlen( (char *) output_buf ); } else #endif { if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf, 16000 ) ) < 0 ) return( ret ); len = ret; c = output_buf + sizeof(output_buf) - len - 1; } if( ( f = fopen( output_file, "w" ) ) == NULL ) return( -1 ); if( fwrite( c, 1, len, f ) != len ) { fclose( f ); return( -1 ); } fclose( f ); return( 0 ); }