Michael Bell schrieb:

> So nameopt works if I used -subj but it fails for -text.

I wrote a patch for req to support:

-nameopt (for -text too)
-reqopt

Please read the README to see what I changed.

Michael
-- 
-------------------------------------------------------------------
Michael Bell                   Email (private): [EMAIL PROTECTED]
Rechenzentrum - Datacenter     Email:  [EMAIL PROTECTED]
Humboldt-University of Berlin  Tel.: +49 (0)30-2093 2482
Unter den Linden 6             Fax:  +49 (0)30-2093 2959
10099 Berlin
Germany                                       http://www.openca.org
changed files:
        crypto/asn1/t_req.c
                * introduce X509_REQ_print_ex
                * X509_REQ_print_ex works like X509_print_ex
        crypto/x509/x509.h
                * added X509_FLAG_NO_ATTRIBUTES
        apps/apps.c
                * added X509_FLAG_NO_ATTRIBUTES to set_cert_ex
                  (I don't want to introduce so much stuff like for
                  certs for reqs too only for one option and a not supported
                  flag is not dangerous)
        apps/req.c
                * added option -reqopt
                * full support for -nameopt
1066d1065
<               { "no_attributes", X509_FLAG_NO_ATTRIBUTES, 0},
154c154
<       unsigned long nmflag = 0, reqflag = 0;
---
>       unsigned long nmflag = 0;
359,363d358
<               else if (strcmp(*argv,"-reqopt") == 0)
<                       {
<                       if (--argc < 1) goto bad;
<                       if (!set_cert_ex(&reqflag, *(++argv))) goto bad;
<                       }
456,457c451
<               BIO_printf(bio_err," -nameopt arg   - various certificate name 
options\n");
<               BIO_printf(bio_err," -reqopt arg    - various request text 
options\n\n");
---
>               BIO_printf(bio_err," -nameopt arg    - various certificate name 
>options\n");
990c984
<                       X509_print_ex(out, x509ss, nmflag, reqflag);
---
>                       X509_print(out,x509ss);
992c986
<                       X509_REQ_print_ex(out, req, nmflag, reqflag);
---
>                       X509_REQ_print(out,req);
1153,1157c1147
<       size_t buflen = strlen (subject)+1; /* to copy the types and values into. due 
to escaping, the copy can only become shorter */
<       char *buf = malloc (buflen);
<       size_t max_ne = buflen / 2 + 1; /* maximum number of name elements */
<       char **ne_types = malloc (max_ne * sizeof (char *));
<       char **ne_values = malloc (max_ne * sizeof (char *));
---
>       X509_NAME *n;
1159,1160c1149,1150
<       char *sp = subject, *bp = buf;
<       int i, ne_num = 0;
---
>       if (!(n = do_subject(subject, chtype)))
>               return 0;
1162,1233c1152
<       X509_NAME *n = NULL;
<       int nid;
< 
<       if (!buf || !ne_types || !ne_values)
<       {
<               BIO_printf(bio_err, "malloc error\n");
<               goto error0;
<       }
< 
<       if (*subject != '/')
<       {
<               BIO_printf(bio_err, "Subject does not start with '/'.\n");
<               goto error0;
<       }
<       sp++; /* skip leading / */
< 
<       while (*sp)
<       {
<               /* collect type */
<               ne_types[ne_num] = bp;
<               while (*sp)
<               {
<                       if (*sp == '\\') /* is there anything to escape in the 
type...? */
<                               if (*++sp)
<                                       *bp++ = *sp++;
<                               else
<                               {
<                                       BIO_printf(bio_err, "escape character at end 
of string\n");
<                                       goto error0;
<                               }
<                       else if (*sp == '=')
<                       {
<                               sp++;
<                               *bp++ = '\0';
<                               break;
<                       }
<                       else
<                               *bp++ = *sp++;
<               }
<               if (!*sp)
<               {
<                       BIO_printf(bio_err, "end of string encountered while 
processing type of subject name element #%d\n", ne_num);
<                       goto error0;
<               }
<               ne_values[ne_num] = bp;
<               while (*sp)
<               {
<                       if (*sp == '\\')
<                               if (*++sp)
<                                       *bp++ = *sp++;
<                               else
<                               {
<                                       BIO_printf(bio_err, "escape character at end 
of string\n");
<                                       goto error0;
<                               }
<                       else if (*sp == '/')
<                       {
<                               sp++;
<                               *bp++ = '\0';
<                               break;
<                       }
<                       else
<                               *bp++ = *sp++;
<               }
<               *bp++ = '\0';
<               ne_num++;
<       }
< 
<       if (!(n = X509_NAME_new()))
<               goto error0;
< 
<       for(i = 0; i < ne_num; i++)
---
>       if (!X509_REQ_set_subject_name(req, n))
1235,1249c1154,1155
<               if ((nid=OBJ_txt2nid(ne_types[i])) == NID_undef)
<                       {
<                       BIO_printf(bio_err, "Subject Attribute %s has no known NID, 
skipped\n", ne_types[i]);
<                       continue;
<                       }
< 
<               if (!*ne_values[i])
<                       {
<                       BIO_printf(bio_err, "No value provided for Subject Attribute 
%s, skipped\n", ne_types[i]);
<                       continue;
<                       }
< 
<               if (!X509_NAME_add_entry_by_NID(n, nid, chtype, (unsigned 
char*)ne_values[i], -1,-1,0))
<                       goto error1;
< 
---
>               X509_NAME_free(n);
>               return 0;
1251,1253d1156
< 
<       if (!X509_REQ_set_subject_name(req, n))
<               goto error1;
1255,1257d1157
<       free (ne_values);
<       free (ne_types);
<       free (buf);
1259,1266d1158
< 
< error1:
<       X509_NAME_free(n);
< error0:
<       free (ne_values);
<       free (ne_types);
<       free (buf);
<       return 0;
85c85
< int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflags, unsigned long 
cflag)
---
> int X509_REQ_print(BIO *bp, X509_REQ *x)
95,105d94
<       char mlch = ' ';
<       int nmindent = 0;
< 
<       if((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
<               mlch = '\n';
<               nmindent = 12;
<       }
< 
<       if(nmflags == X509_FLAG_COMPAT)
<               nmindent = 16;
< 
108,137c97,117
<       if(!(cflag & X509_FLAG_NO_HEADER))
<               {
<               if (BIO_write(bp,"Certificate Request:\n",21) <= 0) goto err;
<               if (BIO_write(bp,"    Data:\n",10) <= 0) goto err;
<               }
<       if(!(cflag & X509_FLAG_NO_VERSION))
<               {
<               neg=(ri->version->type == V_ASN1_NEG_INTEGER)?"-":"";
<               l=0;
<               for (i=0; i<ri->version->length; i++)
<                       { l<<=8; l+=ri->version->data[i]; }
<               sprintf(str,"%8sVersion: %s%lu (%s0x%lx)\n","",neg,l,neg,l);
<               if (BIO_puts(bp,str) <= 0) goto err;
<               }
<         if(!(cflag & X509_FLAG_NO_SUBJECT))
<                 {
<                 if (BIO_printf(bp,"        Subject:%c",mlch) <= 0) goto err;
<                 if (X509_NAME_print_ex(bp,ri->subject,nmindent, nmflags) < 0) goto 
err;
<                 if (BIO_write(bp,"\n",1) <= 0) goto err;
<                 }
<       if(!(cflag & X509_FLAG_NO_PUBKEY))
<               {
<               if (BIO_write(bp,"        Subject Public Key Info:\n",33) <= 0)
<                       goto err;
<               if (BIO_printf(bp,"%12sPublic Key Algorithm: ","") <= 0)
<                       goto err;
<               if (i2a_ASN1_OBJECT(bp, ri->pubkey->algor->algorithm) <= 0)
<                       goto err;
<               if (BIO_puts(bp, "\n") <= 0)
<                       goto err;
---
>       sprintf(str,"Certificate Request:\n");
>       if (BIO_puts(bp,str) <= 0) goto err;
>       sprintf(str,"%4sData:\n","");
>       if (BIO_puts(bp,str) <= 0) goto err;
> 
>       neg=(ri->version->type == V_ASN1_NEG_INTEGER)?"-":"";
>       l=0;
>       for (i=0; i<ri->version->length; i++)
>               { l<<=8; l+=ri->version->data[i]; }
>       sprintf(str,"%8sVersion: %s%lu (%s0x%lx)\n","",neg,l,neg,l);
>       if (BIO_puts(bp,str) <= 0) goto err;
>       sprintf(str,"%8sSubject: ","");
>       if (BIO_puts(bp,str) <= 0) goto err;
> 
>       X509_NAME_print(bp,ri->subject,16);
>       sprintf(str,"\n%8sSubject Public Key Info:\n","");
>       if (BIO_puts(bp,str) <= 0) goto err;
>       i=OBJ_obj2nid(ri->pubkey->algor->algorithm);
>       sprintf(str,"%12sPublic Key Algorithm: %s\n","",
>               (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i));
>       if (BIO_puts(bp,str) <= 0) goto err;
139,145c119
<               pkey=X509_REQ_get_pubkey(x);
<               if (pkey == NULL)
<                       {
<                       BIO_printf(bp,"%12sUnable to load Public Key\n","");
<                       ERR_print_errors(bp);
<                       }
<               else
---
>       pkey=X509_REQ_get_pubkey(x);
147,149c121,123
<               if (pkey->type == EVP_PKEY_RSA)
<                       {
<                       BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","",
---
>       if (pkey != NULL && pkey->type == EVP_PKEY_RSA)
>               {
>               BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","",
151,153c125,127
<                       RSA_print(bp,pkey->pkey.rsa,16);
<                       }
<               else
---
>               RSA_print(bp,pkey->pkey.rsa,16);
>               }
>       else 
156,161c130,135
<               if (pkey->type == EVP_PKEY_DSA)
<                       {
<                       BIO_printf(bp,"%12sDSA Public Key:\n","");
<                       DSA_print(bp,pkey->pkey.dsa,16);
<                       }
<               else
---
>               if (pkey != NULL && pkey->type == EVP_PKEY_DSA)
>               {
>               BIO_printf(bp,"%12sDSA Public Key:\n","");
>               DSA_print(bp,pkey->pkey.dsa,16);
>               }
>       else
163c137
<                       BIO_printf(bp,"%12sUnknown Public Key:\n","");
---
>               BIO_printf(bp,"%12sUnknown Public Key:\n","");
165,166c139,144
<               EVP_PKEY_free(pkey);
<               }
---
>       if (pkey != NULL)
>           EVP_PKEY_free(pkey);
> 
>       /* may not be */
>       sprintf(str,"%8sAttributes:\n","");
>       if (BIO_puts(bp,str) <= 0) goto err;
168c146,147
<       if(!(cflag & X509_FLAG_NO_ATTRIBUTES))
---
>       sk=x->req_info->attributes;
>       if (sk_X509_ATTRIBUTE_num(sk) == 0)
170,171c149
<               /* may not be */
<               sprintf(str,"%8sAttributes:\n","");
---
>               sprintf(str,"%12sa0:00\n","");
173,175c151,154
< 
<               sk=x->req_info->attributes;
<               if (sk_X509_ATTRIBUTE_num(sk) == 0)
---
>               }
>       else
>               {
>               for (i=0; i<sk_X509_ATTRIBUTE_num(sk); i++)
177c156,165
<                       sprintf(str,"%12sa0:00\n","");
---
>                       ASN1_TYPE *at;
>                       X509_ATTRIBUTE *a;
>                       ASN1_BIT_STRING *bs=NULL;
>                       ASN1_TYPE *t;
>                       int j,type=0,count=1,ii=0;
> 
>                       a=sk_X509_ATTRIBUTE_value(sk,i);
>                       if(X509_REQ_extension_nid(OBJ_obj2nid(a->object)))
>                                                               continue;
>                       sprintf(str,"%12s","");
179,180c167
<                       }
<               else
---
>                       if ((j=i2a_ASN1_OBJECT(bp,a->object)) > 0)
182c169
<                       for (i=0; i<sk_X509_ATTRIBUTE_num(sk); i++)
---
>                       if (a->single)
184,195c171,175
<                               ASN1_TYPE *at;
<                               X509_ATTRIBUTE *a;
<                               ASN1_BIT_STRING *bs=NULL;
<                               ASN1_TYPE *t;
<                               int j,type=0,count=1,ii=0;
< 
<                               a=sk_X509_ATTRIBUTE_value(sk,i);
<                               if(X509_REQ_extension_nid(OBJ_obj2nid(a->object)))
<                                                                       continue;
<                               sprintf(str,"%12s","");
<                               if (BIO_puts(bp,str) <= 0) goto err;
<                               if ((j=i2a_ASN1_OBJECT(bp,a->object)) > 0)
---
>                               t=a->value.single;
>                               type=t->type;
>                               bs=t->value.bit_string;
>                               }
>                       else
197,206c177,178
<                               if (a->single)
<                                       {
<                                       t=a->value.single;
<                                       type=t->type;
<                                       bs=t->value.bit_string;
<                                       }
<                               else
<                                       {
<                                       ii=0;
<                                       count=sk_ASN1_TYPE_num(a->value.set);
---
>                               ii=0;
>                               count=sk_ASN1_TYPE_num(a->value.set);
208,229c180,182
<                                       at=sk_ASN1_TYPE_value(a->value.set,ii);
<                                       type=at->type;
<                                       bs=at->value.asn1_string;
<                                       }
<                               }
<                               for (j=25-j; j>0; j--)
<                                       if (BIO_write(bp," ",1) != 1) goto err;
<                               if (BIO_puts(bp,":") <= 0) goto err;
<                               if (    (type == V_ASN1_PRINTABLESTRING) ||
<                                       (type == V_ASN1_T61STRING) ||
<                                       (type == V_ASN1_IA5STRING))
<                                       {
<                                       if (BIO_write(bp,(char *)bs->data,bs->length)
<                                               != bs->length)
<                                               goto err;
<                                       BIO_puts(bp,"\n");
<                                       }
<                               else
<                                       {
<                                       BIO_puts(bp,"unable to print attribute\n");
<                                       }
<                               if (++ii < count) goto get_next;
---
>                               at=sk_ASN1_TYPE_value(a->value.set,ii);
>                               type=at->type;
>                               bs=at->value.asn1_string;
232,239c185,190
<               }
<       if(!(cflag & X509_FLAG_NO_ATTRIBUTES))
<               {
<               exts = X509_REQ_get_extensions(x);
<               if(exts)
<                       {
<                       BIO_printf(bp,"%8sRequested Extensions:\n","");
<                       for (i=0; i<sk_X509_EXTENSION_num(exts); i++)
---
>                       for (j=25-j; j>0; j--)
>                               if (BIO_write(bp," ",1) != 1) goto err;
>                       if (BIO_puts(bp,":") <= 0) goto err;
>                       if (    (type == V_ASN1_PRINTABLESTRING) ||
>                               (type == V_ASN1_T61STRING) ||
>                               (type == V_ASN1_IA5STRING))
241,249c192,193
<                               ASN1_OBJECT *obj;
<                               X509_EXTENSION *ex;
<                               int j;
<                               ex=sk_X509_EXTENSION_value(exts, i);
<                               if (BIO_printf(bp,"%12s","") <= 0) goto err;
<                               obj=X509_EXTENSION_get_object(ex);
<                               i2a_ASN1_OBJECT(bp,obj);
<                               j=X509_EXTENSION_get_critical(ex);
<                               if (BIO_printf(bp,": %s\n",j?"critical":"","") <= 0)
---
>                               if (BIO_write(bp,(char *)bs->data,bs->length)
>                                       != bs->length)
251,256c195
<                               if(!X509V3_EXT_print(bp, ex, 0, 16))
<                                       {
<                                       BIO_printf(bp, "%16s", "");
<                                       M_ASN1_OCTET_STRING_print(bp,ex->value);
<                                       }
<                               if (BIO_write(bp,"\n",1) <= 0) goto err;
---
>                               BIO_puts(bp,"\n");
258c197,201
<                       sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
---
>                       else
>                               {
>                               BIO_puts(bp,"unable to print attribute\n");
>                               }
>                       if (++ii < count) goto get_next;
262,264c205,223
<       if(!(cflag & X509_FLAG_NO_SIGDUMP))
<               {
<               if(!X509_signature_print(bp, x->sig_alg, x->signature)) goto err;
---
>       exts = X509_REQ_get_extensions(x);
>       if(exts) {
>               BIO_printf(bp,"%8sRequested Extensions:\n","");
>               for (i=0; i<sk_X509_EXTENSION_num(exts); i++) {
>                       ASN1_OBJECT *obj;
>                       X509_EXTENSION *ex;
>                       int j;
>                       ex=sk_X509_EXTENSION_value(exts, i);
>                       if (BIO_printf(bp,"%12s","") <= 0) goto err;
>                       obj=X509_EXTENSION_get_object(ex);
>                       i2a_ASN1_OBJECT(bp,obj);
>                       j=X509_EXTENSION_get_critical(ex);
>                       if (BIO_printf(bp,": %s\n",j?"critical":"","") <= 0)
>                               goto err;
>                       if(!X509V3_EXT_print(bp, ex, 0, 16)) {
>                               BIO_printf(bp, "%16s", "");
>                               M_ASN1_OCTET_STRING_print(bp,ex->value);
>                       }
>                       if (BIO_write(bp,"\n",1) <= 0) goto err;
265a225,228
>               sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
>       }
> 
>       if(!X509_signature_print(bp, x->sig_alg, x->signature)) goto err;
271,275d233
<       }
< 
< int X509_REQ_print(BIO *bp, X509_REQ *x)
<       {
<       return X509_REQ_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
334d333
< #define       X509_FLAG_NO_ATTRIBUTES         (1L << 11)
1019d1017
< int           X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned 
long cflag);

Reply via email to