diff options
Diffstat (limited to 'lib/dns/sec/dnssafe/cantobig.c')
-rw-r--r-- | lib/dns/sec/dnssafe/cantobig.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/dns/sec/dnssafe/cantobig.c b/lib/dns/sec/dnssafe/cantobig.c new file mode 100644 index 00000000..79b760f7 --- /dev/null +++ b/lib/dns/sec/dnssafe/cantobig.c @@ -0,0 +1,57 @@ +/* Copyright (C) RSA Data Security, Inc. created 1990, 1996. This is an + unpublished work protected as such under copyright law. This work + contains proprietary, confidential, and trade secret information of + RSA Data Security, Inc. Use, disclosure or reproduction without the + express written authorization of RSA Data Security, Inc. is + prohibited. + */ + +#include "global.h" +#include "algae.h" +#include "bigmath.h" + +/* CanonicalToBig () copies a byte vector into a word vector while REVERSING + the order of significance. The byte vector is input MSByte first while + the word vector is written out LSWord first. It also adds a leading zero + sign bit if necessary. + Returns 0, AE_DATA. + */ +int CanonicalToBig (wordPointer, wordCount, bytePointer, numBytes) +UINT2 *wordPointer; +unsigned int wordCount; +unsigned char *bytePointer; +unsigned int numBytes; +{ + unsigned int copyCount; + + if (A_IntegerBits (bytePointer, numBytes) / 16 + 1 > wordCount) + return (AE_DATA); + + /* start at end of byte vector */ + bytePointer += numBytes-1; + + /* copy as much as possible */ + copyCount = (wordCount < numBytes / 2) ? wordCount : numBytes / 2; + wordCount -= copyCount; + numBytes -= 2 * copyCount; + while (copyCount--) { + /* Copy two bytes.*/ + *wordPointer++ = (UINT2)*bytePointer + (*(bytePointer - 1) << 8); + bytePointer -= 2; + } + + if (wordCount && numBytes & 1) { + /* If the number of input bytes was odd. Copy one last byte.*/ + *wordPointer++ = (UINT2)*bytePointer--; + wordCount--; + numBytes--; + } + + /* zero fill remainder of word vector */ + while (wordCount--) + *wordPointer++ = 0; + + return (0); +} + + |