fixed bug causing a security breach by storing private GXS keys into the public key cache. Added a few asserts to totally remove that possibility. Ideally we should have 2 incompatible key types.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7829 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2015-01-10 07:30:26 +00:00
parent 48e47fabd3
commit c83d27924e
2 changed files with 16 additions and 2 deletions

View File

@ -56,6 +56,8 @@ static RsGxsId getRsaKeyFingerprint(RSA *pubkey)
static RSA *extractPublicKey(const RsTlvSecurityKey& key)
{
assert(!(key.keyFlags & RSTLV_KEY_TYPE_FULL)) ;
const unsigned char *keyptr = (const unsigned char *) key.keyData.bin_data;
long keylen = key.keyData.bin_len;

View File

@ -30,6 +30,7 @@
#include "util/rsrandom.h"
#include "util/rsstring.h"
#include "util/radix64.h"
#include "gxs/gxssecurity.h"
//#include "pqi/authgpg.h"
@ -485,6 +486,7 @@ bool p3IdService::getKey(const RsGxsId &id, RsTlvSecurityKey &key)
key = data.pubkey;
return true;
}
key.keyId.clear() ;
return false;
}
@ -1549,14 +1551,20 @@ bool p3IdService::cache_store(const RsGxsIdGroupItem *item)
{
fullkey = kit->second;
full_key_ok = true;
if(GxsSecurity::extractPublicKey(fullkey,pubkey))
pub_key_ok = true ;
}
else
{
pubkey = kit->second;
pub_key_ok = true ;
}
/* cache public key always
* we don't need to check the keyFlags,
* as both FULL and PUBLIC_ONLY keys contain the PUBLIC key
*/
pubkey = kit->second;
pub_key_ok = true;
}
}
@ -1574,6 +1582,8 @@ bool p3IdService::cache_store(const RsGxsIdGroupItem *item)
RsStackMutex stack(mIdMtx); /********** STACK LOCKED MTX ******/
assert(!(pubkey.keyFlags & RSTLV_KEY_TYPE_FULL)) ;
// Create Cache Data.
RsGxsIdCache pubcache(item, pubkey, tagList);
mPublicKeyCache.store(id, pubcache);
@ -1796,6 +1806,8 @@ bool p3IdService::cache_update_if_cached(const RsGxsId &id, std::string serviceS
std::cerr << std::endl;
#endif // DEBUG_IDS
assert(!(pub_data.pubkey.keyFlags & RSTLV_KEY_TYPE_FULL)) ;
pub_data.updateServiceString(serviceString);
mPublicKeyCache.store(id, pub_data);
}