Logo Search packages:      
Sourcecode: poco version File versions  Download package

RSATest.cpp

//
// RSATest.cpp
//
// $Id: //poco/1.3/Crypto/testsuite/src/RSATest.cpp#2 $
//
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
// 
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//


#include "RSATest.h"
#include "CppUnit/TestCaller.h"
#include "CppUnit/TestSuite.h"
#include "Poco/Crypto/RSADigestEngine.h"
#include "Poco/Crypto/CipherFactory.h"
#include "Poco/Crypto/Cipher.h"
#include "Poco/Net/X509Certificate.h"
#include "Poco/Net/Context.h"
#include <sstream>


using namespace Poco::Crypto;
using namespace Poco::Net;



static const std::string anyPem(
"-----BEGIN CERTIFICATE-----\r\n"
"MIICaDCCAdECCQCzfxSsk7yaLjANBgkqhkiG9w0BAQUFADBzMQswCQYDVQQGEwJB\r\n"
"VDESMBAGA1UECBMJQ2FyaW50aGlhMRIwEAYDVQQHEwlTdC4gSmFrb2IxDzANBgNV\r\n"
"BAoTBkFwcEluZjEPMA0GA1UEAxMGQXBwSW5mMRowGAYJKoZIhvcNAQkBFgthcHBA\r\n"
"aW5mLmNvbTAeFw0wNjAzMDExMzA3MzFaFw0wNjAzMzExMzA3MzFaMH4xCzAJBgNV\r\n"
"BAYTAkFUMRIwEAYDVQQIEwlDYXJpbnRoaWExETAPBgNVBAcTCFN0IEpha29iMRww\r\n"
"GgYDVQQKExNBcHBsaWVkIEluZm9ybWF0aWNzMQowCAYDVQQDFAEqMR4wHAYJKoZI\r\n"
"hvcNAQkBFg9pbmZvQGFwcGluZi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ\r\n"
"AoGBAJHGyXDHyCYoWz+65ltNwwZbhwOGnxr9P1WMATuFJh0bPBZxKbZRdbTm9KhZ\r\n"
"OlvsEIsfgiYdsxURYIqXfEgISYLZcZY0pQwGEOmB+0NeC/+ENSfOlNSthx6zSVlc\r\n"
"zhJ7+dJOGwepHAiLr1fRuc5jogYLraE+lKTnqAAFfzwvti77AgMBAAEwDQYJKoZI\r\n"
"hvcNAQEFBQADgYEAY/ZoeY1ukkEJX7259NeoVM0oahlulWV0rlCqyaeosOiDORPT\r\n"
"m6X1w/5MTCf9VyaD1zukoSZ4QqNVjHFXcXidbB7Tgt3yRuZ5PC5LIFCDPv9mgPne\r\n"
"mUA70yfctNfza2z3ZiQ6NDkW3mZX+1tmxYIrJQIrkVeYeqf1Gh2nyZrUMcE=\r\n"
"-----END CERTIFICATE-----\r\n"
"-----BEGIN RSA PRIVATE KEY-----\r\n"
"Proc-Type: 4,ENCRYPTED\r\n"
"DEK-Info: DES-EDE3-CBC,E7AE93C9E49184EA\r\n"
"\r\n"
"A2IqzNcWs+I5vzV+i+woDk56+yr58eU0Onw8eEvXkLjnSc58JU4327IF7yUbKWdW\r\n"
"Q7BYGGOkVFiZ7ANOwviDg5SUhxRDWCcW8dS6/p1vfdQ1C3qj2OwJjkpg0aDBIzJn\r\n"
"FzgguT3MF3ama77vxv0S3kOfmCj62MLqPGpj5pQ0/1hefRFbL8oAX8bXUN7/rmGM\r\n"
"Zc0QyzFZv2iQ04dY/6TNclwKPB4H0On4K+8BMs3PRkWA0clCaQaFO2+iwnk3XZfe\r\n"
"+MsKUEbLCpAQeYspYv1cw38dCdWq1KTP5aJk+oXgwjfX5cAaPTz74NTqTIsCcaTD\r\n"
"3vy7ukJYFlDR9Kyo7z8rMazYrKJslhnuRH0BhK9st9McwL957j5tZmrKyraCcmCx\r\n"
"dMAGcsis1va3ayYZpIpFqA4EhYrTM+6N8ZRfUap20+b5IQwHfTQDejUhL6rBwy7j\r\n"
"Ti5yD83/itoOMyXq2sV/XWfVD5zk/P5iv22O1EAQMhhnPB9K/I/JhuSGQJfn3cNh\r\n"
"ykOUYT0+vDeSeEVa+FVEP1W35G0alTbKbNs5Tb8KxJ3iDJUxokM//SvPXZy9hOVX\r\n"
"Y05imB04J15DaGbAHlNzunhuJi7121WV/JRXZRW9diE6hwpD8rwqi3FMuRUmy7U9\r\n"
"aFA5poKRAYlo9YtZ3YpFyjGKB6MfCQcB2opuSnQ/gbugV41m67uQ4CDwWLaNRkTb\r\n"
"GlsMBNcHnidg15Bsat5HaB7l250ukrI13Uw1MYdDUzaS3gPfw9aC4F2w0p3U+DPH\r\n"
"80/zePxtroR7T4/+rI136Rl+aMXDMOEGCX1TVP8rjuZzuRyUSUKC8Q==\r\n"
"-----END RSA PRIVATE KEY-----\r\n"
"-----BEGIN CERTIFICATE-----\r\n"
"MIICXTCCAcYCCQC1Vk/N8qR4AjANBgkqhkiG9w0BAQUFADBzMQswCQYDVQQGEwJB\r\n"
"VDESMBAGA1UECBMJQ2FyaW50aGlhMRIwEAYDVQQHEwlTdC4gSmFrb2IxDzANBgNV\r\n"
"BAoTBkFwcEluZjEPMA0GA1UEAxMGQXBwSW5mMRowGAYJKoZIhvcNAQkBFgthcHBA\r\n"
"aW5mLmNvbTAeFw0wNjAyMjcxMzI3MThaFw0wNjAzMjkxMzI3MThaMHMxCzAJBgNV\r\n"
"BAYTAkFUMRIwEAYDVQQIEwlDYXJpbnRoaWExEjAQBgNVBAcTCVN0LiBKYWtvYjEP\r\n"
"MA0GA1UEChMGQXBwSW5mMQ8wDQYDVQQDEwZBcHBJbmYxGjAYBgkqhkiG9w0BCQEW\r\n"
"C2FwcEBpbmYuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsFXiPuicN\r\n"
"Im4oJwF8NuaFN+lgYwcZ6dAO3ILIR3kLA2PxF8HSQLfF8J8a4odZhLhctIMAKTxm\r\n"
"k0w8TW5qhL8QLdGzY9vzvkgdKOkan2t3sMeXJAfrM1AphTsmgntAQazGZjOj5p4W\r\n"
"jDnxQ+VXAylqwjHh49eSBxM3wgoscF4iLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GB\r\n"
"AIpfLdXiKchPvFMhQS8xTtXvrw5dVL3yImUMYs4GQi8RrjGmfGB3yMAR7B/b8v4a\r\n"
"+ztfusgWAWiUKuSGTk4S8YB0fsFlmOv0WDr+PyZ4Lui/a8opbyzGE7rqpnF/s0GO\r\n"
"M7uLCNNwIN7WhmxcWV0KZU1wTppoSWPJda1yTbBzF9XP\r\n"
"-----END CERTIFICATE-----\r\n"
);

RSATest::RSATest(const std::string& name): CppUnit::TestCase(name)
{
}


RSATest::~RSATest()
{
}


void RSATest::testNewKeys()
{
      RSAKey key(RSAKey::KL_1024, RSAKey::EXP_SMALL);
      std::ostringstream strPub;
      std::ostringstream strPriv;
      key.save(&strPub, &strPriv, "testpwd");
      std::string pubKey = strPub.str();
      std::string privKey = strPriv.str();

      //now do the round trip
      std::istringstream iPub(pubKey);
      std::istringstream iPriv(privKey);
      RSAKey key2(&iPub, &iPriv, "testpwd");

      std::istringstream iPriv2(privKey);
      RSAKey key3(0, &iPriv2,  "testpwd");
      std::ostringstream strPub3;
      key3.save(&strPub3);
      std::string pubFromPrivate = strPub3.str();
      assert (pubFromPrivate == pubKey);
}


void RSATest::testSign()
{
      std::string msg("Test this sign message");
      RSAKey key(RSAKey::KL_2048, RSAKey::EXP_LARGE);
      RSADigestEngine eng(key);
      eng.update(msg.c_str(), msg.length());
      const Poco::DigestEngine::Digest& sig = eng.signature();
      std::string hexDig = Poco::DigestEngine::digestToHex(sig);

      //verify
      std::ostringstream strPub;
      key.save(&strPub);
      std::string pubKey = strPub.str();
      std::istringstream iPub(pubKey);
      RSAKey keyPub(&iPub);
      RSADigestEngine eng2(key);
      eng2.update(msg.c_str(), msg.length());
      eng2.verify(sig);
}


void RSATest::testSignManipulated()
{
      std::string msg("Test this sign message");
      std::string msgManip("Test that sign message");
      RSAKey key(RSAKey::KL_2048, RSAKey::EXP_LARGE);
      RSADigestEngine eng(key);
      eng.update(msg.c_str(), msg.length());
      const Poco::DigestEngine::Digest& sig = eng.signature();
      std::string hexDig = Poco::DigestEngine::digestToHex(sig);

      //verify
      std::ostringstream strPub;
      key.save(&strPub);
      std::string pubKey = strPub.str();
      std::istringstream iPub(pubKey);
      RSAKey keyPub(&iPub);
      RSADigestEngine eng2(key);
      eng2.update(msgManip.c_str(), msgManip.length());
      try
      {
            eng2.verify(sig);
            fail("must fail");
      }
      catch(Poco::DataFormatException&)
      {
      }
}


void RSATest::createRSACipher()
{
      Cipher::Ptr pCipher = CipherFactory::defaultFactory().createCipher(RSAKey(RSAKey::KL_1024,RSAKey::EXP_SMALL));
      std::string val("lets do some encryption");
      std::string enc = pCipher->encryptString(val);
      std::string dec = pCipher->decryptString(enc);
      assert (dec == val);
}


void RSATest::createRSACipherLarge()
{
      Cipher::Ptr pCipher = CipherFactory::defaultFactory().createCipher(RSAKey(RSAKey::KL_1024,RSAKey::EXP_SMALL));
      std::string val(16385, 'x');
      std::string enc = pCipher->encryptString(val);
      std::string dec = pCipher->decryptString(enc);
      assert (dec == val);
}


void RSATest::testCertificate()
{
      std::istringstream str(anyPem);
      X509Certificate cert(str);
      
      Context::Ptr pContext(new Context("", "", false));
      bool ok = cert.verify("www.appinf.com", pContext);
      RSAKey key(cert);
      Cipher::Ptr pCipher = CipherFactory::defaultFactory().createCipher(key);
      std::string val("lets do some encryption");
      
      std::string enc = pCipher->encryptString(val);
}


void RSATest::setUp()
{
}


void RSATest::tearDown()
{
}


CppUnit::Test* RSATest::suite()
{
      CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("RSATest");

      CppUnit_addTest(pSuite, RSATest, testNewKeys);
      CppUnit_addTest(pSuite, RSATest, testSign);
      CppUnit_addTest(pSuite, RSATest, testSignManipulated);
      CppUnit_addTest(pSuite, RSATest, createRSACipher);
      CppUnit_addTest(pSuite, RSATest, createRSACipherLarge);
      CppUnit_addTest(pSuite, RSATest, testCertificate);

      return pSuite;
}

Generated by  Doxygen 1.6.0   Back to index