Parent Directory
|
Revision Log
* Wed Sep 30 2009 Tomas Mraz <tmraz@redhat.com> 1.0.0-0.8.beta3 - fix RSA and DSA FIPS selftests - reenable fixed x86_64 camellia assembler code (#521127)
| 1 | diff -up openssl-1.0.0-beta3/Configure.fips openssl-1.0.0-beta3/Configure |
| 2 | --- openssl-1.0.0-beta3/Configure.fips 2009-09-30 13:25:57.000000000 +0200 |
| 3 | +++ openssl-1.0.0-beta3/Configure 2009-09-30 13:25:58.000000000 +0200 |
| 4 | @@ -654,6 +654,7 @@ my $cmll_enc="camellia.o cmll_misc.o cml |
| 5 | my $processor=""; |
| 6 | my $default_ranlib; |
| 7 | my $perl; |
| 8 | +my $fips=0; |
| 9 | |
| 10 | |
| 11 | # All of the following is disabled by default (RC5 was enabled before 0.9.8): |
| 12 | @@ -797,6 +798,10 @@ PROCESS_ARGS: |
| 13 | } |
| 14 | elsif (/^386$/) |
| 15 | { $processor=386; } |
| 16 | + elsif (/^fips$/) |
| 17 | + { |
| 18 | + $fips=1; |
| 19 | + } |
| 20 | elsif (/^rsaref$/) |
| 21 | { |
| 22 | # No RSAref support any more since it's not needed. |
| 23 | @@ -1349,6 +1354,11 @@ $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no |
| 24 | |
| 25 | $cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /-mont/); |
| 26 | |
| 27 | +if ($fips) |
| 28 | + { |
| 29 | + $openssl_other_defines.="#define OPENSSL_FIPS\n"; |
| 30 | + } |
| 31 | + |
| 32 | $cpuid_obj="mem_clr.o" unless ($cpuid_obj =~ /\.o$/); |
| 33 | $des_obj=$des_enc unless ($des_obj =~ /\.o$/); |
| 34 | $bf_obj=$bf_enc unless ($bf_obj =~ /\.o$/); |
| 35 | @@ -1504,6 +1514,10 @@ while (<IN>) |
| 36 | s/^LIBKRB5=.*/LIBKRB5=$withargs{"krb5-lib"}/; |
| 37 | s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/; |
| 38 | s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/; |
| 39 | + if ($fips) |
| 40 | + { |
| 41 | + s/^FIPS=.*/FIPS=yes/; |
| 42 | + } |
| 43 | s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/; |
| 44 | s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/; |
| 45 | s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared); |
| 46 | diff -up openssl-1.0.0-beta3/crypto/bf/bf_skey.c.fips openssl-1.0.0-beta3/crypto/bf/bf_skey.c |
| 47 | --- openssl-1.0.0-beta3/crypto/bf/bf_skey.c.fips 2008-11-12 04:57:52.000000000 +0100 |
| 48 | +++ openssl-1.0.0-beta3/crypto/bf/bf_skey.c 2009-09-30 13:25:58.000000000 +0200 |
| 49 | @@ -59,10 +59,15 @@ |
| 50 | #include <stdio.h> |
| 51 | #include <string.h> |
| 52 | #include <openssl/blowfish.h> |
| 53 | +#include <openssl/crypto.h> |
| 54 | +#ifdef OPENSSL_FIPS |
| 55 | +#include <openssl/fips.h> |
| 56 | +#endif |
| 57 | + |
| 58 | #include "bf_locl.h" |
| 59 | #include "bf_pi.h" |
| 60 | |
| 61 | -void BF_set_key(BF_KEY *key, int len, const unsigned char *data) |
| 62 | +FIPS_NON_FIPS_VCIPHER_Init(BF) |
| 63 | { |
| 64 | int i; |
| 65 | BF_LONG *p,ri,in[2]; |
| 66 | diff -up openssl-1.0.0-beta3/crypto/bf/blowfish.h.fips openssl-1.0.0-beta3/crypto/bf/blowfish.h |
| 67 | --- openssl-1.0.0-beta3/crypto/bf/blowfish.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 68 | +++ openssl-1.0.0-beta3/crypto/bf/blowfish.h 2009-09-30 13:25:58.000000000 +0200 |
| 69 | @@ -104,7 +104,9 @@ typedef struct bf_key_st |
| 70 | BF_LONG S[4*256]; |
| 71 | } BF_KEY; |
| 72 | |
| 73 | - |
| 74 | +#ifdef OPENSSL_FIPS |
| 75 | +void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); |
| 76 | +#endif |
| 77 | void BF_set_key(BF_KEY *key, int len, const unsigned char *data); |
| 78 | |
| 79 | void BF_encrypt(BF_LONG *data,const BF_KEY *key); |
| 80 | diff -up openssl-1.0.0-beta3/crypto/bn/bn.h.fips openssl-1.0.0-beta3/crypto/bn/bn.h |
| 81 | --- openssl-1.0.0-beta3/crypto/bn/bn.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 82 | +++ openssl-1.0.0-beta3/crypto/bn/bn.h 2009-09-30 13:25:58.000000000 +0200 |
| 83 | @@ -540,6 +540,17 @@ int BN_is_prime_ex(const BIGNUM *p,int n |
| 84 | int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, |
| 85 | int do_trial_division, BN_GENCB *cb); |
| 86 | |
| 87 | +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); |
| 88 | + |
| 89 | +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 90 | + const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, |
| 91 | + const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb); |
| 92 | +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 93 | + BIGNUM *Xp1, BIGNUM *Xp2, |
| 94 | + const BIGNUM *Xp, |
| 95 | + const BIGNUM *e, BN_CTX *ctx, |
| 96 | + BN_GENCB *cb); |
| 97 | + |
| 98 | BN_MONT_CTX *BN_MONT_CTX_new(void ); |
| 99 | void BN_MONT_CTX_init(BN_MONT_CTX *ctx); |
| 100 | int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b, |
| 101 | diff -up /dev/null openssl-1.0.0-beta3/crypto/bn/bn_x931p.c |
| 102 | --- /dev/null 2009-09-23 10:56:02.148001752 +0200 |
| 103 | +++ openssl-1.0.0-beta3/crypto/bn/bn_x931p.c 2009-09-30 13:25:58.000000000 +0200 |
| 104 | @@ -0,0 +1,272 @@ |
| 105 | +/* bn_x931p.c */ |
| 106 | +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 107 | + * project 2005. |
| 108 | + */ |
| 109 | +/* ==================================================================== |
| 110 | + * Copyright (c) 2005 The OpenSSL Project. All rights reserved. |
| 111 | + * |
| 112 | + * Redistribution and use in source and binary forms, with or without |
| 113 | + * modification, are permitted provided that the following conditions |
| 114 | + * are met: |
| 115 | + * |
| 116 | + * 1. Redistributions of source code must retain the above copyright |
| 117 | + * notice, this list of conditions and the following disclaimer. |
| 118 | + * |
| 119 | + * 2. Redistributions in binary form must reproduce the above copyright |
| 120 | + * notice, this list of conditions and the following disclaimer in |
| 121 | + * the documentation and/or other materials provided with the |
| 122 | + * distribution. |
| 123 | + * |
| 124 | + * 3. All advertising materials mentioning features or use of this |
| 125 | + * software must display the following acknowledgment: |
| 126 | + * "This product includes software developed by the OpenSSL Project |
| 127 | + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" |
| 128 | + * |
| 129 | + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| 130 | + * endorse or promote products derived from this software without |
| 131 | + * prior written permission. For written permission, please contact |
| 132 | + * licensing@OpenSSL.org. |
| 133 | + * |
| 134 | + * 5. Products derived from this software may not be called "OpenSSL" |
| 135 | + * nor may "OpenSSL" appear in their names without prior written |
| 136 | + * permission of the OpenSSL Project. |
| 137 | + * |
| 138 | + * 6. Redistributions of any form whatsoever must retain the following |
| 139 | + * acknowledgment: |
| 140 | + * "This product includes software developed by the OpenSSL Project |
| 141 | + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" |
| 142 | + * |
| 143 | + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| 144 | + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 145 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 146 | + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| 147 | + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 148 | + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 149 | + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 150 | + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 151 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| 152 | + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 153 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| 154 | + * OF THE POSSIBILITY OF SUCH DAMAGE. |
| 155 | + * ==================================================================== |
| 156 | + * |
| 157 | + * This product includes cryptographic software written by Eric Young |
| 158 | + * (eay@cryptsoft.com). This product includes software written by Tim |
| 159 | + * Hudson (tjh@cryptsoft.com). |
| 160 | + * |
| 161 | + */ |
| 162 | + |
| 163 | +#include <stdio.h> |
| 164 | +#include <openssl/bn.h> |
| 165 | + |
| 166 | +/* X9.31 routines for prime derivation */ |
| 167 | + |
| 168 | +/* X9.31 prime derivation. This is used to generate the primes pi |
| 169 | + * (p1, p2, q1, q2) from a parameter Xpi by checking successive odd |
| 170 | + * integers. |
| 171 | + */ |
| 172 | + |
| 173 | +static int bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, |
| 174 | + BN_GENCB *cb) |
| 175 | + { |
| 176 | + int i = 0; |
| 177 | + if (!BN_copy(pi, Xpi)) |
| 178 | + return 0; |
| 179 | + if (!BN_is_odd(pi) && !BN_add_word(pi, 1)) |
| 180 | + return 0; |
| 181 | + for(;;) |
| 182 | + { |
| 183 | + i++; |
| 184 | + BN_GENCB_call(cb, 0, i); |
| 185 | + /* NB 27 MR is specificed in X9.31 */ |
| 186 | + if (BN_is_prime_fasttest_ex(pi, 27, ctx, 1, cb)) |
| 187 | + break; |
| 188 | + if (!BN_add_word(pi, 2)) |
| 189 | + return 0; |
| 190 | + } |
| 191 | + BN_GENCB_call(cb, 2, i); |
| 192 | + return 1; |
| 193 | + } |
| 194 | + |
| 195 | +/* This is the main X9.31 prime derivation function. From parameters |
| 196 | + * Xp1, Xp2 and Xp derive the prime p. If the parameters p1 or p2 are |
| 197 | + * not NULL they will be returned too: this is needed for testing. |
| 198 | + */ |
| 199 | + |
| 200 | +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 201 | + const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, |
| 202 | + const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb) |
| 203 | + { |
| 204 | + int ret = 0; |
| 205 | + |
| 206 | + BIGNUM *t, *p1p2, *pm1; |
| 207 | + |
| 208 | + /* Only even e supported */ |
| 209 | + if (!BN_is_odd(e)) |
| 210 | + return 0; |
| 211 | + |
| 212 | + BN_CTX_start(ctx); |
| 213 | + if (!p1) |
| 214 | + p1 = BN_CTX_get(ctx); |
| 215 | + |
| 216 | + if (!p2) |
| 217 | + p2 = BN_CTX_get(ctx); |
| 218 | + |
| 219 | + t = BN_CTX_get(ctx); |
| 220 | + |
| 221 | + p1p2 = BN_CTX_get(ctx); |
| 222 | + |
| 223 | + pm1 = BN_CTX_get(ctx); |
| 224 | + |
| 225 | + if (!bn_x931_derive_pi(p1, Xp1, ctx, cb)) |
| 226 | + goto err; |
| 227 | + |
| 228 | + if (!bn_x931_derive_pi(p2, Xp2, ctx, cb)) |
| 229 | + goto err; |
| 230 | + |
| 231 | + if (!BN_mul(p1p2, p1, p2, ctx)) |
| 232 | + goto err; |
| 233 | + |
| 234 | + /* First set p to value of Rp */ |
| 235 | + |
| 236 | + if (!BN_mod_inverse(p, p2, p1, ctx)) |
| 237 | + goto err; |
| 238 | + |
| 239 | + if (!BN_mul(p, p, p2, ctx)) |
| 240 | + goto err; |
| 241 | + |
| 242 | + if (!BN_mod_inverse(t, p1, p2, ctx)) |
| 243 | + goto err; |
| 244 | + |
| 245 | + if (!BN_mul(t, t, p1, ctx)) |
| 246 | + goto err; |
| 247 | + |
| 248 | + if (!BN_sub(p, p, t)) |
| 249 | + goto err; |
| 250 | + |
| 251 | + if (p->neg && !BN_add(p, p, p1p2)) |
| 252 | + goto err; |
| 253 | + |
| 254 | + /* p now equals Rp */ |
| 255 | + |
| 256 | + if (!BN_mod_sub(p, p, Xp, p1p2, ctx)) |
| 257 | + goto err; |
| 258 | + |
| 259 | + if (!BN_add(p, p, Xp)) |
| 260 | + goto err; |
| 261 | + |
| 262 | + /* p now equals Yp0 */ |
| 263 | + |
| 264 | + for (;;) |
| 265 | + { |
| 266 | + int i = 1; |
| 267 | + BN_GENCB_call(cb, 0, i++); |
| 268 | + if (!BN_copy(pm1, p)) |
| 269 | + goto err; |
| 270 | + if (!BN_sub_word(pm1, 1)) |
| 271 | + goto err; |
| 272 | + if (!BN_gcd(t, pm1, e, ctx)) |
| 273 | + goto err; |
| 274 | + if (BN_is_one(t) |
| 275 | + /* X9.31 specifies 8 MR and 1 Lucas test or any prime test |
| 276 | + * offering similar or better guarantees 50 MR is considerably |
| 277 | + * better. |
| 278 | + */ |
| 279 | + && BN_is_prime_fasttest_ex(p, 50, ctx, 1, cb)) |
| 280 | + break; |
| 281 | + if (!BN_add(p, p, p1p2)) |
| 282 | + goto err; |
| 283 | + } |
| 284 | + |
| 285 | + BN_GENCB_call(cb, 3, 0); |
| 286 | + |
| 287 | + ret = 1; |
| 288 | + |
| 289 | + err: |
| 290 | + |
| 291 | + BN_CTX_end(ctx); |
| 292 | + |
| 293 | + return ret; |
| 294 | + } |
| 295 | + |
| 296 | +/* Generate pair of paramters Xp, Xq for X9.31 prime generation. |
| 297 | + * Note: nbits paramter is sum of number of bits in both. |
| 298 | + */ |
| 299 | + |
| 300 | +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx) |
| 301 | + { |
| 302 | + BIGNUM *t; |
| 303 | + int i; |
| 304 | + /* Number of bits for each prime is of the form |
| 305 | + * 512+128s for s = 0, 1, ... |
| 306 | + */ |
| 307 | + if ((nbits < 1024) || (nbits & 0xff)) |
| 308 | + return 0; |
| 309 | + nbits >>= 1; |
| 310 | + /* The random value Xp must be between sqrt(2) * 2^(nbits-1) and |
| 311 | + * 2^nbits - 1. By setting the top two bits we ensure that the lower |
| 312 | + * bound is exceeded. |
| 313 | + */ |
| 314 | + if (!BN_rand(Xp, nbits, 1, 0)) |
| 315 | + return 0; |
| 316 | + |
| 317 | + BN_CTX_start(ctx); |
| 318 | + t = BN_CTX_get(ctx); |
| 319 | + |
| 320 | + for (i = 0; i < 1000; i++) |
| 321 | + { |
| 322 | + if (!BN_rand(Xq, nbits, 1, 0)) |
| 323 | + return 0; |
| 324 | + /* Check that |Xp - Xq| > 2^(nbits - 100) */ |
| 325 | + BN_sub(t, Xp, Xq); |
| 326 | + if (BN_num_bits(t) > (nbits - 100)) |
| 327 | + break; |
| 328 | + } |
| 329 | + |
| 330 | + BN_CTX_end(ctx); |
| 331 | + |
| 332 | + if (i < 1000) |
| 333 | + return 1; |
| 334 | + |
| 335 | + return 0; |
| 336 | + |
| 337 | + } |
| 338 | + |
| 339 | +/* Generate primes using X9.31 algorithm. Of the values p, p1, p2, Xp1 |
| 340 | + * and Xp2 only 'p' needs to be non-NULL. If any of the others are not NULL |
| 341 | + * the relevant parameter will be stored in it. |
| 342 | + * |
| 343 | + * Due to the fact that |Xp - Xq| > 2^(nbits - 100) must be satisfied Xp and Xq |
| 344 | + * are generated using the previous function and supplied as input. |
| 345 | + */ |
| 346 | + |
| 347 | +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
| 348 | + BIGNUM *Xp1, BIGNUM *Xp2, |
| 349 | + const BIGNUM *Xp, |
| 350 | + const BIGNUM *e, BN_CTX *ctx, |
| 351 | + BN_GENCB *cb) |
| 352 | + { |
| 353 | + int ret = 0; |
| 354 | + |
| 355 | + BN_CTX_start(ctx); |
| 356 | + if (!Xp1) |
| 357 | + Xp1 = BN_CTX_get(ctx); |
| 358 | + if (!Xp2) |
| 359 | + Xp2 = BN_CTX_get(ctx); |
| 360 | + |
| 361 | + if (!BN_rand(Xp1, 101, 0, 0)) |
| 362 | + goto error; |
| 363 | + if (!BN_rand(Xp2, 101, 0, 0)) |
| 364 | + goto error; |
| 365 | + if (!BN_X931_derive_prime_ex(p, p1, p2, Xp, Xp1, Xp2, e, ctx, cb)) |
| 366 | + goto error; |
| 367 | + |
| 368 | + ret = 1; |
| 369 | + |
| 370 | + error: |
| 371 | + BN_CTX_end(ctx); |
| 372 | + |
| 373 | + return ret; |
| 374 | + |
| 375 | + } |
| 376 | + |
| 377 | diff -up openssl-1.0.0-beta3/crypto/bn/Makefile.fips openssl-1.0.0-beta3/crypto/bn/Makefile |
| 378 | --- openssl-1.0.0-beta3/crypto/bn/Makefile.fips 2008-11-12 09:19:02.000000000 +0100 |
| 379 | +++ openssl-1.0.0-beta3/crypto/bn/Makefile 2009-09-30 13:25:58.000000000 +0200 |
| 380 | @@ -26,13 +26,13 @@ LIBSRC= bn_add.c bn_div.c bn_exp.c bn_li |
| 381 | bn_print.c bn_rand.c bn_shift.c bn_word.c bn_blind.c \ |
| 382 | bn_kron.c bn_sqrt.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_asm.c \ |
| 383 | bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_gf2m.c bn_nist.c \ |
| 384 | - bn_depr.c bn_const.c |
| 385 | + bn_depr.c bn_const.c bn_x931p.c |
| 386 | |
| 387 | LIBOBJ= bn_add.o bn_div.o bn_exp.o bn_lib.o bn_ctx.o bn_mul.o bn_mod.o \ |
| 388 | bn_print.o bn_rand.o bn_shift.o bn_word.o bn_blind.o \ |
| 389 | bn_kron.o bn_sqrt.o bn_gcd.o bn_prime.o bn_err.o bn_sqr.o $(BN_ASM) \ |
| 390 | bn_recp.o bn_mont.o bn_mpi.o bn_exp2.o bn_gf2m.o bn_nist.o \ |
| 391 | - bn_depr.o bn_const.o |
| 392 | + bn_depr.o bn_const.o bn_x931p.o |
| 393 | |
| 394 | SRC= $(LIBSRC) |
| 395 | |
| 396 | diff -up openssl-1.0.0-beta3/crypto/camellia/asm/cmll-x86.pl.fips openssl-1.0.0-beta3/crypto/camellia/asm/cmll-x86.pl |
| 397 | --- openssl-1.0.0-beta3/crypto/camellia/asm/cmll-x86.pl.fips 2009-04-06 16:25:02.000000000 +0200 |
| 398 | +++ openssl-1.0.0-beta3/crypto/camellia/asm/cmll-x86.pl 2009-09-30 13:25:58.000000000 +0200 |
| 399 | @@ -722,12 +722,15 @@ my $bias=int(@T[0])?shift(@T):0; |
| 400 | } |
| 401 | &function_end("Camellia_Ekeygen"); |
| 402 | |
| 403 | +$setkeyfunc = "Camellia_set_key"; |
| 404 | +$setkeyfunc = "private_Camellia_set_key" if ($ENV{FIPS} ne ""); |
| 405 | + |
| 406 | if ($OPENSSL) { |
| 407 | # int Camellia_set_key ( |
| 408 | # const unsigned char *userKey, |
| 409 | # int bits, |
| 410 | # CAMELLIA_KEY *key) |
| 411 | -&function_begin_B("Camellia_set_key"); |
| 412 | +&function_begin_B($setkeyfunc); |
| 413 | &push ("ebx"); |
| 414 | &mov ("ecx",&wparam(0)); # pull arguments |
| 415 | &mov ("ebx",&wparam(1)); |
| 416 | @@ -760,7 +763,7 @@ if ($OPENSSL) { |
| 417 | &set_label("done",4); |
| 418 | &pop ("ebx"); |
| 419 | &ret (); |
| 420 | -&function_end_B("Camellia_set_key"); |
| 421 | +&function_end_B($setkeyfunc); |
| 422 | } |
| 423 | |
| 424 | @SBOX=( |
| 425 | diff -up openssl-1.0.0-beta3/crypto/camellia/camellia.h.fips openssl-1.0.0-beta3/crypto/camellia/camellia.h |
| 426 | --- openssl-1.0.0-beta3/crypto/camellia/camellia.h.fips 2009-09-30 13:25:56.000000000 +0200 |
| 427 | +++ openssl-1.0.0-beta3/crypto/camellia/camellia.h 2009-09-30 13:25:58.000000000 +0200 |
| 428 | @@ -88,6 +88,11 @@ struct camellia_key_st |
| 429 | }; |
| 430 | typedef struct camellia_key_st CAMELLIA_KEY; |
| 431 | |
| 432 | +#ifdef OPENSSL_FIPS |
| 433 | +int private_Camellia_set_key(const unsigned char *userKey, const int bits, |
| 434 | + CAMELLIA_KEY *key); |
| 435 | +#endif |
| 436 | + |
| 437 | int Camellia_set_key(const unsigned char *userKey, const int bits, |
| 438 | CAMELLIA_KEY *key); |
| 439 | |
| 440 | diff -up /dev/null openssl-1.0.0-beta3/crypto/camellia/cmll_fblk.c |
| 441 | --- /dev/null 2009-09-23 10:56:02.148001752 +0200 |
| 442 | +++ openssl-1.0.0-beta3/crypto/camellia/cmll_fblk.c 2009-09-30 13:25:58.000000000 +0200 |
| 443 | @@ -0,0 +1,68 @@ |
| 444 | +/* crypto/camellia/camellia_misc.c -*- mode:C; c-file-style: "eay" -*- */ |
| 445 | +/* ==================================================================== |
| 446 | + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. |
| 447 | + * |
| 448 | + * Redistribution and use in source and binary forms, with or without |
| 449 | + * modification, are permitted provided that the following conditions |
| 450 | + * are met: |
| 451 | + * |
| 452 | + * 1. Redistributions of source code must retain the above copyright |
| 453 | + * notice, this list of conditions and the following disclaimer. |
| 454 | + * |
| 455 | + * 2. Redistributions in binary form must reproduce the above copyright |
| 456 | + * notice, this list of conditions and the following disclaimer in |
| 457 | + * the documentation and/or other materials provided with the |
| 458 | + * distribution. |
| 459 | + * |
| 460 | + * 3. All advertising materials mentioning features or use of this |
| 461 | + * software must display the following acknowledgment: |
| 462 | + * "This product includes software developed by the OpenSSL Project |
| 463 | + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
| 464 | + * |
| 465 | + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| 466 | + * endorse or promote products derived from this software without |
| 467 | + * prior written permission. For written permission, please contact |
| 468 | + * openssl-core@openssl.org. |
| 469 | + * |
| 470 | + * 5. Products derived from this software may not be called "OpenSSL" |
| 471 | + * nor may "OpenSSL" appear in their names without prior written |
| 472 | + * permission of the OpenSSL Project. |
| 473 | + * |
| 474 | + * 6. Redistributions of any form whatsoever must retain the following |
| 475 | + * acknowledgment: |
| 476 | + * "This product includes software developed by the OpenSSL Project |
| 477 | + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
| 478 | + * |
| 479 | + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| 480 | + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 481 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 482 | + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| 483 | + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 484 | + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 485 | + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 486 | + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 487 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| 488 | + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 489 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| 490 | + * OF THE POSSIBILITY OF SUCH DAMAGE. |
| 491 | + * ==================================================================== |
| 492 | + * |
| 493 | + */ |
| 494 | + |
| 495 | +#include <openssl/opensslv.h> |
| 496 | +#include <openssl/camellia.h> |
| 497 | +#include "cmll_locl.h" |
| 498 | +#include <openssl/crypto.h> |
| 499 | +#ifdef OPENSSL_FIPS |
| 500 | +#include <openssl/fips.h> |
| 501 | +#endif |
| 502 | + |
| 503 | +#ifdef OPENSSL_FIPS |
| 504 | +int Camellia_set_key(const unsigned char *userKey, const int bits, |
| 505 | + CAMELLIA_KEY *key) |
| 506 | + { |
| 507 | + if (FIPS_mode()) |
| 508 | + FIPS_BAD_ABORT(CAMELLIA) |
| 509 | + return private_Camellia_set_key(userKey, bits, key); |
| 510 | + } |
| 511 | +#endif |
| 512 | diff -up openssl-1.0.0-beta3/crypto/camellia/cmll_misc.c.fips openssl-1.0.0-beta3/crypto/camellia/cmll_misc.c |
| 513 | --- openssl-1.0.0-beta3/crypto/camellia/cmll_misc.c.fips 2008-10-28 13:13:52.000000000 +0100 |
| 514 | +++ openssl-1.0.0-beta3/crypto/camellia/cmll_misc.c 2009-09-30 13:25:58.000000000 +0200 |
| 515 | @@ -52,11 +52,20 @@ |
| 516 | #include <openssl/opensslv.h> |
| 517 | #include <openssl/camellia.h> |
| 518 | #include "cmll_locl.h" |
| 519 | +#include <openssl/crypto.h> |
| 520 | +#ifdef OPENSSL_FIPS |
| 521 | +#include <openssl/fips.h> |
| 522 | +#endif |
| 523 | |
| 524 | const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT; |
| 525 | |
| 526 | +#ifdef OPENSSL_FIPS |
| 527 | +int private_Camellia_set_key(const unsigned char *userKey, const int bits, |
| 528 | + CAMELLIA_KEY *key) |
| 529 | +#else |
| 530 | int Camellia_set_key(const unsigned char *userKey, const int bits, |
| 531 | CAMELLIA_KEY *key) |
| 532 | +#endif |
| 533 | { |
| 534 | if(!userKey || !key) |
| 535 | return -1; |
| 536 | diff -up openssl-1.0.0-beta3/crypto/camellia/Makefile.fips openssl-1.0.0-beta3/crypto/camellia/Makefile |
| 537 | --- openssl-1.0.0-beta3/crypto/camellia/Makefile.fips 2008-12-23 12:33:00.000000000 +0100 |
| 538 | +++ openssl-1.0.0-beta3/crypto/camellia/Makefile 2009-09-30 13:25:58.000000000 +0200 |
| 539 | @@ -23,9 +23,9 @@ APPS= |
| 540 | |
| 541 | LIB=$(TOP)/libcrypto.a |
| 542 | LIBSRC=camellia.c cmll_misc.c cmll_ecb.c cmll_cbc.c cmll_ofb.c \ |
| 543 | - cmll_cfb.c cmll_ctr.c |
| 544 | + cmll_cfb.c cmll_ctr.c cmll_fblk.c |
| 545 | |
| 546 | -LIBOBJ= cmll_ecb.o cmll_ofb.o cmll_cfb.o cmll_ctr.o $(CMLL_ENC) |
| 547 | +LIBOBJ= cmll_ecb.o cmll_ofb.o cmll_cfb.o cmll_ctr.o $(CMLL_ENC) cmll_fblk.o |
| 548 | |
| 549 | SRC= $(LIBSRC) |
| 550 | |
| 551 | diff -up openssl-1.0.0-beta3/crypto/cast/cast.h.fips openssl-1.0.0-beta3/crypto/cast/cast.h |
| 552 | --- openssl-1.0.0-beta3/crypto/cast/cast.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 553 | +++ openssl-1.0.0-beta3/crypto/cast/cast.h 2009-09-30 13:25:58.000000000 +0200 |
| 554 | @@ -83,7 +83,9 @@ typedef struct cast_key_st |
| 555 | int short_key; /* Use reduced rounds for short key */ |
| 556 | } CAST_KEY; |
| 557 | |
| 558 | - |
| 559 | +#ifdef OPENSSL_FIPS |
| 560 | +void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); |
| 561 | +#endif |
| 562 | void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); |
| 563 | void CAST_ecb_encrypt(const unsigned char *in,unsigned char *out,CAST_KEY *key, |
| 564 | int enc); |
| 565 | diff -up openssl-1.0.0-beta3/crypto/cast/c_skey.c.fips openssl-1.0.0-beta3/crypto/cast/c_skey.c |
| 566 | --- openssl-1.0.0-beta3/crypto/cast/c_skey.c.fips 2000-06-03 16:13:35.000000000 +0200 |
| 567 | +++ openssl-1.0.0-beta3/crypto/cast/c_skey.c 2009-09-30 13:25:58.000000000 +0200 |
| 568 | @@ -57,6 +57,11 @@ |
| 569 | */ |
| 570 | |
| 571 | #include <openssl/cast.h> |
| 572 | +#include <openssl/crypto.h> |
| 573 | +#ifdef OPENSSL_FIPS |
| 574 | +#include <openssl/fips.h> |
| 575 | +#endif |
| 576 | + |
| 577 | #include "cast_lcl.h" |
| 578 | #include "cast_s.h" |
| 579 | |
| 580 | @@ -72,7 +77,7 @@ |
| 581 | #define S6 CAST_S_table6 |
| 582 | #define S7 CAST_S_table7 |
| 583 | |
| 584 | -void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data) |
| 585 | +FIPS_NON_FIPS_VCIPHER_Init(CAST) |
| 586 | { |
| 587 | CAST_LONG x[16]; |
| 588 | CAST_LONG z[16]; |
| 589 | diff -up openssl-1.0.0-beta3/crypto/crypto.h.fips openssl-1.0.0-beta3/crypto/crypto.h |
| 590 | --- openssl-1.0.0-beta3/crypto/crypto.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 591 | +++ openssl-1.0.0-beta3/crypto/crypto.h 2009-09-30 13:25:58.000000000 +0200 |
| 592 | @@ -546,12 +546,69 @@ void OpenSSLDie(const char *file,int lin |
| 593 | unsigned long *OPENSSL_ia32cap_loc(void); |
| 594 | #define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) |
| 595 | |
| 596 | +#ifdef OPENSSL_FIPS |
| 597 | +#define FIPS_ERROR_IGNORED(alg) OpenSSLDie(__FILE__, __LINE__, \ |
| 598 | + alg " previous FIPS forbidden algorithm error ignored"); |
| 599 | + |
| 600 | +#define FIPS_BAD_ABORT(alg) OpenSSLDie(__FILE__, __LINE__, \ |
| 601 | + #alg " Algorithm forbidden in FIPS mode"); |
| 602 | + |
| 603 | +#ifdef OPENSSL_FIPS_STRICT |
| 604 | +#define FIPS_BAD_ALGORITHM(alg) FIPS_BAD_ABORT(alg) |
| 605 | +#else |
| 606 | +#define FIPS_BAD_ALGORITHM(alg) \ |
| 607 | + { \ |
| 608 | + FIPSerr(FIPS_F_HASH_FINAL,FIPS_R_NON_FIPS_METHOD); \ |
| 609 | + ERR_add_error_data(2, "Algorithm=", #alg); \ |
| 610 | + return 0; \ |
| 611 | + } |
| 612 | +#endif |
| 613 | + |
| 614 | +/* Low level digest API blocking macro */ |
| 615 | + |
| 616 | +#define FIPS_NON_FIPS_MD_Init(alg) \ |
| 617 | + int alg##_Init(alg##_CTX *c) \ |
| 618 | + { \ |
| 619 | + if (FIPS_mode()) \ |
| 620 | + FIPS_BAD_ALGORITHM(alg) \ |
| 621 | + return private_##alg##_Init(c); \ |
| 622 | + } \ |
| 623 | + int private_##alg##_Init(alg##_CTX *c) |
| 624 | + |
| 625 | +/* For ciphers the API often varies from cipher to cipher and each needs to |
| 626 | + * be treated as a special case. Variable key length ciphers (Blowfish, RC4, |
| 627 | + * CAST) however are very similar and can use a blocking macro. |
| 628 | + */ |
| 629 | + |
| 630 | +#define FIPS_NON_FIPS_VCIPHER_Init(alg) \ |
| 631 | + void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) \ |
| 632 | + { \ |
| 633 | + if (FIPS_mode()) \ |
| 634 | + FIPS_BAD_ABORT(alg) \ |
| 635 | + private_##alg##_set_key(key, len, data); \ |
| 636 | + } \ |
| 637 | + void private_##alg##_set_key(alg##_KEY *key, int len, \ |
| 638 | + const unsigned char *data) |
| 639 | + |
| 640 | +#else |
| 641 | + |
| 642 | +#define FIPS_NON_FIPS_VCIPHER_Init(alg) \ |
| 643 | + void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) |
| 644 | + |
| 645 | +#define FIPS_NON_FIPS_MD_Init(alg) \ |
| 646 | + int alg##_Init(alg##_CTX *c) |
| 647 | + |
| 648 | +#endif /* def OPENSSL_FIPS */ |
| 649 | + |
| 650 | /* BEGIN ERROR CODES */ |
| 651 | /* The following lines are auto generated by the script mkerr.pl. Any changes |
| 652 | * made after this point may be overwritten when the script is next run. |
| 653 | */ |
| 654 | void ERR_load_CRYPTO_strings(void); |
| 655 | |
| 656 | +#define OPENSSL_HAVE_INIT 1 |
| 657 | +void OPENSSL_init_library(void); |
| 658 | + |
| 659 | /* Error codes for the CRYPTO functions. */ |
| 660 | |
| 661 | /* Function codes. */ |
| 662 | diff -up openssl-1.0.0-beta3/crypto/dh/dh_err.c.fips openssl-1.0.0-beta3/crypto/dh/dh_err.c |
| 663 | --- openssl-1.0.0-beta3/crypto/dh/dh_err.c.fips 2006-11-21 22:29:37.000000000 +0100 |
| 664 | +++ openssl-1.0.0-beta3/crypto/dh/dh_err.c 2009-09-30 13:25:58.000000000 +0200 |
| 665 | @@ -73,6 +73,8 @@ static ERR_STRING_DATA DH_str_functs[]= |
| 666 | {ERR_FUNC(DH_F_COMPUTE_KEY), "COMPUTE_KEY"}, |
| 667 | {ERR_FUNC(DH_F_DHPARAMS_PRINT_FP), "DHparams_print_fp"}, |
| 668 | {ERR_FUNC(DH_F_DH_BUILTIN_GENPARAMS), "DH_BUILTIN_GENPARAMS"}, |
| 669 | +{ERR_FUNC(DH_F_DH_COMPUTE_KEY), "DH_compute_key"}, |
| 670 | +{ERR_FUNC(DH_F_DH_GENERATE_KEY), "DH_generate_key"}, |
| 671 | {ERR_FUNC(DH_F_DH_NEW_METHOD), "DH_new_method"}, |
| 672 | {ERR_FUNC(DH_F_DH_PARAM_DECODE), "DH_PARAM_DECODE"}, |
| 673 | {ERR_FUNC(DH_F_DH_PRIV_DECODE), "DH_PRIV_DECODE"}, |
| 674 | @@ -94,6 +96,7 @@ static ERR_STRING_DATA DH_str_reasons[]= |
| 675 | {ERR_REASON(DH_R_BN_ERROR) ,"bn error"}, |
| 676 | {ERR_REASON(DH_R_DECODE_ERROR) ,"decode error"}, |
| 677 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, |
| 678 | +{ERR_REASON(DH_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, |
| 679 | {ERR_REASON(DH_R_KEYS_NOT_SET) ,"keys not set"}, |
| 680 | {ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, |
| 681 | {ERR_REASON(DH_R_NO_PARAMETERS_SET) ,"no parameters set"}, |
| 682 | diff -up openssl-1.0.0-beta3/crypto/dh/dh_gen.c.fips openssl-1.0.0-beta3/crypto/dh/dh_gen.c |
| 683 | --- openssl-1.0.0-beta3/crypto/dh/dh_gen.c.fips 2005-04-26 20:53:15.000000000 +0200 |
| 684 | +++ openssl-1.0.0-beta3/crypto/dh/dh_gen.c 2009-09-30 13:25:58.000000000 +0200 |
| 685 | @@ -65,6 +65,10 @@ |
| 686 | #include "cryptlib.h" |
| 687 | #include <openssl/bn.h> |
| 688 | #include <openssl/dh.h> |
| 689 | +#include <openssl/err.h> |
| 690 | +#ifdef OPENSSL_FIPS |
| 691 | +#include <openssl/fips.h> |
| 692 | +#endif |
| 693 | |
| 694 | static int dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb); |
| 695 | |
| 696 | @@ -106,6 +110,20 @@ static int dh_builtin_genparams(DH *ret, |
| 697 | int g,ok= -1; |
| 698 | BN_CTX *ctx=NULL; |
| 699 | |
| 700 | +#ifdef OPENSSL_FIPS |
| 701 | + if(FIPS_selftest_failed()) |
| 702 | + { |
| 703 | + FIPSerr(FIPS_F_DH_BUILTIN_GENPARAMS,FIPS_R_FIPS_SELFTEST_FAILED); |
| 704 | + return 0; |
| 705 | + } |
| 706 | + |
| 707 | + if (FIPS_mode() && (prime_len < OPENSSL_DH_FIPS_MIN_MODULUS_BITS)) |
| 708 | + { |
| 709 | + DHerr(DH_F_DH_BUILTIN_GENPARAMS, DH_R_KEY_SIZE_TOO_SMALL); |
| 710 | + goto err; |
| 711 | + } |
| 712 | +#endif |
| 713 | + |
| 714 | ctx=BN_CTX_new(); |
| 715 | if (ctx == NULL) goto err; |
| 716 | BN_CTX_start(ctx); |
| 717 | diff -up openssl-1.0.0-beta3/crypto/dh/dh.h.fips openssl-1.0.0-beta3/crypto/dh/dh.h |
| 718 | --- openssl-1.0.0-beta3/crypto/dh/dh.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 719 | +++ openssl-1.0.0-beta3/crypto/dh/dh.h 2009-09-30 13:25:58.000000000 +0200 |
| 720 | @@ -77,6 +77,8 @@ |
| 721 | # define OPENSSL_DH_MAX_MODULUS_BITS 10000 |
| 722 | #endif |
| 723 | |
| 724 | +#define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024 |
| 725 | + |
| 726 | #define DH_FLAG_CACHE_MONT_P 0x01 |
| 727 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH |
| 728 | * implementation now uses constant time |
| 729 | @@ -240,6 +242,8 @@ void ERR_load_DH_strings(void); |
| 730 | #define DH_F_GENERATE_PARAMETERS 104 |
| 731 | #define DH_F_PKEY_DH_DERIVE 112 |
| 732 | #define DH_F_PKEY_DH_KEYGEN 113 |
| 733 | +#define DH_F_DH_COMPUTE_KEY 114 |
| 734 | +#define DH_F_DH_GENERATE_KEY 115 |
| 735 | |
| 736 | /* Reason codes. */ |
| 737 | #define DH_R_BAD_GENERATOR 101 |
| 738 | @@ -252,6 +256,7 @@ void ERR_load_DH_strings(void); |
| 739 | #define DH_R_NO_PARAMETERS_SET 107 |
| 740 | #define DH_R_NO_PRIVATE_VALUE 100 |
| 741 | #define DH_R_PARAMETER_ENCODING_ERROR 105 |
| 742 | +#define DH_R_KEY_SIZE_TOO_SMALL 110 |
| 743 | |
| 744 | #ifdef __cplusplus |
| 745 | } |
| 746 | diff -up openssl-1.0.0-beta3/crypto/dh/dh_key.c.fips openssl-1.0.0-beta3/crypto/dh/dh_key.c |
| 747 | --- openssl-1.0.0-beta3/crypto/dh/dh_key.c.fips 2007-03-28 02:15:23.000000000 +0200 |
| 748 | +++ openssl-1.0.0-beta3/crypto/dh/dh_key.c 2009-09-30 13:25:58.000000000 +0200 |
| 749 | @@ -61,6 +61,9 @@ |
| 750 | #include <openssl/bn.h> |
| 751 | #include <openssl/rand.h> |
| 752 | #include <openssl/dh.h> |
| 753 | +#ifdef OPENSSL_FIPS |
| 754 | +#include <openssl/fips.h> |
| 755 | +#endif |
| 756 | |
| 757 | static int generate_key(DH *dh); |
| 758 | static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); |
| 759 | @@ -107,6 +110,14 @@ static int generate_key(DH *dh) |
| 760 | BN_MONT_CTX *mont=NULL; |
| 761 | BIGNUM *pub_key=NULL,*priv_key=NULL; |
| 762 | |
| 763 | +#ifdef OPENSSL_FIPS |
| 764 | + if (FIPS_mode() && (BN_num_bits(dh->p) < OPENSSL_DH_FIPS_MIN_MODULUS_BITS)) |
| 765 | + { |
| 766 | + DHerr(DH_F_GENERATE_KEY, DH_R_KEY_SIZE_TOO_SMALL); |
| 767 | + return 0; |
| 768 | + } |
| 769 | +#endif |
| 770 | + |
| 771 | ctx = BN_CTX_new(); |
| 772 | if (ctx == NULL) goto err; |
| 773 | |
| 774 | @@ -184,6 +195,13 @@ static int compute_key(unsigned char *ke |
| 775 | DHerr(DH_F_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE); |
| 776 | goto err; |
| 777 | } |
| 778 | +#ifdef OPENSSL_FIPS |
| 779 | + if (FIPS_mode() && (BN_num_bits(dh->p) < OPENSSL_DH_FIPS_MIN_MODULUS_BITS)) |
| 780 | + { |
| 781 | + DHerr(DH_F_COMPUTE_KEY, DH_R_KEY_SIZE_TOO_SMALL); |
| 782 | + goto err; |
| 783 | + } |
| 784 | +#endif |
| 785 | |
| 786 | ctx = BN_CTX_new(); |
| 787 | if (ctx == NULL) goto err; |
| 788 | @@ -251,6 +269,9 @@ static int dh_bn_mod_exp(const DH *dh, B |
| 789 | |
| 790 | static int dh_init(DH *dh) |
| 791 | { |
| 792 | +#ifdef OPENSSL_FIPS |
| 793 | + FIPS_selftest_check(); |
| 794 | +#endif |
| 795 | dh->flags |= DH_FLAG_CACHE_MONT_P; |
| 796 | return(1); |
| 797 | } |
| 798 | diff -up openssl-1.0.0-beta3/crypto/dsa/dsa_gen.c.fips openssl-1.0.0-beta3/crypto/dsa/dsa_gen.c |
| 799 | --- openssl-1.0.0-beta3/crypto/dsa/dsa_gen.c.fips 2008-12-26 18:17:21.000000000 +0100 |
| 800 | +++ openssl-1.0.0-beta3/crypto/dsa/dsa_gen.c 2009-09-30 13:25:58.000000000 +0200 |
| 801 | @@ -77,8 +77,12 @@ |
| 802 | #include "cryptlib.h" |
| 803 | #include <openssl/evp.h> |
| 804 | #include <openssl/bn.h> |
| 805 | +#include <openssl/dsa.h> |
| 806 | #include <openssl/rand.h> |
| 807 | #include <openssl/sha.h> |
| 808 | +#ifdef OPENSSL_FIPS |
| 809 | +#include <openssl/fips.h> |
| 810 | +#endif |
| 811 | #include "dsa_locl.h" |
| 812 | |
| 813 | int DSA_generate_parameters_ex(DSA *ret, int bits, |
| 814 | @@ -126,6 +130,21 @@ int dsa_builtin_paramgen(DSA *ret, size_ |
| 815 | BN_CTX *ctx=NULL; |
| 816 | unsigned int h=2; |
| 817 | |
| 818 | +#ifdef OPENSSL_FIPS |
| 819 | + if(FIPS_selftest_failed()) |
| 820 | + { |
| 821 | + FIPSerr(FIPS_F_DSA_BUILTIN_PARAMGEN, |
| 822 | + FIPS_R_FIPS_SELFTEST_FAILED); |
| 823 | + goto err; |
| 824 | + } |
| 825 | + |
| 826 | + if (FIPS_mode() && (bits < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS)) |
| 827 | + { |
| 828 | + DSAerr(DSA_F_DSA_BUILTIN_PARAMGEN, DSA_R_KEY_SIZE_TOO_SMALL); |
| 829 | + goto err; |
| 830 | + } |
| 831 | +#endif |
| 832 | + |
| 833 | if (qsize != SHA_DIGEST_LENGTH && qsize != SHA224_DIGEST_LENGTH && |
| 834 | qsize != SHA256_DIGEST_LENGTH) |
| 835 | /* invalid q size */ |
| 836 | diff -up openssl-1.0.0-beta3/crypto/dsa/dsa.h.fips openssl-1.0.0-beta3/crypto/dsa/dsa.h |
| 837 | --- openssl-1.0.0-beta3/crypto/dsa/dsa.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 838 | +++ openssl-1.0.0-beta3/crypto/dsa/dsa.h 2009-09-30 13:25:58.000000000 +0200 |
| 839 | @@ -88,6 +88,8 @@ |
| 840 | # define OPENSSL_DSA_MAX_MODULUS_BITS 10000 |
| 841 | #endif |
| 842 | |
| 843 | +#define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024 |
| 844 | + |
| 845 | #define DSA_FLAG_CACHE_MONT_P 0x01 |
| 846 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA |
| 847 | * implementation now uses constant time |
| 848 | @@ -97,6 +99,21 @@ |
| 849 | * be used for all exponents. |
| 850 | */ |
| 851 | |
| 852 | +/* If this flag is set the DSA method is FIPS compliant and can be used |
| 853 | + * in FIPS mode. This is set in the validated module method. If an |
| 854 | + * application sets this flag in its own methods it is its reposibility |
| 855 | + * to ensure the result is compliant. |
| 856 | + */ |
| 857 | + |
| 858 | +#define DSA_FLAG_FIPS_METHOD 0x0400 |
| 859 | + |
| 860 | +/* If this flag is set the operations normally disabled in FIPS mode are |
| 861 | + * permitted it is then the applications responsibility to ensure that the |
| 862 | + * usage is compliant. |
| 863 | + */ |
| 864 | + |
| 865 | +#define DSA_FLAG_NON_FIPS_ALLOW 0x0400 |
| 866 | + |
| 867 | #ifdef __cplusplus |
| 868 | extern "C" { |
| 869 | #endif |
| 870 | @@ -270,8 +287,11 @@ void ERR_load_DSA_strings(void); |
| 871 | #define DSA_F_DO_DSA_PRINT 104 |
| 872 | #define DSA_F_DSAPARAMS_PRINT 100 |
| 873 | #define DSA_F_DSAPARAMS_PRINT_FP 101 |
| 874 | +#define DSA_F_DSA_BUILTIN_KEYGEN 124 |
| 875 | +#define DSA_F_DSA_BUILTIN_PARAMGEN 123 |
| 876 | #define DSA_F_DSA_DO_SIGN 112 |
| 877 | #define DSA_F_DSA_DO_VERIFY 113 |
| 878 | +#define DSA_F_DSA_GENERATE_PARAMETERS 125 |
| 879 | #define DSA_F_DSA_NEW_METHOD 103 |
| 880 | #define DSA_F_DSA_PARAM_DECODE 119 |
| 881 | #define DSA_F_DSA_PRINT_FP 105 |
| 882 | @@ -296,9 +316,12 @@ void ERR_load_DSA_strings(void); |
| 883 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 |
| 884 | #define DSA_R_DECODE_ERROR 104 |
| 885 | #define DSA_R_INVALID_DIGEST_TYPE 106 |
| 886 | +#define DSA_R_KEY_SIZE_TOO_SMALL 110 |
| 887 | #define DSA_R_MISSING_PARAMETERS 101 |
| 888 | #define DSA_R_MODULUS_TOO_LARGE 103 |
| 889 | +#define DSA_R_NON_FIPS_METHOD 111 |
| 890 | #define DSA_R_NO_PARAMETERS_SET 107 |
| 891 | +#define DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 112 |
| 892 | #define DSA_R_PARAMETER_ENCODING_ERROR 105 |
| 893 | |
| 894 | #ifdef __cplusplus |
| 895 | diff -up openssl-1.0.0-beta3/crypto/dsa/dsa_key.c.fips openssl-1.0.0-beta3/crypto/dsa/dsa_key.c |
| 896 | --- openssl-1.0.0-beta3/crypto/dsa/dsa_key.c.fips 2007-03-28 02:15:25.000000000 +0200 |
| 897 | +++ openssl-1.0.0-beta3/crypto/dsa/dsa_key.c 2009-09-30 17:01:34.000000000 +0200 |
| 898 | @@ -63,9 +63,53 @@ |
| 899 | #include <openssl/bn.h> |
| 900 | #include <openssl/dsa.h> |
| 901 | #include <openssl/rand.h> |
| 902 | +#include <openssl/err.h> |
| 903 | +#include <openssl/evp.h> |
| 904 | +#include <openssl/fips.h> |
| 905 | +#include "fips_locl.h" |
| 906 | |
| 907 | static int dsa_builtin_keygen(DSA *dsa); |
| 908 | |
| 909 | +#ifdef OPENSSL_FIPS |
| 910 | + |
| 911 | +static int fips_dsa_pairwise_fail = 0; |
| 912 | + |
| 913 | +void FIPS_corrupt_dsa_keygen(void) |
| 914 | + { |
| 915 | + fips_dsa_pairwise_fail = 1; |
| 916 | + } |
| 917 | + |
| 918 | +int fips_check_dsa(DSA *dsa) |
| 919 | + { |
| 920 | + EVP_PKEY *pk; |
| 921 | + unsigned char tbs[] = "DSA Pairwise Check Data"; |
| 922 | + int ret = 0; |
| 923 | + |
| 924 | + if ((pk=EVP_PKEY_new()) == NULL) |
| 925 | + goto err; |
| 926 | + |
| 927 | + EVP_PKEY_set1_DSA(pk, dsa); |
| 928 | + |
| 929 | + if (!fips_pkey_signature_test(pk, tbs, -1, |
| 930 | + NULL, 0, EVP_sha1(), 0, NULL)) |
| 931 | + goto err; |
| 932 | + |
| 933 | + ret = 1; |
| 934 | + |
| 935 | +err: |
| 936 | + if (ret == 0) |
| 937 | + { |
| 938 | + fips_set_selftest_fail(); |
| 939 | + FIPSerr(FIPS_F_FIPS_CHECK_DSA,FIPS_R_PAIRWISE_TEST_FAILED); |
| 940 | + } |
| 941 | + |
| 942 | + if (pk) |
| 943 | + EVP_PKEY_free(pk); |
| 944 | + |
| 945 | + return ret; |
| 946 | + } |
| 947 | +#endif |
| 948 | + |
| 949 | int DSA_generate_key(DSA *dsa) |
| 950 | { |
| 951 | if(dsa->meth->dsa_keygen) |
| 952 | @@ -79,6 +123,14 @@ static int dsa_builtin_keygen(DSA *dsa) |
| 953 | BN_CTX *ctx=NULL; |
| 954 | BIGNUM *pub_key=NULL,*priv_key=NULL; |
| 955 | |
| 956 | +#ifdef OPENSSL_FIPS |
| 957 | + if (FIPS_mode() && (BN_num_bits(dsa->p) < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS)) |
| 958 | + { |
| 959 | + DSAerr(DSA_F_DSA_BUILTIN_KEYGEN, DSA_R_KEY_SIZE_TOO_SMALL); |
| 960 | + goto err; |
| 961 | + } |
| 962 | +#endif |
| 963 | + |
| 964 | if ((ctx=BN_CTX_new()) == NULL) goto err; |
| 965 | |
| 966 | if (dsa->priv_key == NULL) |
| 967 | @@ -117,6 +169,15 @@ static int dsa_builtin_keygen(DSA *dsa) |
| 968 | |
| 969 | dsa->priv_key=priv_key; |
| 970 | dsa->pub_key=pub_key; |
| 971 | +#ifdef OPENSSL_FIPS |
| 972 | + if (FIPS_mode()) |
| 973 | + { |
| 974 | + if (fips_dsa_pairwise_fail) |
| 975 | + BN_add_word(dsa->pub_key, 1); |
| 976 | + if(!fips_check_dsa(dsa)) |
| 977 | + goto err; |
| 978 | + } |
| 979 | +#endif |
| 980 | ok=1; |
| 981 | |
| 982 | err: |
| 983 | diff -up openssl-1.0.0-beta3/crypto/dsa/dsa_ossl.c.fips openssl-1.0.0-beta3/crypto/dsa/dsa_ossl.c |
| 984 | --- openssl-1.0.0-beta3/crypto/dsa/dsa_ossl.c.fips 2007-03-28 02:15:26.000000000 +0200 |
| 985 | +++ openssl-1.0.0-beta3/crypto/dsa/dsa_ossl.c 2009-09-30 13:25:58.000000000 +0200 |
| 986 | @@ -65,6 +65,9 @@ |
| 987 | #include <openssl/dsa.h> |
| 988 | #include <openssl/rand.h> |
| 989 | #include <openssl/asn1.h> |
| 990 | +#ifdef OPENSSL_FIPS |
| 991 | +#include <openssl/fips.h> |
| 992 | +#endif |
| 993 | |
| 994 | static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); |
| 995 | static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); |
| 996 | @@ -82,7 +85,7 @@ NULL, /* dsa_mod_exp, */ |
| 997 | NULL, /* dsa_bn_mod_exp, */ |
| 998 | dsa_init, |
| 999 | dsa_finish, |
| 1000 | -0, |
| 1001 | +DSA_FLAG_FIPS_METHOD, |
| 1002 | NULL, |
| 1003 | NULL, |
| 1004 | NULL |
| 1005 | @@ -137,6 +140,20 @@ static DSA_SIG *dsa_do_sign(const unsign |
| 1006 | int reason=ERR_R_BN_LIB; |
| 1007 | DSA_SIG *ret=NULL; |
| 1008 | |
| 1009 | +#ifdef OPENSSL_FIPS |
| 1010 | + if(FIPS_selftest_failed()) |
| 1011 | + { |
| 1012 | + FIPSerr(FIPS_F_DSA_DO_SIGN,FIPS_R_FIPS_SELFTEST_FAILED); |
| 1013 | + return NULL; |
| 1014 | + } |
| 1015 | + |
| 1016 | + if (FIPS_mode() && (BN_num_bits(dsa->p) < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS)) |
| 1017 | + { |
| 1018 | + DSAerr(DSA_F_DSA_DO_SIGN, DSA_R_KEY_SIZE_TOO_SMALL); |
| 1019 | + return NULL; |
| 1020 | + } |
| 1021 | +#endif |
| 1022 | + |
| 1023 | BN_init(&m); |
| 1024 | BN_init(&xr); |
| 1025 | |
| 1026 | @@ -312,6 +329,20 @@ static int dsa_do_verify(const unsigned |
| 1027 | return -1; |
| 1028 | } |
| 1029 | |
| 1030 | +#ifdef OPENSSL_FIPS |
| 1031 | + if(FIPS_selftest_failed()) |
| 1032 | + { |
| 1033 | + FIPSerr(FIPS_F_DSA_DO_VERIFY,FIPS_R_FIPS_SELFTEST_FAILED); |
| 1034 | + return -1; |
| 1035 | + } |
| 1036 | + |
| 1037 | + if (FIPS_mode() && (BN_num_bits(dsa->p) < OPENSSL_DSA_FIPS_MIN_MODULUS_BITS)) |
| 1038 | + { |
| 1039 | + DSAerr(DSA_F_DSA_DO_VERIFY, DSA_R_KEY_SIZE_TOO_SMALL); |
| 1040 | + return -1; |
| 1041 | + } |
| 1042 | +#endif |
| 1043 | + |
| 1044 | i = BN_num_bits(dsa->q); |
| 1045 | /* fips 186-3 allows only different sizes for q */ |
| 1046 | if (i != 160 && i != 224 && i != 256) |
| 1047 | @@ -403,6 +434,9 @@ static int dsa_do_verify(const unsigned |
| 1048 | |
| 1049 | static int dsa_init(DSA *dsa) |
| 1050 | { |
| 1051 | +#ifdef OPENSSL_FIPS |
| 1052 | + FIPS_selftest_check(); |
| 1053 | +#endif |
| 1054 | dsa->flags|=DSA_FLAG_CACHE_MONT_P; |
| 1055 | return(1); |
| 1056 | } |
| 1057 | diff -up openssl-1.0.0-beta3/crypto/err/err_all.c.fips openssl-1.0.0-beta3/crypto/err/err_all.c |
| 1058 | --- openssl-1.0.0-beta3/crypto/err/err_all.c.fips 2008-11-24 18:27:06.000000000 +0100 |
| 1059 | +++ openssl-1.0.0-beta3/crypto/err/err_all.c 2009-09-30 13:25:58.000000000 +0200 |
| 1060 | @@ -96,6 +96,9 @@ |
| 1061 | #include <openssl/ocsp.h> |
| 1062 | #include <openssl/err.h> |
| 1063 | #include <openssl/ts.h> |
| 1064 | +#ifdef OPENSSL_FIPS |
| 1065 | +#include <openssl/fips.h> |
| 1066 | +#endif |
| 1067 | #ifndef OPENSSL_NO_CMS |
| 1068 | #include <openssl/cms.h> |
| 1069 | #endif |
| 1070 | @@ -148,6 +151,9 @@ void ERR_load_crypto_strings(void) |
| 1071 | #endif |
| 1072 | ERR_load_OCSP_strings(); |
| 1073 | ERR_load_UI_strings(); |
| 1074 | +#ifdef OPENSSL_FIPS |
| 1075 | + ERR_load_FIPS_strings(); |
| 1076 | +#endif |
| 1077 | #ifndef OPENSSL_NO_CMS |
| 1078 | ERR_load_CMS_strings(); |
| 1079 | #endif |
| 1080 | diff -up openssl-1.0.0-beta3/crypto/evp/digest.c.fips openssl-1.0.0-beta3/crypto/evp/digest.c |
| 1081 | --- openssl-1.0.0-beta3/crypto/evp/digest.c.fips 2008-11-04 13:06:09.000000000 +0100 |
| 1082 | +++ openssl-1.0.0-beta3/crypto/evp/digest.c 2009-09-30 13:25:58.000000000 +0200 |
| 1083 | @@ -116,6 +116,7 @@ |
| 1084 | #ifndef OPENSSL_NO_ENGINE |
| 1085 | #include <openssl/engine.h> |
| 1086 | #endif |
| 1087 | +#include "evp_locl.h" |
| 1088 | |
| 1089 | void EVP_MD_CTX_init(EVP_MD_CTX *ctx) |
| 1090 | { |
| 1091 | @@ -137,9 +138,50 @@ int EVP_DigestInit(EVP_MD_CTX *ctx, cons |
| 1092 | return EVP_DigestInit_ex(ctx, type, NULL); |
| 1093 | } |
| 1094 | |
| 1095 | +#ifdef OPENSSL_FIPS |
| 1096 | + |
| 1097 | +/* The purpose of these is to trap programs that attempt to use non FIPS |
| 1098 | + * algorithms in FIPS mode and ignore the errors. |
| 1099 | + */ |
| 1100 | + |
| 1101 | +static int bad_init(EVP_MD_CTX *ctx) |
| 1102 | + { FIPS_ERROR_IGNORED("Digest init"); return 0;} |
| 1103 | + |
| 1104 | +static int bad_update(EVP_MD_CTX *ctx,const void *data,size_t count) |
| 1105 | + { FIPS_ERROR_IGNORED("Digest update"); return 0;} |
| 1106 | + |
| 1107 | +static int bad_final(EVP_MD_CTX *ctx,unsigned char *md) |
| 1108 | + { FIPS_ERROR_IGNORED("Digest Final"); return 0;} |
| 1109 | + |
| 1110 | +static const EVP_MD bad_md = |
| 1111 | + { |
| 1112 | + 0, |
| 1113 | + 0, |
| 1114 | + 0, |
| 1115 | + 0, |
| 1116 | + bad_init, |
| 1117 | + bad_update, |
| 1118 | + bad_final, |
| 1119 | + NULL, |
| 1120 | + NULL, |
| 1121 | + NULL, |
| 1122 | + 0, |
| 1123 | + {0,0,0,0}, |
| 1124 | + }; |
| 1125 | + |
| 1126 | +#endif |
| 1127 | + |
| 1128 | int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) |
| 1129 | { |
| 1130 | EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); |
| 1131 | +#ifdef OPENSSL_FIPS |
| 1132 | + if(FIPS_selftest_failed()) |
| 1133 | + { |
| 1134 | + FIPSerr(FIPS_F_EVP_DIGESTINIT_EX,FIPS_R_FIPS_SELFTEST_FAILED); |
| 1135 | + ctx->digest = &bad_md; |
| 1136 | + return 0; |
| 1137 | + } |
| 1138 | +#endif |
| 1139 | #ifndef OPENSSL_NO_ENGINE |
| 1140 | /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts |
| 1141 | * so this context may already have an ENGINE! Try to avoid releasing |
| 1142 | @@ -195,6 +237,18 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, c |
| 1143 | #endif |
| 1144 | if (ctx->digest != type) |
| 1145 | { |
| 1146 | +#ifdef OPENSSL_FIPS |
| 1147 | + if (FIPS_mode()) |
| 1148 | + { |
| 1149 | + if (!(type->flags & EVP_MD_FLAG_FIPS) |
| 1150 | + && !(ctx->flags & EVP_MD_CTX_FLAG_NON_FIPS_ALLOW)) |
| 1151 | + { |
| 1152 | + EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_DISABLED_FOR_FIPS); |
| 1153 | + ctx->digest = &bad_md; |
| 1154 | + return 0; |
| 1155 | + } |
| 1156 | + } |
| 1157 | +#endif |
| 1158 | if (ctx->digest && ctx->digest->ctx_size) |
| 1159 | OPENSSL_free(ctx->md_data); |
| 1160 | ctx->digest=type; |
| 1161 | @@ -222,6 +276,9 @@ skip_to_init: |
| 1162 | |
| 1163 | int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count) |
| 1164 | { |
| 1165 | +#ifdef OPENSSL_FIPS |
| 1166 | + FIPS_selftest_check(); |
| 1167 | +#endif |
| 1168 | return ctx->update(ctx,data,count); |
| 1169 | } |
| 1170 | |
| 1171 | @@ -238,6 +295,9 @@ int EVP_DigestFinal(EVP_MD_CTX *ctx, uns |
| 1172 | int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) |
| 1173 | { |
| 1174 | int ret; |
| 1175 | +#ifdef OPENSSL_FIPS |
| 1176 | + FIPS_selftest_check(); |
| 1177 | +#endif |
| 1178 | |
| 1179 | OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); |
| 1180 | ret=ctx->digest->final(ctx,md); |
| 1181 | diff -up openssl-1.0.0-beta3/crypto/evp/e_aes.c.fips openssl-1.0.0-beta3/crypto/evp/e_aes.c |
| 1182 | --- openssl-1.0.0-beta3/crypto/evp/e_aes.c.fips 2004-01-28 20:05:33.000000000 +0100 |
| 1183 | +++ openssl-1.0.0-beta3/crypto/evp/e_aes.c 2009-09-30 13:25:58.000000000 +0200 |
| 1184 | @@ -69,32 +69,29 @@ typedef struct |
| 1185 | |
| 1186 | IMPLEMENT_BLOCK_CIPHER(aes_128, ks, AES, EVP_AES_KEY, |
| 1187 | NID_aes_128, 16, 16, 16, 128, |
| 1188 | - 0, aes_init_key, NULL, |
| 1189 | - EVP_CIPHER_set_asn1_iv, |
| 1190 | - EVP_CIPHER_get_asn1_iv, |
| 1191 | - NULL) |
| 1192 | + EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1193 | + aes_init_key, |
| 1194 | + NULL, NULL, NULL, NULL) |
| 1195 | IMPLEMENT_BLOCK_CIPHER(aes_192, ks, AES, EVP_AES_KEY, |
| 1196 | NID_aes_192, 16, 24, 16, 128, |
| 1197 | - 0, aes_init_key, NULL, |
| 1198 | - EVP_CIPHER_set_asn1_iv, |
| 1199 | - EVP_CIPHER_get_asn1_iv, |
| 1200 | - NULL) |
| 1201 | + EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1202 | + aes_init_key, |
| 1203 | + NULL, NULL, NULL, NULL) |
| 1204 | IMPLEMENT_BLOCK_CIPHER(aes_256, ks, AES, EVP_AES_KEY, |
| 1205 | NID_aes_256, 16, 32, 16, 128, |
| 1206 | - 0, aes_init_key, NULL, |
| 1207 | - EVP_CIPHER_set_asn1_iv, |
| 1208 | - EVP_CIPHER_get_asn1_iv, |
| 1209 | - NULL) |
| 1210 | - |
| 1211 | -#define IMPLEMENT_AES_CFBR(ksize,cbits) IMPLEMENT_CFBR(aes,AES,EVP_AES_KEY,ks,ksize,cbits,16) |
| 1212 | - |
| 1213 | -IMPLEMENT_AES_CFBR(128,1) |
| 1214 | -IMPLEMENT_AES_CFBR(192,1) |
| 1215 | -IMPLEMENT_AES_CFBR(256,1) |
| 1216 | - |
| 1217 | -IMPLEMENT_AES_CFBR(128,8) |
| 1218 | -IMPLEMENT_AES_CFBR(192,8) |
| 1219 | -IMPLEMENT_AES_CFBR(256,8) |
| 1220 | + EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1221 | + aes_init_key, |
| 1222 | + NULL, NULL, NULL, NULL) |
| 1223 | + |
| 1224 | +#define IMPLEMENT_AES_CFBR(ksize,cbits,flags) IMPLEMENT_CFBR(aes,AES,EVP_AES_KEY,ks,ksize,cbits,16,flags) |
| 1225 | + |
| 1226 | +IMPLEMENT_AES_CFBR(128,1,EVP_CIPH_FLAG_FIPS) |
| 1227 | +IMPLEMENT_AES_CFBR(192,1,EVP_CIPH_FLAG_FIPS) |
| 1228 | +IMPLEMENT_AES_CFBR(256,1,EVP_CIPH_FLAG_FIPS) |
| 1229 | + |
| 1230 | +IMPLEMENT_AES_CFBR(128,8,EVP_CIPH_FLAG_FIPS) |
| 1231 | +IMPLEMENT_AES_CFBR(192,8,EVP_CIPH_FLAG_FIPS) |
| 1232 | +IMPLEMENT_AES_CFBR(256,8,EVP_CIPH_FLAG_FIPS) |
| 1233 | |
| 1234 | static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 1235 | const unsigned char *iv, int enc) |
| 1236 | diff -up openssl-1.0.0-beta3/crypto/evp/e_camellia.c.fips openssl-1.0.0-beta3/crypto/evp/e_camellia.c |
| 1237 | --- openssl-1.0.0-beta3/crypto/evp/e_camellia.c.fips 2006-08-31 22:56:20.000000000 +0200 |
| 1238 | +++ openssl-1.0.0-beta3/crypto/evp/e_camellia.c 2009-09-30 13:25:58.000000000 +0200 |
| 1239 | @@ -93,7 +93,7 @@ IMPLEMENT_BLOCK_CIPHER(camellia_256, ks, |
| 1240 | EVP_CIPHER_get_asn1_iv, |
| 1241 | NULL) |
| 1242 | |
| 1243 | -#define IMPLEMENT_CAMELLIA_CFBR(ksize,cbits) IMPLEMENT_CFBR(camellia,Camellia,EVP_CAMELLIA_KEY,ks,ksize,cbits,16) |
| 1244 | +#define IMPLEMENT_CAMELLIA_CFBR(ksize,cbits) IMPLEMENT_CFBR(camellia,Camellia,EVP_CAMELLIA_KEY,ks,ksize,cbits,16,0) |
| 1245 | |
| 1246 | IMPLEMENT_CAMELLIA_CFBR(128,1) |
| 1247 | IMPLEMENT_CAMELLIA_CFBR(192,1) |
| 1248 | diff -up openssl-1.0.0-beta3/crypto/evp/e_des3.c.fips openssl-1.0.0-beta3/crypto/evp/e_des3.c |
| 1249 | --- openssl-1.0.0-beta3/crypto/evp/e_des3.c.fips 2008-12-29 13:35:47.000000000 +0100 |
| 1250 | +++ openssl-1.0.0-beta3/crypto/evp/e_des3.c 2009-09-30 13:25:58.000000000 +0200 |
| 1251 | @@ -206,9 +206,9 @@ static int des_ede3_cfb8_cipher(EVP_CIPH |
| 1252 | } |
| 1253 | |
| 1254 | BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, |
| 1255 | - EVP_CIPH_RAND_KEY, des_ede_init_key, NULL, |
| 1256 | - EVP_CIPHER_set_asn1_iv, |
| 1257 | - EVP_CIPHER_get_asn1_iv, |
| 1258 | + EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1259 | + des_ede_init_key, |
| 1260 | + NULL, NULL, NULL, |
| 1261 | des3_ctrl) |
| 1262 | |
| 1263 | #define des_ede3_cfb64_cipher des_ede_cfb64_cipher |
| 1264 | @@ -217,21 +217,21 @@ BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, |
| 1265 | #define des_ede3_ecb_cipher des_ede_ecb_cipher |
| 1266 | |
| 1267 | BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, |
| 1268 | - EVP_CIPH_RAND_KEY, des_ede3_init_key, NULL, |
| 1269 | - EVP_CIPHER_set_asn1_iv, |
| 1270 | - EVP_CIPHER_get_asn1_iv, |
| 1271 | + EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1272 | + des_ede3_init_key, |
| 1273 | + NULL, NULL, NULL, |
| 1274 | des3_ctrl) |
| 1275 | |
| 1276 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, |
| 1277 | - EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, |
| 1278 | - EVP_CIPHER_set_asn1_iv, |
| 1279 | - EVP_CIPHER_get_asn1_iv, |
| 1280 | + EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1281 | + des_ede3_init_key, |
| 1282 | + NULL, NULL, NULL, |
| 1283 | des3_ctrl) |
| 1284 | |
| 1285 | BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, |
| 1286 | - EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, |
| 1287 | - EVP_CIPHER_set_asn1_iv, |
| 1288 | - EVP_CIPHER_get_asn1_iv, |
| 1289 | + EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, |
| 1290 | + des_ede3_init_key, |
| 1291 | + NULL, NULL, NULL, |
| 1292 | des3_ctrl) |
| 1293 | |
| 1294 | static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 1295 | diff -up openssl-1.0.0-beta3/crypto/evp/e_null.c.fips openssl-1.0.0-beta3/crypto/evp/e_null.c |
| 1296 | --- openssl-1.0.0-beta3/crypto/evp/e_null.c.fips 2008-10-31 20:48:24.000000000 +0100 |
| 1297 | +++ openssl-1.0.0-beta3/crypto/evp/e_null.c 2009-09-30 13:25:58.000000000 +0200 |
| 1298 | @@ -69,7 +69,7 @@ static const EVP_CIPHER n_cipher= |
| 1299 | { |
| 1300 | NID_undef, |
| 1301 | 1,0,0, |
| 1302 | - 0, |
| 1303 | + EVP_CIPH_FLAG_FIPS, |
| 1304 | null_init_key, |
| 1305 | null_cipher, |
| 1306 | NULL, |
| 1307 | diff -up openssl-1.0.0-beta3/crypto/evp/evp_enc.c.fips openssl-1.0.0-beta3/crypto/evp/evp_enc.c |
| 1308 | --- openssl-1.0.0-beta3/crypto/evp/evp_enc.c.fips 2008-11-12 04:58:00.000000000 +0100 |
| 1309 | +++ openssl-1.0.0-beta3/crypto/evp/evp_enc.c 2009-09-30 13:25:58.000000000 +0200 |
| 1310 | @@ -68,8 +68,53 @@ |
| 1311 | |
| 1312 | const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT; |
| 1313 | |
| 1314 | +#ifdef OPENSSL_FIPS |
| 1315 | + |
| 1316 | +/* The purpose of these is to trap programs that attempt to use non FIPS |
| 1317 | + * algorithms in FIPS mode and ignore the errors. |
| 1318 | + */ |
| 1319 | + |
| 1320 | +static int bad_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 1321 | + const unsigned char *iv, int enc) |
| 1322 | + { FIPS_ERROR_IGNORED("Cipher init"); return 0;} |
| 1323 | + |
| 1324 | +static int bad_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
| 1325 | + const unsigned char *in, unsigned int inl) |
| 1326 | + { FIPS_ERROR_IGNORED("Cipher update"); return 0;} |
| 1327 | + |
| 1328 | +/* NB: no cleanup because it is allowed after failed init */ |
| 1329 | + |
| 1330 | +static int bad_set_asn1(EVP_CIPHER_CTX *ctx, ASN1_TYPE *typ) |
| 1331 | + { FIPS_ERROR_IGNORED("Cipher set_asn1"); return 0;} |
| 1332 | +static int bad_get_asn1(EVP_CIPHER_CTX *ctx, ASN1_TYPE *typ) |
| 1333 | + { FIPS_ERROR_IGNORED("Cipher get_asn1"); return 0;} |
| 1334 | +static int bad_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) |
| 1335 | + { FIPS_ERROR_IGNORED("Cipher ctrl"); return 0;} |
| 1336 | + |
| 1337 | +static const EVP_CIPHER bad_cipher = |
| 1338 | + { |
| 1339 | + 0, |
| 1340 | + 0, |
| 1341 | + 0, |
| 1342 | + 0, |
| 1343 | + 0, |
| 1344 | + bad_init, |
| 1345 | + bad_do_cipher, |
| 1346 | + NULL, |
| 1347 | + 0, |
| 1348 | + bad_set_asn1, |
| 1349 | + bad_get_asn1, |
| 1350 | + bad_ctrl, |
| 1351 | + NULL |
| 1352 | + }; |
| 1353 | + |
| 1354 | +#endif |
| 1355 | + |
| 1356 | void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx) |
| 1357 | { |
| 1358 | +#ifdef OPENSSL_FIPS |
| 1359 | + FIPS_selftest_check(); |
| 1360 | +#endif |
| 1361 | memset(ctx,0,sizeof(EVP_CIPHER_CTX)); |
| 1362 | /* ctx->cipher=NULL; */ |
| 1363 | } |
| 1364 | @@ -101,6 +146,14 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ct |
| 1365 | enc = 1; |
| 1366 | ctx->encrypt = enc; |
| 1367 | } |
| 1368 | +#ifdef OPENSSL_FIPS |
| 1369 | + if(FIPS_selftest_failed()) |
| 1370 | + { |
| 1371 | + FIPSerr(FIPS_F_EVP_CIPHERINIT_EX,FIPS_R_FIPS_SELFTEST_FAILED); |
| 1372 | + ctx->cipher = &bad_cipher; |
| 1373 | + return 0; |
| 1374 | + } |
| 1375 | +#endif |
| 1376 | #ifndef OPENSSL_NO_ENGINE |
| 1377 | /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts |
| 1378 | * so this context may already have an ENGINE! Try to avoid releasing |
| 1379 | @@ -219,6 +272,22 @@ skip_to_init: |
| 1380 | } |
| 1381 | } |
| 1382 | |
| 1383 | +#ifdef OPENSSL_FIPS |
| 1384 | + /* After 'key' is set no further parameters changes are permissible. |
| 1385 | + * So only check for non FIPS enabling at this point. |
| 1386 | + */ |
| 1387 | + if (key && FIPS_mode()) |
| 1388 | + { |
| 1389 | + if (!(ctx->cipher->flags & EVP_CIPH_FLAG_FIPS) |
| 1390 | + & !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW)) |
| 1391 | + { |
| 1392 | + EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_DISABLED_FOR_FIPS); |
| 1393 | + ctx->cipher = &bad_cipher; |
| 1394 | + return 0; |
| 1395 | + } |
| 1396 | + } |
| 1397 | +#endif |
| 1398 | + |
| 1399 | if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) { |
| 1400 | if(!ctx->cipher->init(ctx,key,iv,enc)) return 0; |
| 1401 | } |
| 1402 | diff -up openssl-1.0.0-beta3/crypto/evp/evp_err.c.fips openssl-1.0.0-beta3/crypto/evp/evp_err.c |
| 1403 | --- openssl-1.0.0-beta3/crypto/evp/evp_err.c.fips 2008-12-29 17:11:54.000000000 +0100 |
| 1404 | +++ openssl-1.0.0-beta3/crypto/evp/evp_err.c 2009-09-30 13:25:58.000000000 +0200 |
| 1405 | @@ -154,6 +154,7 @@ static ERR_STRING_DATA EVP_str_reasons[] |
| 1406 | {ERR_REASON(EVP_R_DECODE_ERROR) ,"decode error"}, |
| 1407 | {ERR_REASON(EVP_R_DIFFERENT_KEY_TYPES) ,"different key types"}, |
| 1408 | {ERR_REASON(EVP_R_DIFFERENT_PARAMETERS) ,"different parameters"}, |
| 1409 | +{ERR_REASON(EVP_R_DISABLED_FOR_FIPS) ,"disabled for fips"}, |
| 1410 | {ERR_REASON(EVP_R_ENCODE_ERROR) ,"encode error"}, |
| 1411 | {ERR_REASON(EVP_R_EVP_PBE_CIPHERINIT_ERROR),"evp pbe cipherinit error"}, |
| 1412 | {ERR_REASON(EVP_R_EXPECTING_AN_RSA_KEY) ,"expecting an rsa key"}, |
| 1413 | diff -up openssl-1.0.0-beta3/crypto/evp/evp.h.fips openssl-1.0.0-beta3/crypto/evp/evp.h |
| 1414 | --- openssl-1.0.0-beta3/crypto/evp/evp.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 1415 | +++ openssl-1.0.0-beta3/crypto/evp/evp.h 2009-09-30 14:40:54.000000000 +0200 |
| 1416 | @@ -75,6 +75,10 @@ |
| 1417 | #include <openssl/bio.h> |
| 1418 | #endif |
| 1419 | |
| 1420 | +#ifdef OPENSSL_FIPS |
| 1421 | +#include <openssl/fips.h> |
| 1422 | +#endif |
| 1423 | + |
| 1424 | /* |
| 1425 | #define EVP_RC2_KEY_SIZE 16 |
| 1426 | #define EVP_RC4_KEY_SIZE 16 |
| 1427 | @@ -197,6 +201,8 @@ typedef int evp_verify_method(int type,c |
| 1428 | |
| 1429 | #define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 |
| 1430 | |
| 1431 | +#define EVP_MD_FLAG_FIPS 0x0400 /* Note if suitable for use in FIPS mode */ |
| 1432 | + |
| 1433 | /* DigestAlgorithmIdentifier flags... */ |
| 1434 | |
| 1435 | #define EVP_MD_FLAG_DIGALGID_MASK 0x0018 |
| 1436 | @@ -269,10 +275,6 @@ struct env_md_ctx_st |
| 1437 | * cleaned */ |
| 1438 | #define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data |
| 1439 | * in EVP_MD_CTX_cleanup */ |
| 1440 | -/* FIPS and pad options are ignored in 1.0.0, definitions are here |
| 1441 | - * so we don't accidentally reuse the values for other purposes. |
| 1442 | - */ |
| 1443 | - |
| 1444 | #define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008 /* Allow use of non FIPS digest |
| 1445 | * in FIPS mode */ |
| 1446 | |
| 1447 | @@ -284,6 +286,10 @@ struct env_md_ctx_st |
| 1448 | #define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00 /* PKCS#1 v1.5 mode */ |
| 1449 | #define EVP_MD_CTX_FLAG_PAD_X931 0x10 /* X9.31 mode */ |
| 1450 | #define EVP_MD_CTX_FLAG_PAD_PSS 0x20 /* PSS mode */ |
| 1451 | +#define M_EVP_MD_CTX_FLAG_PSS_SALT(ctx) \ |
| 1452 | + ((ctx->flags>>16) &0xFFFF) /* seed length */ |
| 1453 | +#define EVP_MD_CTX_FLAG_PSS_MDLEN 0xFFFF /* salt len same as digest */ |
| 1454 | +#define EVP_MD_CTX_FLAG_PSS_MREC 0xFFFE /* salt max or auto recovered */ |
| 1455 | |
| 1456 | #define EVP_MD_CTX_FLAG_NO_INIT 0x0100 /* Don't initialize md_data */ |
| 1457 | |
| 1458 | @@ -330,6 +336,14 @@ struct evp_cipher_st |
| 1459 | #define EVP_CIPH_NO_PADDING 0x100 |
| 1460 | /* cipher handles random key generation */ |
| 1461 | #define EVP_CIPH_RAND_KEY 0x200 |
| 1462 | +/* Note if suitable for use in FIPS mode */ |
| 1463 | +#define EVP_CIPH_FLAG_FIPS 0x400 |
| 1464 | +/* Allow non FIPS cipher in FIPS mode */ |
| 1465 | +#define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x800 |
| 1466 | +/* Allow use default ASN1 get/set iv */ |
| 1467 | +#define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 |
| 1468 | +/* Buffer length in bits not bytes: CFB1 mode only */ |
| 1469 | +#define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 |
| 1470 | |
| 1471 | /* ctrl() values */ |
| 1472 | |
| 1473 | @@ -507,6 +521,10 @@ int EVP_BytesToKey(const EVP_CIPHER *typ |
| 1474 | const unsigned char *salt, const unsigned char *data, |
| 1475 | int datal, int count, unsigned char *key,unsigned char *iv); |
| 1476 | |
| 1477 | +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); |
| 1478 | +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); |
| 1479 | +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx,int flags); |
| 1480 | + |
| 1481 | int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, |
| 1482 | const unsigned char *key, const unsigned char *iv); |
| 1483 | int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, |
| 1484 | @@ -1225,6 +1243,7 @@ void ERR_load_EVP_strings(void); |
| 1485 | #define EVP_R_DECODE_ERROR 114 |
| 1486 | #define EVP_R_DIFFERENT_KEY_TYPES 101 |
| 1487 | #define EVP_R_DIFFERENT_PARAMETERS 153 |
| 1488 | +#define EVP_R_DISABLED_FOR_FIPS 160 |
| 1489 | #define EVP_R_ENCODE_ERROR 115 |
| 1490 | #define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 |
| 1491 | #define EVP_R_EXPECTING_AN_RSA_KEY 127 |
| 1492 | diff -up openssl-1.0.0-beta3/crypto/evp/evp_lib.c.fips openssl-1.0.0-beta3/crypto/evp/evp_lib.c |
| 1493 | --- openssl-1.0.0-beta3/crypto/evp/evp_lib.c.fips 2009-04-10 12:30:27.000000000 +0200 |
| 1494 | +++ openssl-1.0.0-beta3/crypto/evp/evp_lib.c 2009-09-30 13:25:58.000000000 +0200 |
| 1495 | @@ -67,6 +67,8 @@ int EVP_CIPHER_param_to_asn1(EVP_CIPHER_ |
| 1496 | |
| 1497 | if (c->cipher->set_asn1_parameters != NULL) |
| 1498 | ret=c->cipher->set_asn1_parameters(c,type); |
| 1499 | + else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) |
| 1500 | + ret=EVP_CIPHER_set_asn1_iv(c, type); |
| 1501 | else |
| 1502 | ret=-1; |
| 1503 | return(ret); |
| 1504 | @@ -78,6 +80,8 @@ int EVP_CIPHER_asn1_to_param(EVP_CIPHER_ |
| 1505 | |
| 1506 | if (c->cipher->get_asn1_parameters != NULL) |
| 1507 | ret=c->cipher->get_asn1_parameters(c,type); |
| 1508 | + else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) |
| 1509 | + ret=EVP_CIPHER_get_asn1_iv(c, type); |
| 1510 | else |
| 1511 | ret=-1; |
| 1512 | return(ret); |
| 1513 | @@ -180,6 +184,9 @@ int EVP_CIPHER_CTX_block_size(const EVP_ |
| 1514 | |
| 1515 | int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) |
| 1516 | { |
| 1517 | +#ifdef OPENSSL_FIPS |
| 1518 | + FIPS_selftest_check(); |
| 1519 | +#endif |
| 1520 | return ctx->cipher->do_cipher(ctx,out,in,inl); |
| 1521 | } |
| 1522 | |
| 1523 | @@ -289,3 +296,18 @@ int EVP_MD_CTX_test_flags(const EVP_MD_C |
| 1524 | { |
| 1525 | return (ctx->flags & flags); |
| 1526 | } |
| 1527 | + |
| 1528 | +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags) |
| 1529 | + { |
| 1530 | + ctx->flags |= flags; |
| 1531 | + } |
| 1532 | + |
| 1533 | +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags) |
| 1534 | + { |
| 1535 | + ctx->flags &= ~flags; |
| 1536 | + } |
| 1537 | + |
| 1538 | +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags) |
| 1539 | + { |
| 1540 | + return (ctx->flags & flags); |
| 1541 | + } |
| 1542 | diff -up openssl-1.0.0-beta3/crypto/evp/evp_locl.h.fips openssl-1.0.0-beta3/crypto/evp/evp_locl.h |
| 1543 | --- openssl-1.0.0-beta3/crypto/evp/evp_locl.h.fips 2009-09-30 13:25:57.000000000 +0200 |
| 1544 | +++ openssl-1.0.0-beta3/crypto/evp/evp_locl.h 2009-09-30 13:25:58.000000000 +0200 |
| 1545 | @@ -111,11 +111,11 @@ static int cname##_cbc_cipher(EVP_CIPHER |
| 1546 | static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \ |
| 1547 | {\ |
| 1548 | size_t chunk=EVP_MAXCHUNK;\ |
| 1549 | - if (cbits==1) chunk>>=3;\ |
| 1550 | + if (cbits==1 && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS)) chunk>>=3;\ |
| 1551 | if (inl<chunk) chunk=inl;\ |
| 1552 | while(inl && inl>=chunk)\ |
| 1553 | {\ |
| 1554 | - cprefix##_cfb##cbits##_encrypt(in, out, (long)(cbits==1?chunk*8:chunk), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\ |
| 1555 | + cprefix##_cfb##cbits##_encrypt(in, out, (long)(cbits==1 && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS)?chunk*8:chunk), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\ |
| 1556 | inl-=chunk;\ |
| 1557 | in +=chunk;\ |
| 1558 | out+=chunk;\ |
| 1559 | @@ -254,14 +254,29 @@ const EVP_CIPHER *EVP_##cname##_ecb(void |
| 1560 | |
| 1561 | #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data) |
| 1562 | |
| 1563 | -#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len) \ |
| 1564 | +#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \ |
| 1565 | BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \ |
| 1566 | BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \ |
| 1567 | NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \ |
| 1568 | - 0, cipher##_init_key, NULL, \ |
| 1569 | - EVP_CIPHER_set_asn1_iv, \ |
| 1570 | - EVP_CIPHER_get_asn1_iv, \ |
| 1571 | - NULL) |
| 1572 | + (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \ |
| 1573 | + cipher##_init_key, NULL, NULL, NULL, NULL) |
| 1574 | + |
| 1575 | +#ifdef OPENSSL_FIPS |
| 1576 | +#define RC2_set_key private_RC2_set_key |
| 1577 | +#define RC4_set_key private_RC4_set_key |
| 1578 | +#define CAST_set_key private_CAST_set_key |
| 1579 | +#define RC5_32_set_key private_RC5_32_set_key |
| 1580 | +#define BF_set_key private_BF_set_key |
| 1581 | +#define Camellia_set_key private_Camellia_set_key |
| 1582 | +#define idea_set_encrypt_key private_idea_set_encrypt_key |
| 1583 | + |
| 1584 | +#define MD5_Init private_MD5_Init |
| 1585 | +#define MD4_Init private_MD4_Init |
| 1586 | +#define MD2_Init private_MD2_Init |
| 1587 | +#define MDC2_Init private_MDC2_Init |
| 1588 | +#define SHA_Init private_SHA_Init |
| 1589 | + |
| 1590 | +#endif |
| 1591 | |
| 1592 | struct evp_pkey_ctx_st |
| 1593 | { |
| 1594 | diff -up openssl-1.0.0-beta3/crypto/evp/m_dss.c.fips openssl-1.0.0-beta3/crypto/evp/m_dss.c |
| 1595 | --- openssl-1.0.0-beta3/crypto/evp/m_dss.c.fips 2006-04-19 19:05:57.000000000 +0200 |
| 1596 | +++ openssl-1.0.0-beta3/crypto/evp/m_dss.c 2009-09-30 13:25:58.000000000 +0200 |
| 1597 | @@ -81,7 +81,7 @@ static const EVP_MD dsa_md= |
| 1598 | NID_dsaWithSHA, |
| 1599 | NID_dsaWithSHA, |
| 1600 | SHA_DIGEST_LENGTH, |
| 1601 | - EVP_MD_FLAG_PKEY_DIGEST, |
| 1602 | + EVP_MD_FLAG_PKEY_DIGEST|EVP_MD_FLAG_FIPS, |
| 1603 | init, |
| 1604 | update, |
| 1605 | final, |
| 1606 | diff -up openssl-1.0.0-beta3/crypto/evp/m_dss1.c.fips openssl-1.0.0-beta3/crypto/evp/m_dss1.c |
| 1607 | --- openssl-1.0.0-beta3/crypto/evp/m_dss1.c.fips 2006-04-19 19:05:57.000000000 +0200 |
| 1608 | +++ openssl-1.0.0-beta3/crypto/evp/m_dss1.c 2009-09-30 13:25:58.000000000 +0200 |
| 1609 | @@ -82,7 +82,7 @@ static const EVP_MD dss1_md= |
| 1610 | NID_dsa, |
| 1611 | NID_dsaWithSHA1, |
| 1612 | SHA_DIGEST_LENGTH, |
| 1613 | - EVP_MD_FLAG_PKEY_DIGEST, |
| 1614 | + EVP_MD_FLAG_PKEY_DIGEST|EVP_MD_FLAG_FIPS, |
| 1615 | init, |
| 1616 | update, |
| 1617 | final, |
| 1618 | diff -up openssl-1.0.0-beta3/crypto/evp/m_sha1.c.fips openssl-1.0.0-beta3/crypto/evp/m_sha1.c |
| 1619 | --- openssl-1.0.0-beta3/crypto/evp/m_sha1.c.fips 2008-03-12 22:14:24.000000000 +0100 |
| 1620 | +++ openssl-1.0.0-beta3/crypto/evp/m_sha1.c 2009-09-30 13:25:58.000000000 +0200 |
| 1621 | @@ -82,7 +82,8 @@ static const EVP_MD sha1_md= |
| 1622 | NID_sha1, |
| 1623 | NID_sha1WithRSAEncryption, |
| 1624 | SHA_DIGEST_LENGTH, |
| 1625 | - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT, |
| 1626 | + EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT| |
| 1627 | + EVP_MD_FLAG_FIPS, |
| 1628 | init, |
| 1629 | update, |
| 1630 | final, |
| 1631 | @@ -119,7 +120,8 @@ static const EVP_MD sha224_md= |
| 1632 | NID_sha224, |
| 1633 | NID_sha224WithRSAEncryption, |
| 1634 | SHA224_DIGEST_LENGTH, |
| 1635 | - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT, |
| 1636 | + EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT| |
| 1637 | + EVP_MD_FLAG_FIPS, |
| 1638 | init224, |
| 1639 | update256, |
| 1640 | final256, |
| 1641 | @@ -138,7 +140,8 @@ static const EVP_MD sha256_md= |
| 1642 | NID_sha256, |
| 1643 | NID_sha256WithRSAEncryption, |
| 1644 | SHA256_DIGEST_LENGTH, |
| 1645 | - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT, |
| 1646 | + EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT| |
| 1647 | + EVP_MD_FLAG_FIPS, |
| 1648 | init256, |
| 1649 | update256, |
| 1650 | final256, |
| 1651 | @@ -169,7 +172,8 @@ static const EVP_MD sha384_md= |
| 1652 | NID_sha384, |
| 1653 | NID_sha384WithRSAEncryption, |
| 1654 | SHA384_DIGEST_LENGTH, |
| 1655 | - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT, |
| 1656 | + EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT| |
| 1657 | + EVP_MD_FLAG_FIPS, |
| 1658 | init384, |
| 1659 | update512, |
| 1660 | final512, |
| 1661 | @@ -188,7 +192,8 @@ static const EVP_MD sha512_md= |
| 1662 | NID_sha512, |
| 1663 | NID_sha512WithRSAEncryption, |
| 1664 | SHA512_DIGEST_LENGTH, |
| 1665 | - EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT, |
| 1666 | + EVP_MD_FLAG_PKEY_METHOD_SIGNATURE|EVP_MD_FLAG_DIGALGID_ABSENT| |
| 1667 | + EVP_MD_FLAG_FIPS, |
| 1668 | init512, |
| 1669 | update512, |
| 1670 | final512, |
| 1671 | diff -up openssl-1.0.0-beta3/crypto/evp/names.c.fips openssl-1.0.0-beta3/crypto/evp/names.c |
| 1672 | --- openssl-1.0.0-beta3/crypto/evp/names.c.fips 2009-04-10 12:30:27.000000000 +0200 |
| 1673 | +++ openssl-1.0.0-beta3/crypto/evp/names.c 2009-09-30 13:25:58.000000000 +0200 |
| 1674 | @@ -66,6 +66,10 @@ int EVP_add_cipher(const EVP_CIPHER *c) |
| 1675 | { |
| 1676 | int r; |
| 1677 | |
| 1678 | +#ifdef OPENSSL_FIPS |
| 1679 | + OPENSSL_init_library(); |
| 1680 | +#endif |
| 1681 | + |
| 1682 | r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
| 1683 | if (r == 0) return(0); |
| 1684 | check_defer(c->nid); |
| 1685 | @@ -79,6 +83,10 @@ int EVP_add_digest(const EVP_MD *md) |
| 1686 | int r; |
| 1687 | const char *name; |
| 1688 | |
| 1689 | +#ifdef OPENSSL_FIPS |
| 1690 | + OPENSSL_init_library(); |
| 1691 | +#endif |
| 1692 | + |
| 1693 | name=OBJ_nid2sn(md->type); |
| 1694 | r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); |
| 1695 | if (r == 0) return(0); |
| 1696 | diff -up openssl-1.0.0-beta3/crypto/evp/p_sign.c.fips openssl-1.0.0-beta3/crypto/evp/p_sign.c |
| 1697 | --- openssl-1.0.0-beta3/crypto/evp/p_sign.c.fips 2006-05-24 15:29:30.000000000 +0200 |
| 1698 | +++ openssl-1.0.0-beta3/crypto/evp/p_sign.c 2009-09-30 15:07:14.000000000 +0200 |
| 1699 | @@ -61,6 +61,7 @@ |
| 1700 | #include <openssl/evp.h> |
| 1701 | #include <openssl/objects.h> |
| 1702 | #include <openssl/x509.h> |
| 1703 | +#include <openssl/rsa.h> |
| 1704 | |
| 1705 | #ifdef undef |
| 1706 | void EVP_SignInit(EVP_MD_CTX *ctx, EVP_MD *type) |
| 1707 | @@ -101,6 +102,22 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsig |
| 1708 | goto err; |
| 1709 | if (EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) <= 0) |
| 1710 | goto err; |
| 1711 | + if (ctx->flags & EVP_MD_CTX_FLAG_PAD_X931) |
| 1712 | + if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_X931_PADDING) <= 0) |
| 1713 | + goto err; |
| 1714 | + if (ctx->flags & EVP_MD_CTX_FLAG_PAD_PSS) |
| 1715 | + { |
| 1716 | + int saltlen; |
| 1717 | + if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0) |
| 1718 | + goto err; |
| 1719 | + saltlen = M_EVP_MD_CTX_FLAG_PSS_SALT(ctx); |
| 1720 | + if (saltlen == EVP_MD_CTX_FLAG_PSS_MDLEN) |
| 1721 | + saltlen = -1; |
| 1722 | + else if (saltlen == EVP_MD_CTX_FLAG_PSS_MREC) |
| 1723 | + saltlen = -2; |
| 1724 | + if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0) |
| 1725 | + goto err; |
| 1726 | + } |
| 1727 | if (EVP_PKEY_sign(pkctx, sigret, &sltmp, m, m_len) <= 0) |
| 1728 | goto err; |
| 1729 | *siglen = sltmp; |
| 1730 | diff -up openssl-1.0.0-beta3/crypto/evp/p_verify.c.fips openssl-1.0.0-beta3/crypto/evp/p_verify.c |
| 1731 | --- openssl-1.0.0-beta3/crypto/evp/p_verify.c.fips 2008-11-12 04:58:01.000000000 +0100 |
| 1732 | +++ openssl-1.0.0-beta3/crypto/evp/p_verify.c 2009-09-30 15:07:27.000000000 +0200 |
| 1733 | @@ -61,6 +61,7 @@ |
| 1734 | #include <openssl/evp.h> |
| 1735 | #include <openssl/objects.h> |
| 1736 | #include <openssl/x509.h> |
| 1737 | +#include <openssl/rsa.h> |
| 1738 | |
| 1739 | int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, |
| 1740 | unsigned int siglen, EVP_PKEY *pkey) |
| 1741 | @@ -86,6 +87,22 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, con |
| 1742 | goto err; |
| 1743 | if (EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) <= 0) |
| 1744 | goto err; |
| 1745 | + if (ctx->flags & EVP_MD_CTX_FLAG_PAD_X931) |
| 1746 | + if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_X931_PADDING) <= 0) |
| 1747 | + goto err; |
| 1748 | + if (ctx->flags & EVP_MD_CTX_FLAG_PAD_PSS) |
| 1749 | + { |
| 1750 | + int saltlen; |
| 1751 | + if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0) |
| 1752 | + goto err; |
| 1753 | + saltlen = M_EVP_MD_CTX_FLAG_PSS_SALT(ctx); |
| 1754 | + if (saltlen == EVP_MD_CTX_FLAG_PSS_MDLEN) |
| 1755 | + saltlen = -1; |
| 1756 | + else if (saltlen == EVP_MD_CTX_FLAG_PSS_MREC) |
| 1757 | + saltlen = -2; |
| 1758 | + if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0) |
| 1759 | + goto err; |
| 1760 | + } |
| 1761 | i = EVP_PKEY_verify(pkctx, sigbuf, siglen, m, m_len); |
| 1762 | err: |
| 1763 | EVP_PKEY_CTX_free(pkctx); |
| 1764 | diff -up /dev/null openssl-1.0.0-beta3/crypto/fips/cavs/fips_aesavs.c |
| 1765 | --- /dev/null 2009-09-23 10:56:02.148001752 +0200 |
| 1766 | +++ openssl-1.0.0-beta3/crypto/fips/cavs/fips_aesavs.c 2009-09-30 13:25:58.000000000 +0200 |
| 1767 | @@ -0,0 +1,939 @@ |
| 1768 | +/* ==================================================================== |
| 1769 | + * Copyright (c) 2004 The OpenSSL Project. All rights reserved. |
| 1770 | + * |
| 1771 | + * Redistribution and use in source and binary forms, with or without |
| 1772 | + * modification, are permitted provided that the following conditions |
| 1773 | + * are met: |
| 1774 | + * |
| 1775 | + * 1. Redistributions of source code must retain the above copyright |
| 1776 | + * notice, this list of conditions and the following disclaimer. |
| 1777 | + * |
| 1778 | + * 2. Redistributions in binary form must reproduce the above copyright |
| 1779 | + * notice, this list of conditions and the following disclaimer in |
| 1780 | + * the documentation and/or other materials provided with the |
| 1781 | + * distribution. |
| 1782 | + * |
| 1783 | + * 3. All advertising materials mentioning features or use of this |
| 1784 | + * software must display the following acknowledgment: |
| 1785 | + * "This product includes software developed by the OpenSSL Project |
| 1786 | + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
| 1787 | + * |
| 1788 | + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| 1789 | + * endorse or promote products derived from this software without |
| 1790 | + * prior written permission. For written permission, please contact |
| 1791 | + * openssl-core@openssl.org. |
| 1792 | + * |
| 1793 | + * 5. Products derived from this software may not be called "OpenSSL" |
| 1794 | + * nor may "OpenSSL" appear in their names without prior written |
| 1795 | + * permission of the OpenSSL Project. |
| 1796 | + * |
| 1797 | + * 6. Redistributions of any form whatsoever must retain the following |
| 1798 | + * acknowledgment: |
| 1799 | + * "This product includes software developed by the OpenSSL Project |
| 1800 | + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
| 1801 | + * |
| 1802 | + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| 1803 | + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 1804 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 1805 | + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| 1806 | + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 1807 | + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 1808 | + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 1809 | + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 1810 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| 1811 | + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 1812 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| 1813 | + * OF THE POSSIBILITY OF SUCH DAMAGE. |
| 1814 | + * |
| 1815 | + */ |
| 1816 | +/*--------------------------------------------- |
| 1817 | + NIST AES Algorithm Validation Suite |
| 1818 | + Test Program |
| 1819 | + |
| 1820 | + Donated to OpenSSL by: |
| 1821 | + V-ONE Corporation |
| 1822 | + 20250 Century Blvd, Suite 300 |
| 1823 | + Germantown, MD 20874 |
| 1824 | + U.S.A. |
| 1825 | + ----------------------------------------------*/ |
| 1826 | + |
| 1827 | +#include <stdio.h> |
| 1828 | +#include <stdlib.h> |
| 1829 | +#include <string.h> |
| 1830 | +#include <errno.h> |
| 1831 | +#include <assert.h> |
| 1832 | +#include <ctype.h> |
| 1833 | +#include <openssl/aes.h> |
| 1834 | +#include <openssl/evp.h> |
| 1835 | +#include <openssl/bn.h> |
| 1836 | + |
| 1837 | +#include <openssl/err.h> |
| 1838 | +#include "e_os.h" |
| 1839 | + |
| 1840 | +#ifndef OPENSSL_FIPS |
| 1841 | + |
| 1842 | +int main(int argc, char *argv[]) |
| 1843 | +{ |
| 1844 | + printf("No FIPS AES support\n"); |
| 1845 | + return(0); |
| 1846 | +} |
| 1847 | + |
| 1848 | +#else |
| 1849 | + |
| 1850 | +#include <openssl/fips.h> |
| 1851 | +#include "fips_utl.h" |
| 1852 | + |
| 1853 | +#define AES_BLOCK_SIZE 16 |
| 1854 | + |
| 1855 | +#define VERBOSE 0 |
| 1856 | + |
| 1857 | +/*-----------------------------------------------*/ |
| 1858 | + |
| 1859 | +int AESTest(EVP_CIPHER_CTX *ctx, |
| 1860 | + char *amode, int akeysz, unsigned char *aKey, |
| 1861 | + unsigned char *iVec, |
| 1862 | + int dir, /* 0 = decrypt, 1 = encrypt */ |
| 1863 | + unsigned char *plaintext, unsigned char *ciphertext, int len) |
| 1864 | + { |
| 1865 | + const EVP_CIPHER *cipher = NULL; |
| 1866 | + |
| 1867 | + if (strcasecmp(amode, "CBC") == 0) |
| 1868 | + { |
| 1869 | + switch (akeysz) |
| 1870 | + { |
| 1871 | + case 128: |
| 1872 | + cipher = EVP_aes_128_cbc(); |
| 1873 | + break; |
| 1874 | + |
| 1875 | + case 192: |
| 1876 | + cipher = EVP_aes_192_cbc(); |
| 1877 | + break; |
| 1878 | + |
| 1879 | + case 256: |
| 1880 | + cipher = EVP_aes_256_cbc(); |
| 1881 | + break; |
| 1882 | + } |
| 1883 | + |
| 1884 | + } |
| 1885 | + else if (strcasecmp(amode, "ECB") == 0) |
| 1886 | + { |
| 1887 | + switch (akeysz) |
| 1888 | + { |
| 1889 | + case 128: |
| 1890 | + cipher = EVP_aes_128_ecb(); |
| 1891 | + break; |
| 1892 | + |
| 1893 | + case 192: |
| 1894 | + cipher = EVP_aes_192_ecb(); |
| 1895 | + break; |
| 1896 | + |
| 1897 | + case 256: |
| 1898 | + cipher = EVP_aes_256_ecb(); |
| 1899 | + break; |
| 1900 | + } |
| 1901 | + } |
| 1902 | + else if (strcasecmp(amode, "CFB128") == 0) |
| 1903 | + { |
| 1904 | + switch (akeysz) |
| 1905 | + { |
| 1906 | + case 128: |
| 1907 | + cipher = EVP_aes_128_cfb128(); |
| 1908 | + break; |
| 1909 | + |
| 1910 | + case 192: |
| 1911 | + cipher = EVP_aes_192_cfb128(); |
| 1912 | + break; |
| 1913 | + |
| 1914 | + case 256: |
| 1915 | + cipher = EVP_aes_256_cfb128(); |
| 1916 | + break; |
| 1917 | + } |
| 1918 | + |
| 1919 | + } |
| 1920 | + else if (strncasecmp(amode, "OFB", 3) == 0) |
| 1921 | + { |
| 1922 | + switch (akeysz) |
| 1923 | + { |
| 1924 | + case 128: |
| 1925 | + cipher = EVP_aes_128_ofb(); |
| 1926 | + break; |
| 1927 | + |
| 1928 | + case 192: |
| 1929 | + cipher = EVP_aes_192_ofb(); |
| 1930 | + break; |
| 1931 | + |
| 1932 | + case 256: |
| 1933 | + cipher = EVP_aes_256_ofb(); |
| 1934 | + break; |
| 1935 | + } |
| 1936 | + } |
| 1937 | + else if(!strcasecmp(amode,"CFB1")) |
| 1938 | + { |
| 1939 | + switch (akeysz) |
| 1940 | + { |
| 1941 | + case 128: |
| 1942 | + cipher = EVP_aes_128_cfb1(); |
| 1943 | + break; |
| 1944 | + |
| 1945 | + case 192: |
| 1946 | + cipher = EVP_aes_192_cfb1(); |
| 1947 | + break; |
| 1948 | + |
| 1949 | + case 256: |
| 1950 | + cipher = EVP_aes_256_cfb1(); |
| 1951 | + break; |
| 1952 | + } |
| 1953 | + } |
| 1954 | + else if(!strcasecmp(amode,"CFB8")) |
| 1955 | + { |
| 1956 | + switch (akeysz) |
| 1957 | + { |
| 1958 | + case 128: |
| 1959 | + cipher = EVP_aes_128_cfb8(); |
| 1960 | + break; |
| 1961 | + |
| 1962 | + case 192: |
| 1963 | + cipher = EVP_aes_192_cfb8(); |
| 1964 | + break; |
| 1965 | + |
| 1966 | + case 256: |
| 1967 | + cipher = EVP_aes_256_cfb8(); |
| 1968 | + break; |
| 1969 | + } |
| 1970 | + } |
| 1971 | + else |
| 1972 | + { |
| 1973 | + printf("Unknown mode: %s\n", amode); |
| 1974 | + return 0; |
| 1975 | + } |
| 1976 | + if (!cipher) |
| 1977 | + { |
| 1978 | + printf("Invalid key size: %d\n", akeysz); |
| 1979 | + return 0; |
| 1980 | + } |
| 1981 | + if (EVP_CipherInit_ex(ctx, cipher, NULL, aKey, iVec, dir) <= 0) |
| 1982 | + return 0; |
| 1983 | + if(!strcasecmp(amode,"CFB1")) |
| 1984 | + M_EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS); |
| 1985 | + if (dir) |
| 1986 | + EVP_Cipher(ctx, ciphertext, plaintext, len); |
| 1987 | + else |
| 1988 | + EVP_Cipher(ctx, plaintext, ciphertext, len); |
| 1989 | + return 1; |
| 1990 | + } |
| 1991 | + |
| 1992 | +/*-----------------------------------------------*/ |
| 1993 | +char *t_tag[2] = {"PLAINTEXT", "CIPHERTEXT"}; |
| 1994 | +char *t_mode[6] = {"CBC","ECB","OFB","CFB1","CFB8","CFB128"}; |
| 1995 | +enum Mode {CBC, ECB, OFB, CFB1, CFB8, CFB128}; |
| 1996 | +enum XCrypt {XDECRYPT, XENCRYPT}; |
| 1997 | + |
| 1998 | +/*=============================*/ |
| 1999 | +/* Monte Carlo Tests */ |
| 2000 | +/*-----------------------------*/ |
| 2001 | + |
| 2002 | +/*#define gb(a,b) (((a)[(b)/8] >> ((b)%8))&1)*/ |
| 2003 | +/*#define sb(a,b,v) ((a)[(b)/8]=((a)[(b)/8]&~(1 << ((b)%8)))|(!!(v) << ((b)%8)))*/ |
| 2004 | + |
| 2005 | +#define gb(a,b) (((a)[(b)/8] >> (7-(b)%8))&1) |
| 2006 | +#define sb(a,b,v) ((a)[(b)/8]=((a)[(b)/8]&~(1 << (7-(b)%8)))|(!!(v) << (7-(b)%8))) |
| 2007 | + |
| 2008 | +int do_mct(char *amode, |
| 2009 | + int akeysz, unsigned char *aKey,unsigned char *iVec, |
| 2010 | + int dir, unsigned char *text, int len, |
| 2011 | + FILE *rfp) |
| 2012 | + { |
| 2013 | + int ret = 0; |
| 2014 | + unsigned char key[101][32]; |
| 2015 | + unsigned char iv[101][AES_BLOCK_SIZE]; |
| 2016 | + unsigned char ptext[1001][32]; |
| 2017 | + unsigned char ctext[1001][32]; |
| 2018 | + unsigned char ciphertext[64+4]; |
| 2019 | + int i, j, n, n1, n2; |
| 2020 | + int imode = 0, nkeysz = akeysz/8; |
| 2021 | + EVP_CIPHER_CTX ctx; |
| 2022 | + EVP_CIPHER_CTX_init(&ctx); |
| 2023 | + |
| 2024 | + if (len > 32) |
| 2025 | + { |
| 2026 | + printf("\n>>>> Length exceeds 32 for %s %d <<<<\n\n", |
| 2027 | + amode, akeysz); |