Print this page
6799218 RSA using Solaris Kernel Crypto framework lagging behind OpenSSL
5016936 bignumimpl:big_mul: potential memory leak
6810280 panic from bignum module: vmem_xalloc(): size == 0

*** 1,12 **** /* * CDDL HEADER START * * The contents of this file are subject to the terms of the ! * Common Development and Distribution License, Version 1.0 only ! * (the "License"). You may not use this file except in compliance ! * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. --- 1,11 ---- /* * CDDL HEADER START * * The contents of this file are subject to the terms of the ! * Common Development and Distribution License (the "License"). ! * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License.
*** 18,33 **** * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* ! * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - #pragma ident "%Z%%M% %I% %E% SMI" - /* * This file contains bignum implementation code that * is specific to AMD64, but which is still more appropriate * to write in C, rather than assembly language. * bignum_amd64_asm.s does all the assembly language code --- 17,30 ---- * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* ! * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * This file contains bignum implementation code that * is specific to AMD64, but which is still more appropriate * to write in C, rather than assembly language. * bignum_amd64_asm.s does all the assembly language code
*** 39,186 **** */ #include "bignum.h" /* ! * The bignum interface deals only with arrays of 32-bit "digits". ! * The 64-bit bignum functions are internal implementation details. ! * If a bignum happens to be aligned on a 64-bit boundary ! * and its length is even, then the pure 64-bit implementation ! * can be used. */ - #define ISALIGNED64(p) (((uintptr_t)(p) & 7) == 0) - #define ISBIGNUM64(p, len) (ISALIGNED64(p) && (((len) & 1) == 0)) - #if defined(__lint) - - extern uint64_t *P64(uint32_t *addr); - - #else /* lint */ - - #define P64(addr) ((uint64_t *)addr) - - #endif /* lint */ - - extern uint64_t big_mul_set_vec64(uint64_t *, uint64_t *, int, uint64_t); - extern uint64_t big_mul_add_vec64(uint64_t *, uint64_t *, int, uint64_t); - extern void big_mul_vec64(uint64_t *, uint64_t *, int, uint64_t *, int); - extern void big_sqr_vec64(uint64_t *, uint64_t *, int); - - extern uint32_t big_mul_set_vec32(uint32_t *, uint32_t *, int, uint32_t); - extern uint32_t big_mul_add_vec32(uint32_t *, uint32_t *, int, uint32_t); - extern void big_mul_vec32(uint32_t *, uint32_t *, int, uint32_t *, int); - extern void big_sqr_vec32(uint32_t *, uint32_t *, int); - - uint32_t big_mul_set_vec(uint32_t *, uint32_t *, int, uint32_t); - uint32_t big_mul_add_vec(uint32_t *, uint32_t *, int, uint32_t); - void big_mul_vec(uint32_t *, uint32_t *, int, uint32_t *, int); - void big_sqr_vec(uint32_t *, uint32_t *, int); - - void ! big_mul_vec(uint32_t *r, uint32_t *a, int alen, uint32_t *b, int blen) { - if (!ISALIGNED64(r) || !ISBIGNUM64(a, alen) || !ISBIGNUM64(b, blen)) { - big_mul_vec32(r, a, alen, b, blen); - return; - } - - big_mul_vec64(P64(r), P64(a), alen / 2, P64(b), blen / 2); - } - - void - big_sqr_vec(uint32_t *r, uint32_t *a, int alen) - { - if (!ISALIGNED64(r) || !ISBIGNUM64(a, alen)) { - big_mul_vec32(r, a, alen, a, alen); - return; - } - big_sqr_vec64(P64(r), P64(a), alen / 2); - } - - /* - * It is OK to cast the 64-bit carry to 32 bit. - * There will be no loss, because although we are multiplying the vector, a, - * by a uint64_t, its value cannot exceedthat of a uint32_t. - */ - - uint32_t - big_mul_set_vec(uint32_t *r, uint32_t *a, int alen, uint32_t digit) - { - if (!ISALIGNED64(r) || !ISBIGNUM64(a, alen)) - return (big_mul_set_vec32(r, a, alen, digit)); - - return (big_mul_set_vec64(P64(r), P64(a), alen / 2, digit)); - } - uint32_t - big_mul_add_vec(uint32_t *r, uint32_t *a, int alen, uint32_t digit) - { - if (!ISALIGNED64(r) || !ISBIGNUM64(a, alen)) - return (big_mul_add_vec32(r, a, alen, digit)); - - return (big_mul_add_vec64(P64(r), P64(a), alen / 2, digit)); - } - - - void - big_mul_vec64(uint64_t *r, uint64_t *a, int alen, uint64_t *b, int blen) - { int i; ! r[alen] = big_mul_set_vec64(r, a, alen, b[0]); for (i = 1; i < blen; ++i) ! r[alen + i] = big_mul_add_vec64(r+i, a, alen, b[i]); ! } ! ! void ! big_mul_vec32(uint32_t *r, uint32_t *a, int alen, uint32_t *b, int blen) ! { ! int i; ! ! r[alen] = big_mul_set_vec32(r, a, alen, b[0]); ! for (i = 1; i < blen; ++i) ! r[alen + i] = big_mul_add_vec32(r+i, a, alen, b[i]); ! } ! ! void ! big_sqr_vec32(uint32_t *r, uint32_t *a, int alen) ! { ! big_mul_vec32(r, a, alen, a, alen); ! } ! ! ! uint32_t ! big_mul_set_vec32(uint32_t *r, uint32_t *a, int alen, uint32_t digit) ! { ! uint64_t p, d, cy; ! ! d = (uint64_t)digit; ! cy = 0; ! while (alen != 0) { ! p = (uint64_t)a[0] * d + cy; ! r[0] = (uint32_t)p; ! cy = p >> 32; ! ++r; ! ++a; ! --alen; ! } ! return ((uint32_t)cy); ! } ! ! uint32_t ! big_mul_add_vec32(uint32_t *r, uint32_t *a, int alen, uint32_t digit) ! { ! uint64_t p, d, cy; ! ! d = (uint64_t)digit; ! cy = 0; ! while (alen != 0) { ! p = r[0] + (uint64_t)a[0] * d + cy; ! r[0] = (uint32_t)p; ! cy = p >> 32; ! ++r; ! ++a; ! --alen; ! } ! return ((uint32_t)cy); } --- 36,55 ---- */ #include "bignum.h" /* ! * The bignum interface deals with arrays of 64-bit "chunks" or "digits". ! * Data should be aligned on 8-byte address boundaries for best performance. */ void ! big_mul_vec(BIG_CHUNK_TYPE *r, BIG_CHUNK_TYPE *a, int alen, ! BIG_CHUNK_TYPE *b, int blen) { int i; ! r[alen] = big_mul_set_vec(r, a, alen, b[0]); for (i = 1; i < blen; ++i) ! r[alen + i] = big_mul_add_vec(r + i, a, alen, b[i]); }