Implement internally opaque bn access from asn1
[openssl.git] / crypto / asn1 / t_pkey.c
index 7bf470e8ddb2083c16b4ce46293dcca5cad157b1..44f7183046efac22d65564502142f6042cc0bda1 100644 (file)
 
 #include <stdio.h>
 #include "cryptlib.h"
+#include <openssl/objects.h>
 #include <openssl/buffer.h>
-#include <openssl/bn.h>
-#ifndef NO_RSA
-#include <openssl/rsa.h>
-#endif
-#ifndef NO_DH
-#include <openssl/dh.h>
-#endif
-#ifndef NO_DSA
-#include <openssl/dsa.h>
-#endif
+#include "internal/bn_int.h"
 
-/* DHerr(DH_F_DHPARAMS_PRINT,ERR_R_MALLOC_FAILURE);
- * DSAerr(DSA_F_DSAPARAMS_PRINT,ERR_R_MALLOC_FAILURE);
- */
-
-#ifndef NOPROTO
-static int print(BIO *fp,const char *str,BIGNUM *num,
-               unsigned char *buf,int off);
-#else
-static int print();
-#endif
-
-#ifndef NO_RSA
-#ifndef NO_FP_API
-int RSA_print_fp(FILE *fp, RSA *x, int off)
-        {
-        BIO *b;
-        int ret;
-
-        if ((b=BIO_new(BIO_s_file())) == NULL)
-               {
-               RSAerr(RSA_F_RSA_PRINT_FP,ERR_R_BUF_LIB);
-                return(0);
-               }
-        BIO_set_fp(b,fp,BIO_NOCLOSE);
-        ret=RSA_print(b,x,off);
-        BIO_free(b);
-        return(ret);
-        }
-#endif
-
-int RSA_print(BIO *bp, RSA *x, int off)
-       {
-       char str[128];
-       const char *s;
-       unsigned char *m=NULL;
-       int i,ret=0;
-
-       i=RSA_size(x);
-       m=(unsigned char *)Malloc((unsigned int)i+10);
-       if (m == NULL)
-               {
-               RSAerr(RSA_F_RSA_PRINT,ERR_R_MALLOC_FAILURE);
-               goto err;
-               }
-
-       if (off)
-               {
-               if (off > 128) off=128;
-               memset(str,' ',off);
-               }
-       if (x->d != NULL)
-               {
-               if (off && (BIO_write(bp,str,off) <= 0)) goto err;
-               if (BIO_printf(bp,"Private-Key: (%d bit)\n",BN_num_bits(x->n))
-                       <= 0) goto err;
-               }
-
-       if (x->d == NULL)
-               sprintf(str,"Modulus (%d bit):",BN_num_bits(x->n));
-       else
-               strcpy(str,"modulus:");
-       if (!print(bp,str,x->n,m,off)) goto err;
-       s=(x->d == NULL)?"Exponent:":"publicExponent:";
-       if (!print(bp,s,x->e,m,off)) goto err;
-       if (!print(bp,"privateExponent:",x->d,m,off)) goto err;
-       if (!print(bp,"prime1:",x->p,m,off)) goto err;
-       if (!print(bp,"prime2:",x->q,m,off)) goto err;
-       if (!print(bp,"exponent1:",x->dmp1,m,off)) goto err;
-       if (!print(bp,"exponent2:",x->dmq1,m,off)) goto err;
-       if (!print(bp,"coefficient:",x->iqmp,m,off)) goto err;
-       ret=1;
-err:
-       if (m != NULL) Free((char *)m);
-       return(ret);
-       }
-#endif /* NO_RSA */
-
-#ifndef NO_DSA
-#ifndef NO_FP_API
-int DSA_print_fp(FILE *fp, DSA *x, int off)
-       {
-       BIO *b;
-       int ret;
-
-       if ((b=BIO_new(BIO_s_file())) == NULL)
-               {
-               DSAerr(DSA_F_DSA_PRINT_FP,ERR_R_BUF_LIB);
-               return(0);
-               }
-       BIO_set_fp(b,fp,BIO_NOCLOSE);
-       ret=DSA_print(b,x,off);
-       BIO_free(b);
-       return(ret);
-       }
-#endif
-
-int DSA_print(BIO *bp, DSA *x, int off)
-       {
-       char str[128];
-       unsigned char *m=NULL;
-       int i,ret=0;
-       BIGNUM *bn=NULL;
-
-       if (x->p != NULL)
-               bn=x->p;
-       else if (x->priv_key != NULL)
-               bn=x->priv_key;
-       else if (x->pub_key != NULL)
-               bn=x->pub_key;
-               
-       /* larger than needed but what the hell :-) */
-       if (bn != NULL)
-               i=BN_num_bytes(bn)*2;
-       else
-               i=256;
-       m=(unsigned char *)Malloc((unsigned int)i+10);
-       if (m == NULL)
-               {
-               DSAerr(DSA_F_DSA_PRINT,ERR_R_MALLOC_FAILURE);
-               goto err;
-               }
-
-       if (off)
-               {
-               if (off > 128) off=128;
-               memset(str,' ',off);
-               }
-       if (x->priv_key != NULL)
-               {
-               if (off && (BIO_write(bp,str,off) <= 0)) goto err;
-               if (BIO_printf(bp,"Private-Key: (%d bit)\n",BN_num_bits(x->p))
-                       <= 0) goto err;
-               }
-
-       if ((x->priv_key != NULL) && !print(bp,"priv:",x->priv_key,m,off))
-               goto err;
-       if ((x->pub_key  != NULL) && !print(bp,"pub: ",x->pub_key,m,off))
-               goto err;
-       if ((x->p != NULL) && !print(bp,"P:   ",x->p,m,off)) goto err;
-       if ((x->q != NULL) && !print(bp,"Q:   ",x->q,m,off)) goto err;
-       if ((x->g != NULL) && !print(bp,"G:   ",x->g,m,off)) goto err;
-       ret=1;
-err:
-       if (m != NULL) Free((char *)m);
-       return(ret);
-       }
-#endif /* !NO_DSA */
-
-static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf,
-            int off)
+int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num,
+                       unsigned char *buf, int off)
        {
        int n,i;
-       char str[128];
        const char *neg;
 
        if (num == NULL) return(1);
-       neg=(num->neg)?"-":"";
-       if (off)
+       neg = (BN_is_negative(num))?"-":"";
+       if(!BIO_indent(bp,off,128))
+               return 0;
+       if (BN_is_zero(num))
                {
-               if (off > 128) off=128;
-               memset(str,' ',off);
-               if (BIO_write(bp,str,off) <= 0) return(0);
+               if (BIO_printf(bp, "%s 0\n", number) <= 0)
+                       return 0;
+               return 1;
                }
 
        if (BN_num_bytes(num) <= BN_BYTES)
                {
                if (BIO_printf(bp,"%s %s%lu (%s0x%lx)\n",number,neg,
-                       (unsigned long)num->d[0],neg,(unsigned long)num->d[0])
-                       <= 0) return(0);
+                       (unsigned long)bn_get_words(num)[0],neg,
+                       (unsigned long)bn_get_words(num)[0])<= 0) return(0);
                }
        else
                {
@@ -256,9 +101,9 @@ static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf,
                        {
                        if ((i%15) == 0)
                                {
-                               str[0]='\n';
-                               memset(&(str[1]),' ',off+4);
-                               if (BIO_write(bp,str,off+1+4) <= 0) return(0);
+                               if(BIO_puts(bp,"\n") <= 0
+                                  || !BIO_indent(bp,off+4,128))
+                                   return 0;
                                }
                        if (BIO_printf(bp,"%02x%s",buf[i],((i+1) == n)?"":":")
                                <= 0) return(0);
@@ -267,104 +112,3 @@ static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf,
                }
        return(1);
        }
-
-#ifndef NO_DH
-#ifndef NO_FP_API
-int DHparams_print_fp(FILE *fp, DH *x)
-        {
-        BIO *b;
-        int ret;
-
-        if ((b=BIO_new(BIO_s_file())) == NULL)
-               {
-               DHerr(DH_F_DHPARAMS_PRINT_FP,ERR_R_BUF_LIB);
-                return(0);
-               }
-        BIO_set_fp(b,fp,BIO_NOCLOSE);
-        ret=DHparams_print(b, x);
-        BIO_free(b);
-        return(ret);
-        }
-#endif
-
-int DHparams_print(BIO *bp, DH *x)
-       {
-       unsigned char *m=NULL;
-       int reason=ERR_R_BUF_LIB,i,ret=0;
-
-       i=BN_num_bytes(x->p);
-       m=(unsigned char *)Malloc((unsigned int)i+10);
-       if (m == NULL)
-               {
-               reason=ERR_R_MALLOC_FAILURE;
-               goto err;
-               }
-
-       if (BIO_printf(bp,"Diffie-Hellman-Parameters: (%d bit)\n",
-               BN_num_bits(x->p)) <= 0)
-               goto err;
-       if (!print(bp,"prime:",x->p,m,4)) goto err;
-       if (!print(bp,"generator:",x->g,m,4)) goto err;
-       if (x->length != 0)
-               {
-               if (BIO_printf(bp,"    recomented-private-length: %d bits\n",
-                       (int)x->length) <= 0) goto err;
-               }
-       ret=1;
-       if (0)
-               {
-err:
-               DHerr(DH_F_DHPARAMS_PRINT,reason);
-               }
-       if (m != NULL) Free((char *)m);
-       return(ret);
-       }
-#endif
-
-#ifndef NO_DSA
-#ifndef NO_FP_API
-int DSAparams_print_fp(FILE *fp, DSA *x)
-        {
-        BIO *b;
-        int ret;
-
-        if ((b=BIO_new(BIO_s_file())) == NULL)
-               {
-               DSAerr(DSA_F_DSAPARAMS_PRINT_FP,ERR_R_BUF_LIB);
-                return(0);
-               }
-        BIO_set_fp(b,fp,BIO_NOCLOSE);
-        ret=DSAparams_print(b, x);
-        BIO_free(b);
-        return(ret);
-        }
-#endif
-
-int DSAparams_print(BIO *bp, DSA *x)
-       {
-       unsigned char *m=NULL;
-       int reason=ERR_R_BUF_LIB,i,ret=0;
-
-       i=BN_num_bytes(x->p);
-       m=(unsigned char *)Malloc((unsigned int)i+10);
-       if (m == NULL)
-               {
-               reason=ERR_R_MALLOC_FAILURE;
-               goto err;
-               }
-
-       if (BIO_printf(bp,"DSA-Parameters: (%d bit)\n",
-               BN_num_bits(x->p)) <= 0)
-               goto err;
-       if (!print(bp,"p:",x->p,m,4)) goto err;
-       if (!print(bp,"q:",x->q,m,4)) goto err;
-       if (!print(bp,"g:",x->g,m,4)) goto err;
-       ret=1;
-err:
-       if (m != NULL) Free((char *)m);
-       DSAerr(DSA_F_DSAPARAMS_PRINT,reason);
-       return(ret);
-       }
-
-#endif /* !NO_DSA */
-