summaryrefslogtreecommitdiff
path: root/lib/dns/sec/dnssafe/seccbce.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dns/sec/dnssafe/seccbce.c')
-rw-r--r--lib/dns/sec/dnssafe/seccbce.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/lib/dns/sec/dnssafe/seccbce.c b/lib/dns/sec/dnssafe/seccbce.c
new file mode 100644
index 00000000..6fe5c863
--- /dev/null
+++ b/lib/dns/sec/dnssafe/seccbce.c
@@ -0,0 +1,97 @@
+/* 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 "secrcbc.h"
+
+/* On first call, it is assumed that *remainderLen is zero.
+ Returns AE_OUTPUT_LEN, 0.
+ */
+int SecretCBCEncryptUpdate
+ (context, xorBlock, remainder, remainderLen, SecretEncrypt, output,
+ outputLen, maxOutputLen, input, inputLen)
+POINTER context;
+unsigned char *xorBlock;
+unsigned char *remainder;
+unsigned int *remainderLen;
+SECRET_CRYPT SecretEncrypt;
+unsigned char *output;
+unsigned int *outputLen;
+unsigned int maxOutputLen;
+unsigned char *input;
+unsigned int inputLen;
+{
+ unsigned int partialLen, totalLen, i;
+
+ totalLen = *remainderLen + inputLen;
+
+ /* Output length will be all available 8-byte blocks.
+ */
+ if ((*outputLen = 8 * (totalLen / 8)) > maxOutputLen)
+ return (AE_OUTPUT_LEN);
+
+ if (totalLen < 8) {
+ /* Not enough to encrypt, just accumulate into remainder.
+ */
+ T_memcpy
+ ((POINTER)remainder + *remainderLen, (POINTER)input, inputLen);
+ *remainderLen = totalLen;
+
+ return (0);
+ }
+
+ /* Accumulate enough bytes from input into remainder to encrypt the
+ remainder.
+ */
+ T_memcpy
+ ((POINTER)remainder + *remainderLen, (POINTER)input,
+ partialLen = 8 - *remainderLen);
+
+ for (i = 0; i < 8; i++)
+ output[i] = remainder[i] ^ xorBlock[i];
+ /* Encrypt in place */
+ (*SecretEncrypt) (context, output, output);
+
+ T_memcpy ((POINTER)xorBlock, (POINTER)output, 8);
+ input += partialLen;
+ inputLen -= partialLen;
+ output += 8;
+
+ /* Now encrypt the bulk of the input.
+ */
+ while (inputLen >= 8) {
+ for (i = 0; i < 8; i++)
+ output[i] = *(input++) ^ xorBlock[i];
+ /* Encrypt in place */
+ (*SecretEncrypt) (context, output, output);
+ T_memcpy ((POINTER)xorBlock, (POINTER)output, 8);
+ output += 8;
+ inputLen -= 8;
+ }
+
+ /* inputLen is now < 8, so copy input to remainder.
+ */
+ T_memcpy ((POINTER)remainder, (POINTER)input, inputLen);
+ *remainderLen = inputLen;
+
+ return (0);
+}
+
+/* This just ensures that *remainderLen is zero.
+ The caller must restart the context (setting remainderLen to zero).
+ Returns AE_INPUT_LEN, 0.
+ */
+int SecretCBCEncryptFinal (remainderLen)
+unsigned int remainderLen;
+{
+ if (remainderLen != 0)
+ return (AE_INPUT_LEN);
+
+ return (0);
+}