javaextensions/satsa/crypto/src/stssignaturefactory.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/satsa/crypto/src/stssignaturefactory.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,232 @@
+/*
+* 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:  Implementation of STSSignatureFactory
+ *
+*/
+
+
+
+#include <x509cert.h>
+#include <openssl/evp.h>
+#include "javajniutils.h"
+#include "stssignaturefactory.h"
+#include "stsrsasignature.h"
+#include "stsdsasignature.h"
+#include "stsconstants.h"
+#include "logger.h"
+
+namespace java
+{
+namespace satsa
+{
+
+STSSignature* STSSignatureFactory::CreateSignature(JNIEnv* aJni,
+        const jstring aAlgorithm, int* errCode)
+{
+    LOG(ESATSA, EInfo, "STSSignatureFactory::CreateSignature+");
+    std::wstring padding;
+    std::wstring algorithm;
+
+    //convert the jstring to native string
+    std::wstring sigstr;
+    try
+    {
+        sigstr = java::util::JniUtils::jstringToWstring(aJni, aAlgorithm);
+    }
+    catch (...)
+    {
+        ELOG(ESATSA, "CreateSignature: caught exception. Return error code");
+        *errCode = KSTSErrNoSuchAlgorithm;
+        return NULL;
+    }
+
+    // Algorithm is a form of <padding>with<algorithm>
+    int index = sigstr.find(STSSignatureSeparator);
+
+    // String must contain 'with'
+    if (index == wstring::npos)
+    {
+        ELOG(ESATSA, "CreateSignature: No Such Algorithm");
+        *errCode = KSTSErrNoSuchAlgorithm;
+        return NULL;
+    }
+
+    // Get padding part
+    padding.assign(sigstr, 0, index);
+
+    // Skip 'with'
+    index += STSSignatureSeparatorLength;
+
+    // Get algorithm part
+    algorithm.assign(sigstr, index, wstring::npos);
+
+    // return null if there isn't padding or algorithm
+    if (padding.length() <= 0 || algorithm.length() <= 0)
+    {
+        ELOG(ESATSA, "CreateSignature:there isn't padding or algorithm ");
+        *errCode = KSTSErrNoSuchAlgorithm;
+        return NULL;
+    }
+
+    // With signatures padding name "SHA1" must be used and Message digest
+    // algorithm name is "SHA-1".
+    if (padding == STSDigestSHA1Signature)
+    {
+        padding.assign(STSDigestSHA1);
+    }
+
+    STSSignature* signature = NULL;
+
+    OpenSSL_add_all_digests();
+
+    if (algorithm == STSAlgorithmDSA)
+    {
+        signature = STSDSASignature::Create(padding, errCode);
+    }
+    else if (algorithm == STSAlgorithmRSA)
+    {
+        signature = STSRSASignature::Create(padding, errCode);
+    }
+    else
+    {
+        // Algorithm is not supported
+        ELOG(ESATSA, "CreateSignature:algorithm is not supported ");
+        *errCode = KSTSErrNoSuchAlgorithm;
+        return NULL;
+    }
+
+    if (*errCode == 0)
+    {
+        //no errors, return the signature object
+        return signature;
+    }
+    else
+    {
+        ELOG(ESATSA, "STSSignatureFactory::CreateSignature:Error, return NULL");
+        return NULL;
+    }
+}
+
+jboolean STSSignatureFactory::IsSupportedAlgorithm(JNIEnv* aJni,
+        const jstring aAlgorithm)
+{
+    LOG(ESATSA, EInfo, "STSSignatureFactory::IsSupportedAlgorithm+");
+    //convert the jstring to native string
+    std::wstring algorithm;
+    try
+    {
+        algorithm = java::util::JniUtils::jstringToWstring(aJni, aAlgorithm);
+    }
+    catch (...)
+    {
+        ELOG(ESATSA, "IsSupportedAlgorithm:caught exception. Return error code");
+        return false;
+    }
+    // RSA and DSA algorithms are supported.
+    if (algorithm == STSAlgorithmRSA || algorithm == STSAlgorithmDSA)
+    {
+        return true;
+    }
+    else
+    {
+        ELOG(ESATSA, "IsSupportedAlgorithm:Algorithm is not supported");
+        return false;
+    }
+}
+
+jint STSSignatureFactory::IsValidKey(JNIEnv* aJni, const jstring aAlgorithm,
+                                     const jstring aKeyFormat, const jbyteArray aKeyEncoded)
+{
+    LOG(ESATSA, EInfo, "STSSignatureFactory::IsValidKey+");
+    std::wstring algorithm;
+    try
+    {
+        algorithm = java::util::JniUtils::jstringToWstring(aJni, aAlgorithm);
+    }
+    catch (...)
+    {
+        ELOG(ESATSA, "IsValidKey: caught exception. Return error code");
+        return KSTSErrNotSupported;
+    }
+    // only X.509 keyformat is supported
+    std::wstring format;
+    try
+    {
+        format = java::util::JniUtils::jstringToWstring(aJni, aKeyFormat);
+    }
+    catch (...)
+    {
+        ELOG(ESATSA, "IsValidKey: caught exception. Return error code");
+        return KSTSErrNotSupported;
+    }
+    if (format != STSKeyFormatX509)
+    {
+        ELOG(ESATSA, "IsValidKey:Key Format Not Supported");
+        return KSTSErrNotSupported;
+    }
+
+    // check the algorithm from the subject public info.
+
+    //Read the encoded key from the jbytearray
+    int key_length = aJni->GetArrayLength(aKeyEncoded);
+    const unsigned char *key = new unsigned char[key_length];
+    aJni->GetByteArrayRegion(aKeyEncoded, 0, key_length, (signed char*) key);
+
+    //check if RSA
+    RSA* iRSA = NULL;
+    iRSA = d2i_RSA_PUBKEY(&iRSA, &key, (long) key_length);
+    if (iRSA == NULL)
+    {
+        //check for DSA
+        DSA* iDSA = NULL;
+        iDSA = d2i_DSA_PUBKEY(&iDSA, &key, (long) key_length);
+
+        if (iDSA == NULL)
+        {
+            //Not RSA or DSA
+            ELOG(ESATSA, "STSSignatureFactory::IsValidKey: Neither RSA nor DSA");
+            return KSTSErrNotSupported;
+        }
+        else
+        {
+            //Check if algorithm is DSA as Key is for DSA
+            if (algorithm == STSAlgorithmDSA)
+            {
+                return 0;
+            }
+            else
+            {
+                ELOG(ESATSA, "IsValidKey: DSA not supported");
+                return KSTSErrNotSupported;
+            }
+        }
+    }
+    else
+    {
+        //Key is for RSA check the algorithm whether its RSA
+        if (algorithm == STSAlgorithmRSA)
+        {
+            return 0;
+        }
+        else
+        {
+            ELOG(ESATSA, "IsValidKey: RSA not supported");
+            return KSTSErrNotSupported;
+        }
+    }
+
+}
+} // namespace satsa
+} // namespace java
+