Merge from the ASN1 branch of new ASN1 code
[openssl.git] / crypto / dh / dh_asn1.c
similarity index 69%
rename from crypto/asn1/a_null.c
rename to crypto/dh/dh_asn1.c
index 119fd78..1f26be7 100644 (file)
@@ -1,9 +1,9 @@
-/* a_null.c */
+/* dh_asn1.c */
 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
- * project 1999.
+ * project 2000.
  */
 /* ====================================================================
- * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #include <stdio.h>
 #include "cryptlib.h"
-#include <openssl/asn1.h>
+#include <openssl/bn.h>
+#include <openssl/dh.h>
+#include <openssl/objects.h>
+#include <openssl/asn1t.h>
 
-/* ASN1 functions for NULL type. For compatibility with other ASN1 code
- * it returns a pointer to an "ASN1_NULL" structure. The new/free functions
- * don't need to do any allocating because nothing is stored in a NULL.
- */
-
-int i2d_ASN1_NULL(ASN1_NULL *a, unsigned char **pp)
-       {
-       if(!a) return 0;
-       if (pp) ASN1_put_object(pp,0,0,V_ASN1_NULL,V_ASN1_UNIVERSAL);
-       return 2;
-       }
-
-ASN1_NULL *d2i_ASN1_NULL(ASN1_NULL **a, unsigned char **pp, long length)
-       {
-       ASN1_NULL *ret = NULL;
-       unsigned char *p;
-       long len;
-       int inf,tag,xclass;
-       int i=0;
-
-       p= *pp;
-       inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
-       if (inf & 0x80)
-               {
-               i=ASN1_R_BAD_OBJECT_HEADER;
-               goto err;
-               }
-
-       if (tag != V_ASN1_NULL)
-               {
-               i=ASN1_R_EXPECTING_A_NULL;
-               goto err;
-               }
-
-       if (len != 0)
-               {
-               i=ASN1_R_NULL_IS_WRONG_LENGTH;
-               goto err;
-               }
-       ret=(ASN1_NULL *)1;
-       if (a != NULL) (*a)=ret;
-       *pp=p;
-       return(ret);
-err:
-       ASN1err(ASN1_F_D2I_ASN1_NULL,i);
-       return(ret);
-       }
-
-ASN1_NULL *ASN1_NULL_new(void)
+/* Override the default free and new methods */
+static int dh_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
 {
-       return (ASN1_NULL *)1;
+       if(operation == ASN1_OP_NEW_PRE) {
+               *pval = (ASN1_VALUE *)DH_new();
+               if(*pval) return 2;
+               return 0;
+       } else if(operation == ASN1_OP_FREE_PRE) {
+               DH_free((DH *)*pval);
+               *pval = NULL;
+               return 2;
+       }
+       return 1;
 }
 
-void ASN1_NULL_free(ASN1_NULL *a)
-{
-       return;
-}
+ASN1_SEQUENCE_cb(DHparams, dh_cb) = {
+       ASN1_SIMPLE(DH, p, BIGNUM),
+       ASN1_SIMPLE(DH, g, BIGNUM),
+       ASN1_OPT(DH, length, ZLONG),
+} ASN1_SEQUENCE_END_cb(DH, DHparams);
+
+IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DH, DHparams, DHparams)