static QByteArray hexDecode(const QString &in) { QByteArray out; for(int n = 0; n + 1 < in.length(); n += 2) { int value = hexByte(in[n].toLatin1(), in[n + 1].toLatin1()); if(value < 0) return QByteArray(); // error out += (unsigned char)value; } return out; }
RPointerArray<CX509Certificate> PkiUtil::GetCaCertListL(RPKIServiceAPI& aPkiService, const CArrayFixFlat<TCertInfo*>& aIkeCAList) { __ASSERT_ALWAYS(aIkeCAList.Count() > 0, User::Invariant()); _LIT8(KEmptyString, ""); RPointerArray<CX509Certificate> certificateArray; ResetAndDestroyPushL(certificateArray); RArray<TUid> applUidArray; CleanupClosePushL(applUidArray); for (TInt i = 0; i < aIkeCAList.Count(); ++i) { const TCertInfo* certInfo = aIkeCAList[i]; switch(certInfo->iFormat) { case CA_NAME: { // Reserve enough space for UTF-8 TInt len = 3*( certInfo->iData.Length() ); HBufC8* caName = HBufC8::NewLC(len); TPtr8 caNamePtr(caName->Des()); if (CnvUtfConverter::ConvertFromUnicodeToUtf8(caNamePtr, certInfo->iData) != 0) { User::Leave(KErrCorrupt); } CX509Certificate* cert = ReadCertificateLC(aPkiService, KEmptyString, *caName, KEmptyString, EPKICACertificate); User::LeaveIfError(certificateArray.Append(cert)); CleanupStack::Pop(cert); CleanupStack::PopAndDestroy(caName); } break; case KEY_ID: { TPKIKeyIdentifier keyId(NULL); for (TInt j = 0; j < certInfo->iData.Length(); j += 2) { TPtrC hexByte(certInfo->iData.Mid(j, 2)); TLex lex(hexByte); TUint8 value; User::LeaveIfError(lex.Val(value, EHex)); keyId.Append(&value, 1); } CX509Certificate* cert = ReadCertificateLC(aPkiService, keyId); User::LeaveIfError(certificateArray.Append(cert)); CleanupStack::Pop(cert); } break; case APPL_UID: { TLex lex(certInfo->iData); TUint32 value; User::LeaveIfError(lex.Val(value, EHex)); TUid id = { value }; User::LeaveIfError(applUidArray.Append(id)); } break; default: User::Leave(KErrArgument); break; } } if (applUidArray.Count() > 0) { CArrayFix<TCertificateListEntry>* certListArray = NULL;; aPkiService.ListApplicableCertificatesL(applUidArray, certListArray); CleanupStack::PushL(certListArray); if (certListArray->Count() == 0) { User::Leave(KErrNotFound); } for (TInt i = 0; i < certListArray->Count(); ++i) { TCertificateListEntry entry = (*certListArray)[i]; if (entry.iOwnerType == EPKICACertificate) { CX509Certificate* cert = ReadCertificateLC(aPkiService, KEmptyString, entry.iIdentitySubjectName, KEmptyString, EPKICACertificate); User::LeaveIfError(certificateArray.Append(cert)); CleanupStack::Pop(cert); } } CleanupStack::PopAndDestroy(certListArray); } CleanupStack::PopAndDestroy(); //applUidArray CleanupStack::Pop(); return certificateArray; }
QString bcdbyte(unsigned char start) { return hexByte(start); }