mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-22 20:59:45 -04:00
fixed compilation and several problems following separation of public/private keys
This commit is contained in:
parent
590be092e5
commit
a2ca0385db
16 changed files with 291 additions and 523 deletions
|
@ -174,17 +174,6 @@ bool GxsSecurity::checkPublicKey(const RsTlvPublicRSAKey &key)
|
|||
return true ;
|
||||
}
|
||||
|
||||
static void setRSAPrivateKeyData(RsTlvSecurityKey_deprecated & key, RSA *rsa_priv)
|
||||
{
|
||||
unsigned char *data = NULL ;
|
||||
int reqspace = i2d_RSAPrivateKey(rsa_priv, &data);
|
||||
|
||||
key.keyData.setBinData(data, reqspace);
|
||||
key.keyId = getRsaKeyFingerprint(rsa_priv);
|
||||
|
||||
free(data) ;
|
||||
}
|
||||
|
||||
bool GxsSecurity::generateKeyPair(RsTlvPublicRSAKey& public_key,RsTlvPrivateRSAKey& private_key)
|
||||
{
|
||||
// admin keys
|
||||
|
@ -991,8 +980,7 @@ bool GxsSecurity::validateNxsGrp(const RsNxsGrp& grp, const RsTlvKeySignature& s
|
|||
#endif
|
||||
|
||||
/* extract admin key */
|
||||
#warning Souldn't need to do that HERE!!
|
||||
RSA *rsakey = (key.keyFlags & RSTLV_KEY_TYPE_FULL)? d2i_RSAPrivateKey(NULL, &(keyptr), keylen): d2i_RSAPublicKey(NULL, &(keyptr), keylen);
|
||||
RSA *rsakey = d2i_RSAPublicKey(NULL, &(keyptr), keylen);
|
||||
|
||||
if (!rsakey)
|
||||
{
|
||||
|
@ -1067,4 +1055,21 @@ bool GxsSecurity::validateNxsGrp(const RsNxsGrp& grp, const RsTlvKeySignature& s
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
void GxsSecurity::createPublicKeysFromPrivateKeys(RsTlvSecurityKeySet& keyset)
|
||||
{
|
||||
for( std::map<RsGxsId, RsTlvPrivateRSAKey>::const_iterator it = keyset.private_keys.begin(); it != keyset.private_keys.end() ; ++it)
|
||||
if(keyset.public_keys.find(it->second.keyId) == keyset.public_keys.end())
|
||||
{
|
||||
RsTlvPublicRSAKey pub_key ;
|
||||
|
||||
if(!extractPublicKey(it->second,pub_key))
|
||||
{
|
||||
std::cerr << "(EE) ERROR when trying to generate public key from private key for ID " << it->second.keyId << ". This is probably a bug with security implications." << std::endl;
|
||||
continue ;
|
||||
}
|
||||
|
||||
keyset.public_keys[it->second.keyId] = pub_key ;
|
||||
|
||||
std::cerr << "(II) Generated missing public key for ID " << it->second.keyId << " from private key." << std::endl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -125,6 +125,15 @@ class GxsSecurity
|
|||
|
||||
static bool checkPublicKey(const RsTlvPublicRSAKey &key);
|
||||
static bool checkPrivateKey(const RsTlvPrivateRSAKey &key);
|
||||
|
||||
/*!
|
||||
* Adds possibly missing public keys when private keys are present.
|
||||
*
|
||||
* \brief createPublicKeysForPrivateKeys
|
||||
* \param set set of keys to consider
|
||||
* \return
|
||||
*/
|
||||
static void createPublicKeysFromPrivateKeys(RsTlvSecurityKeySet& set) ;
|
||||
};
|
||||
|
||||
#endif // GXSSECURITY_H
|
||||
|
|
|
@ -373,20 +373,6 @@ void RsGenExchange::generateGroupKeys(RsTlvSecurityKeySet& keySet, bool genPubli
|
|||
}
|
||||
}
|
||||
|
||||
void RsGenExchange::generatePublicFromPrivateKeys(RsTlvSecurityKeySet& keySet)
|
||||
{
|
||||
// actually just copy settings of one key except mark its key flags public
|
||||
|
||||
keySet.public_keys.clear() ;
|
||||
|
||||
for(std::map<RsGxsId, RsTlvPrivateRSAKey>::const_iterator cit=keySet.private_keys.begin(); cit != keySet.private_keys.end(); ++cit)
|
||||
{
|
||||
RsTlvPublicRSAKey pubkey ;
|
||||
if(GxsSecurity::extractPublicKey(cit->second,pubkey))
|
||||
keySet.public_keys.insert(std::make_pair(pubkey.keyId, pubkey));
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t RsGenExchange::createGroup(RsNxsGrp *grp, RsTlvSecurityKeySet& keySet)
|
||||
{
|
||||
#ifdef GEN_EXCH_DEBUG
|
||||
|
@ -2166,7 +2152,9 @@ void RsGenExchange::processGroupUpdatePublish()
|
|||
if(checkKeys(meta->keys))
|
||||
{
|
||||
ggps.mKeys = meta->keys;
|
||||
generatePublicFromPrivateKeys(ggps.mKeys);
|
||||
|
||||
GxsSecurity::createPublicKeysFromPrivateKeys(ggps.mKeys) ;
|
||||
|
||||
ggps.mHaveKeys = true;
|
||||
ggps.mStartTS = time(NULL);
|
||||
ggps.mLastAttemptTS = 0;
|
||||
|
@ -2581,29 +2569,30 @@ RsGeneralDataService* RsGenExchange::getDataStore()
|
|||
|
||||
bool RsGenExchange::getGroupKeys(const RsGxsGroupId &grpId, RsTlvSecurityKeySet &keySet)
|
||||
{
|
||||
if(grpId.isNull())
|
||||
return false;
|
||||
if(grpId.isNull())
|
||||
return false;
|
||||
|
||||
RS_STACK_MUTEX(mGenMtx) ;
|
||||
RS_STACK_MUTEX(mGenMtx) ;
|
||||
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMeta;
|
||||
grpMeta[grpId] = NULL;
|
||||
mDataStore->retrieveGxsGrpMetaData(grpMeta);
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMeta;
|
||||
grpMeta[grpId] = NULL;
|
||||
mDataStore->retrieveGxsGrpMetaData(grpMeta);
|
||||
|
||||
if(grpMeta.empty())
|
||||
return false;
|
||||
if(grpMeta.empty())
|
||||
return false;
|
||||
|
||||
RsGxsGrpMetaData* meta = grpMeta[grpId];
|
||||
RsGxsGrpMetaData* meta = grpMeta[grpId];
|
||||
|
||||
if(meta == NULL)
|
||||
return false;
|
||||
if(meta == NULL)
|
||||
return false;
|
||||
|
||||
keySet = meta->keys;
|
||||
keySet = meta->keys;
|
||||
GxsSecurity::createPublicKeysFromPrivateKeys(keySet) ;
|
||||
|
||||
for(std::map<RsGxsGroupId, RsGxsGrpMetaData*>::iterator it=grpMeta.begin();it!=grpMeta.end();++it)
|
||||
delete it->second ;
|
||||
for(std::map<RsGxsGroupId, RsGxsGrpMetaData*>::iterator it=grpMeta.begin();it!=grpMeta.end();++it)
|
||||
delete it->second ;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void RsGenExchange::shareGroupPublishKey(const RsGxsGroupId& grpId,const std::set<RsPeerId>& peers)
|
||||
|
|
|
@ -743,15 +743,6 @@ private:
|
|||
*/
|
||||
void generateGroupKeys(RsTlvSecurityKeySet& keySet, bool genPublishKeys);
|
||||
|
||||
/*!
|
||||
* Generate public set of keys from their private counterparts
|
||||
* No keys will be generated if one fails
|
||||
* @param privatekeySet contains private generated keys
|
||||
* @param publickeySet contains public generated keys (counterpart of private)
|
||||
* @return false if key gen failed for a key set
|
||||
*/
|
||||
void generatePublicFromPrivateKeys(RsTlvSecurityKeySet& keySet);
|
||||
|
||||
/*!
|
||||
* Attempts to validate msg signatures
|
||||
* @param msg message to be validated
|
||||
|
|
|
@ -4877,7 +4877,7 @@ void RsGxsNetService::sharePublishKeysPending()
|
|||
publishKeyItem->clear();
|
||||
publishKeyItem->grpId = mit->first;
|
||||
|
||||
publishKeyItem->key = publishKey ;
|
||||
publishKeyItem->private_key = publishKey ;
|
||||
publishKeyItem->PeerId(*it);
|
||||
|
||||
sendItem(publishKeyItem);
|
||||
|
@ -4932,8 +4932,8 @@ void RsGxsNetService::handleRecvPublishKeys(RsNxsGroupPublishKeyItem *item)
|
|||
GXSNETDEBUG_PG(item->PeerId(),item->grpId)<< " Key received: " << std::endl;
|
||||
#endif
|
||||
|
||||
bool admin = (item->key.keyFlags & RSTLV_KEY_DISTRIB_ADMIN) && (item->key.keyFlags & RSTLV_KEY_TYPE_FULL) ;
|
||||
bool publi = (item->key.keyFlags & RSTLV_KEY_DISTRIB_PUBLISH) && (item->key.keyFlags & RSTLV_KEY_TYPE_FULL) ;
|
||||
bool admin = (item->private_key.keyFlags & RSTLV_KEY_DISTRIB_ADMIN) && (item->private_key.keyFlags & RSTLV_KEY_TYPE_FULL) ;
|
||||
bool publi = (item->private_key.keyFlags & RSTLV_KEY_DISTRIB_PUBLISH) && (item->private_key.keyFlags & RSTLV_KEY_TYPE_FULL) ;
|
||||
|
||||
#ifdef NXS_NET_DEBUG_3
|
||||
GXSNETDEBUG_PG(item->PeerId(),item->grpId)<< " Key id = " << item->key.keyId << " admin=" << admin << ", publish=" << publi << " ts=" << item->key.endTS << std::endl;
|
||||
|
@ -4946,13 +4946,13 @@ void RsGxsNetService::handleRecvPublishKeys(RsNxsGroupPublishKeyItem *item)
|
|||
}
|
||||
// Also check that we don't already have full keys for that group.
|
||||
|
||||
if(grpMeta->keys.public_keys.find(item->key.keyId) == grpMeta->keys.public_keys.end())
|
||||
if(grpMeta->keys.public_keys.find(item->private_key.keyId) == grpMeta->keys.public_keys.end())
|
||||
{
|
||||
std::cerr << " (EE) Key not found in known group keys. This is an inconsistency." << std::endl;
|
||||
return ;
|
||||
}
|
||||
|
||||
if(grpMeta->keys.private_keys.find(item->key.keyId) != grpMeta->keys.private_keys.end())
|
||||
if(grpMeta->keys.private_keys.find(item->private_key.keyId) != grpMeta->keys.private_keys.end())
|
||||
{
|
||||
#ifdef NXS_NET_DEBUG_3
|
||||
GXSNETDEBUG_PG(item->PeerId(),item->grpId)<< " (EE) Publish key already present in database. Discarding message." << std::endl;
|
||||
|
@ -4962,7 +4962,7 @@ void RsGxsNetService::handleRecvPublishKeys(RsNxsGroupPublishKeyItem *item)
|
|||
|
||||
// Store/update the info.
|
||||
|
||||
grpMeta->keys.private_keys[item->key.keyId] = item->key ;
|
||||
grpMeta->keys.private_keys[item->private_key.keyId] = item->private_key ;
|
||||
|
||||
bool ret = mDataStore->updateGroupKeys(item->grpId,grpMeta->keys, grpMeta->mSubscribeFlags | GXS_SERV::GROUP_SUBSCRIBE_PUBLISH) ;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue