mturk       2005/07/08 00:49:56

  Modified:    jni/native/src sslinfo.c
  Log:
  Add param infos in ASN1 format for server and client certificates.
  
  Revision  Changes    Path
  1.6       +78 -8     jakarta-tomcat-connectors/jni/native/src/sslinfo.c
  
  Index: sslinfo.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslinfo.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- sslinfo.c 8 Jul 2005 07:19:10 -0000       1.5
  +++ sslinfo.c 8 Jul 2005 07:49:56 -0000       1.6
  @@ -95,21 +95,40 @@
   
   static char *get_cert_PEM(X509 *xs)
   {
  -    char *result;
  +    char *result = NULL;
       BIO *bio;
  -    int n;
   
       if ((bio = BIO_new(BIO_s_mem())) == NULL)
           return NULL;
  -    PEM_write_bio_X509(bio, xs);
  -    n = BIO_pending(bio);
  -    result = malloc(n+1);
  -    n = BIO_read(bio, result, n);
  -    result[n] = '\0';
  +    if (PEM_write_bio_X509(bio, xs)) {
  +        int n = BIO_pending(bio);
  +        result = malloc(n+1);
  +        n = BIO_read(bio, result, n);
  +        result[n] = '\0';
  +    }
  +    BIO_free(bio);
  +    return result;
  +}
  +
  +static unsigned char *get_cert_ASN1(X509 *xs, int *len)
  +{
  +    char *result = NULL;
  +    BIO *bio;
  +
  +    *len = 0;
  +    if ((bio = BIO_new(BIO_s_mem())) == NULL)
  +        return NULL;
  +    if (i2d_X509_bio(bio, xs)) {
  +        int n = BIO_pending(bio);
  +        result = malloc(n);
  +        n = BIO_read(bio, result, n);
  +        *len = n;
  +    }
       BIO_free(bio);
       return result;
   }
   
  +
   static char *get_cert_serial(X509 *xs)
   {
       char *result;
  @@ -186,6 +205,7 @@
   {
       tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
       jbyteArray array = NULL;
  +    apr_status_t rv = APR_SUCCESS;
   
       UNREFERENCED(o);
       TCN_ASSERT(sock != 0);
  @@ -204,6 +224,56 @@
               tcn_ThrowAPRException(e, APR_EINVAL);
           break;
       }
  +    if (what & SSL_INFO_CLIENT_MASK) {
  +        X509 *xs;
  +        unsigned char *result;
  +        int len;
  +        if ((xs = SSL_get_peer_certificate(s->ssl)) != NULL) {
  +            switch (what) {
  +                case SSL_INFO_CLIENT_CERT:
  +                    if ((result = get_cert_ASN1(xs, &len))) {
  +                        array = tcn_new_arrayb(e, result, len);
  +                        free(result);
  +                    }
  +                break;
  +            }
  +            X509_free(xs);
  +        }
  +        rv = APR_SUCCESS;
  +    }
  +    else if (what & SSL_INFO_SERVER_MASK) {
  +        X509 *xs;
  +        unsigned char *result;
  +        int len;
  +        if ((xs = SSL_get_certificate(s->ssl)) != NULL) {
  +            switch (what) {
  +                case SSL_INFO_SERVER_CERT:
  +                    if ((result = get_cert_ASN1(xs, &len))) {
  +                        array = tcn_new_arrayb(e, result, len);
  +                        free(result);
  +                    }
  +                break;
  +            }
  +            /* XXX: No need to call the X509_free(xs); */
  +        }
  +        rv = APR_SUCCESS;
  +    }
  +    else if (what & SSL_INFO_CLIENT_CERT_CHAIN) {
  +        X509 *xs;
  +        unsigned char *result;
  +        STACK_OF(X509) *sk =  SSL_get_peer_cert_chain(s->ssl);
  +        int len, n = what & 0x0F;
  +        if (n < sk_X509_num(sk)) {
  +            xs = sk_X509_value(sk, n);
  +            if ((result = get_cert_ASN1(xs, &len))) {
  +                array = tcn_new_arrayb(e, result, len);
  +                free(result);
  +            }
  +        }
  +        rv = APR_SUCCESS;
  +    }
  +    if (rv != APR_SUCCESS)
  +        tcn_ThrowAPRException(e, rv);
   
       return array;
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to