Home | History | Annotate | Download | only in dsa
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) cryptsoft.com).
      6  * The implementation was written so as to conform with Netscapes SSL.
      7  *
      8  * This library is free for commercial and non-commercial use as long as
      9  * the following conditions are aheared to.  The following conditions
     10  * apply to all code found in this distribution, be it the RC4, RSA,
     11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     12  * included with this distribution is covered by the same copyright terms
     13  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     14  *
     15  * Copyright remains Eric Young's, and as such any Copyright notices in
     16  * the code are not to be removed.
     17  * If this package is used in a product, Eric Young should be given attribution
     18  * as the author of the parts of the library used.
     19  * This can be in the form of a textual message at program startup or
     20  * in documentation (online or textual) provided with the package.
     21  *
     22  * Redistribution and use in source and binary forms, with or without
     23  * modification, are permitted provided that the following conditions
     24  * are met:
     25  * 1. Redistributions of source code must retain the copyright
     26  *    notice, this list of conditions and the following disclaimer.
     27  * 2. Redistributions in binary form must reproduce the above copyright
     28  *    notice, this list of conditions and the following disclaimer in the
     29  *    documentation and/or other materials provided with the distribution.
     30  * 3. All advertising materials mentioning features or use of this software
     31  *    must display the following acknowledgement:
     32  *    "This product includes cryptographic software written by
     33  *     Eric Young (eay (at) cryptsoft.com)"
     34  *    The word 'cryptographic' can be left out if the rouines from the library
     35  *    being used are not cryptographic related :-).
     36  * 4. If you include any Windows specific code (or a derivative thereof) from
     37  *    the apps directory (application code) you must include an acknowledgement:
     38  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     39  *
     40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     50  * SUCH DAMAGE.
     51  *
     52  * The licence and distribution terms for any publically available version or
     53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     54  * copied and put under another distribution licence
     55  * [including the GNU Public Licence.]
     56  *
     57  * The DSS routines are based on patches supplied by
     58  * Steven Schoch <schoch (at) sheba.arc.nasa.gov>. */
     59 
     60 #include <openssl/dsa.h>
     61 
     62 #include <openssl/bio.h>
     63 #include <openssl/bn.h>
     64 #include <openssl/crypto.h>
     65 
     66 #include "internal.h"
     67 
     68 
     69 static int dsa_cb(int p, int n, BN_GENCB *arg);
     70 
     71 /* seed, out_p, out_q, out_g are taken from the updated Appendix 5 to
     72  * FIPS PUB 186 and also appear in Appendix 5 to FIPS PIB 186-1 */
     73 static unsigned char seed[20] = {0xd5, 0x01, 0x4e, 0x4b, 0x60, 0xef, 0x2b,
     74                                  0xa8, 0xb6, 0x21, 0x1b, 0x40, 0x62, 0xba,
     75                                  0x32, 0x24, 0xe0, 0x42, 0x7d, 0xd3, };
     76 
     77 static unsigned char out_p[] = {
     78     0x8d, 0xf2, 0xa4, 0x94, 0x49, 0x22, 0x76, 0xaa, 0x3d, 0x25, 0x75,
     79     0x9b, 0xb0, 0x68, 0x69, 0xcb, 0xea, 0xc0, 0xd8, 0x3a, 0xfb, 0x8d,
     80     0x0c, 0xf7, 0xcb, 0xb8, 0x32, 0x4f, 0x0d, 0x78, 0x82, 0xe5, 0xd0,
     81     0x76, 0x2f, 0xc5, 0xb7, 0x21, 0x0e, 0xaf, 0xc2, 0xe9, 0xad, 0xac,
     82     0x32, 0xab, 0x7a, 0xac, 0x49, 0x69, 0x3d, 0xfb, 0xf8, 0x37, 0x24,
     83     0xc2, 0xec, 0x07, 0x36, 0xee, 0x31, 0xc8, 0x02, 0x91, };
     84 
     85 static unsigned char out_q[] = {0xc7, 0x73, 0x21, 0x8c, 0x73, 0x7e, 0xc8,
     86                                 0xee, 0x99, 0x3b, 0x4f, 0x2d, 0xed, 0x30,
     87                                 0xf4, 0x8e, 0xda, 0xce, 0x91, 0x5f, };
     88 
     89 static unsigned char out_g[] = {
     90     0x62, 0x6d, 0x02, 0x78, 0x39, 0xea, 0x0a, 0x13, 0x41, 0x31, 0x63,
     91     0xa5, 0x5b, 0x4c, 0xb5, 0x00, 0x29, 0x9d, 0x55, 0x22, 0x95, 0x6c,
     92     0xef, 0xcb, 0x3b, 0xff, 0x10, 0xf3, 0x99, 0xce, 0x2c, 0x2e, 0x71,
     93     0xcb, 0x9d, 0xe5, 0xfa, 0x24, 0xba, 0xbf, 0x58, 0xe5, 0xb7, 0x95,
     94     0x21, 0x92, 0x5c, 0x9c, 0xc4, 0x2e, 0x9f, 0x6f, 0x46, 0x4b, 0x08,
     95     0x8c, 0xc5, 0x72, 0xaf, 0x53, 0xe6, 0xd7, 0x88, 0x02, };
     96 
     97 static const uint8_t str1[]="12345678901234567890";
     98 
     99 static BIO *bio_err = NULL;
    100 static BIO *bio_out = NULL;
    101 
    102 int main(int argc, char **argv) {
    103   BN_GENCB cb;
    104   DSA *dsa = NULL;
    105   int counter, ok = 0, i, j;
    106   unsigned char buf[256];
    107   unsigned long h;
    108   unsigned char sig[256];
    109   unsigned int siglen;
    110 
    111   CRYPTO_library_init();
    112 
    113   bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
    114   bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);
    115 
    116   BIO_printf(bio_out, "test generation of DSA parameters\n");
    117 
    118   BN_GENCB_set(&cb, dsa_cb, bio_out);
    119   dsa = DSA_new();
    120   if (dsa == NULL ||
    121       !DSA_generate_parameters_ex(dsa, 512, seed, 20, &counter, &h, &cb)) {
    122     goto end;
    123   }
    124 
    125   BIO_printf(bio_out, "seed\n");
    126   for (i = 0; i < 20; i += 4) {
    127     BIO_printf(bio_out, "%02X%02X%02X%02X ", seed[i], seed[i + 1], seed[i + 2],
    128                seed[i + 3]);
    129   }
    130   BIO_printf(bio_out, "\ncounter=%d h=%ld\n", counter, h);
    131 
    132   if (counter != 105) {
    133     BIO_printf(bio_err, "counter should be 105\n");
    134     goto end;
    135   }
    136   if (h != 2) {
    137     BIO_printf(bio_err, "h should be 2\n");
    138     goto end;
    139   }
    140 
    141   i = BN_bn2bin(dsa->q, buf);
    142   j = sizeof(out_q);
    143   if (i != j || memcmp(buf, out_q, i) != 0) {
    144     BIO_printf(bio_err, "q value is wrong\n");
    145     goto end;
    146   }
    147 
    148   i = BN_bn2bin(dsa->p, buf);
    149   j = sizeof(out_p);
    150   if (i != j || memcmp(buf, out_p, i) != 0) {
    151     BIO_printf(bio_err, "p value is wrong\n");
    152     goto end;
    153   }
    154 
    155   i = BN_bn2bin(dsa->g, buf);
    156   j = sizeof(out_g);
    157   if (i != j || memcmp(buf, out_g, i) != 0) {
    158     BIO_printf(bio_err, "g value is wrong\n");
    159     goto end;
    160   }
    161 
    162   DSA_generate_key(dsa);
    163   DSA_sign(0, str1, 20, sig, &siglen, dsa);
    164   if (DSA_verify(0, str1, 20, sig, siglen, dsa) == 1) {
    165     ok = 1;
    166   } else {
    167     BIO_printf(bio_err, "verification failure\n");
    168   }
    169 
    170 end:
    171   if (!ok) {
    172     BIO_print_errors(bio_err);
    173   }
    174   if (dsa != NULL) {
    175     DSA_free(dsa);
    176   }
    177 
    178   BIO_free(bio_err);
    179   BIO_free(bio_out);
    180 
    181   if (ok) {
    182     printf("PASS\n");
    183   }
    184 
    185   return ok == 1 ? 0 : 1;
    186 }
    187 
    188 static int dsa_cb(int p, int n, BN_GENCB *arg) {
    189   char c = '*';
    190   static int ok = 0, num = 0;
    191 
    192   switch (p) {
    193   case 0:
    194     c = '.';
    195     num++;
    196     break;
    197   case 1:
    198     c = '+';
    199     break;
    200   case 2:
    201     c = '*';
    202     ok++;
    203     break;
    204   case 3:
    205     c = '\n';
    206   }
    207 
    208   BIO_write(arg->arg, &c, 1);
    209   (void)BIO_flush(arg->arg);
    210 
    211   if (!ok && p == 0 && num > 1) {
    212     BIO_printf((BIO *)arg, "error in dsatest\n");
    213     return 0;
    214   }
    215 
    216   return 1;
    217 }
    218