os/security/cryptoservices/certificateandkeymgmt/pkcs10/keyhelper.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include "keyhelper.h"
sl@0
    20
#include <asn1enc.h>
sl@0
    21
#include <asymmetric.h>
sl@0
    22
#include <x509cert.h>
sl@0
    23
sl@0
    24
// CPKCS10KeyHelper ////////////////////////////////////////////////////////////
sl@0
    25
sl@0
    26
CPKCS10KeyHelper* CPKCS10KeyHelper::CreateKeyHelperL(MCTKeyStore& aKeyStore,
sl@0
    27
													 const CCTKeyInfo& aKeyInfo,
sl@0
    28
													 const TDesC8& aExportedKey,
sl@0
    29
													 const TAlgorithmId aDigestId)
sl@0
    30
	{
sl@0
    31
	CPKCS10KeyHelper* result = NULL;
sl@0
    32
	
sl@0
    33
	switch (aKeyInfo.Algorithm())
sl@0
    34
		{
sl@0
    35
		case CCTKeyInfo::ERSA:
sl@0
    36
			result = new (ELeave) CPKCS10RSAKeyHelper(aKeyStore, aKeyInfo);
sl@0
    37
			break;
sl@0
    38
sl@0
    39
		case CCTKeyInfo::EDSA:
sl@0
    40
			result = new (ELeave) CPKCS10DSAKeyHelper(aKeyStore, aKeyInfo);
sl@0
    41
			break;
sl@0
    42
sl@0
    43
		default:
sl@0
    44
			User::Leave(KErrArgument);
sl@0
    45
		}
sl@0
    46
sl@0
    47
	CleanupStack::PushL(result);
sl@0
    48
	result->CreateKeyEncoderL(aExportedKey, aDigestId);
sl@0
    49
	CleanupStack::Pop(result);
sl@0
    50
sl@0
    51
	return result;
sl@0
    52
	}
sl@0
    53
sl@0
    54
CPKCS10KeyHelper::CPKCS10KeyHelper(MCTKeyStore& aKeyStore, const CCTKeyInfo& aKeyInfo) :
sl@0
    55
	iKeyStore(aKeyStore),
sl@0
    56
	iKeyInfo(aKeyInfo)
sl@0
    57
	{
sl@0
    58
	}
sl@0
    59
sl@0
    60
CPKCS10KeyHelper::~CPKCS10KeyHelper()
sl@0
    61
	{
sl@0
    62
	delete iKeyEncoder;
sl@0
    63
	}
sl@0
    64
sl@0
    65
CASN1EncBase* CPKCS10KeyHelper::EncodeKeyLC()
sl@0
    66
	{
sl@0
    67
	return iKeyEncoder->EncodeKeyLC();
sl@0
    68
	}
sl@0
    69
sl@0
    70
CASN1EncBase* CPKCS10KeyHelper::DigestInfoLC(const TDesC8& digest)
sl@0
    71
	{
sl@0
    72
	CASN1EncSequence* seq = CASN1EncSequence::NewLC();
sl@0
    73
	
sl@0
    74
	// DigestAlgorithmIdentifier
sl@0
    75
	CASN1EncSequence* digestAlgID =iKeyEncoder-> EncodeDigestAlgorithmLC();
sl@0
    76
sl@0
    77
	seq->AddAndPopChildL(digestAlgID); 
sl@0
    78
	
sl@0
    79
	// Actual message digest	
sl@0
    80
	CASN1EncOctetString* octet = CASN1EncOctetString::NewLC(digest);
sl@0
    81
	seq->AddAndPopChildL(octet);
sl@0
    82
	
sl@0
    83
	return seq;
sl@0
    84
	}
sl@0
    85
sl@0
    86
sl@0
    87
CASN1EncSequence* CPKCS10KeyHelper::EncodeSignatureAlgorithmLC()
sl@0
    88
	{
sl@0
    89
	return iKeyEncoder->EncodeSignatureAlgorithmLC();
sl@0
    90
	}
sl@0
    91
sl@0
    92
// CPKCS10RSAKeyHelper /////////////////////////////////////////////////////////
sl@0
    93
sl@0
    94
CPKCS10RSAKeyHelper::CPKCS10RSAKeyHelper(MCTKeyStore& aKeyStore, const CCTKeyInfo& aKeyInfo) :
sl@0
    95
	CPKCS10KeyHelper(aKeyStore, aKeyInfo)
sl@0
    96
	{
sl@0
    97
	}
sl@0
    98
sl@0
    99
CPKCS10RSAKeyHelper::~CPKCS10RSAKeyHelper()
sl@0
   100
	{
sl@0
   101
	if (iRSASigner)
sl@0
   102
		{
sl@0
   103
		iRSASigner->Release();		
sl@0
   104
		}
sl@0
   105
	if (iDigestBuf) 
sl@0
   106
		{
sl@0
   107
		delete iDigestBuf;
sl@0
   108
		}
sl@0
   109
	delete iRSASignature;
sl@0
   110
	delete iPublicKey;	
sl@0
   111
	}
sl@0
   112
sl@0
   113
void CPKCS10RSAKeyHelper::OpenSigner(TRequestStatus& aStatus)
sl@0
   114
	{
sl@0
   115
	iKeyStore.Open(iKeyInfo, iRSASigner, aStatus);
sl@0
   116
	}
sl@0
   117
sl@0
   118
void CPKCS10RSAKeyHelper::CancelOpenSigner()
sl@0
   119
	{
sl@0
   120
	iKeyStore.CancelOpen();
sl@0
   121
	}
sl@0
   122
sl@0
   123
void CPKCS10RSAKeyHelper::SignDigestL(const TDesC8& aDigest, TRequestStatus& aStatus)
sl@0
   124
	{
sl@0
   125
	CASN1EncBase* digestInfo = DigestInfoLC(aDigest);
sl@0
   126
	
sl@0
   127
	// DER encode it!
sl@0
   128
	iDigestBuf = HBufC8::NewMaxL(digestInfo->LengthDER());
sl@0
   129
	TPtr8 oct(iDigestBuf->Des());
sl@0
   130
	oct.FillZ();
sl@0
   131
sl@0
   132
	TUint writePos = 0;
sl@0
   133
	digestInfo->WriteDERL(oct, writePos);
sl@0
   134
	
sl@0
   135
	// Sign the DER encoded digest info
sl@0
   136
	iRSASigner->Sign(*iDigestBuf, iRSASignature, aStatus);
sl@0
   137
sl@0
   138
	//CleanupStack::PopAndDestroy(octetData);	
sl@0
   139
	CleanupStack::PopAndDestroy(digestInfo);		
sl@0
   140
	}
sl@0
   141
sl@0
   142
void CPKCS10RSAKeyHelper::CancelSignDigest()
sl@0
   143
	{
sl@0
   144
	iRSASigner->CancelSign();
sl@0
   145
	}
sl@0
   146
sl@0
   147
void CPKCS10RSAKeyHelper::CreateKeyEncoderL(const TDesC8& aExportedKey, TAlgorithmId aDigestId)
sl@0
   148
	{
sl@0
   149
	CX509SubjectPublicKeyInfo* ki = CX509SubjectPublicKeyInfo::NewLC(aExportedKey);
sl@0
   150
	TX509KeyFactory factory; 
sl@0
   151
	iPublicKey = factory.RSAPublicKeyL(ki->KeyData());
sl@0
   152
	CleanupStack::PopAndDestroy(ki);
sl@0
   153
	iKeyEncoder = new (ELeave) TX509RSAKeyEncoder(*iPublicKey, aDigestId);
sl@0
   154
	}
sl@0
   155
sl@0
   156
sl@0
   157
CASN1EncBitString* CPKCS10RSAKeyHelper::EncodeSignatureLC()
sl@0
   158
	{
sl@0
   159
	// Get raw signature data
sl@0
   160
	HBufC8* sigData = iRSASignature->S().BufferLC();
sl@0
   161
sl@0
   162
	// Create ASN.1 bit string from the signature and return it.
sl@0
   163
	CASN1EncBitString* encSig = CASN1EncBitString::NewL(*sigData);
sl@0
   164
	CleanupStack::PopAndDestroy(sigData);
sl@0
   165
	CleanupStack::PushL(encSig);
sl@0
   166
sl@0
   167
	return encSig;
sl@0
   168
	}
sl@0
   169
sl@0
   170
// CPKCS10DSAKeyHelper /////////////////////////////////////////////////////////
sl@0
   171
sl@0
   172
CPKCS10DSAKeyHelper::CPKCS10DSAKeyHelper(MCTKeyStore& aKeyStore, const CCTKeyInfo& aKeyInfo) :
sl@0
   173
	CPKCS10KeyHelper(aKeyStore, aKeyInfo)
sl@0
   174
	{
sl@0
   175
	}
sl@0
   176
sl@0
   177
CPKCS10DSAKeyHelper::~CPKCS10DSAKeyHelper()
sl@0
   178
	{
sl@0
   179
	if (iDSASigner)
sl@0
   180
		iDSASigner->Release();
sl@0
   181
	delete iDSASignature;
sl@0
   182
	delete iPublicKey;
sl@0
   183
	}
sl@0
   184
sl@0
   185
void CPKCS10DSAKeyHelper::OpenSigner(TRequestStatus& aStatus)
sl@0
   186
	{
sl@0
   187
	iKeyStore.Open(iKeyInfo, iDSASigner, aStatus);
sl@0
   188
	}
sl@0
   189
sl@0
   190
void CPKCS10DSAKeyHelper::CancelOpenSigner()
sl@0
   191
	{
sl@0
   192
	iKeyStore.CancelOpen();
sl@0
   193
	}
sl@0
   194
sl@0
   195
void CPKCS10DSAKeyHelper::SignDigestL(const TDesC8& aDigest, TRequestStatus& aStatus)
sl@0
   196
	{
sl@0
   197
	iDSASigner->Sign(aDigest, iDSASignature, aStatus);
sl@0
   198
	}
sl@0
   199
sl@0
   200
void CPKCS10DSAKeyHelper::CancelSignDigest()
sl@0
   201
	{
sl@0
   202
	iDSASigner->CancelSign();
sl@0
   203
	}
sl@0
   204
sl@0
   205
void CPKCS10DSAKeyHelper::CreateKeyEncoderL(const TDesC8& aExportedKey, TAlgorithmId aDigestId)
sl@0
   206
	{
sl@0
   207
	CX509SubjectPublicKeyInfo* ki = CX509SubjectPublicKeyInfo::NewLC(aExportedKey);
sl@0
   208
	TX509KeyFactory factory; 
sl@0
   209
	iPublicKey = factory.DSAPublicKeyL(ki->EncodedParams(), ki->KeyData());
sl@0
   210
	CleanupStack::PopAndDestroy(ki);
sl@0
   211
	iKeyEncoder = new (ELeave) TX509DSAKeyEncoder(*iPublicKey, aDigestId);
sl@0
   212
	}
sl@0
   213
sl@0
   214
/**
sl@0
   215
 * Override default implementation - leave DSA parameters out of the
sl@0
   216
 * AlgorithmIdentifier when it appears outside of SubjectPublicKeyInfo.  
sl@0
   217
 */
sl@0
   218
CASN1EncSequence* CPKCS10DSAKeyHelper::EncodeSignatureAlgorithmLC()
sl@0
   219
	{
sl@0
   220
	CASN1EncSequence* seq = CASN1EncSequence::NewLC();
sl@0
   221
	// Assume only SHA1 with DSA
sl@0
   222
	CASN1EncObjectIdentifier* oid = CASN1EncObjectIdentifier::NewLC(KDSAWithSHA1);
sl@0
   223
	seq->AddAndPopChildL(oid);
sl@0
   224
sl@0
   225
	// Don't add parameters!
sl@0
   226
sl@0
   227
	return seq;	
sl@0
   228
	}
sl@0
   229
sl@0
   230
CASN1EncBitString* CPKCS10DSAKeyHelper::EncodeSignatureLC()
sl@0
   231
	{
sl@0
   232
	// Create sequence that will hold the two bit integers.
sl@0
   233
	CASN1EncSequence* sigSeq = CASN1EncSequence::NewLC();
sl@0
   234
	// Stuff two signature integers into the sequence.
sl@0
   235
sl@0
   236
	CASN1EncBigInt* r = CASN1EncBigInt::NewLC(iDSASignature->R());
sl@0
   237
	sigSeq->AddAndPopChildL(r);
sl@0
   238
	CASN1EncBigInt* s = CASN1EncBigInt::NewLC(iDSASignature->S());
sl@0
   239
	sigSeq->AddAndPopChildL(s);
sl@0
   240
sl@0
   241
	// Wrap the sequence into a bit string
sl@0
   242
	// Create ASN.1 encoding from the signature and return it.
sl@0
   243
	CASN1EncBitString* sigDer = CASN1EncBitString::NewL(*sigSeq);
sl@0
   244
sl@0
   245
	CleanupStack::PopAndDestroy(sigSeq);
sl@0
   246
	CleanupStack::PushL(sigDer);
sl@0
   247
sl@0
   248
	return sigDer;
sl@0
   249
	}
sl@0
   250