random: Remove the new API introduced by the new DRBG.
[libgcrypt.git] / src / context.c
index ae991c5..f77878b 100644 (file)
@@ -47,7 +47,7 @@ struct gcry_context
 
 /* Allocate a fresh generic context of contect TYPE and allocate
    LENGTH extra bytes for private use of the type handler. DEINIT is a
 
 /* Allocate a fresh generic context of contect TYPE and allocate
    LENGTH extra bytes for private use of the type handler. DEINIT is a
-   fucntion used called to deinitialize the private part; it may be
+   function used called to deinitialize the private part; it may be
    NULL if de-initialization is not required.  Returns NULL and sets
    ERRNO if memory allocation failed.  */
 gcry_ctx_t
    NULL if de-initialization is not required.  Returns NULL and sets
    ERRNO if memory allocation failed.  */
 gcry_ctx_t
@@ -67,7 +67,7 @@ _gcry_ctx_alloc (int type, size_t length, void (*deinit)(void*))
   if (length < sizeof (PROPERLY_ALIGNED_TYPE))
     length = sizeof (PROPERLY_ALIGNED_TYPE);
 
   if (length < sizeof (PROPERLY_ALIGNED_TYPE))
     length = sizeof (PROPERLY_ALIGNED_TYPE);
 
-  ctx = gcry_calloc (1, sizeof *ctx - sizeof (PROPERLY_ALIGNED_TYPE) + length);
+  ctx = xtrycalloc (1, sizeof *ctx - sizeof (PROPERLY_ALIGNED_TYPE) + length);
   if (!ctx)
     return NULL;
   memcpy (ctx->magic, CTX_MAGIC, CTX_MAGIC_LEN);
   if (!ctx)
     return NULL;
   memcpy (ctx->magic, CTX_MAGIC, CTX_MAGIC_LEN);
@@ -86,7 +86,7 @@ _gcry_ctx_alloc (int type, size_t length, void (*deinit)(void*))
 void *
 _gcry_ctx_get_pointer (gcry_ctx_t ctx, int type)
 {
 void *
 _gcry_ctx_get_pointer (gcry_ctx_t ctx, int type)
 {
-  if (memcmp (ctx->magic, CTX_MAGIC, CTX_MAGIC_LEN))
+  if (!ctx || memcmp (ctx->magic, CTX_MAGIC, CTX_MAGIC_LEN))
     log_fatal ("bad pointer %p passed to _gcry_ctx_get_pointer\n", ctx);
   if (ctx->type != type)
     log_fatal ("wrong context type %d request for context %p of type %d\n",
     log_fatal ("bad pointer %p passed to _gcry_ctx_get_pointer\n", ctx);
   if (ctx->type != type)
     log_fatal ("wrong context type %d request for context %p of type %d\n",
@@ -94,10 +94,29 @@ _gcry_ctx_get_pointer (gcry_ctx_t ctx, int type)
   return &ctx->u;
 }
 
   return &ctx->u;
 }
 
+/* Return a pointer to the private part of the context CTX.  TYPE is
+   the requested context type.  Using an explicit type allows to cross
+   check the type and eventually allows to store several private
+   contexts in one context object.  In contrast to
+   _gcry_ctx_get_pointer, this function returns NULL if no context for
+   the given type was found.  If CTX is NULL the function does not
+   abort but returns NULL.  */
+void *
+_gcry_ctx_find_pointer (gcry_ctx_t ctx, int type)
+{
+  if (!ctx)
+    return NULL;
+  if (memcmp (ctx->magic, CTX_MAGIC, CTX_MAGIC_LEN))
+    log_fatal ("bad pointer %p passed to _gcry_ctx_get_pointer\n", ctx);
+  if (ctx->type != type)
+    return NULL;
+  return &ctx->u;
+}
+
 
 /* Release the generic context CTX.  */
 void
 
 /* Release the generic context CTX.  */
 void
-gcry_ctx_release (gcry_ctx_t ctx)
+_gcry_ctx_release (gcry_ctx_t ctx)
 {
   if (!ctx)
     return;
 {
   if (!ctx)
     return;
@@ -114,5 +133,5 @@ gcry_ctx_release (gcry_ctx_t ctx)
     }
   if (ctx->deinit)
     ctx->deinit (&ctx->u);
     }
   if (ctx->deinit)
     ctx->deinit (&ctx->u);
-  gcry_free (ctx);
+  xfree (ctx);
 }
 }