diff -r 000000000000 -r ba25891c3a9e secureswitools/swianalysistoolkit/source/dumpswicertstoretool/certificate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swianalysistoolkit/source/dumpswicertstoretool/certificate.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#include "certificate.h" +#include + +Certificate::Certificate(const Stream& aStream, StoreFile& aStore) + :iStream(aStream), + iStore(aStore) + { + } + +bool Certificate::Read(const char* aCertName , const Options& aOptions) + { + bool writeToFile = false; + Frames::Iterator f = iStream.Frame(); + do + { + FramePos pos = f->iPos; + int len = f++ -> iDes.Length(); + if (len == 0) + len = f -> iPos.Pos()- pos.Pos(); + + char* buffer = new char[len]; + + iStore.File().seekg(FileOffset(pos).Offset(),ios::beg); + iStore.File().read(buffer,len); + + int aOffset = 0; + X509* x509 = NULL; + unsigned char* was = reinterpret_cast(buffer); + unsigned char* ptr = was; + assert (ptr); + if (! d2i_X509 (&x509, &ptr, static_cast (len))) + { + delete[] buffer; + throw EInvalidCertificateChain; + } + aOffset = (ptr - was); + assert (x509); + + char buf [KLength]; + X509_NAME_oneline (X509_get_issuer_name (x509), buf, KLength); + if (buf) + { + iIssuerName.append(buf); + } + + unsigned char* signature = x509->signature->data; + int signatureLen = x509->signature->length; + std::string certSignature((const char*)signature, signatureLen); + //this vector contains the certificate signatures of writable certstore,when both ROM and writable certstore are specified + if(aOptions.CBasedWritableCertstore() && aOptions.ROMCertstore() && SwiCertStoreMetaData::iCount == 1) + { + iCertSignature.push_back(certSignature); + writeToFile = true; + } + else + { + StringVector::iterator certVector; + StringVector::iterator start = iCertSignature.begin(); + StringVector::iterator last = iCertSignature.end(); + int size = iCertSignature.size(); + //in case the same certificate is present in both ROM Based and writable certstore + //first their signatures are compared,and only those certificates which are only available in + //the ROM certstore are considered for display. + certVector = std::find(start, last, certSignature); + if(certVector == last) + { + writeToFile = true; + } + } + + if(writeToFile) + { + BIO* b64 = BIO_new(BIO_f_base64()); + if(aOptions.GenerateCertificate()) + { + ofstream file_write (aCertName,ofstream::binary); + file_write.write(buffer,len); + file_write.close(); + } + + if(aOptions.CreateCCIFile()) + { + BIO* bio = BIO_new_fp(stdout, BIO_NOCLOSE); + if (!PEM_write_bio_X509(bio, x509 )) + { + cout << "error in pem " << endl; + } + BIO_free_all(bio); + } + if(aOptions.CreateDetailCCIFile()) + { + BIO* bio = BIO_new_fp(stdout, BIO_NOCLOSE); + if (!PEM_write_bio_X509(bio, x509 )) + { + cout << "error in pem " << endl; + } + BIO_free_all(bio); + } + BIO_free_all(b64); + } + + delete [] buffer; + } while (f->iDes.Type()==FrameDes::Continuation); + + if(writeToFile) + { + return true; + } + else + { + return false; + } + } + +Certificate::~Certificate() + { + } + +StringVector Certificate::iCertSignature; \ No newline at end of file