00001
00026 #include <QtCrypto>
00027 #include <QtTest/QtTest>
00028
00029 class CMSut : public QObject
00030 {
00031
00032 Q_OBJECT
00033
00034 private slots:
00035 void initTestCase();
00036 void cleanupTestCase();
00037 void xcrypt_data();
00038 void xcrypt();
00039 void signverify_data();
00040 void signverify();
00041 void signverify_message_data();
00042 void signverify_message();
00043 void signverify_message_invalid_data();
00044 void signverify_message_invalid();
00045 private:
00046 QCA::Initializer* m_init;
00047
00048 };
00049
00050
00051 void CMSut::initTestCase()
00052 {
00053 m_init = new QCA::Initializer;
00054 #include "../fixpaths.include"
00055 }
00056
00057 void CMSut::cleanupTestCase()
00058 {
00059 delete m_init;
00060 }
00061
00062 void CMSut::xcrypt_data()
00063 {
00064 QTest::addColumn<QByteArray>("testText");
00065
00066 QTest::newRow("empty") << QByteArray("");
00067 QTest::newRow("0") << QByteArray("0");
00068 QTest::newRow("07") << QByteArray("07899847jkjjfasjaJKJLJkljklj&kjlj;/**-+.01");
00069 QTest::newRow("dubious") << QByteArray("~!#**$#&&%^@#^&()");
00070 }
00071
00072 void CMSut::xcrypt()
00073 {
00074 QStringList providersToTest;
00075 providersToTest.append("qca-ossl");
00076
00077 foreach(const QString provider, providersToTest) {
00078 if( !QCA::isSupported( "cert", provider ) )
00079 QWARN( QString( "Certificate not supported for "+provider).toLocal8Bit() );
00080 else if( !QCA::isSupported( "cms", provider ) )
00081 QWARN( QString( "CMS not supported for "+provider).toLocal8Bit() );
00082 else {
00083 QCA::Certificate pubCert = QCA::Certificate::fromPEMFile( "QcaTestClientCert.pem",0, provider );
00084 QCOMPARE( pubCert.isNull(), false );
00085
00086 QCA::SecureMessageKey secMsgKey;
00087 QCA::CertificateChain chain;
00088 chain += pubCert;
00089 secMsgKey.setX509CertificateChain( chain );
00090
00091 QCA::CMS cms;
00092 QCA::SecureMessage msg(&cms);
00093 QCOMPARE( msg.canClearsign(), false );
00094 QCOMPARE( msg.canSignAndEncrypt(), false );
00095 QCOMPARE( msg.type(), QCA::SecureMessage::CMS );
00096
00097 msg.setRecipient(secMsgKey);
00098
00099 QFETCH( QByteArray, testText );
00100
00101 msg.startEncrypt();
00102 msg.update(testText);
00103 msg.end();
00104
00105 msg.waitForFinished(-1);
00106
00107 QByteArray encryptedResult1 = msg.read();
00108 QCOMPARE( encryptedResult1.isEmpty(), false );
00109
00110 msg.reset();
00111 msg.setRecipient(secMsgKey);
00112 msg.startEncrypt();
00113 msg.update( testText );
00114 msg.end();
00115
00116 msg.waitForFinished(-1);
00117 QVERIFY( msg.success() );
00118
00119 QByteArray encryptedResult2 = msg.read();
00120 QCOMPARE( encryptedResult2.isEmpty(), false );
00121
00122 QCA::ConvertResult res;
00123 QCA::SecureArray passPhrase = "start";
00124 QCA::PrivateKey privKey = QCA::PrivateKey::fromPEMFile( "QcaTestClientKey.pem", passPhrase, &res );
00125 QCOMPARE( res, QCA::ConvertGood );
00126
00127 secMsgKey.setX509PrivateKey( privKey );
00128 QCA::SecureMessageKeyList privKeyList;
00129 privKeyList += secMsgKey;
00130 QCA::CMS cms2;
00131 cms2.setPrivateKeys( privKeyList );
00132
00133 QCA::SecureMessage msg2( &cms2 );
00134
00135 msg2.startDecrypt();
00136 msg2.update( encryptedResult1 );
00137 msg2.end();
00138 msg2.waitForFinished(-1);
00139 QVERIFY( msg2.success() );
00140 QByteArray decryptedResult1 = msg2.read();
00141 QCOMPARE( decryptedResult1, testText );
00142
00143 msg2.reset();
00144 msg2.startDecrypt();
00145 msg2.update( encryptedResult1 );
00146 msg2.end();
00147 msg2.waitForFinished(-1);
00148 QVERIFY( msg2.success() );
00149 QByteArray decryptedResult2 = msg2.read();
00150
00151 QCOMPARE( decryptedResult1, decryptedResult2 );
00152
00153 QCOMPARE( msg2.canClearsign(), false );
00154 QCOMPARE( msg2.canSignAndEncrypt(), false );
00155 QCOMPARE( msg2.type(), QCA::SecureMessage::CMS );
00156 }
00157 }
00158 }
00159
00160 void CMSut::signverify_data()
00161 {
00162 QTest::addColumn<QByteArray>("testText");
00163
00164 QTest::newRow("empty") << QByteArray("");
00165 QTest::newRow("0") << QByteArray("0");
00166 QTest::newRow("07") << QByteArray("07899847jkjjfasjaJKJLJkljklj&kjlj;/**-+.01");
00167 QTest::newRow("dubious") << QByteArray("~!#**$#&&%^@#^&()");
00168 }
00169
00170
00171 void CMSut::signverify()
00172 {
00173 QStringList providersToTest;
00174 providersToTest.append("qca-ossl");
00175
00176 foreach(const QString provider, providersToTest) {
00177 if( !QCA::isSupported( "cert", provider ) )
00178 QWARN( QString( "Certificate not supported for "+provider).toLocal8Bit() );
00179 else if( !QCA::isSupported( "cms", provider ) )
00180 QWARN( QString( "CMS not supported for "+provider).toLocal8Bit() );
00181 else {
00182 QCA::ConvertResult res;
00183 QCA::SecureArray passPhrase = "start";
00184 QCA::PrivateKey privKey = QCA::PrivateKey::fromPEMFile( "QcaTestClientKey.pem", passPhrase, &res, provider );
00185 QCOMPARE( res, QCA::ConvertGood );
00186
00187 QCA::Certificate pubCert = QCA::Certificate::fromPEMFile( "QcaTestClientCert.pem", &res, provider);
00188 QCOMPARE( res, QCA::ConvertGood );
00189 QCOMPARE( pubCert.isNull(), false );
00190
00191 QCA::CertificateChain chain;
00192 chain += pubCert;
00193 QCA::SecureMessageKey secMsgKey;
00194 secMsgKey.setX509CertificateChain( chain );
00195 secMsgKey.setX509PrivateKey( privKey );
00196
00197 QCA::SecureMessageKeyList privKeyList;
00198 privKeyList += secMsgKey;
00199 QCA::CMS cms2;
00200 cms2.setPrivateKeys( privKeyList );
00201
00202 QCA::SecureMessage msg2( &cms2 );
00203 msg2.setSigners( privKeyList );
00204 QCOMPARE( msg2.canClearsign(), false );
00205 QCOMPARE( msg2.canSignAndEncrypt(), false );
00206 QCOMPARE( msg2.type(), QCA::SecureMessage::CMS );
00207
00208 QFETCH( QByteArray, testText );
00209
00210 msg2.startSign(QCA::SecureMessage::Detached);
00211 msg2.update( testText );
00212 msg2.end();
00213 msg2.waitForFinished(-1);
00214 QVERIFY( msg2.success() );
00215 QByteArray signedResult1 = msg2.signature();
00216 QCOMPARE( signedResult1.isEmpty(), false );
00217
00218 msg2.reset();
00219
00220 msg2.setSigners( privKeyList );
00221 msg2.startSign(QCA::SecureMessage::Detached);
00222 msg2.update( testText );
00223 msg2.end();
00224 msg2.waitForFinished(-1);
00225 QVERIFY( msg2.success() );
00226 QByteArray signedResult2 = msg2.signature();
00227
00228 QCOMPARE( signedResult2.isEmpty(), false );
00229
00230 QCA::CMS cms;
00231 QCA::Certificate caCert = QCA::Certificate::fromPEMFile( "QcaTestRootCert.pem", &res, provider );
00232 QCOMPARE( res, QCA::ConvertGood );
00233 QCA::CertificateCollection caCertCollection;
00234 caCertCollection.addCertificate(caCert);
00235
00236 cms.setTrustedCertificates( caCertCollection );
00237 QCA::SecureMessage msg( &cms );
00238 QCOMPARE( msg.canClearsign(), false );
00239 QCOMPARE( msg.canSignAndEncrypt(), false );
00240 QCOMPARE( msg.type(), QCA::SecureMessage::CMS );
00241
00242 msg.startVerify( signedResult1 );
00243 msg.update( testText );
00244 msg.end();
00245
00246 msg.waitForFinished(-1);
00247 QVERIFY( msg.wasSigned() );
00248 QVERIFY( msg.success() );
00249 QEXPECT_FAIL( "empty", "We don't seem to be able to verify signature of a zero length message", Continue);
00250 QVERIFY( msg.verifySuccess() );
00251
00252 msg.reset();
00253
00254 msg.startVerify( signedResult2);
00255 msg.update( testText );
00256 msg.end();
00257
00258 msg.waitForFinished(-1);
00259 QVERIFY( msg.wasSigned() );
00260 QVERIFY( msg.success() );
00261 QEXPECT_FAIL( "empty", "We don't seem to be able to verify signature of a zero length message", Continue);
00262 QVERIFY( msg.verifySuccess() );
00263
00264 msg.reset();
00265
00266
00267 msg.startVerify( signedResult2 + "junk");
00268 msg.update( testText );
00269 msg.end();
00270
00271 msg.waitForFinished(-1);
00272 QVERIFY( msg.wasSigned() );
00273 QVERIFY( msg.success() );
00274 QCOMPARE( msg.verifySuccess(), false );
00275
00276 msg.reset();
00277
00278
00279 msg.startVerify( signedResult2 );
00280 msg.update( testText+"junk" );
00281 msg.end();
00282
00283 msg.waitForFinished(-1);
00284 QVERIFY( msg.wasSigned() );
00285 QVERIFY( msg.success() );
00286 QCOMPARE( msg.verifySuccess(), false );
00287 }
00288 }
00289 }
00290
00291
00292 void CMSut::signverify_message_data()
00293 {
00294 QTest::addColumn<QByteArray>("testText");
00295
00296 QTest::newRow("empty") << QByteArray("");
00297 QTest::newRow("0") << QByteArray("0");
00298 QTest::newRow("07") << QByteArray("07899847jkjjfasjaJKJLJkljklj&kjlj;/**-+.01");
00299 QTest::newRow("dubious") << QByteArray("~!#**$#&&%^@#^&()");
00300 }
00301
00302
00303 void CMSut::signverify_message()
00304 {
00305 QStringList providersToTest;
00306 providersToTest.append("qca-ossl");
00307
00308 foreach(const QString provider, providersToTest) {
00309 if( !QCA::isSupported( "cert", provider ) )
00310 QWARN( QString( "Certificate not supported for "+provider).toLocal8Bit() );
00311 else if( !QCA::isSupported( "cms", provider ) )
00312 QWARN( QString( "CMS not supported for "+provider).toLocal8Bit() );
00313 else {
00314 QCA::ConvertResult res;
00315 QCA::SecureArray passPhrase = "start";
00316 QCA::PrivateKey privKey = QCA::PrivateKey::fromPEMFile( "QcaTestClientKey.pem", passPhrase, &res, provider );
00317 QCOMPARE( res, QCA::ConvertGood );
00318
00319 QCA::Certificate pubCert = QCA::Certificate::fromPEMFile( "QcaTestClientCert.pem", &res, provider );
00320 QCOMPARE( res, QCA::ConvertGood );
00321 QCOMPARE( pubCert.isNull(), false );
00322
00323 QCA::CertificateChain chain;
00324 chain += pubCert;
00325 QCA::SecureMessageKey secMsgKey;
00326 secMsgKey.setX509CertificateChain( chain );
00327 secMsgKey.setX509PrivateKey( privKey );
00328
00329 QCA::SecureMessageKeyList privKeyList;
00330 privKeyList += secMsgKey;
00331 QCA::CMS cms2;
00332 cms2.setPrivateKeys( privKeyList );
00333
00334 QCA::SecureMessage msg2( &cms2 );
00335 msg2.setSigners( privKeyList );
00336 QCOMPARE( msg2.canClearsign(), false );
00337 QCOMPARE( msg2.canSignAndEncrypt(), false );
00338 QCOMPARE( msg2.type(), QCA::SecureMessage::CMS );
00339
00340 QFETCH( QByteArray, testText );
00341
00342 msg2.startSign( QCA::SecureMessage::Message );
00343 msg2.update( testText );
00344 msg2.end();
00345 msg2.waitForFinished(-1);
00346 QVERIFY( msg2.success() );
00347 QByteArray signedResult1 = msg2.read();
00348 QCOMPARE( signedResult1.isEmpty(), false );
00349
00350 msg2.reset();
00351
00352 msg2.setSigners( privKeyList );
00353 msg2.startSign(QCA::SecureMessage::Message);
00354 msg2.update( testText );
00355 msg2.end();
00356 msg2.waitForFinished(-1);
00357 QVERIFY( msg2.success() );
00358 QByteArray signedResult2 = msg2.read();
00359
00360 QCOMPARE( signedResult2.isEmpty(), false );
00361
00362 QCA::CMS cms;
00363 QCA::Certificate caCert = QCA::Certificate::fromPEMFile( "QcaTestRootCert.pem", &res, provider );
00364 QCOMPARE( res, QCA::ConvertGood );
00365
00366 QCA::CertificateCollection caCertCollection;
00367 caCertCollection.addCertificate(caCert);
00368
00369 cms.setTrustedCertificates( caCertCollection );
00370 QCA::SecureMessage msg( &cms );
00371 QCOMPARE( msg.canClearsign(), false );
00372 QCOMPARE( msg.canSignAndEncrypt(), false );
00373 QCOMPARE( msg.type(), QCA::SecureMessage::CMS );
00374
00375 msg.startVerify( );
00376 msg.update( signedResult1 );
00377 msg.end();
00378
00379 msg.waitForFinished(-1);
00380 QVERIFY( msg.wasSigned() );
00381 QVERIFY( msg.success() );
00382 QVERIFY( msg.verifySuccess() );
00383
00384 msg.reset();
00385
00386 msg.startVerify( );
00387 msg.update( signedResult2 );
00388 msg.end();
00389
00390 msg.waitForFinished(-1);
00391 QVERIFY( msg.wasSigned() );
00392 QVERIFY( msg.success() );
00393 QVERIFY( msg.verifySuccess() );
00394
00395 msg.reset();
00396
00397 msg.startVerify( );
00398 msg.update( signedResult2 );
00399 msg.end();
00400
00401 msg.waitForFinished(-1);
00402 QVERIFY( msg.wasSigned() );
00403 QVERIFY( msg.success() );
00404 QCOMPARE( msg.verifySuccess(), true );
00405 }
00406 }
00407 }
00408
00409 void CMSut::signverify_message_invalid_data()
00410 {
00411 QTest::addColumn<QByteArray>("testText");
00412
00413 QTest::newRow("empty") << QByteArray("");
00414 QTest::newRow("0") << QByteArray("0");
00415 QTest::newRow("07") << QByteArray("07899847jkjjfasjaJKJLJkljklj&kjlj;/**-+.01");
00416 QTest::newRow("dubious") << QByteArray("~!#**$#&&%^@#^&()");
00417 }
00418
00419
00420
00421 void CMSut::signverify_message_invalid()
00422 {
00423 QStringList providersToTest;
00424 providersToTest.append("qca-ossl");
00425
00426 foreach(const QString provider, providersToTest) {
00427 if( !QCA::isSupported( "cert", provider ) )
00428 QWARN( QString( "Certificate not supported for "+provider).toLocal8Bit() );
00429 else if( !QCA::isSupported( "cms", provider ) )
00430 QWARN( QString( "CMS not supported for "+provider).toLocal8Bit() );
00431 else {
00432 QCA::ConvertResult res;
00433 QCA::SecureArray passPhrase = "start";
00434 QCA::PrivateKey privKey = QCA::PrivateKey::fromPEMFile( "QcaTestClientKey.pem", passPhrase, &res, provider );
00435 QCOMPARE( res, QCA::ConvertGood );
00436
00437 QCA::Certificate pubCert = QCA::Certificate::fromPEMFile( "QcaTestClientCert.pem", &res, provider );
00438 QCOMPARE( res, QCA::ConvertGood );
00439 QCOMPARE( pubCert.isNull(), false );
00440
00441 QCA::CertificateChain chain;
00442 chain += pubCert;
00443 QCA::SecureMessageKey secMsgKey;
00444 secMsgKey.setX509CertificateChain( chain );
00445 secMsgKey.setX509PrivateKey( privKey );
00446
00447 QCA::SecureMessageKeyList privKeyList;
00448 privKeyList += secMsgKey;
00449 QCA::CMS cms2;
00450 cms2.setPrivateKeys( privKeyList );
00451
00452 QCA::SecureMessage msg2( &cms2 );
00453 msg2.setSigners( privKeyList );
00454 QCOMPARE( msg2.canClearsign(), false );
00455 QCOMPARE( msg2.canSignAndEncrypt(), false );
00456 QCOMPARE( msg2.type(), QCA::SecureMessage::CMS );
00457
00458 QFETCH( QByteArray, testText );
00459
00460 msg2.startSign( QCA::SecureMessage::Message );
00461 msg2.update( testText );
00462 msg2.end();
00463 msg2.waitForFinished(-1);
00464 QVERIFY( msg2.success() );
00465 QByteArray signedResult1 = msg2.read();
00466 QCOMPARE( signedResult1.isEmpty(), false );
00467
00468 QCA::CMS cms;
00469 QCA::Certificate caCert = QCA::Certificate::fromPEMFile( "QcaTestRootCert.pem", &res, provider );
00470 QCOMPARE( res, QCA::ConvertGood );
00471
00472 QCA::CertificateCollection caCertCollection;
00473 caCertCollection.addCertificate(caCert);
00474
00475 cms.setTrustedCertificates( caCertCollection );
00476 QCA::SecureMessage msg( &cms );
00477 QCOMPARE( msg.canClearsign(), false );
00478 QCOMPARE( msg.canSignAndEncrypt(), false );
00479 QCOMPARE( msg.type(), QCA::SecureMessage::CMS );
00480
00481
00482
00483 signedResult1[signedResult1.size()-2] = 0x00;
00484
00485 msg.startVerify( );
00486 msg.update( signedResult1 );
00487 msg.end();
00488
00489 msg.waitForFinished(-1);
00490 QVERIFY( msg.wasSigned() );
00491 QVERIFY( msg.success() );
00492 QCOMPARE( msg.verifySuccess(), false );
00493 }
00494 }
00495 }
00496
00497
00498 QTEST_MAIN(CMSut)
00499
00500 #include "cms.moc"
00501