On Sat, Jul 02, 2016 at 06:48:58PM +0200, Hilko Bengen wrote:
> control: tag -1 help
> control: tag -1 moreinfo
> 
> Hi Kurt,
> 
> I have prepared a patch that allows most of bro to build with OpenSSL
> 1.1. There are still some issues that I haven't been able to figure out
> with looking at the OpenSSL source. Please have a look at the attached
> patch.
> 
> The remaining issues (all in
> bro-2.4.0+dfsg/src/file_analysis/analyzer/x509/functions.bif) are about
> what seems to be missing OCSP getter functions:
> 
> - For OCSP_RECPID *rid:
>   - rid->type
>   - rid->value.byKey->length
>   - rid->value.byKey->data

I guess that's OCSP_RESPID.


> - For OCSP_BASICRESP *basic:
>   - basic->certs
>   - basic->tbsResponseData->responderId

Will look into it.


I also had a quick view at your patch.


> @@ -138,7 +138,9 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* 
> cert_val, const char*
>       // we only read 255 bytes because byte 256 is always 0.
>       // if the string is longer than 255, that will be our null-termination,
>       // otherwhise i2t does null-terminate.
> -     if ( ! i2t_ASN1_OBJECT(buf, 255, 
> ssl_cert->cert_info->key->algor->algorithm) )
> +     ASN1_OBJECT *algorithm;
> +     X509_PUBKEY_get0_param(&algorithm, NULL, NULL, NULL, 
> X509_get_X509_PUBKEY(ssl_cert));
> +     if ( ! i2t_ASN1_OBJECT(buf, 255, algorithm) )
>               buf[0] = 0;
>  
>       pX509Cert->Assign(7, new StringVal(buf));
> @@ -149,14 +151,17 @@ RecordVal* 
> file_analysis::X509::ParseCertificate(X509Val* cert_val, const char*
>       // actually should be (namely - rsaEncryption), so that OpenSSL will 
> parse out the
>       // key later. Otherwise it will just fail to parse the certificate key.
>  
> -     ASN1_OBJECT* old_algorithm = 0;
> -     if ( OBJ_obj2nid(ssl_cert->cert_info->key->algor->algorithm) == 
> NID_md5WithRSAEncryption )
> +     if ( X509_get_signature_nid(ssl_cert) == NID_md5WithRSAEncryption )
>               {
> -             old_algorithm = ssl_cert->cert_info->key->algor->algorithm;
> -             ssl_cert->cert_info->key->algor->algorithm = 
> OBJ_nid2obj(NID_rsaEncryption);
> +             X509_PUBKEY_set0_param(X509_get_X509_PUBKEY(ssl_cert), 
> OBJ_nid2obj(NID_rsaEncryption), 0, NULL, NULL, 0);
> +             }
> +        else
> +             {
> +             ASN1_OBJECT_free(algorithm);
> +             algorithm = 0;
>               }

The manpage says that algorithm is an internal pointer that should
not be freed.

> @@ -165,14 +170,16 @@ RecordVal* 
> file_analysis::X509::ParseCertificate(X509Val* cert_val, const char*
>       EVP_PKEY *pkey = X509_extract_key(ssl_cert);
>       if ( pkey != NULL )
>               {
> -             if ( pkey->type == EVP_PKEY_DSA )
> +             if ( DSA *dsa = EVP_PKEY_get0_DSA(pkey) )

I think you're looking EVP_PKEY_base_id?

> @@ -357,15 +357,15 @@ function x509_ocsp_verify%(certs: x509_opaque_vector, 
> ocsp_reply: string, root_c
>       else
>               {
>               // issuer not in list sent by server, check store
> -             X509_OBJECT obj;
> -             int lookup = X509_STORE_get_by_subject(csc, X509_LU_X509, 
> X509_get_subject_name(cert), &obj);
> +             X509_OBJECT *obj = X509_OBJECT_new();
> +             int lookup = X509_STORE_get_by_subject(csc, X509_LU_X509, 
> X509_get_subject_name(cert), obj);
>               if ( lookup <= 0)
>                       {
>                       rval = x509_result_record(lookup, "Could not find 
> issuer of host certificate");
>                       goto x509_ocsp_cleanup;
>                       }
>  
> -             certid = OCSP_cert_to_id(NULL, cert, obj.data.x509);
> +             certid = OCSP_cert_to_id(NULL, cert,X509_OBJECT_get0_X509( 
> obj));

I think you forgot to call X509_OBJECT_free(obj) here.



Kurt

Reply via email to