Replace the macros in asn1.h with function equivalents. Also make UTF8Strings
[openssl.git] / crypto / asn1 / x_pubkey.c
index b1a2499d349425345116a2b4bb69f0393850902e..8adaeba82ced98f180bf035a85010411a042cb22 100644 (file)
@@ -1,5 +1,5 @@
 /* crypto/asn1/x_pubkey.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
 
 #include <stdio.h>
 #include "cryptlib.h"
-#include "asn1_mac.h"
+#include <openssl/asn1_mac.h>
+#include <openssl/x509.h>
 
-/*
- * ASN1err(ASN1_F_D2I_X509_PUBKEY,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_PUBKEY_NEW,ASN1_R_LENGTH_MISMATCH);
- */
-
-int i2d_X509_PUBKEY(a,pp)
-X509_PUBKEY *a;
-unsigned char **pp;
+int i2d_X509_PUBKEY(X509_PUBKEY *a, unsigned char **pp)
        {
        M_ASN1_I2D_vars(a);
 
@@ -82,10 +76,8 @@ unsigned char **pp;
        M_ASN1_I2D_finish();
        }
 
-X509_PUBKEY *d2i_X509_PUBKEY(a,pp,length)
-X509_PUBKEY **a;
-unsigned char **pp;
-long length;
+X509_PUBKEY *d2i_X509_PUBKEY(X509_PUBKEY **a, unsigned char **pp,
+            long length)
        {
        M_ASN1_D2I_vars(a,X509_PUBKEY *,X509_PUBKEY_new);
 
@@ -101,31 +93,29 @@ long length;
        M_ASN1_D2I_Finish(a,X509_PUBKEY_free,ASN1_F_D2I_X509_PUBKEY);
        }
 
-X509_PUBKEY *X509_PUBKEY_new()
+X509_PUBKEY *X509_PUBKEY_new(void)
        {
        X509_PUBKEY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_PUBKEY);
        M_ASN1_New(ret->algor,X509_ALGOR_new);
-       M_ASN1_New(ret->public_key,ASN1_BIT_STRING_new);
+       M_ASN1_New(ret->public_key,M_ASN1_BIT_STRING_new);
        ret->pkey=NULL;
        return(ret);
        M_ASN1_New_Error(ASN1_F_X509_PUBKEY_NEW);
        }
 
-void X509_PUBKEY_free(a)
-X509_PUBKEY *a;
+void X509_PUBKEY_free(X509_PUBKEY *a)
        {
        if (a == NULL) return;
        X509_ALGOR_free(a->algor);
-       ASN1_BIT_STRING_free(a->public_key);
+       M_ASN1_BIT_STRING_free(a->public_key);
        if (a->pkey != NULL) EVP_PKEY_free(a->pkey);
        Free((char *)a);
        }
 
-int X509_PUBKEY_set(x,pkey)
-X509_PUBKEY **x;
-EVP_PKEY *pkey;
+int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
        {
        int ok=0;
        X509_PUBKEY *pk;
@@ -182,11 +172,15 @@ EVP_PKEY *pkey;
                goto err;
                }
 
-       i=i2d_PublicKey(pkey,NULL);
+       if ((i=i2d_PublicKey(pkey,NULL)) <= 0) goto err;
        if ((s=(unsigned char *)Malloc(i+1)) == NULL) goto err;
        p=s;
        i2d_PublicKey(pkey,&p);
-       if (!ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;
+       if (!M_ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;
+       /* Set number of unused bits to zero */
+       pk->public_key->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);
+       pk->public_key->flags|=ASN1_STRING_FLAG_BITS_LEFT;
+
        Free(s);
 
        CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
@@ -204,19 +198,26 @@ err:
        return(ok);
        }
 
-EVP_PKEY *X509_PUBKEY_get(key)
-X509_PUBKEY *key;
+EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
        {
        EVP_PKEY *ret=NULL;
        long j;
        int type;
        unsigned char *p;
+#ifndef NO_DSA
        X509_ALGOR *a;
+#endif
+
+       if (key == NULL) goto err;
 
        if (key->pkey != NULL)
-               {
-               return(key->pkey);
-               }
+           {
+           CRYPTO_add(&key->pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
+           return(key->pkey);
+           }
+
+       if (key->public_key == NULL) goto err;
+
        type=OBJ_obj2nid(key->algor->algorithm);
        p=key->public_key->data;
         j=key->public_key->length;
@@ -243,6 +244,7 @@ X509_PUBKEY *key;
                }
 #endif
        key->pkey=ret;
+       CRYPTO_add(&ret->references,1,CRYPTO_LOCK_EVP_PKEY);
        return(ret);
 err:
        if (ret != NULL)