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