summaryrefslogtreecommitdiff
path: root/lib/dns/sec/dnssafe/cantobig.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dns/sec/dnssafe/cantobig.c')
-rw-r--r--lib/dns/sec/dnssafe/cantobig.c57
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);
+}
+
+