r3165 - in trunk/libmikey: include/libmikey keyagreement mikey

erik at minisip.org erik at minisip.org
Wed Jan 31 14:13:31 CET 2007


Author: erik
Date: 2007-01-31 14:13:30 +0100 (Wed, 31 Jan 2007)
New Revision: 3165

Modified:
   trunk/libmikey/include/libmikey/KeyAgreementDH.h
   trunk/libmikey/keyagreement/KeyAgreementDH.cxx
   trunk/libmikey/mikey/MikeyMessageDH.cxx
Log:

 * Make D-H key agreement use the MIKEY SmartCard (if it supports
   "MIKEY-on-card").



Modified: trunk/libmikey/include/libmikey/KeyAgreementDH.h
===================================================================
--- trunk/libmikey/include/libmikey/KeyAgreementDH.h	2007-01-30 21:00:51 UTC (rev 3164)
+++ trunk/libmikey/include/libmikey/KeyAgreementDH.h	2007-01-31 13:13:30 UTC (rev 3165)
@@ -28,6 +28,7 @@
 #include<libmikey/libmikey_config.h>
 
 #include<libmikey/KeyAgreement.h>
+#include<libmcrypto/SipSim.h>
 
 #define DH_GROUP_OAKLEY5 0
 #define DH_GROUP_OAKLEY1 1
@@ -59,7 +60,7 @@
 
 class LIBMIKEY_API KeyAgreementDHBase: virtual public ITgk{
 	public:
-		KeyAgreementDHBase();
+		KeyAgreementDHBase(MRef<SipSim* > sim=NULL);
 		~KeyAgreementDHBase();
 
 		int computeTgk();
@@ -74,6 +75,7 @@
 		byte_t * publicKey();
 
 	private:
+		MRef<SipSim*> sim;
 		OakleyDH * dh;
 		byte_t * peerKeyPtr;
 		int peerKeyLengthValue;

Modified: trunk/libmikey/keyagreement/KeyAgreementDH.cxx
===================================================================
--- trunk/libmikey/keyagreement/KeyAgreementDH.cxx	2007-01-30 21:00:51 UTC (rev 3164)
+++ trunk/libmikey/keyagreement/KeyAgreementDH.cxx	2007-01-31 13:13:30 UTC (rev 3165)
@@ -30,6 +30,7 @@
 #include<libmikey/MikeyMessage.h>
 #include<libmcrypto/OakleyDH.h>
 #include<libmcrypto/SipSim.h>
+#include<libmcrypto/SipSimSmartCardGD.h>
 
 using namespace std;
 
@@ -57,22 +58,29 @@
 // 
 // KeyAgreementDHBase
 //
-KeyAgreementDHBase::KeyAgreementDHBase():
+KeyAgreementDHBase::KeyAgreementDHBase(MRef<SipSim *> s):
 	peerKeyPtr( NULL ),
 	peerKeyLengthValue( 0 ),
 	publicKeyPtr( NULL ),
-	publicKeyLengthValue( 0 )
+	publicKeyLengthValue( 0 ),
+	sim(s),
+	dh(NULL)
+
 {
-	dh = new OakleyDH();
-	if( dh == NULL )
-	{
-		throw MikeyException( "Could not create "
-				          "DH parameters." );
+	if (!sim){
+		dh = new OakleyDH();
+		if( dh == NULL )
+		{
+			throw MikeyException( "Could not create "
+					"DH parameters." );
+		}
 	}
+
 }
 
 KeyAgreementDHBase::~KeyAgreementDHBase(){
-	delete dh;
+	if (dh)
+		delete dh;
 	if( peerKeyPtr != NULL ){
 		delete [] peerKeyPtr;
 		peerKeyPtr = NULL;
@@ -107,25 +115,39 @@
 	return KEY_AGREEMENT_TYPE_DH;
 }
 
+
 int KeyAgreementDHBase::setGroup( int groupValue ){
-	if( !dh->setGroup( groupValue ) )
-		return 1;
+	if (dynamic_cast<SipSimSmartCardGD*>(*sim)){
+		SipSimSmartCardGD* gd = dynamic_cast<SipSimSmartCardGD*>(*sim);
 
-	uint32_t len = dh->secretLength();
+		assert (groupValue==DH_GROUP_OAKLEY5);
 
-	if( len != tgkLength() || !tgk() ){
-		setTgk( NULL, len );
-	}
+		publicKeyPtr = new unsigned char[192];
 
-	int32_t length = dh->publicKeyLength();
-	if( length != publicKeyLengthValue ){
-		if( publicKeyPtr ){
-			delete[] publicKeyPtr;
+		unsigned long length;
+		gd->getDHPublicValue(length, publicKeyPtr);
+	}else{
+
+		if( !dh->setGroup( groupValue ) )
+			return 1;
+
+		uint32_t len = dh->secretLength();
+
+		if( len != tgkLength() || !tgk() ){
+			setTgk( NULL, len );
 		}
-		publicKeyLengthValue = length;
-		publicKeyPtr = new unsigned char[ length ];
+
+		int32_t length = dh->publicKeyLength();
+		if( length != publicKeyLengthValue ){
+			if( publicKeyPtr ){
+				delete[] publicKeyPtr;
+			}
+			publicKeyLengthValue = length;
+			publicKeyPtr = new unsigned char[ length ];
+		}
+		dh->getPublicKey( publicKeyPtr, length );
+
 	}
-	dh->getPublicKey( publicKeyPtr, length );
 
 	return 0;
 }
@@ -149,18 +171,32 @@
 	return publicKeyPtr;
 }
 
+
 int KeyAgreementDHBase::computeTgk(){
 	assert( peerKeyPtr );
 
-	int res = dh->computeSecret( peerKeyPtr, peerKeyLengthValue, tgk(), tgkLength() );
-	return res;
+	if (dynamic_cast<SipSimSmartCardGD*>(*sim)){
+		SipSimSmartCardGD *gd = dynamic_cast<SipSimSmartCardGD*>(*sim);
+		unsigned long len;
+		unsigned char *dhval = new unsigned char[192];	//FIXME: fix API to work with unknown key lengths
+		gd->getDHPublicValue(len, dhval);
+		gd->genTgk( dhval, len );
+		return true;
+	}else{
+		int res = dh->computeSecret( peerKeyPtr, peerKeyLengthValue, tgk(), tgkLength() );
+		return res;
+	}
+
 }
 
 int KeyAgreementDHBase::group(){
 	if( !publicKeyPtr )
 		return -1;
 
-	return dh->group();
+	if (sim){
+		return DH_GROUP_OAKLEY5;
+	}else
+		return dh->group();
 }
 
 int KeyAgreementDHBase::peerKeyLength(){

Modified: trunk/libmikey/mikey/MikeyMessageDH.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessageDH.cxx	2007-01-30 21:00:51 UTC (rev 3164)
+++ trunk/libmikey/mikey/MikeyMessageDH.cxx	2007-01-31 13:13:30 UTC (rev 3165)
@@ -402,7 +402,7 @@
 	
 	if( error ){
 		if (ka->useSim){
-			addSignaturePayload(ka->getSim());
+			errorMessage->addSignaturePayload(ka->getSim());
 		}else{
 			errorMessage->addSignaturePayload( ka->certificateChain()->get_first() );
 		}



More information about the Minisip-devel mailing list