674baa3c4f
changes. MFC after: 2 weeks X-MFC-With: r361677
1546 lines
55 KiB
C
1546 lines
55 KiB
C
/* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "testutil.h"
|
|
#include "apr.h"
|
|
#include "apu.h"
|
|
#include "apu_errno.h"
|
|
#include "apr_pools.h"
|
|
#include "apr_dso.h"
|
|
#include "apr_crypto.h"
|
|
#include "apr_strings.h"
|
|
|
|
#if APU_HAVE_CRYPTO
|
|
|
|
#define TEST_STRING "12345"
|
|
#define ALIGNED_STRING "123456789012345"
|
|
|
|
static const apr_crypto_driver_t *get_driver(abts_case *tc, apr_pool_t *pool,
|
|
const char *name, const char *params)
|
|
{
|
|
|
|
const apr_crypto_driver_t *driver = NULL;
|
|
const apu_err_t *result = NULL;
|
|
apr_status_t rv;
|
|
|
|
rv = apr_crypto_init(pool);
|
|
ABTS_ASSERT(tc, "failed to init apr_crypto", rv == APR_SUCCESS);
|
|
|
|
rv = apr_crypto_get_driver(&driver, name, params, &result, pool);
|
|
if (APR_ENOTIMPL == rv) {
|
|
ABTS_NOT_IMPL(tc,
|
|
apr_psprintf(pool, "Crypto driver '%s' not implemented", (char *)name));
|
|
return NULL;
|
|
}
|
|
if (APR_EDSOOPEN == rv) {
|
|
ABTS_NOT_IMPL(tc,
|
|
apr_psprintf(pool, "Crypto driver '%s' DSO could not be opened", (char *)name));
|
|
return NULL;
|
|
}
|
|
if (APR_SUCCESS != rv && result) {
|
|
char err[1024];
|
|
apr_strerror(rv, err, sizeof(err) - 1);
|
|
fprintf(stderr, "get_driver error %d: %s: '%s' native error %d: %s (%s),",
|
|
rv, err, name, result->rc, result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, apr_psprintf(pool, "failed to apr_crypto_get_driver for '%s' with %d",
|
|
name, rv), rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_get_driver returned NULL", driver != NULL);
|
|
if (!driver || rv) {
|
|
return NULL;
|
|
}
|
|
|
|
return driver;
|
|
|
|
}
|
|
|
|
static const apr_crypto_driver_t *get_nss_driver(abts_case *tc,
|
|
apr_pool_t *pool)
|
|
{
|
|
|
|
/* initialise NSS */
|
|
return get_driver(tc, pool, "nss", "");
|
|
|
|
}
|
|
|
|
static const apr_crypto_driver_t *get_openssl_driver(abts_case *tc,
|
|
apr_pool_t *pool)
|
|
{
|
|
|
|
return get_driver(tc, pool, "openssl", NULL);
|
|
|
|
}
|
|
|
|
static const apr_crypto_driver_t *get_commoncrypto_driver(abts_case *tc,
|
|
apr_pool_t *pool)
|
|
{
|
|
|
|
return get_driver(tc, pool, "commoncrypto", NULL);
|
|
|
|
}
|
|
|
|
static apr_crypto_t *make(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver)
|
|
{
|
|
|
|
apr_crypto_t *f = NULL;
|
|
|
|
if (!driver) {
|
|
return NULL;
|
|
}
|
|
|
|
/* get the context */
|
|
apr_crypto_make(&f, driver, "engine=openssl", pool);
|
|
ABTS_ASSERT(tc, "apr_crypto_make returned NULL", f != NULL);
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
static const apr_crypto_key_t *keysecret(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver, const apr_crypto_t *f,
|
|
apr_crypto_block_key_type_e type, apr_crypto_block_key_mode_e mode,
|
|
int doPad, apr_size_t secretLen, const char *description)
|
|
{
|
|
apr_crypto_key_t *key = NULL;
|
|
const apu_err_t *result = NULL;
|
|
apr_crypto_key_rec_t *rec = apr_pcalloc(pool, sizeof(apr_crypto_key_rec_t));
|
|
apr_status_t rv;
|
|
|
|
if (!f) {
|
|
return NULL;
|
|
}
|
|
|
|
rec->ktype = APR_CRYPTO_KTYPE_SECRET;
|
|
rec->type = type;
|
|
rec->mode = mode;
|
|
rec->pad = doPad;
|
|
rec->k.secret.secret = apr_pcalloc(pool, secretLen);
|
|
rec->k.secret.secretLen = secretLen;
|
|
|
|
/* init the passphrase */
|
|
rv = apr_crypto_key(&key, rec, f, pool);
|
|
if (APR_ENOCIPHER == rv) {
|
|
apr_crypto_error(&result, f);
|
|
ABTS_NOT_IMPL(tc,
|
|
apr_psprintf(pool, "skipped: %s %s key return APR_ENOCIPHER: error %d: %s (%s)\n", description, apr_crypto_driver_name(driver), result->rc, result->reason ? result->reason : "", result->msg ? result->msg : ""));
|
|
return NULL;
|
|
}
|
|
else {
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr, "key: %s %s apr error %d / native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_EKEYLENGTH", rv != APR_EKEYLENGTH);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_ENOKEY", rv != APR_ENOKEY);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_EPADDING",
|
|
rv != APR_EPADDING);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_EKEYTYPE",
|
|
rv != APR_EKEYTYPE);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_key", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned NULL context", key != NULL);
|
|
}
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
return key;
|
|
|
|
}
|
|
|
|
static const apr_crypto_key_t *passphrase(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver, const apr_crypto_t *f,
|
|
apr_crypto_block_key_type_e type, apr_crypto_block_key_mode_e mode,
|
|
int doPad, const char *description)
|
|
{
|
|
|
|
apr_crypto_key_t *key = NULL;
|
|
const apu_err_t *result = NULL;
|
|
const char *pass = "secret";
|
|
const char *salt = "salt";
|
|
apr_status_t rv;
|
|
|
|
if (!f) {
|
|
return NULL;
|
|
}
|
|
|
|
/* init the passphrase */
|
|
rv = apr_crypto_passphrase(&key, NULL, pass, strlen(pass),
|
|
(unsigned char *) salt, strlen(salt), type, mode, doPad, 4096, f,
|
|
pool);
|
|
if (APR_ENOCIPHER == rv) {
|
|
apr_crypto_error(&result, f);
|
|
ABTS_NOT_IMPL(tc, apr_psprintf(pool,
|
|
"skipped: %s %s passphrase return APR_ENOCIPHER: error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), result->rc,
|
|
result->reason ? result->reason : "", result->msg ? result->msg : ""));
|
|
return NULL;
|
|
}
|
|
else {
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr, "passphrase: %s %s apr error %d / native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_ENOKEY", rv != APR_ENOKEY);
|
|
ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_EPADDING", rv != APR_EPADDING);
|
|
ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_passphrase", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_passphrase returned NULL context", key != NULL);
|
|
}
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
return key;
|
|
|
|
}
|
|
|
|
static const apr_crypto_key_t *keypassphrase(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver, const apr_crypto_t *f,
|
|
apr_crypto_block_key_type_e type, apr_crypto_block_key_mode_e mode,
|
|
int doPad, const char *description)
|
|
{
|
|
|
|
apr_crypto_key_t *key = NULL;
|
|
const apu_err_t *result = NULL;
|
|
const char *pass = "secret";
|
|
const char *salt = "salt";
|
|
apr_crypto_key_rec_t *rec = apr_pcalloc(pool, sizeof(apr_crypto_key_rec_t));
|
|
apr_status_t rv;
|
|
|
|
if (!f) {
|
|
return NULL;
|
|
}
|
|
|
|
rec->ktype = APR_CRYPTO_KTYPE_PASSPHRASE;
|
|
rec->type = type;
|
|
rec->mode = mode;
|
|
rec->pad = doPad;
|
|
rec->k.passphrase.pass = pass;
|
|
rec->k.passphrase.passLen = strlen(pass);
|
|
rec->k.passphrase.salt = (unsigned char *)salt;
|
|
rec->k.passphrase.saltLen = strlen(salt);
|
|
rec->k.passphrase.iterations = 4096;
|
|
|
|
/* init the passphrase */
|
|
rv = apr_crypto_key(&key, rec, f, pool);
|
|
if (APR_ENOCIPHER == rv) {
|
|
apr_crypto_error(&result, f);
|
|
ABTS_NOT_IMPL(tc, apr_psprintf(pool,
|
|
"skipped: %s %s key passphrase return APR_ENOCIPHER: error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), result->rc,
|
|
result->reason ? result->reason : "", result->msg ? result->msg : ""));
|
|
return NULL;
|
|
}
|
|
else {
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr, "key passphrase: %s %s apr error %d / native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_ENOKEY", rv != APR_ENOKEY);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_EPADDING", rv != APR_EPADDING);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_key", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_key returned NULL context", key != NULL);
|
|
}
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
return key;
|
|
|
|
}
|
|
|
|
static unsigned char *encrypt_block(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver, const apr_crypto_t *f,
|
|
const apr_crypto_key_t *key, const unsigned char *in,
|
|
const apr_size_t inlen, unsigned char **cipherText,
|
|
apr_size_t *cipherTextLen, const unsigned char **iv,
|
|
apr_size_t *blockSize, const char *description)
|
|
{
|
|
|
|
apr_crypto_block_t *block = NULL;
|
|
const apu_err_t *result = NULL;
|
|
apr_size_t len = 0;
|
|
apr_status_t rv;
|
|
|
|
if (!driver || !f || !key || !in) {
|
|
return NULL;
|
|
}
|
|
|
|
/* init the encryption */
|
|
rv = apr_crypto_block_encrypt_init(&block, iv, key, blockSize, pool);
|
|
if (APR_ENOTIMPL == rv) {
|
|
ABTS_NOT_IMPL(tc, "apr_crypto_block_encrypt_init returned APR_ENOTIMPL");
|
|
}
|
|
else {
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr,
|
|
"encrypt_init: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_ENOKEY",
|
|
rv != APR_ENOKEY);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_ENOIV",
|
|
rv != APR_ENOIV);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_EKEYTYPE",
|
|
rv != APR_EKEYTYPE);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_EKEYLENGTH",
|
|
rv != APR_EKEYLENGTH);
|
|
ABTS_ASSERT(tc,
|
|
"apr_crypto_block_encrypt_init returned APR_ENOTENOUGHENTROPY",
|
|
rv != APR_ENOTENOUGHENTROPY);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt_init",
|
|
rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned NULL context",
|
|
block != NULL);
|
|
}
|
|
if (!block || rv) {
|
|
return NULL;
|
|
}
|
|
|
|
/* encrypt the block */
|
|
rv = apr_crypto_block_encrypt(cipherText, cipherTextLen, in, inlen, block);
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr, "encrypt: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt returned APR_ECRYPT", rv != APR_ECRYPT);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt failed to allocate buffer", *cipherText != NULL);
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
|
|
/* finalise the encryption */
|
|
rv = apr_crypto_block_encrypt_finish(*cipherText + *cipherTextLen, &len,
|
|
block);
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr,
|
|
"encrypt_finish: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_finish returned APR_ECRYPT", rv != APR_ECRYPT);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_finish returned APR_EPADDING", rv != APR_EPADDING);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_encrypt_finish returned APR_ENOSPACE", rv != APR_ENOSPACE);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt_finish", rv == APR_SUCCESS);
|
|
*cipherTextLen += len;
|
|
apr_crypto_block_cleanup(block);
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
|
|
return *cipherText;
|
|
|
|
}
|
|
|
|
static unsigned char *decrypt_block(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t *driver, const apr_crypto_t *f,
|
|
const apr_crypto_key_t *key, unsigned char *cipherText,
|
|
apr_size_t cipherTextLen, unsigned char **plainText,
|
|
apr_size_t *plainTextLen, const unsigned char *iv,
|
|
apr_size_t *blockSize, const char *description)
|
|
{
|
|
|
|
apr_crypto_block_t *block = NULL;
|
|
const apu_err_t *result = NULL;
|
|
apr_size_t len = 0;
|
|
apr_status_t rv;
|
|
|
|
if (!driver || !f || !key || !cipherText) {
|
|
return NULL;
|
|
}
|
|
|
|
/* init the decryption */
|
|
rv = apr_crypto_block_decrypt_init(&block, blockSize, iv, key, pool);
|
|
if (APR_ENOTIMPL == rv) {
|
|
ABTS_NOT_IMPL(tc, "apr_crypto_block_decrypt_init returned APR_ENOTIMPL");
|
|
}
|
|
else {
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr,
|
|
"decrypt_init: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_ENOKEY", rv != APR_ENOKEY);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_ENOIV", rv != APR_ENOIV);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_EKEYLENGTH", rv != APR_EKEYLENGTH);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt_init", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned NULL context", block != NULL);
|
|
}
|
|
if (!block || rv) {
|
|
return NULL;
|
|
}
|
|
|
|
/* decrypt the block */
|
|
rv = apr_crypto_block_decrypt(plainText, plainTextLen, cipherText,
|
|
cipherTextLen, block);
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr, "decrypt: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt returned APR_ECRYPT", rv != APR_ECRYPT);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt", rv == APR_SUCCESS);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt failed to allocate buffer", *plainText != NULL);
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
|
|
/* finalise the decryption */
|
|
rv = apr_crypto_block_decrypt_finish(*plainText + *plainTextLen, &len,
|
|
block);
|
|
if (APR_SUCCESS != rv) {
|
|
apr_crypto_error(&result, f);
|
|
fprintf(stderr,
|
|
"decrypt_finish: %s %s (APR %d) native error %d: %s (%s)\n",
|
|
description, apr_crypto_driver_name(driver), rv, result->rc,
|
|
result->reason ? result->reason : "",
|
|
result->msg ? result->msg : "");
|
|
}
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_finish returned APR_ECRYPT", rv != APR_ECRYPT);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_finish returned APR_EPADDING", rv != APR_EPADDING);
|
|
ABTS_ASSERT(tc, "apr_crypto_block_decrypt_finish returned APR_ENOSPACE", rv != APR_ENOSPACE);
|
|
ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt_finish", rv == APR_SUCCESS);
|
|
if (rv) {
|
|
return NULL;
|
|
}
|
|
|
|
*plainTextLen += len;
|
|
apr_crypto_block_cleanup(block);
|
|
|
|
return *plainText;
|
|
|
|
}
|
|
|
|
/**
|
|
* Interoperability test.
|
|
*
|
|
* data must point at an array of two driver structures. Data will be encrypted
|
|
* with the first driver, and decrypted with the second.
|
|
*
|
|
* If the two drivers interoperate, the test passes.
|
|
*/
|
|
static void crypto_block_cross(abts_case *tc, apr_pool_t *pool,
|
|
const apr_crypto_driver_t **drivers,
|
|
const apr_crypto_block_key_type_e type,
|
|
const apr_crypto_block_key_mode_e mode, int doPad,
|
|
const unsigned char *in, apr_size_t inlen, apr_size_t secretLen,
|
|
const char *description)
|
|
{
|
|
const apr_crypto_driver_t *driver1 = drivers[0];
|
|
const apr_crypto_driver_t *driver2 = drivers[1];
|
|
apr_crypto_t *f1 = NULL;
|
|
apr_crypto_t *f2 = NULL;
|
|
const apr_crypto_key_t *key1 = NULL;
|
|
const apr_crypto_key_t *key2 = NULL;
|
|
const apr_crypto_key_t *key3 = NULL;
|
|
const apr_crypto_key_t *key4 = NULL;
|
|
const apr_crypto_key_t *key5 = NULL;
|
|
const apr_crypto_key_t *key6 = NULL;
|
|
|
|
unsigned char *cipherText = NULL;
|
|
apr_size_t cipherTextLen = 0;
|
|
unsigned char *plainText = NULL;
|
|
apr_size_t plainTextLen = 0;
|
|
const unsigned char *iv = NULL;
|
|
apr_size_t blockSize = 0;
|
|
|
|
f1 = make(tc, pool, driver1);
|
|
f2 = make(tc, pool, driver2);
|
|
key1 = passphrase(tc, pool, driver1, f1, type, mode, doPad, description);
|
|
key2 = passphrase(tc, pool, driver2, f2, type, mode, doPad, description);
|
|
|
|
cipherText = encrypt_block(tc, pool, driver1, f1, key1, in, inlen,
|
|
&cipherText, &cipherTextLen, &iv, &blockSize, description);
|
|
plainText = decrypt_block(tc, pool, driver2, f2, key2, cipherText,
|
|
cipherTextLen, &plainText, &plainTextLen, iv, &blockSize,
|
|
description);
|
|
|
|
if (cipherText && plainText) {
|
|
if (memcmp(in, plainText, inlen)) {
|
|
fprintf(stderr, "passphrase cross mismatch: %s %s/%s\n", description,
|
|
apr_crypto_driver_name(driver1), apr_crypto_driver_name(
|
|
driver2));
|
|
}
|
|
ABTS_STR_EQUAL(tc, (char *)in, (char *)plainText);
|
|
}
|
|
|
|
key3 = keysecret(tc, pool, driver1, f1, type, mode, doPad, secretLen, description);
|
|
key4 = keysecret(tc, pool, driver2, f2, type, mode, doPad, secretLen, description);
|
|
|
|
iv = NULL;
|
|
blockSize = 0;
|
|
cipherText = NULL;
|
|
plainText = NULL;
|
|
cipherText = encrypt_block(tc, pool, driver1, f1, key3, in, inlen,
|
|
&cipherText, &cipherTextLen, &iv, &blockSize, description);
|
|
plainText = decrypt_block(tc, pool, driver2, f2, key4, cipherText,
|
|
cipherTextLen, &plainText, &plainTextLen, iv, &blockSize,
|
|
description);
|
|
|
|
if (cipherText && plainText) {
|
|
if (memcmp(in, plainText, inlen)) {
|
|
fprintf(stderr, "key secret cross mismatch: %s %s/%s\n", description,
|
|
apr_crypto_driver_name(driver1), apr_crypto_driver_name(
|
|
driver2));
|
|
}
|
|
ABTS_STR_EQUAL(tc, (char *)in, (char *)plainText);
|
|
}
|
|
|
|
key5 = keypassphrase(tc, pool, driver1, f1, type, mode, doPad, description);
|
|
key6 = keypassphrase(tc, pool, driver2, f2, type, mode, doPad, description);
|
|
|
|
iv = NULL;
|
|
blockSize = 0;
|
|
cipherText = NULL;
|
|
plainText = NULL;
|
|
cipherText = encrypt_block(tc, pool, driver1, f1, key5, in, inlen,
|
|
&cipherText, &cipherTextLen, &iv, &blockSize, description);
|
|
plainText = decrypt_block(tc, pool, driver2, f2, key6, cipherText,
|
|
cipherTextLen, &plainText, &plainTextLen, iv, &blockSize,
|
|
description);
|
|
|
|
if (cipherText && plainText) {
|
|
if (memcmp(in, plainText, inlen)) {
|
|
fprintf(stderr, "key passphrase cross mismatch: %s %s/%s\n", description,
|
|
apr_crypto_driver_name(driver1), apr_crypto_driver_name(
|
|
driver2));
|
|
}
|
|
ABTS_STR_EQUAL(tc, (char *)in, (char *)plainText);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Test initialisation.
|
|
*/
|
|
static void test_crypto_init(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
apr_status_t rv;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
|
|
rv = apr_crypto_init(pool);
|
|
ABTS_ASSERT(tc, "failed to init apr_crypto", rv == APR_SUCCESS);
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of OpenSSL key.
|
|
*/
|
|
static void test_crypto_key_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f = NULL;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_openssl_driver(tc, pool);
|
|
|
|
f = make(tc, pool, driver);
|
|
keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
|
|
"KEY_AES_256/MODE_CBC");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of NSS key.
|
|
*/
|
|
static void test_crypto_key_nss(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f = NULL;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_nss_driver(tc, pool);
|
|
|
|
f = make(tc, pool, driver);
|
|
keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
|
|
"KEY_AES_256/MODE_CBC");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of CommonCrypto key.
|
|
*/
|
|
static void test_crypto_key_commoncrypto(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f = NULL;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_commoncrypto_driver(tc, pool);
|
|
|
|
f = make(tc, pool, driver);
|
|
keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
|
|
"KEY_AES_256/MODE_CBC");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of OpenSSL block crypt.
|
|
*/
|
|
static void test_crypto_block_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of NSS block crypt.
|
|
*/
|
|
static void test_crypto_block_nss(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_nss_driver(tc, pool);
|
|
drivers[1] = get_nss_driver(tc, pool);
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, "KEY_3DES_192/MODE_ECB"); */
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of Common Crypto block crypt.
|
|
*/
|
|
static void test_crypto_block_commoncrypto(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_commoncrypto_driver(tc, pool);
|
|
drivers[1] = get_commoncrypto_driver(tc, pool);
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt NSS, decrypt OpenSSL.
|
|
*/
|
|
static void test_crypto_block_nss_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_nss_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, 24, "KEY_3DES_192/MODE_ECB"); */
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt OpenSSL, decrypt NSS.
|
|
*/
|
|
static void test_crypto_block_openssl_nss(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_nss_driver(tc, pool);
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, 24, "KEY_3DES_192/MODE_ECB"); */
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt OpenSSL, decrypt CommonCrypto.
|
|
*/
|
|
static void test_crypto_block_openssl_commoncrypto(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] =
|
|
{ NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_commoncrypto_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt OpenSSL, decrypt CommonCrypto.
|
|
*/
|
|
static void test_crypto_block_commoncrypto_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] =
|
|
{ NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
|
|
apr_size_t inlen = sizeof(ALIGNED_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_commoncrypto_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of OpenSSL block crypt.
|
|
*/
|
|
static void test_crypto_block_openssl_pad(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of NSS block crypt.
|
|
*/
|
|
static void test_crypto_block_nss_pad(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] =
|
|
{ NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_nss_driver(tc, pool);
|
|
drivers[1] = get_nss_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, 24, "KEY_3DES_192/MODE_ECB"); */
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
|
|
/* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, 32, "KEY_AES_256/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
|
|
/* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 1, in, inlen, 24, "KEY_AES_192/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
|
|
/* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 1, in, inlen, 16, "KEY_AES_128/MODE_ECB");*/
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Simple test of Common Crypto block crypt.
|
|
*/
|
|
static void test_crypto_block_commoncrypto_pad(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_commoncrypto_driver(tc, pool);
|
|
drivers[1] = get_commoncrypto_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt NSS, decrypt OpenSSL.
|
|
*/
|
|
static void test_crypto_block_nss_openssl_pad(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_nss_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, 24, "KEY_3DES_192/MODE_ECB"); */
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
|
|
/* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, 32, "KEY_AES_256/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
|
|
/* KEY_AES_192 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
|
|
/* KEY_AES_192 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");*/
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt OpenSSL, decrypt NSS.
|
|
*/
|
|
static void test_crypto_block_openssl_nss_pad(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] = { NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_nss_driver(tc, pool);
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
|
|
in, inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
|
|
/* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
|
|
/* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, 24, "KEY_3DES_192/MODE_ECB"); */
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
|
|
/* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, 32, "KEY_AES_256/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in, inlen,
|
|
24, "KEY_AES_192/MODE_CBC");
|
|
|
|
/* KEY_AES_192 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in, inlen,
|
|
24, "KEY_AES_192/MODE_ECB");*/
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in, inlen,
|
|
16, "KEY_AES_128/MODE_CBC");
|
|
|
|
/* KEY_AES_128 / MODE_ECB doesn't support padding on NSS */
|
|
/*crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in, inlen,
|
|
16, "KEY_AES_128/MODE_ECB");*/
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt CommonCrypto, decrypt OpenSSL.
|
|
*/
|
|
static void test_crypto_block_commoncrypto_openssl_pad(abts_case *tc,
|
|
void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] =
|
|
{ NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_commoncrypto_driver(tc, pool);
|
|
drivers[1] = get_openssl_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Encrypt OpenSSL, decrypt CommonCrypto.
|
|
*/
|
|
static void test_crypto_block_openssl_commoncrypto_pad(abts_case *tc,
|
|
void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *drivers[] =
|
|
{ NULL, NULL };
|
|
|
|
const unsigned char *in = (const unsigned char *) TEST_STRING;
|
|
apr_size_t inlen = sizeof(TEST_STRING);
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
drivers[0] = get_openssl_driver(tc, pool);
|
|
drivers[1] = get_commoncrypto_driver(tc, pool);
|
|
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_3DES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 1, in,
|
|
inlen, 32, "KEY_AES_256/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
|
|
inlen, 24, "KEY_AES_192/MODE_ECB");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_CBC");
|
|
crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
|
|
inlen, 16, "KEY_AES_128/MODE_ECB");
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Types, OpenSSL.
|
|
*/
|
|
static void test_crypto_get_block_key_types_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *types;
|
|
int *key_3des_192;
|
|
int *key_aes_128;
|
|
int *key_aes_192;
|
|
int *key_aes_256;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_openssl_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_types(&types, f);
|
|
|
|
key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_3des_192);
|
|
ABTS_INT_EQUAL(tc, *key_3des_192, APR_KEY_3DES_192);
|
|
|
|
key_aes_128 = apr_hash_get(types, "aes128", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_128);
|
|
ABTS_INT_EQUAL(tc, *key_aes_128, APR_KEY_AES_128);
|
|
|
|
key_aes_192 = apr_hash_get(types, "aes192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_192);
|
|
ABTS_INT_EQUAL(tc, *key_aes_192, APR_KEY_AES_192);
|
|
|
|
key_aes_256 = apr_hash_get(types, "aes256", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_256);
|
|
ABTS_INT_EQUAL(tc, *key_aes_256, APR_KEY_AES_256);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Types, NSS.
|
|
*/
|
|
static void test_crypto_get_block_key_types_nss(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *types;
|
|
int *key_3des_192;
|
|
int *key_aes_128;
|
|
int *key_aes_192;
|
|
int *key_aes_256;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_nss_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_types(&types, f);
|
|
|
|
key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_3des_192);
|
|
ABTS_INT_EQUAL(tc, *key_3des_192, APR_KEY_3DES_192);
|
|
|
|
key_aes_128 = apr_hash_get(types, "aes128", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_128);
|
|
ABTS_INT_EQUAL(tc, *key_aes_128, APR_KEY_AES_128);
|
|
|
|
key_aes_192 = apr_hash_get(types, "aes192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_192);
|
|
ABTS_INT_EQUAL(tc, *key_aes_192, APR_KEY_AES_192);
|
|
|
|
key_aes_256 = apr_hash_get(types, "aes256", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_256);
|
|
ABTS_INT_EQUAL(tc, *key_aes_256, APR_KEY_AES_256);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Types, Common Crypto.
|
|
*/
|
|
static void test_crypto_get_block_key_types_commoncrypto(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *types;
|
|
int *key_3des_192;
|
|
int *key_aes_128;
|
|
int *key_aes_192;
|
|
int *key_aes_256;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_commoncrypto_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_types(&types, f);
|
|
|
|
key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_3des_192);
|
|
ABTS_INT_EQUAL(tc, *key_3des_192, APR_KEY_3DES_192);
|
|
|
|
key_aes_128 = apr_hash_get(types, "aes128", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_128);
|
|
ABTS_INT_EQUAL(tc, *key_aes_128, APR_KEY_AES_128);
|
|
|
|
key_aes_192 = apr_hash_get(types, "aes192", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_192);
|
|
ABTS_INT_EQUAL(tc, *key_aes_192, APR_KEY_AES_192);
|
|
|
|
key_aes_256 = apr_hash_get(types, "aes256", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, key_aes_256);
|
|
ABTS_INT_EQUAL(tc, *key_aes_256, APR_KEY_AES_256);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Modes, OpenSSL.
|
|
*/
|
|
static void test_crypto_get_block_key_modes_openssl(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *modes;
|
|
int *mode_ecb;
|
|
int *mode_cbc;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_openssl_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_modes(&modes, f);
|
|
|
|
mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_ecb);
|
|
ABTS_INT_EQUAL(tc, *mode_ecb, APR_MODE_ECB);
|
|
|
|
mode_cbc = apr_hash_get(modes, "cbc", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_cbc);
|
|
ABTS_INT_EQUAL(tc, *mode_cbc, APR_MODE_CBC);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Modes, NSS.
|
|
*/
|
|
static void test_crypto_get_block_key_modes_nss(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *modes;
|
|
int *mode_ecb;
|
|
int *mode_cbc;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_nss_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_modes(&modes, f);
|
|
|
|
mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_ecb);
|
|
ABTS_INT_EQUAL(tc, *mode_ecb, APR_MODE_ECB);
|
|
|
|
mode_cbc = apr_hash_get(modes, "cbc", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_cbc);
|
|
ABTS_INT_EQUAL(tc, *mode_cbc, APR_MODE_CBC);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
/**
|
|
* Get Modes, Common Crypto.
|
|
*/
|
|
static void test_crypto_get_block_key_modes_commoncrypto(abts_case *tc, void *data)
|
|
{
|
|
apr_pool_t *pool = NULL;
|
|
const apr_crypto_driver_t *driver;
|
|
apr_crypto_t *f;
|
|
apr_hash_t *modes;
|
|
int *mode_ecb;
|
|
int *mode_cbc;
|
|
|
|
apr_pool_create(&pool, NULL);
|
|
driver = get_commoncrypto_driver(tc, pool);
|
|
if (driver) {
|
|
|
|
f = make(tc, pool, driver);
|
|
apr_crypto_get_block_key_modes(&modes, f);
|
|
|
|
mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_ecb);
|
|
ABTS_INT_EQUAL(tc, *mode_ecb, APR_MODE_ECB);
|
|
|
|
mode_cbc = apr_hash_get(modes, "cbc", APR_HASH_KEY_STRING);
|
|
ABTS_PTR_NOTNULL(tc, mode_cbc);
|
|
ABTS_INT_EQUAL(tc, *mode_cbc, APR_MODE_CBC);
|
|
|
|
}
|
|
|
|
apr_pool_destroy(pool);
|
|
|
|
}
|
|
|
|
static void test_crypto_memzero(abts_case *tc, void *data)
|
|
{
|
|
/* Aligned message */
|
|
struct {
|
|
char buf[7 * sizeof(int)];
|
|
int untouched;
|
|
} msg;
|
|
/* A bit of type punning such that 'msg' might look unused
|
|
* after the call to apr_crypto_memzero().
|
|
*/
|
|
int *ptr = (int *)&msg;
|
|
int i;
|
|
|
|
/* Fill buf with non-zeros (odds) */
|
|
for (i = 1; i < 2 * sizeof(msg.buf); i += 2) {
|
|
msg.buf[i / 2] = (char)i;
|
|
ABTS_ASSERT(tc, "test_crypto_memzero() barrier", msg.buf[i / 2] != 0);
|
|
}
|
|
|
|
/* Zero out the whole, and check it */
|
|
apr_crypto_memzero(&msg, sizeof msg);
|
|
for (i = 0; i < sizeof(msg) / sizeof(*ptr); ++i) {
|
|
ABTS_ASSERT(tc, "test_crypto_memzero() optimized out", ptr[i] == 0);
|
|
}
|
|
}
|
|
|
|
static void test_crypto_equals(abts_case *tc, void *data)
|
|
{
|
|
/* Buffers of each type of scalar */
|
|
union {
|
|
char c;
|
|
short s;
|
|
int i;
|
|
long l;
|
|
float f;
|
|
double d;
|
|
void *p;
|
|
} buf0[7], buf1[7], buf[7];
|
|
char *ptr = (char *)buf;
|
|
int i;
|
|
|
|
#define TEST_SCALAR_MATCH(i, x, r) \
|
|
ABTS_ASSERT(tc, "test_crypto_equals(" APR_STRINGIFY(x) ")" \
|
|
" != " APR_STRINGIFY(r), \
|
|
apr_crypto_equals(&buf##r[i].x, &buf[i].x, \
|
|
sizeof(buf[i].x)) == r)
|
|
|
|
/* Fill buf with non-zeros (odds) */
|
|
for (i = 1; i < 2 * sizeof(buf); i += 2) {
|
|
ptr[i / 2] = (char)i;
|
|
}
|
|
/* Set buf1 = buf */
|
|
memcpy(buf1, buf, sizeof buf);
|
|
/* Set buf0 = {0} */
|
|
memset(buf0, 0, sizeof buf0);
|
|
|
|
/* Check that buf1 == buf for each scalar */
|
|
TEST_SCALAR_MATCH(0, c, 1);
|
|
TEST_SCALAR_MATCH(1, s, 1);
|
|
TEST_SCALAR_MATCH(2, i, 1);
|
|
TEST_SCALAR_MATCH(3, l, 1);
|
|
TEST_SCALAR_MATCH(4, f, 1);
|
|
TEST_SCALAR_MATCH(5, d, 1);
|
|
TEST_SCALAR_MATCH(6, p, 1);
|
|
|
|
/* Check that buf0 != buf for each scalar */
|
|
TEST_SCALAR_MATCH(0, c, 0);
|
|
TEST_SCALAR_MATCH(1, s, 0);
|
|
TEST_SCALAR_MATCH(2, i, 0);
|
|
TEST_SCALAR_MATCH(3, l, 0);
|
|
TEST_SCALAR_MATCH(4, f, 0);
|
|
TEST_SCALAR_MATCH(5, d, 0);
|
|
TEST_SCALAR_MATCH(6, p, 0);
|
|
}
|
|
|
|
abts_suite *testcrypto(abts_suite *suite)
|
|
{
|
|
suite = ADD_SUITE(suite);
|
|
|
|
/* test simple init and shutdown */
|
|
abts_run_test(suite, test_crypto_init, NULL);
|
|
|
|
/* test key parsing - openssl */
|
|
abts_run_test(suite, test_crypto_key_openssl, NULL);
|
|
|
|
/* test key parsing - nss */
|
|
abts_run_test(suite, test_crypto_key_nss, NULL);
|
|
|
|
/* test key parsing - commoncrypto */
|
|
abts_run_test(suite, test_crypto_key_commoncrypto, NULL);
|
|
|
|
/* test a simple encrypt / decrypt operation - openssl */
|
|
abts_run_test(suite, test_crypto_block_openssl, NULL);
|
|
|
|
/* test a padded encrypt / decrypt operation - openssl */
|
|
abts_run_test(suite, test_crypto_block_openssl_pad, NULL);
|
|
|
|
/* test a simple encrypt / decrypt operation - nss */
|
|
abts_run_test(suite, test_crypto_block_nss, NULL);
|
|
|
|
/* test a padded encrypt / decrypt operation - nss */
|
|
abts_run_test(suite, test_crypto_block_nss_pad, NULL);
|
|
|
|
/* test a simple encrypt / decrypt operation - commoncrypto */
|
|
abts_run_test(suite, test_crypto_block_commoncrypto, NULL);
|
|
|
|
/* test a padded encrypt / decrypt operation - commoncrypto */
|
|
abts_run_test(suite, test_crypto_block_commoncrypto_pad, NULL);
|
|
|
|
/* test encrypt nss / decrypt openssl */
|
|
abts_run_test(suite, test_crypto_block_nss_openssl, NULL);
|
|
|
|
/* test padded encrypt nss / decrypt openssl */
|
|
abts_run_test(suite, test_crypto_block_nss_openssl_pad, NULL);
|
|
|
|
/* test encrypt openssl / decrypt nss */
|
|
abts_run_test(suite, test_crypto_block_openssl_nss, NULL);
|
|
|
|
/* test padded encrypt openssl / decrypt nss */
|
|
abts_run_test(suite, test_crypto_block_openssl_nss_pad, NULL);
|
|
|
|
/* test encrypt openssl / decrypt commoncrypto */
|
|
abts_run_test(suite, test_crypto_block_openssl_commoncrypto, NULL);
|
|
|
|
/* test padded encrypt openssl / decrypt commoncrypto */
|
|
abts_run_test(suite, test_crypto_block_openssl_commoncrypto_pad, NULL);
|
|
|
|
/* test encrypt commoncrypto / decrypt openssl */
|
|
abts_run_test(suite, test_crypto_block_commoncrypto_openssl, NULL);
|
|
|
|
/* test padded encrypt commoncrypto / decrypt openssl */
|
|
abts_run_test(suite, test_crypto_block_commoncrypto_openssl_pad, NULL);
|
|
|
|
/* test block key types openssl */
|
|
abts_run_test(suite, test_crypto_get_block_key_types_openssl, NULL);
|
|
|
|
/* test block key types nss */
|
|
abts_run_test(suite, test_crypto_get_block_key_types_nss, NULL);
|
|
|
|
/* test block key types commoncrypto */
|
|
abts_run_test(suite, test_crypto_get_block_key_types_commoncrypto, NULL);
|
|
|
|
/* test block key modes openssl */
|
|
abts_run_test(suite, test_crypto_get_block_key_modes_openssl, NULL);
|
|
|
|
/* test block key modes nss */
|
|
abts_run_test(suite, test_crypto_get_block_key_modes_nss, NULL);
|
|
|
|
/* test block key modes commoncrypto */
|
|
abts_run_test(suite, test_crypto_get_block_key_modes_commoncrypto, NULL);
|
|
|
|
abts_run_test(suite, test_crypto_memzero, NULL);
|
|
abts_run_test(suite, test_crypto_equals, NULL);
|
|
|
|
return suite;
|
|
}
|
|
|
|
#else
|
|
|
|
/**
|
|
* Dummy test suite when crypto is turned off.
|
|
*/
|
|
abts_suite *testcrypto(abts_suite *suite)
|
|
{
|
|
return ADD_SUITE(suite);
|
|
}
|
|
|
|
#endif /* APU_HAVE_CRYPTO */
|