mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
fixed bug in keypair generation
git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-OpenPGP@5263 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
efa5460a52
commit
e723c8739d
@ -299,10 +299,12 @@ bool PGPHandler::availableGPGCertificatesWithPrivateKeys(std::list<PGPIdType>& i
|
|||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PGPHandler::GeneratePGPCertificate(const std::string& name, const std::string& email, const std::string& passwd, PGPIdType& pgpId, std::string& errString)
|
bool PGPHandler::GeneratePGPCertificate(const std::string& name, const std::string& email, const std::string& passphrase, PGPIdType& pgpId, std::string& errString)
|
||||||
{
|
{
|
||||||
static const int KEY_NUMBITS = 2048 ;
|
static const int KEY_NUMBITS = 2048 ;
|
||||||
|
|
||||||
|
// 1 - generate keypair - RSA-2048
|
||||||
|
//
|
||||||
ops_user_id_t uid ;
|
ops_user_id_t uid ;
|
||||||
char *s = strdup((name + " " + email + " (Generated by RetroShare)").c_str()) ;
|
char *s = strdup((name + " " + email + " (Generated by RetroShare)").c_str()) ;
|
||||||
uid.user_id = (unsigned char *)s ;
|
uid.user_id = (unsigned char *)s ;
|
||||||
@ -315,10 +317,6 @@ bool PGPHandler::GeneratePGPCertificate(const std::string& name, const std::stri
|
|||||||
if(!key)
|
if(!key)
|
||||||
return false ;
|
return false ;
|
||||||
|
|
||||||
// 1 - get a passphrase for encrypting.
|
|
||||||
|
|
||||||
std::string passphrase = _passphrase_callback(NULL,PGPIdType(key->key_id).toStdString().c_str(),"Please enter passwd for encrypting your key : ",false) ;
|
|
||||||
|
|
||||||
// 2 - save the private key encrypted to a temporary memory buffer
|
// 2 - save the private key encrypted to a temporary memory buffer
|
||||||
|
|
||||||
ops_create_info_t *cinfo = NULL ;
|
ops_create_info_t *cinfo = NULL ;
|
||||||
@ -327,12 +325,10 @@ bool PGPHandler::GeneratePGPCertificate(const std::string& name, const std::stri
|
|||||||
|
|
||||||
ops_write_transferable_secret_key(key,(unsigned char *)passphrase.c_str(),passphrase.length(),ops_false,cinfo);
|
ops_write_transferable_secret_key(key,(unsigned char *)passphrase.c_str(),passphrase.length(),ops_false,cinfo);
|
||||||
|
|
||||||
ops_keydata_free(key) ;
|
|
||||||
|
|
||||||
// 3 - read the file into a keyring
|
// 3 - read the file into a keyring
|
||||||
|
|
||||||
ops_keyring_t *tmp_keyring = allocateOPSKeyring() ;
|
ops_keyring_t *tmp_secring = allocateOPSKeyring() ;
|
||||||
if(! ops_keyring_read_from_mem(tmp_keyring, ops_false, buf))
|
if(! ops_keyring_read_from_mem(tmp_secring, ops_false, buf))
|
||||||
{
|
{
|
||||||
std::cerr << "(EE) Cannot re-read key from memory!!" << std::endl;
|
std::cerr << "(EE) Cannot re-read key from memory!!" << std::endl;
|
||||||
return false ;
|
return false ;
|
||||||
@ -341,31 +337,40 @@ bool PGPHandler::GeneratePGPCertificate(const std::string& name, const std::stri
|
|||||||
|
|
||||||
// 4 - copy the private key to the private keyring
|
// 4 - copy the private key to the private keyring
|
||||||
|
|
||||||
pgpId = PGPIdType(tmp_keyring->keys[0].key_id) ;
|
pgpId = PGPIdType(tmp_secring->keys[0].key_id) ;
|
||||||
addNewKeyToOPSKeyring(_secring,tmp_keyring->keys[0]) ;
|
addNewKeyToOPSKeyring(_secring,tmp_secring->keys[0]) ;
|
||||||
initCertificateInfo(_secret_keyring_map[ pgpId.toStdString() ],&tmp_keyring->keys[0],_secring->nkeys-1) ;
|
initCertificateInfo(_secret_keyring_map[ pgpId.toStdString() ],&tmp_secring->keys[0],_secring->nkeys-1) ;
|
||||||
|
|
||||||
#ifdef DEBUG_PGPHANDLER
|
#ifdef DEBUG_PGPHANDLER
|
||||||
std::cerr << "Added new secret key with id " << pgpId.toStdString() << " to secret keyring." << std::endl;
|
std::cerr << "Added new secret key with id " << pgpId.toStdString() << " to secret keyring." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
ops_keyring_free(tmp_secring) ;
|
||||||
|
free(tmp_secring) ;
|
||||||
|
|
||||||
// 5 - copy the private key to the public keyring
|
// 5 - copy the private key to the public keyring
|
||||||
|
|
||||||
addNewKeyToOPSKeyring(_pubring,tmp_keyring->keys[0]) ;
|
ops_setup_memory_write(&cinfo, &buf, 0);
|
||||||
initCertificateInfo(_public_keyring_map[ pgpId.toStdString() ],&tmp_keyring->keys[0],_pubring->nkeys-1) ;
|
ops_write_transferable_public_key(key, ops_false, cinfo);
|
||||||
|
|
||||||
|
ops_keyring_t *tmp_pubring = allocateOPSKeyring() ;
|
||||||
|
if(! ops_keyring_read_from_mem(tmp_pubring, ops_false, buf))
|
||||||
|
{
|
||||||
|
std::cerr << "(EE) Cannot re-read key from memory!!" << std::endl;
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
ops_teardown_memory_write(cinfo,buf); // cleanup memory
|
||||||
|
|
||||||
|
addNewKeyToOPSKeyring(_pubring,tmp_pubring->keys[0]) ;
|
||||||
|
initCertificateInfo(_public_keyring_map[ pgpId.toStdString() ],&tmp_pubring->keys[0],_pubring->nkeys-1) ;
|
||||||
|
|
||||||
#ifdef DEBUG_PGPHANDLER
|
#ifdef DEBUG_PGPHANDLER
|
||||||
std::cerr << "Added new public key with id " << pgpId.toStdString() << " to public keyring." << std::endl;
|
std::cerr << "Added new public key with id " << pgpId.toStdString() << " to public keyring." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 6 - clean
|
// 6 - clean
|
||||||
|
ops_keydata_free(key) ;
|
||||||
|
|
||||||
ops_keyring_free(tmp_keyring) ;
|
// 7 - Update flags.
|
||||||
free(tmp_keyring) ;
|
|
||||||
|
|
||||||
// 7 - validate own signature and update certificate.
|
|
||||||
|
|
||||||
// validateAndUpdateSignatures(_public_keyring_map[ pgpId.toStdString() ],getPublicKey(pgpId)) ;
|
|
||||||
|
|
||||||
_pubring_changed = true ;
|
_pubring_changed = true ;
|
||||||
_secring_changed = true ;
|
_secring_changed = true ;
|
||||||
@ -546,6 +551,13 @@ bool PGPHandler::encryptTextToFile(const PGPIdType& key_id,const std::string& te
|
|||||||
std::cerr << "Cannot get public key of id " << key_id.toStdString() << std::endl;
|
std::cerr << "Cannot get public key of id " << key_id.toStdString() << std::endl;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(public_key->type != OPS_PTAG_CT_PUBLIC_KEY)
|
||||||
|
{
|
||||||
|
std::cerr << "PGPHandler::encryptTextToFile(): ERROR: supplied id did not return a public key!" << outfile << std::endl;
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
std::cerr << "PGPHandler::encryptTextToFile(): ERROR: Cannot write to " << outfile << std::endl;
|
std::cerr << "PGPHandler::encryptTextToFile(): ERROR: Cannot write to " << outfile << std::endl;
|
||||||
@ -791,7 +803,7 @@ bool PGPHandler::privateTrustCertificate(const PGPIdType& id,int trustlvl)
|
|||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( it->second._validLvl != (int)trustlvl )
|
if( (int)it->second._validLvl != trustlvl )
|
||||||
_trustdb_changed = true ;
|
_trustdb_changed = true ;
|
||||||
|
|
||||||
it->second._validLvl = trustlvl ;
|
it->second._validLvl = trustlvl ;
|
||||||
@ -908,12 +920,9 @@ bool PGPHandler::locked_syncPublicKeyring()
|
|||||||
librs::util::ConvertUtf8ToUtf16(_pubring_path, wfullname);
|
librs::util::ConvertUtf8ToUtf16(_pubring_path, wfullname);
|
||||||
if(-1 == _wstati64(wfullname.c_str(), &buf))
|
if(-1 == _wstati64(wfullname.c_str(), &buf))
|
||||||
#else
|
#else
|
||||||
if(-1 == stat64(_pubring_path.c_str(), &buf))
|
if(-1 == stat64(_pubring_path.c_str(), &buf))
|
||||||
#endif
|
#endif
|
||||||
{
|
std::cerr << "PGPHandler::syncDatabase(): can't stat file " << _pubring_path << ". Can't sync public keyring." << std::endl;
|
||||||
std::cerr << "PGPHandler::syncDatabase(): can't stat file " << _pubring_path << ". Can't sync public keyring." << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_pubring_last_update_time < buf.st_mtime)
|
if(_pubring_last_update_time < buf.st_mtime)
|
||||||
{
|
{
|
||||||
@ -946,12 +955,10 @@ bool PGPHandler::locked_syncSecretKeyring()
|
|||||||
librs::util::ConvertUtf8ToUtf16(_secring_path, wfullname);
|
librs::util::ConvertUtf8ToUtf16(_secring_path, wfullname);
|
||||||
if(-1 == _wstati64(wfullname.c_str(), &buf))
|
if(-1 == _wstati64(wfullname.c_str(), &buf))
|
||||||
#else
|
#else
|
||||||
if(-1 == stat64(_secring_path.c_str(), &buf))
|
if(-1 == stat64(_secring_path.c_str(), &buf))
|
||||||
#endif
|
#endif
|
||||||
{
|
std::cerr << "PGPHandler::syncDatabase(): can't stat file " << _secring_path << ". Can't sync secret keyring." << std::endl;
|
||||||
std::cerr << "PGPHandler::syncDatabase(): can't stat file " << _secring_path << ". Can't sync secret keyring." << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#ifdef TODO
|
#ifdef TODO
|
||||||
if(_secring_last_update_time < buf.st_mtime)
|
if(_secring_last_update_time < buf.st_mtime)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user