sl@0: /* sl@0: * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * -- FingerPrint Note: sl@0: * Developers have to be aware that if they are going to change the fingerprint for this certificate sl@0: * for a different hash, then there are other places that need to reflect this change sl@0: * -- Location sl@0: * void CWTLSCertificate::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: * EXPORT_C void CWTLSCertificate::InternalizeL(RReadStream& aStream) sl@0: * Also change the CX509Certificate and search for other occurences of the current sl@0: * hash. sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include "wtlsdec.h" sl@0: #include sl@0: sl@0: enum TEncAlgorithmType sl@0: { sl@0: EEncRSA = 0x02 sl@0: }; sl@0: sl@0: enum TEncSigAlgorithmType sl@0: { sl@0: EEncRSAwithSHA1 = 0x02 sl@0: }; sl@0: sl@0: const TInt KMinAlgIdLength = 2; sl@0: const TInt KMinExpLengthBytes = 1; sl@0: const TInt KMaxExpLengthBytes = 65535; sl@0: const TInt KMinModLengthBytes = 1; sl@0: const TInt KMaxModLengthBytes = 65535; sl@0: sl@0: //WTLS RSA signature result sl@0: EXPORT_C CWTLSRSASignatureResult* CWTLSRSASignatureResult::NewL(const CAlgorithmIdentifier& aDigestAlgorithm, const TDesC8& aDigest) sl@0: { sl@0: CWTLSRSASignatureResult* self = CWTLSRSASignatureResult::NewLC(aDigestAlgorithm, aDigest); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSRSASignatureResult* CWTLSRSASignatureResult::NewLC(const CAlgorithmIdentifier& aDigestAlgorithm, const TDesC8& aDigest) sl@0: { sl@0: CWTLSRSASignatureResult* self = new(ELeave) CWTLSRSASignatureResult; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aDigestAlgorithm, aDigest); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C TBool CWTLSRSASignatureResult::VerifyL(const TDesC8& aResult) sl@0: { sl@0: return aResult == *iDigest; sl@0: } sl@0: sl@0: void CWTLSRSASignatureResult::ConstructL(const CAlgorithmIdentifier& aDigestAlgorithm, const TDesC8& aDigest) sl@0: { sl@0: iDigestAlgorithm = CAlgorithmIdentifier::NewL(aDigestAlgorithm); sl@0: iDigest = aDigest.AllocL(); sl@0: } sl@0: sl@0: //WTLS KeyFactory sl@0: CRSAPublicKey* TWTLSKeyFactory::RSAPublicKeyL(const TDesC8& aEncoding) const sl@0: { sl@0: return CWTLSRSAPublicKey::NewL(aEncoding); sl@0: } sl@0: sl@0: CRSASignatureResult* TWTLSKeyFactory::RSASignatureResultL(const CAlgorithmIdentifier& aDigestAlgorithm, TDesC8& aDigest) const sl@0: { sl@0: return CWTLSRSASignatureResult::NewL(aDigestAlgorithm, aDigest); sl@0: } sl@0: sl@0: CDSAPublicKey* TWTLSKeyFactory::DSAPublicKeyL(const CDSAParameters& /*aParams*/, const TDesC8& /*aEncoding*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: CDSAPublicKey* TWTLSKeyFactory::DSAPublicKeyL(const TDesC8& /*aParams*/, const TDesC8& /*aEncoding*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: CDSASignature* TWTLSKeyFactory::DSASignatureL(const TDesC8& /*aEncoding*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: sl@0: CDSAParameters* TWTLSKeyFactory::DSAParametersL(const TDesC8& /*aParamsEncoding*/) const sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: //validity period sl@0: EXPORT_C CWTLSValidityPeriod* CWTLSValidityPeriod::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSValidityPeriod::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSValidityPeriod* CWTLSValidityPeriod::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSValidityPeriod::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSValidityPeriod* CWTLSValidityPeriod::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSValidityPeriod* self = CWTLSValidityPeriod::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSValidityPeriod* CWTLSValidityPeriod::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSValidityPeriod* self = new(ELeave) CWTLSValidityPeriod; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: CWTLSValidityPeriod::CWTLSValidityPeriod() sl@0: { sl@0: } sl@0: sl@0: void CWTLSValidityPeriod::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TWTLSDecTime timeDec; sl@0: iStart = timeDec.DecodeL(aBinaryData, aPos); sl@0: iFinish = timeDec.DecodeL(aBinaryData, aPos); sl@0: } sl@0: sl@0: //algorithm id sl@0: EXPORT_C CWTLSAlgorithmIdentifier* CWTLSAlgorithmIdentifier::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSAlgorithmIdentifier::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSAlgorithmIdentifier* CWTLSAlgorithmIdentifier::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSAlgorithmIdentifier::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSAlgorithmIdentifier* CWTLSAlgorithmIdentifier::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSAlgorithmIdentifier* self = CWTLSAlgorithmIdentifier::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSAlgorithmIdentifier* CWTLSAlgorithmIdentifier::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSAlgorithmIdentifier* self = new(ELeave) CWTLSAlgorithmIdentifier; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: CWTLSAlgorithmIdentifier::CWTLSAlgorithmIdentifier() sl@0: { sl@0: } sl@0: sl@0: void CWTLSAlgorithmIdentifier::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: if ((aBinaryData.Length() - aPos) < KMinAlgIdLength) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: switch (aBinaryData[aPos]) sl@0: { sl@0: case EEncRSA: sl@0: { sl@0: iAlgorithmId = ERSA; sl@0: aPos++; sl@0: if (aBinaryData[aPos] != 0) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: aPos++; sl@0: iEncodedParams = HBufC8::NewL(1); sl@0: *iEncodedParams = KNullDesC8; sl@0: break; sl@0: } sl@0: default: sl@0: //we only support RSA just now... sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: //signing algorithm id sl@0: EXPORT_C CWTLSSigningAlgorithmIdentifier* CWTLSSigningAlgorithmIdentifier::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSSigningAlgorithmIdentifier::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSSigningAlgorithmIdentifier* CWTLSSigningAlgorithmIdentifier::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSSigningAlgorithmIdentifier::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSSigningAlgorithmIdentifier* CWTLSSigningAlgorithmIdentifier::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSSigningAlgorithmIdentifier* self = CWTLSSigningAlgorithmIdentifier::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSSigningAlgorithmIdentifier* CWTLSSigningAlgorithmIdentifier::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSSigningAlgorithmIdentifier* self = new(ELeave) CWTLSSigningAlgorithmIdentifier; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: CWTLSSigningAlgorithmIdentifier::CWTLSSigningAlgorithmIdentifier() sl@0: { sl@0: } sl@0: sl@0: void CWTLSSigningAlgorithmIdentifier::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: if ((aBinaryData.Length() - aPos) < 1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: switch (aBinaryData[aPos]) sl@0: { sl@0: case EEncRSAwithSHA1: sl@0: { sl@0: TAlgorithmId asym = ERSA; sl@0: TAlgorithmId dig = ESHA1; sl@0: iAsymmetricAlgorithm = CAlgorithmIdentifier::NewL(asym, KNullDesC8); sl@0: iDigestAlgorithm = CAlgorithmIdentifier::NewL(dig, KNullDesC8); sl@0: aPos++; sl@0: break; sl@0: } sl@0: default: sl@0: //we only support RSA-SHA1 just now... sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: //wtls subject public key info sl@0: EXPORT_C CWTLSSubjectPublicKeyInfo* CWTLSSubjectPublicKeyInfo::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSSubjectPublicKeyInfo::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSSubjectPublicKeyInfo* CWTLSSubjectPublicKeyInfo::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSSubjectPublicKeyInfo::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSSubjectPublicKeyInfo* CWTLSSubjectPublicKeyInfo::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSSubjectPublicKeyInfo* self = CWTLSSubjectPublicKeyInfo::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSSubjectPublicKeyInfo* CWTLSSubjectPublicKeyInfo::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSSubjectPublicKeyInfo* self = new(ELeave) CWTLSSubjectPublicKeyInfo; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: CWTLSSubjectPublicKeyInfo::CWTLSSubjectPublicKeyInfo() sl@0: { sl@0: } sl@0: sl@0: void CWTLSSubjectPublicKeyInfo::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: iAlgId = CWTLSAlgorithmIdentifier::NewL(aBinaryData, aPos); sl@0: if (iAlgId->Algorithm() != ERSA) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: TInt totalLength = aBinaryData.Length(); sl@0: TInt tempPos = aPos; sl@0: sl@0: const TPtrC8 expEnc = aBinaryData.Right(totalLength - aPos); sl@0: TWTLSDecVector exp(expEnc, KMinExpLengthBytes, KMaxExpLengthBytes); sl@0: exp.InitL(); sl@0: sl@0: aPos += exp.EncodingLength(); sl@0: sl@0: const TPtrC8 modEnc = aBinaryData.Right(totalLength - aPos); sl@0: TWTLSDecVector mod(modEnc, KMinModLengthBytes, KMaxModLengthBytes); sl@0: mod.InitL(); sl@0: sl@0: aPos+= mod.EncodingLength(); sl@0: iEncodedKeyData = (aBinaryData.Mid(tempPos, aPos - tempPos)).AllocL(); sl@0: } sl@0: sl@0: //wtls certificate sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSCertificate::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CWTLSCertificate::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSCertificate* self = CWTLSCertificate::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CWTLSCertificate* self = new(ELeave) CWTLSCertificate; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewL(RReadStream& aStream) sl@0: { sl@0: CWTLSCertificate* self = CWTLSCertificate::NewLC(aStream); sl@0: CleanupStack::Pop();//self sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewLC(RReadStream& aStream) sl@0: { sl@0: CWTLSCertificate* self = new(ELeave) CWTLSCertificate; sl@0: CleanupStack::PushL(self); sl@0: self->InternalizeL(aStream); sl@0: return self; sl@0: } sl@0: /* sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewL(CCertStore& aStore, const CCertStoreEntry& aEntry) sl@0: { sl@0: CWTLSCertificate* self = CWTLSCertificate::NewLC(aStore, aEntry); sl@0: CleanupStack::Pop();//self sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewLC(CCertStore& aStore, const CCertStoreEntry& aEntry) sl@0: { sl@0: CWTLSCertificate* self = new(ELeave) CWTLSCertificate; sl@0: CleanupStack::PushL(self); sl@0: aStore.LoadL(*self, aEntry); sl@0: return self; sl@0: } sl@0: */ sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewL(const CWTLSCertificate& aCert) sl@0: { sl@0: CWTLSCertificate* self = CWTLSCertificate::NewLC(aCert); sl@0: CleanupStack::Pop();//self sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate* CWTLSCertificate::NewLC(const CWTLSCertificate& aCert) sl@0: { sl@0: CWTLSCertificate* self = new(ELeave) CWTLSCertificate; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aCert); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CWTLSCertificate::~CWTLSCertificate() sl@0: { sl@0: delete iIssuerName; sl@0: delete iSubjectName; sl@0: sl@0: if (iDataElements != NULL) sl@0: { sl@0: for (TInt i = 0; i < KWTLSCertMaxDataElements; i++) sl@0: { sl@0: delete iDataElements->At(i); sl@0: } sl@0: delete iDataElements; sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TBool CWTLSCertificate::IsEqualL(const CWTLSCertificate& aCert) const sl@0: { sl@0: return (*(iFingerprint) == (*(aCert.iFingerprint))); sl@0: } sl@0: sl@0: //extra accessors sl@0: EXPORT_C const TPtrC8 CWTLSCertificate::SignedDataL() const sl@0: { sl@0: return iEncoding->Left(iEncoding->Length() - (iSignature->Length() +2)); sl@0: } sl@0: sl@0: EXPORT_C TInt CWTLSCertificate::Version() const sl@0: { sl@0: return iVersion; sl@0: } sl@0: sl@0: EXPORT_C const CWTLSName& CWTLSCertificate::IssuerName() const sl@0: { sl@0: return *iIssuerName; sl@0: } sl@0: sl@0: EXPORT_C const CWTLSName& CWTLSCertificate::SubjectName() const sl@0: { sl@0: return *iSubjectName; sl@0: } sl@0: sl@0: EXPORT_C HBufC* CWTLSCertificate::IssuerL() const sl@0: { sl@0: return iIssuerName->DisplayNameL(); sl@0: } sl@0: sl@0: EXPORT_C HBufC* CWTLSCertificate::SubjectL() const sl@0: { sl@0: return iSubjectName->DisplayNameL(); sl@0: } sl@0: sl@0: EXPORT_C TBool CWTLSCertificate::IsSelfSignedL() const sl@0: { sl@0: return iSubjectName->ExactMatchL(*iIssuerName); sl@0: } sl@0: sl@0: EXPORT_C const TPtrC8* CWTLSCertificate::DataElementEncoding(const TUint aIndex) const sl@0: { sl@0: return iDataElements->At(aIndex); sl@0: } sl@0: sl@0: EXPORT_C void CWTLSCertificate::InternalizeL(RReadStream& aStream) sl@0: { sl@0: if (iIssuerName != NULL) //just to check cert is uninitialised sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: iKeyFactory = new(ELeave) TWTLSKeyFactory; sl@0: TInt len = aStream.ReadInt32L(); sl@0: iEncoding = HBufC8::NewL(aStream,len); sl@0: TInt pos = 0; sl@0: ConstructCertL(*iEncoding, pos); sl@0: sl@0: TWTLSDecUnsignedInteger decInt; sl@0: TInt sigLength = decInt.DecodeShortL(*iEncoding, pos, 2); sl@0: iSignature = (iEncoding->Mid(pos, sigLength)).AllocL(); sl@0: CSHA1* hash = CSHA1::NewL(); sl@0: CleanupStack::PushL(hash); sl@0: iFingerprint = hash->Final(Encoding()).AllocL(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: InitEncodedDataElementsL(); sl@0: } sl@0: sl@0: EXPORT_C TBool CWTLSCertificate::IsTCAL() const sl@0: { sl@0: TBool isTCA = EFalse; sl@0: TPtrC8 nameData = SubjectName().NameData(); sl@0: CWTLSStructuredText* sText = NULL; //inited to get rid of warning sl@0: TRAPD(err, sText = CWTLSStructuredText::NewL(nameData) ); sl@0: if( err == KErrNone ) sl@0: { sl@0: const TWTLSStructuredTextField* sTextField = sText->FieldByName(KWTLSTCAType); sl@0: if(sTextField != NULL) sl@0: { sl@0: if(sTextField->Value().Compare(KWTLSTCAValue) == 0) sl@0: { sl@0: isTCA = ETrue; sl@0: } sl@0: } sl@0: delete sText; sl@0: } sl@0: return isTCA; sl@0: } sl@0: sl@0: CWTLSCertificate::CWTLSCertificate() sl@0: { sl@0: } sl@0: sl@0: void CWTLSCertificate::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TInt tempPos = aPos; sl@0: ConstructCertL(aBinaryData, aPos); sl@0: iKeyFactory = new(ELeave) TWTLSKeyFactory; sl@0: sl@0: TWTLSDecUnsignedInteger decInt; sl@0: TInt sigLength = decInt.DecodeShortL(aBinaryData, aPos, 2); sl@0: if ((sigLength + aPos) > aBinaryData.Length()) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: iSignature = (aBinaryData.Mid(aPos, sigLength)).AllocL(); sl@0: aPos+= sigLength; sl@0: iEncoding = aBinaryData.Mid(tempPos, aPos - tempPos).AllocL(); sl@0: sl@0: CSHA1* hash = CSHA1::NewL(); sl@0: CleanupStack::PushL(hash); sl@0: iFingerprint = hash->Final(Encoding()).AllocL(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: InitEncodedDataElementsL(); sl@0: } sl@0: sl@0: void CWTLSCertificate::ConstructL(const CWTLSCertificate& aCertificate) sl@0: { sl@0: iEncoding = aCertificate.Encoding().AllocL(); sl@0: iKeyFactory = new(ELeave) TWTLSKeyFactory; sl@0: iSignature = aCertificate.Signature().AllocL(); sl@0: iFingerprint = aCertificate.Fingerprint().AllocL(); sl@0: iSigningAlgorithm = CSigningAlgorithmIdentifier::NewL(aCertificate.SigningAlgorithm()); sl@0: iSerialNumber = aCertificate.iSerialNumber->Des().AllocL(); sl@0: iIssuerName = CWTLSName::NewL(*(aCertificate.iIssuerName)); sl@0: iValidityPeriod = new(ELeave) CValidityPeriod(*(aCertificate.iValidityPeriod)); sl@0: iSubjectName = CWTLSName::NewL(*(aCertificate.iSubjectName)); sl@0: iSubjectPublicKeyInfo = CSubjectPublicKeyInfo::NewL(*(aCertificate.iSubjectPublicKeyInfo)); sl@0: sl@0: InitEncodedDataElementsL(); sl@0: } sl@0: sl@0: void CWTLSCertificate::ConstructCertL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: if ((aBinaryData.Length() - aPos) < 1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: iVersion = aBinaryData[aPos]; sl@0: sl@0: aPos++; sl@0: iSigningAlgorithm = CWTLSSigningAlgorithmIdentifier::NewL(aBinaryData, aPos); sl@0: iIssuerName = CWTLSName::NewL(aBinaryData, aPos); sl@0: iValidityPeriod = CWTLSValidityPeriod::NewL(aBinaryData, aPos); sl@0: iSubjectName = CWTLSName::NewL(aBinaryData, aPos); sl@0: iSubjectPublicKeyInfo = CWTLSSubjectPublicKeyInfo::NewL(aBinaryData, aPos); sl@0: iSerialNumber = HBufC8::NewL(0); sl@0: *iSerialNumber = KNullDesC8; sl@0: } sl@0: sl@0: void CWTLSCertificate::InitEncodedDataElementsL() sl@0: { sl@0: iDataElements = new(ELeave) TFixedArray; sl@0: iDataElements->Reset(); sl@0: const TPtrC8 signedData = SignedDataL(); sl@0: TInt aPos = 0; sl@0: TPtrC8** pElement = iDataElements->Begin(); sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Left(++aPos)); sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Mid(aPos, aPos)); sl@0: aPos++; // Defect fix from Jetstream sl@0: TInt issuerEncodedLength = IssuerName().NameData().Length() + 1;//1 for the identifier type sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Mid(aPos, issuerEncodedLength)); sl@0: aPos+=+issuerEncodedLength; sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Mid(aPos, 8)); sl@0: aPos+=8; sl@0: TInt subjectEncodedLength = SubjectName().NameData().Length() + 1;//1 for the identifier type sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Mid(aPos, subjectEncodedLength)); sl@0: aPos+=+subjectEncodedLength; sl@0: *pElement++ = new(ELeave) TPtrC8(signedData.Right(signedData.Length() - aPos)); sl@0: } sl@0: