]> andersk Git - gssapi-openssh.git/blobdiff - openssh/moduli.c
fix AIX build problem with T_NULL being redefined
[gssapi-openssh.git] / openssh / moduli.c
index 581b03503d9709435ac4cde3d765aa95af0bc40e..44e5ddfc0c03347620cb3998c953ac1092f313e8 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: moduli.c,v 1.9 2004/07/11 17:48:47 deraadt Exp $ */
+/* $OpenBSD: moduli.c,v 1.19 2006/11/06 21:25:28 markus Exp $ */
 /*
  * Copyright 1994 Phil Karn <karn@qualcomm.com>
  * Copyright 1996-1998, 2003 William Allen Simpson <wsimpson@greendragon.com>
  */
 
 #include "includes.h"
-#include "xmalloc.h"
-#include "log.h"
+
+#include <sys/types.h>
 
 #include <openssl/bn.h>
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include "xmalloc.h"
+#include "log.h"
+
 /*
  * File output defines
  */
@@ -56,7 +65,7 @@
 #define QTYPE_UNKNOWN          (0)
 #define QTYPE_UNSTRUCTURED     (1)
 #define QTYPE_SAFE             (2)
-#define QTYPE_SCHNOOR          (3)
+#define QTYPE_SCHNORR          (3)
 #define QTYPE_SOPHIE_GERMAIN   (4)
 #define QTYPE_STRONG           (5)
 
 #define TINY_NUMBER    (1UL<<16)
 
 /* Ensure enough bit space for testing 2*q. */
-#define TEST_MAXIMUM    (1UL<<16)
-#define TEST_MINIMUM    (QSIZE_MINIMUM + 1)
-/* real TEST_MINIMUM    (1UL << (SHIFT_WORD - TEST_POWER)) */
-#define TEST_POWER      (3)    /* 2**n, n < SHIFT_WORD */
+#define TEST_MAXIMUM   (1UL<<16)
+#define TEST_MINIMUM   (QSIZE_MINIMUM + 1)
+/* real TEST_MINIMUM   (1UL << (SHIFT_WORD - TEST_POWER)) */
+#define TEST_POWER     (3)     /* 2**n, n < SHIFT_WORD */
 
 /* bit operations on 32-bit words */
-#define BIT_CLEAR(a,n)  ((a)[(n)>>SHIFT_WORD] &= ~(1L << ((n) & 31)))
-#define BIT_SET(a,n)    ((a)[(n)>>SHIFT_WORD] |= (1L << ((n) & 31)))
-#define BIT_TEST(a,n)   ((a)[(n)>>SHIFT_WORD] & (1L << ((n) & 31)))
+#define BIT_CLEAR(a,n) ((a)[(n)>>SHIFT_WORD] &= ~(1L << ((n) & 31)))
+#define BIT_SET(a,n)   ((a)[(n)>>SHIFT_WORD] |= (1L << ((n) & 31)))
+#define BIT_TEST(a,n)  ((a)[(n)>>SHIFT_WORD] & (1L << ((n) & 31)))
 
 /*
  * Prime testing defines
  */
 
 /* Minimum number of primality tests to perform */
-#define TRIAL_MINIMUM           (4)
+#define TRIAL_MINIMUM  (4)
 
 /*
  * Sieving data (XXX - move to struct)
@@ -144,7 +153,7 @@ static u_int32_t *LargeSieve, largewords, largetries, largenumbers;
 static u_int32_t largebits, largememory;       /* megabytes */
 static BIGNUM *largebase;
 
-int gen_candidates(FILE *, int, int, BIGNUM *);
+int gen_candidates(FILE *, u_int32_t, u_int32_t, BIGNUM *);
 int prime_test(FILE *, FILE *, u_int32_t, u_int32_t);
 
 /*
@@ -241,19 +250,20 @@ sieve_large(u_int32_t s)
  * The list is checked against small known primes (less than 2**30).
  */
 int
-gen_candidates(FILE *out, int memory, int power, BIGNUM *start)
+gen_candidates(FILE *out, u_int32_t memory, u_int32_t power, BIGNUM *start)
 {
        BIGNUM *q;
        u_int32_t j, r, s, t;
        u_int32_t smallwords = TINY_NUMBER >> 6;
        u_int32_t tinywords = TINY_NUMBER >> 6;
        time_t time_start, time_stop;
-       int i, ret = 0;
+       u_int32_t i;
+       int ret = 0;
 
        largememory = memory;
 
        if (memory != 0 &&
-          (memory < LARGE_MINIMUM || memory > LARGE_MAXIMUM)) {
+           (memory < LARGE_MINIMUM || memory > LARGE_MAXIMUM)) {
                error("Invalid memory amount (min %ld, max %ld)",
                    LARGE_MINIMUM, LARGE_MAXIMUM);
                return (-1);
@@ -300,21 +310,10 @@ gen_candidates(FILE *out, int memory, int power, BIGNUM *start)
                largewords = (largememory << SHIFT_MEGAWORD);
        }
 
-       TinySieve = calloc(tinywords, sizeof(u_int32_t));
-       if (TinySieve == NULL) {
-               error("Insufficient memory for tiny sieve: need %u bytes",
-                   tinywords << SHIFT_BYTE);
-               exit(1);
-       }
+       TinySieve = xcalloc(tinywords, sizeof(u_int32_t));
        tinybits = tinywords << SHIFT_WORD;
 
-       SmallSieve = calloc(smallwords, sizeof(u_int32_t));
-       if (SmallSieve == NULL) {
-               error("Insufficient memory for small sieve: need %u bytes",
-                   smallwords << SHIFT_BYTE);
-               xfree(TinySieve);
-               exit(1);
-       }
+       SmallSieve = xcalloc(smallwords, sizeof(u_int32_t));
        smallbits = smallwords << SHIFT_WORD;
 
        /*
@@ -328,20 +327,26 @@ gen_candidates(FILE *out, int memory, int power, BIGNUM *start)
 
        /* validation check: count the number of primes tried */
        largetries = 0;
-       q = BN_new();
+       if ((q = BN_new()) == NULL)
+               fatal("BN_new failed");
 
        /*
         * Generate random starting point for subprime search, or use
         * specified parameter.
         */
-       largebase = BN_new();
-       if (start == NULL)
-               BN_rand(largebase, power, 1, 1);
-       else
-               BN_copy(largebase, start);
+       if ((largebase = BN_new()) == NULL)
+               fatal("BN_new failed");
+       if (start == NULL) {
+               if (BN_rand(largebase, power, 1, 1) == 0)
+                       fatal("BN_rand failed");
+       } else {
+               if (BN_copy(largebase, start) == NULL)
+                       fatal("BN_copy: failed");
+       }
 
        /* ensure odd */
-       BN_set_bit(largebase, 0);
+       if (BN_set_bit(largebase, 0) == 0)
+               fatal("BN_set_bit: failed");
 
        time(&time_start);
 
@@ -371,8 +376,8 @@ gen_candidates(FILE *out, int memory, int power, BIGNUM *start)
         * fencepost errors, the last pass is skipped.
         */
        for (smallbase = TINY_NUMBER + 3;
-            smallbase < (SMALL_MAXIMUM - TINY_NUMBER);
-            smallbase += TINY_NUMBER) {
+           smallbase < (SMALL_MAXIMUM - TINY_NUMBER);
+           smallbase += TINY_NUMBER) {
                for (i = 0; i < tinybits; i++) {
                        if (BIT_TEST(TinySieve, i))
                                continue; /* 2*i+3 is composite */
@@ -425,8 +430,10 @@ gen_candidates(FILE *out, int memory, int power, BIGNUM *start)
                        continue; /* Definitely composite, skip */
 
                debug2("test q = largebase+%u", 2 * j);
-               BN_set_word(q, 2 * j);
-               BN_add(q, q, largebase);
+               if (BN_set_word(q, 2 * j) == 0)
+                       fatal("BN_set_word failed");
+               if (BN_add(q, q, largebase) == 0)
+                       fatal("BN_add failed");
                if (qfileout(out, QTYPE_SOPHIE_GERMAIN, QTEST_SIEVE,
                    largetries, (power - 1) /* MSB */, (0), q) == -1) {
                        ret = -1;
@@ -471,9 +478,12 @@ prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted)
 
        time(&time_start);
 
-       p = BN_new();
-       q = BN_new();
-       ctx = BN_CTX_new();
+       if ((p = BN_new()) == NULL)
+               fatal("BN_new failed");
+       if ((q = BN_new()) == NULL)
+               fatal("BN_new failed");
+       if ((ctx = BN_CTX_new()) == NULL)
+               fatal("BN_CTX_new failed");
 
        debug2("%.24s Final %u Miller-Rabin trials (%x generator)",
            ctime(&time_start), trials, generator_wanted);
@@ -521,23 +531,28 @@ prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted)
                case QTYPE_SOPHIE_GERMAIN:
                        debug2("%10u: (%u) Sophie-Germain", count_in, in_type);
                        a = q;
-                       BN_hex2bn(&a, cp);
+                       if (BN_hex2bn(&a, cp) == 0)
+                               fatal("BN_hex2bn failed");
                        /* p = 2*q + 1 */
-                       BN_lshift(p, q, 1);
-                       BN_add_word(p, 1);
+                       if (BN_lshift(p, q, 1) == 0)
+                               fatal("BN_lshift failed");
+                       if (BN_add_word(p, 1) == 0)
+                               fatal("BN_add_word failed");
                        in_size += 1;
                        generator_known = 0;
                        break;
                case QTYPE_UNSTRUCTURED:
                case QTYPE_SAFE:
-               case QTYPE_SCHNOOR:
+               case QTYPE_SCHNORR:
                case QTYPE_STRONG:
                case QTYPE_UNKNOWN:
                        debug2("%10u: (%u)", count_in, in_type);
                        a = p;
-                       BN_hex2bn(&a, cp);
+                       if (BN_hex2bn(&a, cp) == 0)
+                               fatal("BN_hex2bn failed");
                        /* q = (p-1) / 2 */
-                       BN_rshift(q, p, 1);
+                       if (BN_rshift(q, p, 1) == 0)
+                               fatal("BN_rshift failed");
                        break;
                default:
                        debug2("Unknown prime type");
@@ -548,7 +563,7 @@ prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted)
                 * due to earlier inconsistencies in interpretation, check
                 * the proposed bit size.
                 */
-               if (BN_num_bits(p) != (in_size + 1)) {
+               if ((u_int32_t)BN_num_bits(p) != (in_size + 1)) {
                        debug2("%10u: bit size %u mismatch", count_in, in_size);
                        continue;
                }
This page took 0.060754 seconds and 4 git commands to generate.