~ubuntu-branches/ubuntu/lucid/openssl/lucid-proposed

« back to all changes in this revision

Viewing changes to fips/rand/fips_randtest.c

  • Committer: Bazaar Package Importer
  • Author(s): Kurt Roeckx
  • Date: 2009-06-13 18:15:46 UTC
  • mto: (11.1.5 squeeze)
  • mto: This revision was merged to the branch mainline in revision 34.
  • Revision ID: james.westby@ubuntu.com-20090613181546-vbfntai3b009dl1u
Tags: upstream-0.9.8k
ImportĀ upstreamĀ versionĀ 0.9.8k

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 
2
 * All rights reserved.
 
3
 *
 
4
 * This package is an SSL implementation written
 
5
 * by Eric Young (eay@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@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@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@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
/* ====================================================================
 
58
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
 
59
 *
 
60
 * Redistribution and use in source and binary forms, with or without
 
61
 * modification, are permitted provided that the following conditions
 
62
 * are met:
 
63
 *
 
64
 * 1. Redistributions of source code must retain the above copyright
 
65
 *    notice, this list of conditions and the following disclaimer. 
 
66
 *
 
67
 * 2. Redistributions in binary form must reproduce the above copyright
 
68
 *    notice, this list of conditions and the following disclaimer in
 
69
 *    the documentation and/or other materials provided with the
 
70
 *    distribution.
 
71
 *
 
72
 * 3. All advertising materials mentioning features or use of this
 
73
 *    software must display the following acknowledgment:
 
74
 *    "This product includes software developed by the OpenSSL Project
 
75
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 
76
 *
 
77
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 
78
 *    endorse or promote products derived from this software without
 
79
 *    prior written permission. For written permission, please contact
 
80
 *    openssl-core@openssl.org.
 
81
 *
 
82
 * 5. Products derived from this software may not be called "OpenSSL"
 
83
 *    nor may "OpenSSL" appear in their names without prior written
 
84
 *    permission of the OpenSSL Project.
 
85
 *
 
86
 * 6. Redistributions of any form whatsoever must retain the following
 
87
 *    acknowledgment:
 
88
 *    "This product includes software developed by the OpenSSL Project
 
89
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 
90
 *
 
91
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 
92
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
93
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
94
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 
95
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
96
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
97
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
98
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
99
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
100
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
101
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
102
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
103
 *
 
104
 */
 
105
 
 
106
#include <stdio.h>
 
107
#include <stdlib.h>
 
108
#include <string.h>
 
109
#include <ctype.h>
 
110
#include <openssl/rand.h>
 
111
#include <openssl/fips_rand.h>
 
112
#include <openssl/err.h>
 
113
#include <openssl/bn.h>
 
114
 
 
115
#include "e_os.h"
 
116
 
 
117
#ifndef OPENSSL_FIPS
 
118
int main(int argc, char *argv[])
 
119
{
 
120
    printf("No FIPS RAND support\n");
 
121
    return(0);
 
122
}
 
123
 
 
124
#else
 
125
 
 
126
#include "fips_utl.h"
 
127
 
 
128
typedef struct
 
129
        {
 
130
        unsigned char DT[16];
 
131
        unsigned char V[16];
 
132
        unsigned char R[16];
 
133
        } AES_PRNG_MCT;
 
134
 
 
135
static unsigned char aes_128_mct_key[16] =
 
136
        {0x9f,0x5b,0x51,0x20,0x0b,0xf3,0x34,0xb5,
 
137
         0xd8,0x2b,0xe8,0xc3,0x72,0x55,0xc8,0x48};
 
138
 
 
139
static AES_PRNG_MCT aes_128_mct_tv = {
 
140
                        /* DT */
 
141
        {0x63,0x76,0xbb,0xe5,0x29,0x02,0xba,0x3b,
 
142
         0x67,0xc9,0x25,0xfa,0x70,0x1f,0x11,0xac},
 
143
                        /* V */
 
144
        {0x57,0x2c,0x8e,0x76,0x87,0x26,0x47,0x97,
 
145
         0x7e,0x74,0xfb,0xdd,0xc4,0x95,0x01,0xd1},
 
146
                        /* R */
 
147
        {0x48,0xe9,0xbd,0x0d,0x06,0xee,0x18,0xfb,
 
148
         0xe4,0x57,0x90,0xd5,0xc3,0xfc,0x9b,0x73}
 
149
};
 
150
 
 
151
static unsigned char aes_192_mct_key[24] =
 
152
        {0xb7,0x6c,0x34,0xd1,0x09,0x67,0xab,0x73,
 
153
         0x4d,0x5a,0xd5,0x34,0x98,0x16,0x0b,0x91,
 
154
         0xbc,0x35,0x51,0x16,0x6b,0xae,0x93,0x8a};
 
155
 
 
156
static AES_PRNG_MCT aes_192_mct_tv = {
 
157
                        /* DT */
 
158
        {0x84,0xce,0x22,0x7d,0x91,0x5a,0xa3,0xc9,
 
159
         0x84,0x3c,0x0a,0xb3,0xa9,0x63,0x15,0x52},
 
160
                        /* V */
 
161
        {0xb6,0xaf,0xe6,0x8f,0x99,0x9e,0x90,0x64,
 
162
         0xdd,0xc7,0x7a,0xc1,0xbb,0x90,0x3a,0x6d},
 
163
                        /* R */
 
164
        {0xfc,0x85,0x60,0x9a,0x29,0x6f,0xef,0x21,
 
165
         0xdd,0x86,0x20,0x32,0x8a,0x29,0x6f,0x47}
 
166
};
 
167
 
 
168
static unsigned char aes_256_mct_key[32] =
 
169
        {0x9b,0x05,0xc8,0x68,0xff,0x47,0xf8,0x3a,
 
170
         0xa6,0x3a,0xa8,0xcb,0x4e,0x71,0xb2,0xe0,
 
171
         0xb8,0x7e,0xf1,0x37,0xb6,0xb4,0xf6,0x6d,
 
172
         0x86,0x32,0xfc,0x1f,0x5e,0x1d,0x1e,0x50};
 
173
 
 
174
static AES_PRNG_MCT aes_256_mct_tv = {
 
175
                        /* DT */
 
176
        {0x31,0x6e,0x35,0x9a,0xb1,0x44,0xf0,0xee,
 
177
         0x62,0x6d,0x04,0x46,0xe0,0xa3,0x92,0x4c},
 
178
                        /* V */
 
179
        {0x4f,0xcd,0xc1,0x87,0x82,0x1f,0x4d,0xa1,
 
180
         0x3e,0x0e,0x56,0x44,0x59,0xe8,0x83,0xca},
 
181
                        /* R */
 
182
        {0xc8,0x87,0xc2,0x61,0x5b,0xd0,0xb9,0xe1,
 
183
         0xe7,0xf3,0x8b,0xd7,0x5b,0xd5,0xf1,0x8d}
 
184
};
 
185
 
 
186
static void dump(const unsigned char *b,int n)
 
187
    {
 
188
    while(n-- > 0)
 
189
        {
 
190
        printf(" %02x",*b++);
 
191
        }
 
192
    }
 
193
 
 
194
static void compare(const unsigned char *result,const unsigned char *expected,
 
195
                    int n)
 
196
    {
 
197
    int i;
 
198
 
 
199
    for(i=0 ; i < n ; ++i)
 
200
        if(result[i] != expected[i])
 
201
            {
 
202
            puts("Random test failed, got:");
 
203
            dump(result,n);
 
204
            puts("\n               expected:");
 
205
            dump(expected,n);
 
206
            putchar('\n');
 
207
            EXIT(1);
 
208
            }
 
209
    }
 
210
 
 
211
 
 
212
static void run_test(unsigned char *key, int keylen, AES_PRNG_MCT *tv)
 
213
    {
 
214
    unsigned char buf[16], dt[16];
 
215
    int i, j;
 
216
    FIPS_rand_reset();
 
217
    FIPS_rand_test_mode();
 
218
    FIPS_rand_set_key(key, keylen);
 
219
    FIPS_rand_seed(tv->V, 16);
 
220
    memcpy(dt, tv->DT, 16);
 
221
    for (i = 0; i < 10000; i++)
 
222
        {
 
223
        FIPS_rand_set_dt(dt);
 
224
        FIPS_rand_bytes(buf, 16);
 
225
        /* Increment DT */
 
226
        for (j = 15; j >= 0; j--)
 
227
                {
 
228
                dt[j]++;
 
229
                if (dt[j])
 
230
                        break;
 
231
                }
 
232
        }
 
233
 
 
234
    compare(buf,tv->R, 16);
 
235
    }
 
236
 
 
237
int main()
 
238
        {
 
239
        run_test(aes_128_mct_key, 16, &aes_128_mct_tv);
 
240
        printf("FIPS PRNG test 1 done\n");
 
241
        run_test(aes_192_mct_key, 24, &aes_192_mct_tv);
 
242
        printf("FIPS PRNG test 2 done\n");
 
243
        run_test(aes_256_mct_key, 32, &aes_256_mct_tv);
 
244
        printf("FIPS PRNG test 3 done\n");
 
245
        return 0;
 
246
        }
 
247
 
 
248
#endif