Blame test/dsatest.c

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