2009-07-23 01:06 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
+ contrib/hbssl/tests/pem.prg
+ contrib/hbssl/tests/privkey.pem
* contrib/hbssl/pem.c
+ Added these public/private key loading functions:
PEM_READ_BIO_PRIVATEKEY()
PEM_READ_BIO_PUBKEY()
PEM_READ_BIO_RSAPRIVATEKEY()
PEM_READ_BIO_RSAPUBLICKEY()
PEM_READ_BIO_RSA_PUBKEY()
PEM_READ_BIO_DSAPRIVATEKEY()
PEM_READ_BIO_DSA_PUBKEY()
PEM_READ_BIO_DSAPARAMS()
PEM_READ_BIO_DHPARAMS()
PEM_READ_BIO_X509()
PEM_READ_BIO_X509_AUX()
PEM_READ_BIO_X509_REQ()
PEM_READ_BIO_X509_CRL()
PEM_READ_BIO_PKCS7()
Usage:
PEM_READ_BIO_*( <ptrBIO> | <cFileName> | <fhnd>, <bPasswordCB> | <cPassword> ) -> ptr | NULL
To load from memory, BIO_new_mem_buf() can be used, see in test.
<bPasswordCB> is a codeblock which receive a logical parameter indicating
write/read mode (.T. = write) a returns password as string or else (like NIL) for failure.
This commit is contained in:
@@ -17,6 +17,31 @@
|
||||
past entries belonging to author(s): Viktor Szakats.
|
||||
*/
|
||||
|
||||
2009-07-23 01:06 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
+ contrib/hbssl/tests/pem.prg
|
||||
+ contrib/hbssl/tests/privkey.pem
|
||||
* contrib/hbssl/pem.c
|
||||
+ Added these public/private key loading functions:
|
||||
PEM_READ_BIO_PRIVATEKEY()
|
||||
PEM_READ_BIO_PUBKEY()
|
||||
PEM_READ_BIO_RSAPRIVATEKEY()
|
||||
PEM_READ_BIO_RSAPUBLICKEY()
|
||||
PEM_READ_BIO_RSA_PUBKEY()
|
||||
PEM_READ_BIO_DSAPRIVATEKEY()
|
||||
PEM_READ_BIO_DSA_PUBKEY()
|
||||
PEM_READ_BIO_DSAPARAMS()
|
||||
PEM_READ_BIO_DHPARAMS()
|
||||
PEM_READ_BIO_X509()
|
||||
PEM_READ_BIO_X509_AUX()
|
||||
PEM_READ_BIO_X509_REQ()
|
||||
PEM_READ_BIO_X509_CRL()
|
||||
PEM_READ_BIO_PKCS7()
|
||||
Usage:
|
||||
PEM_READ_BIO_*( <ptrBIO> | <cFileName> | <fhnd>, <bPasswordCB> | <cPassword> ) -> ptr | NULL
|
||||
To load from memory, BIO_new_mem_buf() can be used, see in test.
|
||||
<bPasswordCB> is a codeblock which receive a logical parameter indicating
|
||||
write/read mode (.T. = write) a returns password as string or else (like NIL) for failure.
|
||||
|
||||
2009-07-22 22:10 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* config/global.cf
|
||||
! Fixed GTSLN exclusion if HB_COMMERCE is set.
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
#include "hbssl.h"
|
||||
|
||||
/* ---------------------------------------------------------------------------- */
|
||||
/* Callbacks */
|
||||
/* Callback */
|
||||
|
||||
static int hb_ssl_pem_password_cb( char * buf, int size, int rwflag, void * userdata )
|
||||
{
|
||||
@@ -66,19 +66,22 @@ static int hb_ssl_pem_password_cb( char * buf, int size, int rwflag, void * user
|
||||
|
||||
if( size > 0 && userdata )
|
||||
{
|
||||
PHB_ITEM p = hb_itemPutNI( NULL, rwflag );
|
||||
PHB_ITEM p = hb_itemPutL( NULL, rwflag );
|
||||
PHB_ITEM r = hb_vmEvalBlockV( ( PHB_ITEM ) userdata, 1, p );
|
||||
|
||||
hb_itemRelease( p );
|
||||
|
||||
buf[ 0 ] = '\0';
|
||||
|
||||
retsize = hb_itemGetCLen( r );
|
||||
|
||||
if( retsize > size )
|
||||
retsize = size;
|
||||
if( retsize > 0 )
|
||||
{
|
||||
if( retsize > size )
|
||||
retsize = size;
|
||||
|
||||
memcpy( buf, hb_itemGetCPtr( r ), retsize );
|
||||
|
||||
hb_itemRelease( p );
|
||||
memcpy( buf, hb_itemGetCPtr( r ), retsize );
|
||||
}
|
||||
}
|
||||
|
||||
return retsize;
|
||||
@@ -89,12 +92,15 @@ HB_FUNC( ERR_LOAD_PEM_STRINGS )
|
||||
ERR_load_PEM_strings();
|
||||
}
|
||||
|
||||
HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY )
|
||||
typedef void * PEM_READ_BIO( BIO * bp, void ** x, pem_password_cb * cb, void * u );
|
||||
typedef void * PEM_WRITE_BIO( BIO * bp, void ** x, pem_password_cb * cb, void * u );
|
||||
|
||||
static void hb_PEM_read_bio( PEM_READ_BIO * func )
|
||||
{
|
||||
BIO * bio;
|
||||
|
||||
if( HB_ISPOINTER( 1 ) )
|
||||
bio = hb_parptr( 1 );
|
||||
bio = ( BIO * ) hb_parptr( 1 );
|
||||
else if( HB_ISCHAR( 1 ) )
|
||||
bio = BIO_new_file( hb_parc( 1 ), "r" );
|
||||
else if( HB_ISNUM( 1 ) )
|
||||
@@ -109,47 +115,13 @@ HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY )
|
||||
if( HB_ISBLOCK( 2 ) )
|
||||
{
|
||||
pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
|
||||
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
|
||||
hb_retptr( ( * func )( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
|
||||
}
|
||||
else if( HB_ISCHAR( 2 ) )
|
||||
/* NOTE: Dropping 'const' qualifier. [vszakats] */
|
||||
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
|
||||
|
||||
if( pPassBlock )
|
||||
hb_itemRelease( pPassBlock );
|
||||
|
||||
if( ! HB_ISPOINTER( 1 ) )
|
||||
BIO_free( bio );
|
||||
}
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY )
|
||||
{
|
||||
BIO * bio;
|
||||
|
||||
if( HB_ISPOINTER( 1 ) )
|
||||
bio = hb_parptr( 1 );
|
||||
else if( HB_ISCHAR( 1 ) )
|
||||
bio = BIO_new_file( hb_parc( 1 ), "r" );
|
||||
else if( HB_ISNUM( 1 ) )
|
||||
bio = BIO_new_fd( hb_parni( 1 ), BIO_NOCLOSE );
|
||||
else
|
||||
bio = NULL;
|
||||
|
||||
if( bio )
|
||||
{
|
||||
PHB_ITEM pPassBlock = NULL;
|
||||
|
||||
if( HB_ISBLOCK( 2 ) )
|
||||
{
|
||||
pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
|
||||
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
|
||||
}
|
||||
else if( HB_ISCHAR( 2 ) )
|
||||
/* NOTE: Dropping 'const' qualifier. [vszakats] */
|
||||
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
|
||||
hb_retptr( ( * func )( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
|
||||
}
|
||||
|
||||
if( pPassBlock )
|
||||
hb_itemRelease( pPassBlock );
|
||||
@@ -161,39 +133,39 @@ HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY )
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( PEM_READ_BIO_PRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PrivateKey ); }
|
||||
HB_FUNC( PEM_READ_BIO_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PUBKEY ); }
|
||||
HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSAPrivateKey ); }
|
||||
HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSAPublicKey ); }
|
||||
HB_FUNC( PEM_READ_BIO_RSA_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSA_PUBKEY ); }
|
||||
HB_FUNC( PEM_READ_BIO_DSAPRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSAPrivateKey ); }
|
||||
HB_FUNC( PEM_READ_BIO_DSA_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSA_PUBKEY ); }
|
||||
HB_FUNC( PEM_READ_BIO_DSAPARAMS ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSAparams ); }
|
||||
HB_FUNC( PEM_READ_BIO_DHPARAMS ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DHparams ); }
|
||||
HB_FUNC( PEM_READ_BIO_X509 ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509 ); }
|
||||
HB_FUNC( PEM_READ_BIO_X509_AUX ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_AUX ); }
|
||||
HB_FUNC( PEM_READ_BIO_X509_REQ ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_REQ ); }
|
||||
HB_FUNC( PEM_READ_BIO_X509_CRL ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_CRL ); }
|
||||
HB_FUNC( PEM_READ_BIO_PKCS7 ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PKCS7 ); }
|
||||
|
||||
#if 0
|
||||
|
||||
EVP_PKEY * PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
|
||||
EVP_PKEY * PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
|
||||
RSA * PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
|
||||
RSA * PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
|
||||
RSA * PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
|
||||
DSA * PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
|
||||
DSA * PEM_read_bio_DSA_PUBKEY(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
|
||||
DSA * PEM_read_bio_DSAparams(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
|
||||
DH * PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u);
|
||||
X509 * PEM_read_bio_X509(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
|
||||
X509 * PEM_read_bio_X509_AUX(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
|
||||
X509_REQ * PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u);
|
||||
X509_CRL * PEM_read_bio_X509_CRL(BIO *bp, X509_CRL **x, pem_password_cb *cb, void *u);
|
||||
PKCS7 * PEM_read_bio_PKCS7(BIO *bp, PKCS7 **x, pem_password_cb *cb, void *u);
|
||||
|
||||
int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
|
||||
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
|
||||
int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);
|
||||
int PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_DSA_PUBKEY(BIO *bp, DSA *x);
|
||||
int PEM_write_bio_DSAparams(BIO *bp, DSA *x);
|
||||
int PEM_write_bio_DHparams(BIO *bp, DH *x);
|
||||
int PEM_write_bio_X509(BIO *bp, X509 *x);
|
||||
int PEM_write_bio_X509_AUX(BIO *bp, X509 *x);
|
||||
int PEM_write_bio_X509_REQ(BIO *bp, X509_REQ *x);
|
||||
int PEM_write_bio_X509_REQ_NEW(BIO *bp, X509_REQ *x);
|
||||
int PEM_write_bio_X509_CRL(BIO *bp, X509_CRL *x);
|
||||
int PEM_write_bio_PKCS7(BIO *bp, PKCS7 *x);
|
||||
int PEM_write_bio_RSAPrivateKey( BIO *bp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_DSAPrivateKey( BIO *bp, DSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PrivateKey( BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PKCS8PrivateKey( BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr , int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid , char *kstr , int klen, pem_password_cb *cb, void *u);
|
||||
int PEM_write_bio_PUBKEY( BIO *bp, EVP_PKEY *x);
|
||||
int PEM_write_bio_RSAPublicKey( BIO *bp, RSA *x);
|
||||
int PEM_write_bio_RSA_PUBKEY( BIO *bp, RSA *x);
|
||||
int PEM_write_bio_DSA_PUBKEY( BIO *bp, DSA *x);
|
||||
int PEM_write_bio_DSAparams( BIO *bp, DSA *x);
|
||||
int PEM_write_bio_DHparams( BIO *bp, DH *x);
|
||||
int PEM_write_bio_X509( BIO *bp, X509 *x);
|
||||
int PEM_write_bio_X509_AUX( BIO *bp, X509 *x);
|
||||
int PEM_write_bio_X509_REQ( BIO *bp, X509_REQ *x);
|
||||
int PEM_write_bio_X509_REQ_NEW( BIO *bp, X509_REQ *x);
|
||||
int PEM_write_bio_X509_CRL( BIO *bp, X509_CRL *x);
|
||||
int PEM_write_bio_PKCS7( BIO *bp, PKCS7 *x);
|
||||
|
||||
#endif
|
||||
|
||||
54
harbour/contrib/hbssl/tests/pem.prg
Normal file
54
harbour/contrib/hbssl/tests/pem.prg
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright 2009 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* www - http://www.harbour-project.org
|
||||
*/
|
||||
|
||||
#include "simpleio.ch"
|
||||
|
||||
#include "hbssl.ch"
|
||||
|
||||
PROCEDURE Main()
|
||||
LOCAL cString
|
||||
LOCAL bio
|
||||
|
||||
? ERR_load_PEM_strings()
|
||||
? OpenSSL_add_all_algorithms()
|
||||
|
||||
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
|
||||
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", "test" )
|
||||
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
|
||||
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", "test" )
|
||||
|
||||
#pragma __cstream|cString:=%s
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
Proc-Type: 4,ENCRYPTED
|
||||
DEK-Info: DES-EDE3-CBC,7EDF8C06409FC8D1
|
||||
|
||||
w2i5vWLCOvrExPC4+FMwGQBwxXdGE7FY5Jgr6UstEN+b6l7UVSdRXEkT/Ng6RDZF
|
||||
jViFPKBSrTAzEnvyNesqPBZMwRPKSEZSj+XcS/dHoz7hrbFTNBzKmDL8CJ67k2Lw
|
||||
4UwtTtmTkU6L++NTfP6ImvxfaQYCkFK9D42qB7pzAAA27aGZMJCotECqVrekeCed
|
||||
Tx7EMa7Vf2ToGTsvHBphy7Nwe/8Kijdb0wQIj0ZQWGa2vkYjICauAz9vfOv1xaXe
|
||||
+H90c6xhVqRCv0uum3pGkqsrdJm0mBnr1gstFEDI+S1Lwr80WWBSQjCBsytfxc8j
|
||||
dNXG8qXm59/n01vfHaZTtStd6mVa+eJwNRMHP0pisoxCTBPTtF/LOaZvOlbYB+r4
|
||||
Hbxs5Bp0+YZp9RIipA3uagvtcTk7oHzx6v72amd3egli/DL1OY/ZjvVzHe9/dh6K
|
||||
LZE2mpAHXtnHe8Rlg4CSPMvyFgN2OZXfbc64FjZcglldIoLwhr7kuLzb0zWv8sOz
|
||||
jOO+uKNzyjDl5R2ay9YCANUpWVGOrpRrU6C/TzbltcxyEVKk8riKAKCsYf+De3Ee
|
||||
SwPgouYGV8RgfzAwhwesibA1By1cLS/alCESH+9P2R39VHPB7MzjLc8FyNe3xAQJ
|
||||
VGue9TIkMgy7RW1VFWLcLsCArTEAl83bv+BQ+YaPp9aLNq8bL5vfU2od0R7LXIOe
|
||||
jH09fWcojNNLfmZU0Jzy7viUiScTtNqpqoH0qPI1hkisvELqXKhW1Lpkr56Ij8IL
|
||||
B0NDIZKbaPJHHPb9Ne7nQECzv0/kzmAley9UMTZ1M7fq6KYemR0LsA==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
ENDTEXT
|
||||
|
||||
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
|
||||
BIO_free( bio )
|
||||
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), "test" )
|
||||
BIO_free( bio )
|
||||
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), "<wrong>" )
|
||||
BIO_free( bio )
|
||||
|
||||
RETURN
|
||||
18
harbour/contrib/hbssl/tests/privkey.pem
Normal file
18
harbour/contrib/hbssl/tests/privkey.pem
Normal file
@@ -0,0 +1,18 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
Proc-Type: 4,ENCRYPTED
|
||||
DEK-Info: DES-EDE3-CBC,7EDF8C06409FC8D1
|
||||
|
||||
w2i5vWLCOvrExPC4+FMwGQBwxXdGE7FY5Jgr6UstEN+b6l7UVSdRXEkT/Ng6RDZF
|
||||
jViFPKBSrTAzEnvyNesqPBZMwRPKSEZSj+XcS/dHoz7hrbFTNBzKmDL8CJ67k2Lw
|
||||
4UwtTtmTkU6L++NTfP6ImvxfaQYCkFK9D42qB7pzAAA27aGZMJCotECqVrekeCed
|
||||
Tx7EMa7Vf2ToGTsvHBphy7Nwe/8Kijdb0wQIj0ZQWGa2vkYjICauAz9vfOv1xaXe
|
||||
+H90c6xhVqRCv0uum3pGkqsrdJm0mBnr1gstFEDI+S1Lwr80WWBSQjCBsytfxc8j
|
||||
dNXG8qXm59/n01vfHaZTtStd6mVa+eJwNRMHP0pisoxCTBPTtF/LOaZvOlbYB+r4
|
||||
Hbxs5Bp0+YZp9RIipA3uagvtcTk7oHzx6v72amd3egli/DL1OY/ZjvVzHe9/dh6K
|
||||
LZE2mpAHXtnHe8Rlg4CSPMvyFgN2OZXfbc64FjZcglldIoLwhr7kuLzb0zWv8sOz
|
||||
jOO+uKNzyjDl5R2ay9YCANUpWVGOrpRrU6C/TzbltcxyEVKk8riKAKCsYf+De3Ee
|
||||
SwPgouYGV8RgfzAwhwesibA1By1cLS/alCESH+9P2R39VHPB7MzjLc8FyNe3xAQJ
|
||||
VGue9TIkMgy7RW1VFWLcLsCArTEAl83bv+BQ+YaPp9aLNq8bL5vfU2od0R7LXIOe
|
||||
jH09fWcojNNLfmZU0Jzy7viUiScTtNqpqoH0qPI1hkisvELqXKhW1Lpkr56Ij8IL
|
||||
B0NDIZKbaPJHHPb9Ne7nQECzv0/kzmAley9UMTZ1M7fq6KYemR0LsA==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Reference in New Issue
Block a user