diff -r f5050f1da672 -r 04becd199f91 javaextensions/satsa/crypto/src/messagedigestimpljni.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/satsa/crypto/src/messagedigestimpljni.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2008 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: JNI Layer corresponding to MessageDigestImpl.java +* +*/ + + +#include "javajniutils.h" +#include "com_nokia_mj_impl_security_MessageDigestImpl.h" +#include +#include +#include "stsconstants.h" +#include +#include "logger.h" + +using namespace java::satsa; + + +// JNI function. +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_security_MessageDigestImpl__1reset +(JNIEnv*, jclass, jint aHandle) +{ + const EVP_MD* md = NULL; + int retVal; + + EVP_MD_CTX* mdctx = reinterpret_cast< EVP_MD_CTX* >(aHandle); + + md = EVP_MD_CTX_md(mdctx); + if (md == NULL) + { + return KSTSErrNoMemory; + } + EVP_MD_CTX_init(mdctx); + retVal = EVP_DigestInit_ex(mdctx, md, NULL); + if (retVal == 0) + { + // Set error code to handle variable which is returned to Java + return KSTSErrNoMemory; + } + + return 0; +} + + +// JNI function. +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_security_MessageDigestImpl__1digest +(JNIEnv* aJni, jclass, jint aHandle, + jbyteArray aBuf, jint aOffset, jint aLength) +{ + EVP_MD_CTX* mdctx = reinterpret_cast< EVP_MD_CTX* >(aHandle); + const EVP_MD* md = NULL; + unsigned int retVal; + unsigned int err; + unsigned char* buf = new unsigned char[EVP_MAX_MD_SIZE]; + err = EVP_DigestFinal_ex(mdctx, buf, &retVal); + if (err == 1) + { + //digest successful + if (aLength < retVal) + { + return KSTSErrNoMemory; + } + else + { + // set the output buffer with hashed data + aJni->SetByteArrayRegion(aBuf,aOffset,retVal,(signed char*)buf); + + // reset the digest as per the spec + md = EVP_MD_CTX_md(mdctx); + if (md == NULL) + { + return KSTSErrNoMemory; + } + EVP_MD_CTX_init(mdctx); + err = EVP_DigestInit_ex(mdctx, md, NULL); + if (err == 0) + { + // Set error code to handle variable which is returned to Java + return KSTSErrNoMemory; + } + else + { + return retVal; + } + } + } + else + { + return KSTSErrNoMemory; + } +} + + +// JNI function. +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_security_MessageDigestImpl__1update +(JNIEnv* aJni, jclass, jint aHandle, + jbyteArray aBuf, jint aOffset, jint aLength) +{ + int err; + EVP_MD_CTX* mdctx = reinterpret_cast< EVP_MD_CTX* >(aHandle); + unsigned char* buf = new unsigned char[aLength]; + aJni->GetByteArrayRegion(aBuf,aOffset,aLength,(signed char *)buf); + err = EVP_DigestUpdate(mdctx, buf, aLength); + if (0 == err) + { + err = KSTSErrNoMemory; + } + return err; +} + + +// JNI function. +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_security_MessageDigestImpl__1create +(JNIEnv* aJni, jclass, + jstring aAlgorithm) +{ + int retVal; + EVP_MD_CTX *mdctx = new EVP_MD_CTX; + const EVP_MD *md; + + OpenSSL_add_all_digests(); + + // Set the transformation string contents to a wstring. + std::wstring algo; + try + { + algo = java::util::JniUtils::jstringToWstring(aJni, aAlgorithm); + } + catch (...) + { + // do nothing + } + TInt handle = KSTSErrNoMemory; + + // Create digest object according to aAlgorithm + if (algo == L"SHA-1") + { + md = EVP_sha1(); + } + else if (algo == L"MD2") + { + md = EVP_md2(); + } + else if (algo == L"MD5") + { + md = EVP_md5(); + } + else + { + // Algorithm was not found + handle = KSTSErrDigest; + return handle; + } + + EVP_MD_CTX_init(mdctx); + retVal = EVP_DigestInit_ex(mdctx, md, NULL); + if (0 == retVal) + { + // Set error code to handle variable which is returned to Java + handle = KSTSErrNoMemory; + return handle; + } + + // return handle to new MessageDigest object or error code + handle = reinterpret_cast(mdctx); + return handle; +} + + +// JNI function dispose. +JNIEXPORT void +JNICALL Java_com_nokia_mj_impl_security_MessageDigestImpl__1dispose +(JNIEnv* /*aJni*/, + jclass, + jint aHandle) +{ + + //Get the digest object from aHandle + EVP_MD_CTX* mdctx = reinterpret_cast< EVP_MD_CTX* >(aHandle); + + if (mdctx != NULL) + { + // Cleanup the native handle. + delete mdctx; + mdctx = 0; + } + +}//end dispose + +//end of file + + +