summaryrefslogtreecommitdiff
path: root/imap/src/c-client/usha.c
diff options
context:
space:
mode:
authorEduardo Chappa <chappa@washington.edu>2021-11-20 12:54:47 -0700
committerEduardo Chappa <chappa@washington.edu>2021-11-20 12:54:47 -0700
commit626eccdd8d0a325842d736596348e9d1d81ca105 (patch)
tree2eb4695b74cf88e15b030e30a751ada1017a0528 /imap/src/c-client/usha.c
parenta9e8d3c24b2bb6d30649d4d3c66f554ae38024bb (diff)
downloadalpine-626eccdd8d0a325842d736596348e9d1d81ca105.tar.xz
* Addition of support for SHA1 to SHA512 needed for future additions to
Alpine. The code is taken and adapted from code in RFC 4634.
Diffstat (limited to 'imap/src/c-client/usha.c')
-rw-r--r--imap/src/c-client/usha.c255
1 files changed, 255 insertions, 0 deletions
diff --git a/imap/src/c-client/usha.c b/imap/src/c-client/usha.c
new file mode 100644
index 00000000..3f49f45e
--- /dev/null
+++ b/imap/src/c-client/usha.c
@@ -0,0 +1,255 @@
+/**************************** usha.c ****************************/
+/******************** See RFC 4634 for details ******************/
+/*
+ * Description:
+ * This file implements a unified interface to the SHA algorithms.
+ */
+
+#include "sha.h"
+
+/*
+ * USHAReset
+ *
+ * Description:
+ * This function will initialize the SHA Context in preparation
+ * for computing a new SHA message digest.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to reset.
+ * whichSha: [in]
+ * Selects which SHA reset to call
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int USHAReset(USHAContext *ctx, enum SHAversion whichSha)
+{
+ if (ctx) {
+ ctx->whichSha = whichSha;
+ switch (whichSha) {
+ case CCSHA1: return SHA1Reset((SHA1Context*)&ctx->ctx);
+ case CCSHA224: return SHA224Reset((SHA224Context*)&ctx->ctx);
+ case CCSHA256: return SHA256Reset((SHA256Context*)&ctx->ctx);
+ case CCSHA384: return SHA384Reset((SHA384Context*)&ctx->ctx);
+ case CCSHA512: return SHA512Reset((SHA512Context*)&ctx->ctx);
+ default: return shaBadParam;
+ }
+ } else {
+ return shaNull;
+ }
+}
+
+/*
+ * USHAInput
+ *
+ * Description:
+ * This function accepts an array of octets as the next portion
+ * of the message.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The SHA context to update
+ * message_array: [in]
+ * An array of characters representing the next portion of
+ * the message.
+ * length: [in]
+ * The length of the message in message_array
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int USHAInput(USHAContext *ctx,
+ const uint8_t *bytes, unsigned int bytecount)
+{
+ if (ctx) {
+ switch (ctx->whichSha) {
+ case CCSHA1:
+ return SHA1Input((SHA1Context*)&ctx->ctx, bytes, bytecount);
+ case CCSHA224:
+ return SHA224Input((SHA224Context*)&ctx->ctx, bytes,
+ bytecount);
+ case CCSHA256:
+ return SHA256Input((SHA256Context*)&ctx->ctx, bytes,
+ bytecount);
+ case CCSHA384:
+ return SHA384Input((SHA384Context*)&ctx->ctx, bytes,
+ bytecount);
+ case CCSHA512:
+ return SHA512Input((SHA512Context*)&ctx->ctx, bytes,
+ bytecount);
+ default: return shaBadParam;
+ }
+ } else {
+ return shaNull;
+ }
+}
+
+/*
+ * USHAFinalBits
+ *
+ * Description:
+ * This function will add in any final bits of the message.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The SHA context to update
+ * message_bits: [in]
+ * The final bits of the message, in the upper portion of the
+ * byte. (Use 0b###00000 instead of 0b00000### to input the
+ * three bits ###.)
+ * length: [in]
+ * The number of bits in message_bits, between 1 and 7.
+ *
+ * Returns:
+ * sha Error Code.
+ */
+int USHAFinalBits(USHAContext *ctx,
+ const uint8_t bits, unsigned int bitcount)
+{
+ if (ctx) {
+ switch (ctx->whichSha) {
+ case CCSHA1:
+ return SHA1FinalBits((SHA1Context*)&ctx->ctx, bits, bitcount);
+ case CCSHA224:
+ return SHA224FinalBits((SHA224Context*)&ctx->ctx, bits,
+ bitcount);
+ case CCSHA256:
+ return SHA256FinalBits((SHA256Context*)&ctx->ctx, bits,
+ bitcount);
+ case CCSHA384:
+ return SHA384FinalBits((SHA384Context*)&ctx->ctx, bits,
+ bitcount);
+ case CCSHA512:
+ return SHA512FinalBits((SHA512Context*)&ctx->ctx, bits,
+ bitcount);
+ default: return shaBadParam;
+ }
+ } else {
+ return shaNull;
+ }
+}
+
+/*
+ * USHAResult
+ *
+ * Description:
+ * This function will return the 160-bit message digest into the
+ * Message_Digest array provided by the caller.
+ * NOTE: The first octet of hash is stored in the 0th element,
+ * the last octet of hash in the 19th element.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to use to calculate the SHA-1 hash.
+ * Message_Digest: [out]
+ * Where the digest is returned.
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int USHAResult(USHAContext *ctx,
+ uint8_t Message_Digest[USHAMaxHashSize])
+{
+ if (ctx) {
+ switch (ctx->whichSha) {
+ case CCSHA1:
+ return SHA1Result((SHA1Context*)&ctx->ctx, Message_Digest);
+ case CCSHA224:
+ return SHA224Result((SHA224Context*)&ctx->ctx, Message_Digest);
+ case CCSHA256:
+ return SHA256Result((SHA256Context*)&ctx->ctx, Message_Digest);
+ case CCSHA384:
+ return SHA384Result((SHA384Context*)&ctx->ctx, Message_Digest);
+ case CCSHA512:
+ return SHA512Result((SHA512Context*)&ctx->ctx, Message_Digest);
+ default: return shaBadParam;
+ }
+ } else {
+ return shaNull;
+ }
+}
+
+/*
+ * USHABlockSize
+ *
+ * Description:
+ * This function will return the blocksize for the given SHA
+ * algorithm.
+ *
+ * Parameters:
+ * whichSha:
+ * which SHA algorithm to query
+ *
+ * Returns:
+ * block size
+ *
+ */
+int USHABlockSize(enum SHAversion whichSha)
+{
+ switch (whichSha) {
+ case CCSHA1: return SHA1_Message_Block_Size;
+ case CCSHA224: return SHA224_Message_Block_Size;
+ case CCSHA256: return SHA256_Message_Block_Size;
+ case CCSHA384: return SHA384_Message_Block_Size;
+ default:
+ case CCSHA512: return SHA512_Message_Block_Size;
+ }
+}
+
+/*
+ * USHAHashSize
+ *
+ * Description:
+ * This function will return the hashsize for the given SHA
+ * algorithm.
+ *
+ * Parameters:
+ * whichSha:
+ * which SHA algorithm to query
+ *
+ * Returns:
+ * hash size
+ *
+ */
+int USHAHashSize(enum SHAversion whichSha)
+{
+ switch (whichSha) {
+ case CCSHA1: return SHA1HashSize;
+ case CCSHA224: return SHA224HashSize;
+ case CCSHA256: return SHA256HashSize;
+ case CCSHA384: return SHA384HashSize;
+ default:
+ case CCSHA512: return SHA512HashSize;
+ }
+}
+
+/*
+ * USHAHashSizeBits
+ *
+ * Description:
+ * This function will return the hashsize for the given SHA
+ * algorithm, expressed in bits.
+ *
+ * Parameters:
+ * whichSha:
+ * which SHA algorithm to query
+ *
+ * Returns:
+ * hash size in bits
+ *
+ */
+int USHAHashSizeBits(enum SHAversion whichSha)
+{
+ switch (whichSha) {
+ case CCSHA1: return SHA1HashSizeBits;
+ case CCSHA224: return SHA224HashSizeBits;
+ case CCSHA256: return SHA256HashSizeBits;
+ case CCSHA384: return SHA384HashSizeBits;
+ default:
+ case CCSHA512: return SHA512HashSizeBits;
+ }
+}