diff -r f5050f1da672 -r 04becd199f91 javacommons/security/src.s60/fileutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/security/src.s60/fileutils.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,203 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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 "fileutils.h" +#include "securityutils.h" +#include +#include +#include "javajniutils.h" +#include "com_nokia_mj_impl_security_midp_authentication_AuthenticationModule.h" +#include +#include +#include +#include "javajniutils.h" + +using namespace java::security; + +char * FileUtils::computeDigest(const char* aFileName) +{ + return computeDigest(aFileName, false); +} + +char * FileUtils::computeDigest(const char* aFileName, bool drmContent) +{ + RFs fs; + TInt err = fs.Connect(); + char * digest = NULL; + RFile file; + ContentAccess::CContent* cafContent = NULL; + ContentAccess::CData* cafData = NULL; + if (err == KErrNone) + { + int len = strlen(aFileName); + HBufC * fileName = HBufC::New(len); + TPtr fileNamePtr = fileName->Des(); + TPtr8 ptr8((TUint8 *)aFileName, len); + ptr8.SetLength(len); + fileNamePtr.Copy(ptr8); + if (drmContent) + { + TRAP(err, + cafContent = ContentAccess::CContent::NewL(fileNamePtr); + cafData = cafContent->OpenContentL(ContentAccess::EPeek);); + } + else + { + err = file.Open(fs, fileNamePtr, EFileShareReadersOrWriters); + } + delete fileName; + fileName = NULL; + if (err == KErrNone) + { + // figure out the size of the file + TInt size; + if (drmContent) + { + TRAP(err, cafData->DataSizeL(size)); + } + else + { + err = file.Size(size); + } + if (err == KErrNone) + { + // if the size of the file is less than the size of the chunks, + // then do the hash calculation in on go + unsigned char * computed_digest = NULL; + HBufC8* buf = NULL; + if (size > 0 && size <= SHA_1_HASH_CHUNK_LEN) + { + // do the hash calculation in one go + TRAPD(err, buf = HBufC8::NewL(size);); + if (err == KErrNone) + { + TPtr8 ptr = buf->Des(); + if (drmContent) + { + cafData->Read(ptr, size); + } + else + { + err = file.Read(ptr, size); + } + if (err == KErrNone) + { + computed_digest = new unsigned char[SHA_1_DIGEST_LEN]; + SHA1((const unsigned char *)buf->Ptr(), size, computed_digest); + } + delete buf; + buf = NULL; + } + + } + else + { + // do the hash calculation in chunks + SHA_CTX c; + SHA1_Init(&c); + TRAPD(err, buf = HBufC8::NewL(SHA_1_HASH_CHUNK_LEN);); + if (err == KErrNone) + { + TPtr8 ptr = buf->Des(); + if (drmContent) + { + cafData->Read(ptr, SHA_1_HASH_CHUNK_LEN); + } + else + { + err = file.Read(ptr, SHA_1_HASH_CHUNK_LEN); + } + while (err == KErrNone + && ptr.Length() > 0) + { + SHA1_Update(&c, (const unsigned char *)buf->Ptr(), ptr.Length()); + if (drmContent) + { + cafData->Read(ptr, SHA_1_HASH_CHUNK_LEN); + } + else + { + err = file.Read(ptr, SHA_1_HASH_CHUNK_LEN); + } + } + delete buf; + buf = NULL; + if (err == KErrNone) + { + // put it all together + computed_digest = new unsigned char[SHA_1_DIGEST_LEN]; + SHA1_Final(computed_digest, &c); + } + } + } + + // format it as hex + if (computed_digest != NULL) + { + digest = new char[2*SHA_1_DIGEST_LEN + 1]; + char * tmp = digest; + for (int i=0; iGetStringUTFChars(appJARPath, &isCopy)); + char * jarHashValue = FileUtils::computeDigest(jarPath, true); + env->ReleaseStringUTFChars(appJARPath, jarPath); + if (jarHashValue != NULL) + { + jstring hash = env->NewStringUTF(jarHashValue); + delete[] jarHashValue; + jarHashValue = NULL; + return hash; + } + return NULL; +}