Commit d91b7423 authored by Rich Salz's avatar Rich Salz
Browse files

evp_test.c: Add PrivPubKeyPair tests

parent dd05be5d
Loading
Loading
Loading
Loading
+130 −0
Original line number Diff line number Diff line
@@ -273,6 +273,7 @@ static const struct evp_test_method pderive_test_method;
static const struct evp_test_method pbe_test_method;
static const struct evp_test_method encode_test_method;
static const struct evp_test_method kdf_test_method;
static const struct evp_test_method keypair_test_method;

static const struct evp_test_method *evp_test_list[] = {
    &digest_test_method,
@@ -286,6 +287,7 @@ static const struct evp_test_method *evp_test_list[] = {
    &pbe_test_method,
    &encode_test_method,
    &kdf_test_method,
    &keypair_test_method,
    NULL
};

@@ -2050,3 +2052,131 @@ static const struct evp_test_method kdf_test_method = {
    kdf_test_parse,
    kdf_test_run
};

struct keypair_test_data {
    EVP_PKEY *privk;
    EVP_PKEY *pubk;
};

static int keypair_test_init(struct evp_test *t, const char *pair)
{
    int rv = 0;
    EVP_PKEY *pk = NULL, *pubk = NULL;
    char *pub, *priv = NULL;
    const char *err = "INTERNAL_ERROR";
    struct keypair_test_data *data;

    priv = OPENSSL_strdup(pair);
    if (priv == NULL)
        return 0;
    pub = strchr(priv, ':');
    if ( pub == NULL ) {
        fprintf(stderr, "Wrong syntax \"%s\"\n", pair);
        goto end;
    }
    *pub++ = 0; /* split priv and pub strings */

    if (find_key(&pk, priv, t->private) == 0) {
        fprintf(stderr, "Cannot find private key: %s\n", priv);
        err = "MISSING_PRIVATE_KEY";
        goto end;
    }
    if (find_key(&pubk, pub, t->public) == 0) {
        fprintf(stderr, "Cannot find public key: %s\n", pub);
        err = "MISSING_PUBLIC_KEY";
        goto end;
    }

    if (pk == NULL && pubk == NULL) {
        /* Both keys are listed but unsupported: skip this test */
        t->skip = 1;
        rv = 1;
        goto end;
    }

    data = OPENSSL_malloc(sizeof(*data));
    if (data == NULL )
        goto end;

    data->privk = pk;
    data->pubk = pubk;
    t->data = data;

    rv = 1;
    err = NULL;

end:
    if (priv)
        OPENSSL_free(priv);
    t->err = err;
    return rv;
}

static void keypair_test_cleanup(struct evp_test *t)
{
    struct keypair_test_data *data = t->data;
    t->data = NULL;
    if (data)
        test_free(data);
    return;
}

/* For test that do not accept any custom keyword:
 *      return 0 if called
 */
static int void_test_parse(struct evp_test *t, const char *keyword, const char *value)
{
    return 0;
}

static int keypair_test_run(struct evp_test *t)
{
    int rv = 0;
    const struct keypair_test_data *pair = t->data;
    const char *err = "INTERNAL_ERROR";

    if (pair == NULL)
        goto end;

    if (pair->privk == NULL || pair->pubk == NULL) {
        /* this can only happen if only one of the keys is not set
         * which means that one of them was unsupported while the
         * other isn't: hence a key type mismatch.
         */
        err = "KEYPAIR_TYPE_MISMATCH";
        rv = 1;
        goto end;
    }

    if ((rv = EVP_PKEY_cmp(pair->privk, pair->pubk)) != 1 ) {
        if ( 0 == rv ) {
            err = "KEYPAIR_MISMATCH";
        } else if ( -1 == rv ) {
            err = "KEYPAIR_TYPE_MISMATCH";
        } else if ( -2 == rv ) {
            err = "UNSUPPORTED_KEY_COMPARISON";
        } else {
            fprintf(stderr, "Unexpected error in key comparison\n");
            rv = 0;
            goto end;
        }
        rv = 1;
        goto end;
    }

    rv = 1;
    err = NULL;

end:
    t->err = err;
    return rv;
}

static const struct evp_test_method keypair_test_method = {
    "PrivPubKeyPair",
    keypair_test_init,
    keypair_test_cleanup,
    void_test_parse,
    keypair_test_run
};
+1790 −1

File changed.

Preview size limit exceeded, changes collapsed.