summaryrefslogtreecommitdiff
path: root/lib/dns/sec/dnssafe/bigtocan.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dns/sec/dnssafe/bigtocan.c')
-rw-r--r--lib/dns/sec/dnssafe/bigtocan.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/dns/sec/dnssafe/bigtocan.c b/lib/dns/sec/dnssafe/bigtocan.c
new file mode 100644
index 00000000..13e8315d
--- /dev/null
+++ b/lib/dns/sec/dnssafe/bigtocan.c
@@ -0,0 +1,60 @@
+/* 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"
+
+
+/* BigToCanonical () copies a word vector to a byte vector while REVERSING the
+ order of significance. The word vector is input LSWord first and the
+ byte vector is written out MSByte first. It also removes a leading zero
+ sign bit. (The byte vector must represent a nonnegative number.)
+ Returns 0, AE_DATA.
+ */
+int BigToCanonical (bytePointer, numBytes, wordPointer, wordCount)
+unsigned char *bytePointer;
+unsigned int numBytes;
+UINT2 *wordPointer;
+unsigned int wordCount;
+{
+ unsigned int copyCount;
+
+ if (BigSign (wordPointer, wordCount) < 0 ||
+ (BigLen (wordPointer, wordCount) + 7) / 8 > numBytes)
+ 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.*/
+ *bytePointer-- = (unsigned char)*wordPointer;
+ *bytePointer-- = (unsigned char)(*wordPointer >> 8);
+ wordPointer++;
+ }
+
+ if (wordCount && numBytes & 1) {
+ /* The number of output bytes was odd. Copy one last byte */
+ *bytePointer-- = (unsigned char)*wordPointer++;
+ wordCount--;
+ numBytes--;
+ }
+
+ /* zero fill remainder of byte vector */
+ while (numBytes--)
+ *bytePointer-- = 0;
+
+ return (0);
+}
+
+