static int write_private_key( 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( opt.output_format == OUTPUT_FORMAT_PEM ) { if( ( ret = pk_write_key_pem( key, output_buf, 16000 ) ) != 0 ) return( ret ); len = strlen( (char *) output_buf ); } else { if( ( ret = pk_write_key_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 ) return( -1 ); fclose(f); return( 0 ); }
int pk_write_key_pem( pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[8192]; const char *begin, *end; size_t olen = 0; if( ( ret = pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) return( ret ); #if defined(POLARSSL_RSA_C) if( pk_get_type( key ) == POLARSSL_PK_RSA ) { begin = PEM_BEGIN_PRIVATE_KEY_RSA; end = PEM_END_PRIVATE_KEY_RSA; } else #endif #if defined(POLARSSL_ECP_C) if( pk_get_type( key ) == POLARSSL_PK_ECKEY ) { begin = PEM_BEGIN_PRIVATE_KEY_EC; end = PEM_END_PRIVATE_KEY_EC; } else #endif return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE ); if( ( ret = pem_write_buffer( begin, end, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); }
result_t PKey::exportDer(obj_ptr<Buffer_base> &retVal) { result_t hr; bool priv; hr = isPrivate(priv); if (hr < 0) return hr; int ret; std::string buf; buf.resize(8192); if (priv) ret = pk_write_key_der(&m_key, (unsigned char *)&buf[0], buf.length()); else ret = pk_write_pubkey_der(&m_key, (unsigned char *)&buf[0], buf.length()); if (ret < 0) return CHECK_ERROR(_ssl::setError(ret)); retVal = new Buffer(buf.substr(buf.length() - ret)); return 0; }
int pk_write_key_pem( pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[1280000]; const char *begin, *end; size_t olen = 0; if( ( ret = pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) return( ret ); #if defined(POLARSSL_RSA_C) if( pk_get_type( key ) == POLARSSL_PK_RSA ) { begin = PEM_BEGIN_PRIVATE_KEY_RSA; end = PEM_END_PRIVATE_KEY_RSA; } else #endif #if defined(POLARSSL_ECP_C) if( pk_get_type( key ) == POLARSSL_PK_ECKEY ) { begin = PEM_BEGIN_PRIVATE_KEY_EC; end = PEM_END_PRIVATE_KEY_EC; } else #endif #if defined(__TTS__) if ( pk_get_type( key ) == OUR_PK_TTS ) { begin = "-----BEGIN TTS PRIVATE KEY-----\n"; end = "-----END TTS PRIVATE KEY-----\n"; } else #endif #if defined(__TTS_2__) if ( pk_get_type( key ) == OUR_PK_TTS2 ) { begin = "-----BEGIN TTS2 PRIVATE KEY-----\n"; end = "-----END TTS2 PRIVATE KEY-----\n"; } else #endif #if defined(__RAINBOW__) if ( pk_get_type( key ) == OUR_PK_RAINBOW ) { begin = "-----BEGIN RAINBOW PRIVATE KEY-----\n"; end = "-----END RAINBOW PRIVATE KEY-----\n"; } else #endif #if defined(__RAINBOW_2__) if ( pk_get_type( key ) == OUR_PK_RAINBOW2 ) { begin = "-----BEGIN RAINBOW2 PRIVATE KEY-----\n"; end = "-----END RAINBOW2 PRIVATE KEY-----\n"; } else #endif return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE ); if( ( ret = pem_write_buffer( begin, end, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); }