diff options
Diffstat (limited to 'beecrypt/mpnumber.c')
-rw-r--r-- | beecrypt/mpnumber.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/beecrypt/mpnumber.c b/beecrypt/mpnumber.c new file mode 100644 index 000000000..090487eda --- /dev/null +++ b/beecrypt/mpnumber.c @@ -0,0 +1,225 @@ +/*@-sizeoftype@*/ +/** \ingroup MP_m + * \file mpnumber.c + * + * Multiple precision numbers, code. + */ + +/* + * + * Copyright (c) 1997, 1998, 1999, 2000, 2001 Virtual Unlimited B.V. + * + * Author: Bob Deblier <bob@virtualunlimited.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "system.h" +#include "mpnumber.h" +#include "mp.h" +#include "debug.h" + +void mp32nzero(mp32number* n) +{ + n->size = 0; + n->data = (uint32*) 0; +} + +/*@-compdef @*/ /* n->data not initialized */ +void mp32nsize(mp32number* n, uint32 size) +{ + if (size) + { + if (n->data) + { + if (n->size != size) + n->data = (uint32*) realloc(n->data, size * sizeof(uint32)); + } + else + n->data = (uint32*) malloc(size * sizeof(uint32)); + + if (n->data) + n->size = size; + else + { + n->size = 0; + n->data = (uint32*) 0; + } + + } + else if (n->data) + { + free(n->data); + n->size = 0; + n->data = (uint32*) 0; + } + else + {}; +} +/*@=compdef @*/ + +/*@-boundswrite@*/ +void mp32ninit(mp32number* n, uint32 size, const uint32* data) +{ + n->size = size; + if (n->data) + { + free(n->data); + n->data = (uint32*) 0; + } + n->data = (uint32*) malloc(size * sizeof(uint32)); + + if (n->data && data) + mp32copy(size, n->data, data); +} +/*@=boundswrite@*/ + +void mp32nfree(mp32number* n) +{ + if (n->data) + { + free(n->data); + n->data = (uint32*) 0; + } + n->size = 0; +} + +void mp32ncopy(mp32number* n, const mp32number* copy) +{ + mp32nset(n, copy->size, copy->data); +} + +void mp32nwipe(mp32number* n) +{ + if (n->data) + mp32zero(n->size, n->data); +} + +/*@-boundswrite@*/ +void mp32nset(mp32number* n, uint32 size, const uint32* data) +{ + if (size) + { + if (n->data) + { + if (n->size != size) + n->data = (uint32*) realloc(n->data, size * sizeof(uint32)); + } + else + n->data = (uint32*) malloc(size * sizeof(uint32)); + + if (n->data && data) + /*@-nullpass@*/ /* data is notnull */ + mp32copy(n->size = size, n->data, data); + /*@=nullpass@*/ + else + { + n->size = 0; + n->data = (uint32*) 0; + } + } + else if (n->data) + { + free(n->data); + n->data = (uint32*) 0; + n->size = 0; + } + else + {}; +} +/*@=boundswrite@*/ + +/*@-boundswrite@*/ +void mp32nsetw(mp32number* n, uint32 val) +{ + if (n->data) + { + if (n->size != 1) + n->data = (uint32*) realloc(n->data, sizeof(uint32)); + } + else + n->data = (uint32*) malloc(sizeof(uint32)); + + if (n->data) + { + n->size = 1; + n->data[0] = val; + } + else + { + n->size = 0; + n->data = (uint32*) 0; + } +} +/*@=boundswrite@*/ + +/*@-boundswrite@*/ +/*@-usedef @*/ /* n->data may be NULL */ +void mp32nsethex(mp32number* n, const char* hex) +{ + uint32 length = strlen(hex); + uint32 size = (length+7) >> 3; + uint8 rem = (uint8)(length & 0x7); + + if (n->data) + { + if (n->size != size) + n->data = (uint32*) realloc(n->data, size * sizeof(uint32)); + } + else + n->data = (uint32*) malloc(size * sizeof(uint32)); + + if (n->data) + { + register uint32 val = 0; + register uint32* dst = n->data; + register char ch; + + n->size = size; + + while (length-- > 0) + { + ch = *(hex++); + val <<= 4; + if (ch >= '0' && ch <= '9') + val += (ch - '0'); + else if (ch >= 'A' && ch <= 'F') + val += (ch - 'A') + 10; + else if (ch >= 'a' && ch <= 'f') + val += (ch - 'a') + 10; + else + {}; + + if ((length & 0x7) == 0) + { + *(dst++) = val; + val = 0; + rem = 0; + } else + rem = 1; + } + if (rem != 0) { + *dst = val; + } + } + else { + n->size = 0; + n->data = (uint32*)0; + } +} +/*@=usedef @*/ +/*@=sizeoftype@*/ +/*@=boundswrite@*/ |