bigtocan.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/* 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 "port_before.h"
#include "global.h"
#include "algae.h"
#include "bigmath.h"
#include "port_after.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);
}