summaryrefslogtreecommitdiff
path: root/usr/src/lib/libresolv2/common/dnssafe/algchoic.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libresolv2/common/dnssafe/algchoic.c')
-rw-r--r--usr/src/lib/libresolv2/common/dnssafe/algchoic.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/usr/src/lib/libresolv2/common/dnssafe/algchoic.c b/usr/src/lib/libresolv2/common/dnssafe/algchoic.c
new file mode 100644
index 0000000000..b444c41be6
--- /dev/null
+++ b/usr/src/lib/libresolv2/common/dnssafe/algchoic.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 1999 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/* Copyright (C) RSA Data Security, Inc. created 1993, 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 "bsafe2.h"
+#include "algae.h"
+#include "balgmeth.h"
+#include "bkey.h"
+#include "algchoic.h"
+#include "port_after.h"
+
+/* In C++:
+ResizeContext::ResizeContext ()
+{
+ T_memset ((POINTER)&z, 0, sizeof (z));
+}
+ */
+void ResizeContextConstructor (resizeContext)
+ResizeContext *resizeContext;
+{
+ T_memset ((POINTER)&resizeContext->z, 0, sizeof (resizeContext->z));
+}
+
+/* In C++:
+ResizeContext::~ResizeContext ()
+{
+ T_memset (z.context, 0, z.contextSize);
+ T_free (z.context);
+}
+ */
+void ResizeContextDestructor (resizeContext)
+ResizeContext *resizeContext;
+{
+ T_memset (resizeContext->z.context, 0, resizeContext->z.contextSize);
+ T_free (resizeContext->z.context);
+}
+
+/* If the resizeContext's context is already the requested size, do nothing.
+ Otherwise, this memsets the existing context to zero, then allocates
+ the context as a buffer of the requested size.
+ If the allocate fails, the context size is set to
+ zero so that later calls will not zeroize non-existing buffers.
+ */
+int ResizeContextMakeNewContext (resizeContext, contextSize)
+ResizeContext *resizeContext;
+unsigned int contextSize;
+{
+ if (resizeContext->z.contextSize == contextSize)
+ return (0);
+
+ /* Take care of zeroizing the previous context.
+ */
+ T_memset (resizeContext->z.context, 0, resizeContext->z.contextSize);
+
+ if ((resizeContext->z.context = T_realloc
+ (resizeContext->z.context, contextSize)) == NULL_PTR) {
+ resizeContext->z.contextSize = 0;
+ return (BE_ALLOC);
+ }
+
+ resizeContext->z.contextSize = contextSize;
+ return (0);
+}
+
+int AlgaChoiceChoose (algaChoice, encryptFlag, key, chooser, surrenderContext)
+AlgaChoice *algaChoice;
+int encryptFlag;
+B_Key *key;
+B_ALGORITHM_CHOOSER chooser;
+A_SURRENDER_CTX *surrenderContext;
+{
+ POINTER keyInfo;
+ int status, overallStatus;
+
+ /* Each alga init callback returns BE_NOT_SUPPORTED if the Query fails.
+ Each also may return a more specific error like BE_MODULUS_LEN if the
+ method is not supported, so return the more specific error if possible.
+ */
+ overallStatus = BE_METHOD_NOT_IN_CHOOSER;
+
+ for (; *chooser != (B_ALGORITHM_METHOD *)NULL_PTR; chooser++) {
+ if ((*chooser)->algorithmInfoType != algaChoice->_algorithmInfoType ||
+ (*chooser)->encryptFlag != encryptFlag)
+ /* Wrong type of algorithm, or the encryptFlag is wrong */
+ continue;
+
+ if ((*chooser)->keyInfoType != (struct B_KeyInfoType *)NULL_PTR) {
+ if ((status = B_KeyGetInfo
+ (key, &keyInfo, (*chooser)->keyInfoType)) != 0) {
+ if (IS_FATAL_BSAFE_ERROR (status))
+ return (status);
+
+ /* Update the overall status with this more specific error. */
+ overallStatus = status;
+ continue;
+ }
+ }
+ else
+ keyInfo = NULL_PTR;
+
+ if ((status = (*algaChoice->_InitAlga)
+ (algaChoice, keyInfo, *chooser, surrenderContext)) != 0) {
+ if (IS_FATAL_BSAFE_ERROR (status))
+ return (status);
+
+ /* Update the overall status with this more specific error. */
+ overallStatus = status;
+ continue;
+ }
+
+ /* Succeeded */
+ algaChoice->_alga = (*chooser)->alga;
+ return (0);
+ }
+
+ return (overallStatus);
+}
+
+/* Convert the ALGAE error to a BSAFE2 error.
+ This does not check for zero since BSAFE should not bother to call
+ this function if there is no error.
+ */
+int ConvertAlgaeError (type)
+int type;
+{
+ switch (type) {
+ case AE_CANCEL:
+ return (BE_CANCEL);
+ case AE_DATA:
+ return (BE_DATA);
+ case AE_EXPONENT_EVEN:
+ return (BE_EXPONENT_EVEN);
+ case AE_EXPONENT_LEN:
+ return (BE_EXPONENT_LEN);
+ case AE_INPUT_DATA:
+ return (BE_INPUT_DATA);
+ case AE_INPUT_LEN:
+ return (BE_INPUT_LEN);
+ case AE_KEY_INFO:
+ return (BE_KEY_INFO);
+ case AE_KEY_LEN:
+ return (BE_KEY_LEN);
+ case AE_MODULUS_LEN:
+ return (BE_MODULUS_LEN);
+ case AE_NOT_INITIALIZED:
+ return (BE_NOT_INITIALIZED);
+ case AE_NOT_SUPPORTED:
+ return (BE_NOT_SUPPORTED);
+ case AE_OUTPUT_LEN:
+ return (BE_OUTPUT_LEN);
+ case AE_PARAMS:
+ return (BE_ALGORITHM_INFO);
+
+#if USE_ALLOCED_FRAME
+ case AE_ALLOC:
+ return (BE_ALLOC);
+#endif
+
+ default:
+ return (BE_DATA);
+ }
+}
+