Blame test/dsatest.c

Packit c4476c
/*
Packit c4476c
 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
 *
Packit c4476c
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
 * this file except in compliance with the License.  You can obtain a copy
Packit c4476c
 * in the file LICENSE in the source distribution or at
Packit c4476c
 * https://www.openssl.org/source/license.html
Packit c4476c
 */
Packit c4476c
Packit c4476c
#include <stdio.h>
Packit c4476c
#include <stdlib.h>
Packit c4476c
#include <string.h>
Packit c4476c
#include <sys/types.h>
Packit c4476c
#include <sys/stat.h>
Packit c4476c
Packit c4476c
#include <openssl/crypto.h>
Packit c4476c
#include <openssl/rand.h>
Packit c4476c
#include <openssl/bn.h>
Packit c4476c
#include <openssl/dsa.h>
Packit c4476c
Packit c4476c
#include "testutil.h"
Packit c4476c
#include "internal/nelem.h"
Packit c4476c
Packit c4476c
#ifndef OPENSSL_NO_DSA
Packit c4476c
static int dsa_cb(int p, int n, BN_GENCB *arg);
Packit c4476c
Packit c4476c
static unsigned char seed[20] = {
Packit c4476c
    0x02, 0x47, 0x11, 0x92, 0x11, 0x88, 0xC8, 0xFB, 0xAF, 0x48, 0x4C, 0x62,
Packit c4476c
    0xDF, 0xA5, 0xBE, 0xA0, 0xA4, 0x3C, 0x56, 0xE3,
Packit c4476c
};
Packit c4476c
Packit c4476c
static unsigned char out_p[] = {
Packit c4476c
    0xAC, 0xCB, 0x1E, 0x63, 0x60, 0x69, 0x0C, 0xFB, 0x06, 0x19, 0x68, 0x3E,
Packit c4476c
    0xA5, 0x01, 0x5A, 0xA2, 0x15, 0x5C, 0xE2, 0x99, 0x2D, 0xD5, 0x30, 0x99,
Packit c4476c
    0x7E, 0x5F, 0x8D, 0xE2, 0xF7, 0xC6, 0x2E, 0x8D, 0xA3, 0x9F, 0x58, 0xAD,
Packit c4476c
    0xD6, 0xA9, 0x7D, 0x0E, 0x0D, 0x95, 0x53, 0xA6, 0x71, 0x3A, 0xDE, 0xAB,
Packit c4476c
    0xAC, 0xE9, 0xF4, 0x36, 0x55, 0x9E, 0xB9, 0xD6, 0x93, 0xBF, 0xF3, 0x18,
Packit c4476c
    0x1C, 0x14, 0x7B, 0xA5, 0x42, 0x2E, 0xCD, 0x00, 0xEB, 0x35, 0x3B, 0x1B,
Packit c4476c
    0xA8, 0x51, 0xBB, 0xE1, 0x58, 0x42, 0x85, 0x84, 0x22, 0xA7, 0x97, 0x5E,
Packit c4476c
    0x99, 0x6F, 0x38, 0x20, 0xBD, 0x9D, 0xB6, 0xD9, 0x33, 0x37, 0x2A, 0xFD,
Packit c4476c
    0xBB, 0xD4, 0xBC, 0x0C, 0x2A, 0x67, 0xCB, 0x9F, 0xBB, 0xDF, 0xF9, 0x93,
Packit c4476c
    0xAA, 0xD6, 0xF0, 0xD6, 0x95, 0x0B, 0x5D, 0x65, 0x14, 0xD0, 0x18, 0x9D,
Packit c4476c
    0xC6, 0xAF, 0xF0, 0xC6, 0x37, 0x7C, 0xF3, 0x5F,
Packit c4476c
};
Packit c4476c
Packit c4476c
static unsigned char out_q[] = {
Packit c4476c
    0xE3, 0x8E, 0x5E, 0x6D, 0xBF, 0x2B, 0x79, 0xF8, 0xC5, 0x4B, 0x89, 0x8B,
Packit c4476c
    0xBA, 0x2D, 0x91, 0xC3, 0x6C, 0x80, 0xAC, 0x87,
Packit c4476c
};
Packit c4476c
Packit c4476c
static unsigned char out_g[] = {
Packit c4476c
    0x42, 0x4A, 0x04, 0x4E, 0x79, 0xB4, 0x99, 0x7F, 0xFD, 0x58, 0x36, 0x2C,
Packit c4476c
    0x1B, 0x5F, 0x18, 0x7E, 0x0D, 0xCC, 0xAB, 0x81, 0xC9, 0x5D, 0x10, 0xCE,
Packit c4476c
    0x4E, 0x80, 0x7E, 0x58, 0xB4, 0x34, 0x3F, 0xA7, 0x45, 0xC7, 0xAA, 0x36,
Packit c4476c
    0x24, 0x42, 0xA9, 0x3B, 0xE8, 0x0E, 0x04, 0x02, 0x2D, 0xFB, 0xA6, 0x13,
Packit c4476c
    0xB9, 0xB5, 0x15, 0xA5, 0x56, 0x07, 0x35, 0xE4, 0x03, 0xB6, 0x79, 0x7C,
Packit c4476c
    0x62, 0xDD, 0xDF, 0x3F, 0x71, 0x3A, 0x9D, 0x8B, 0xC4, 0xF6, 0xE7, 0x1D,
Packit c4476c
    0x52, 0xA8, 0xA9, 0x43, 0x1D, 0x33, 0x51, 0x88, 0x39, 0xBD, 0x73, 0xE9,
Packit c4476c
    0x5F, 0xBE, 0x82, 0x49, 0x27, 0xE6, 0xB5, 0x53, 0xC1, 0x38, 0xAC, 0x2F,
Packit c4476c
    0x6D, 0x97, 0x6C, 0xEB, 0x67, 0xC1, 0x5F, 0x67, 0xF8, 0x35, 0x05, 0x5E,
Packit c4476c
    0xD5, 0x68, 0x80, 0xAA, 0x96, 0xCA, 0x0B, 0x8A, 0xE6, 0xF1, 0xB1, 0x41,
Packit c4476c
    0xC6, 0x75, 0x94, 0x0A, 0x0A, 0x2A, 0xFA, 0x29,
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char str1[] = "12345678901234567890";
Packit c4476c
Packit c4476c
static int dsa_test(void)
Packit c4476c
{
Packit c4476c
    BN_GENCB *cb;
Packit c4476c
    DSA *dsa = NULL;
Packit c4476c
    int counter, ret = 0, i, j;
Packit c4476c
    unsigned char buf[256];
Packit c4476c
    unsigned long h;
Packit c4476c
    unsigned char sig[256];
Packit c4476c
    unsigned int siglen;
Packit c4476c
    const BIGNUM *p = NULL, *q = NULL, *g = NULL;
Packit c4476c
Packit c4476c
    if (!TEST_ptr(cb = BN_GENCB_new()))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    BN_GENCB_set(cb, dsa_cb, NULL);
Packit c4476c
    if (!TEST_ptr(dsa = DSA_new())
Packit c4476c
        || !TEST_true(DSA_generate_parameters_ex(dsa, 1024, seed, 20,
Packit c4476c
                                                &counter, &h, cb)))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    if (!TEST_int_eq(counter, 239))
Packit c4476c
        goto end;
Packit c4476c
    if (!TEST_int_eq(h, 2))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    DSA_get0_pqg(dsa, &p, &q, &g);
Packit c4476c
    i = BN_bn2bin(q, buf);
Packit c4476c
    j = sizeof(out_q);
Packit c4476c
    if (!TEST_int_eq(i, j) || !TEST_mem_eq(buf, i, out_q, i))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    i = BN_bn2bin(p, buf);
Packit c4476c
    j = sizeof(out_p);
Packit c4476c
    if (!TEST_int_eq(i, j) || !TEST_mem_eq(buf, i, out_p, i))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    i = BN_bn2bin(g, buf);
Packit c4476c
    j = sizeof(out_g);
Packit c4476c
    if (!TEST_int_eq(i, j) || !TEST_mem_eq(buf, i, out_g, i))
Packit c4476c
        goto end;
Packit c4476c
Packit c4476c
    DSA_generate_key(dsa);
Packit c4476c
    DSA_sign(0, str1, 20, sig, &siglen, dsa);
Packit c4476c
    if (TEST_true(DSA_verify(0, str1, 20, sig, siglen, dsa)))
Packit c4476c
        ret = 1;
Packit c4476c
Packit c4476c
 end:
Packit c4476c
    DSA_free(dsa);
Packit c4476c
    BN_GENCB_free(cb);
Packit c4476c
    return ret;
Packit c4476c
}
Packit c4476c
Packit c4476c
static int dsa_cb(int p, int n, BN_GENCB *arg)
Packit c4476c
{
Packit c4476c
    static int ok = 0, num = 0;
Packit c4476c
Packit c4476c
    if (p == 0)
Packit c4476c
        num++;
Packit c4476c
    if (p == 2)
Packit c4476c
        ok++;
Packit c4476c
Packit c4476c
    if (!ok && (p == 0) && (num > 1)) {
Packit c4476c
        TEST_error("dsa_cb error");
Packit c4476c
        return 0;
Packit c4476c
    }
Packit c4476c
    return 1;
Packit c4476c
}
Packit c4476c
#endif /* OPENSSL_NO_DSA */
Packit c4476c
Packit c4476c
int setup_tests(void)
Packit c4476c
{
Packit c4476c
#ifndef OPENSSL_NO_DSA
Packit c4476c
    ADD_TEST(dsa_test);
Packit c4476c
#endif
Packit c4476c
    return 1;
Packit c4476c
}