| From 0c35749891bf834c1f3c1c4c330266bd2f4733cc Mon Sep 17 00:00:00 2001 | 
| From: Khem Raj <raj.khem@gmail.com> | 
| Date: Sun, 9 Sep 2018 10:40:09 -0700 | 
| Subject: [PATCH] Forward port to OpenSSL 1.1.x | 
|   | 
| * import patch from debian | 
| https://sources.debian.org/src/wvstreams/4.6.1-14/debian/patches/wvstreams_openssl1.1.patch | 
| Author: Reiner Herrmann <reiner@reiner-h.de> | 
|   | 
| Upstream-Status: Submitted [https://github.com/apenwarr/wvstreams/pull/2] | 
| Signed-off-by: Khem Raj <raj.khem@gmail.com> | 
| --- | 
|  crypto/wvcrl.cc           | 38 +++++++++++++------------------------- | 
|  crypto/wvdiffiehellman.cc | 30 +++++++++++++++++++----------- | 
|  crypto/wvdigest.cc        | 16 ++++++++-------- | 
|  crypto/wvocsp.cc          | 35 +++++++++-------------------------- | 
|  crypto/wvx509.cc          | 31 ++++++++++++++++--------------- | 
|  crypto/wvx509mgr.cc       | 27 ++++++++++++++++----------- | 
|  include/wvdiffiehellman.h |  2 +- | 
|  include/wvdigest.h        | 14 ++++++-------- | 
|  include/wvtripledes.h     | 10 +++++----- | 
|  9 files changed, 93 insertions(+), 110 deletions(-) | 
|   | 
| diff --git a/crypto/wvcrl.cc b/crypto/wvcrl.cc | 
| index fa00c76..880ad85 100644 | 
| --- a/crypto/wvcrl.cc | 
| +++ b/crypto/wvcrl.cc | 
| @@ -357,31 +357,19 @@ bool WvCRL::isrevoked(WvStringParm serial_number) const | 
|      ASN1_INTEGER *serial = serial_to_int(serial_number); | 
|      if (serial) | 
|      { | 
| -        X509_REVOKED mayberevoked; | 
| -        mayberevoked.serialNumber = serial; | 
| -        if (crl->crl->revoked) | 
| -        { | 
| -        int idx = sk_X509_REVOKED_find(crl->crl->revoked,  | 
| -                           &mayberevoked); | 
| -        ASN1_INTEGER_free(serial); | 
| -        if (idx >= 0) | 
| -                { | 
| -                    debug("Certificate is revoked.\n"); | 
| -            return true; | 
| -                } | 
| -                else | 
| -                { | 
| -                    debug("Certificate is not revoked.\n"); | 
| -            return false; | 
| -                } | 
| -        } | 
| -        else | 
| -        { | 
| -        ASN1_INTEGER_free(serial); | 
| -        debug("CRL does not have revoked list.\n"); | 
| -                return false; | 
| -        } | 
| -         | 
| +        X509_REVOKED *revoked_entry = NULL; | 
| +        int idx = X509_CRL_get0_by_serial(crl, &revoked_entry, serial); | 
| +        ASN1_INTEGER_free(serial); | 
| +        if (idx >= 1 || revoked_entry) | 
| +            { | 
| +                debug("Certificate is revoked.\n"); | 
| +            return true; | 
| +            } | 
| +            else | 
| +            { | 
| +                debug("Certificate is not revoked.\n"); | 
| +            return false; | 
| +            } | 
|      } | 
|      else | 
|          debug(WvLog::Warning, "Can't convert serial number to ASN1 format. " | 
| diff --git a/crypto/wvdiffiehellman.cc b/crypto/wvdiffiehellman.cc | 
| index 7c0bf32..15cd104 100644 | 
| --- a/crypto/wvdiffiehellman.cc | 
| +++ b/crypto/wvdiffiehellman.cc | 
| @@ -39,24 +39,25 @@ WvDiffieHellman::WvDiffieHellman(const unsigned char *_key, int _keylen, | 
|  { | 
|      int problems; | 
|      int check; | 
| -    { | 
| + | 
|      info = DH_new(); | 
| -    info->p = BN_bin2bn(_key, _keylen, NULL); | 
| +    BIGNUM *p = BN_bin2bn(_key, _keylen, NULL); | 
|  //     info->p->top = 0; | 
|  //     info->p->dmax = _keylen * 8 / BN_BITS2; | 
|  //     info->p->neg = 0; | 
|  //     info->p->flags = 0; | 
|   | 
| -    info->g = BN_new(); | 
| -    BN_set_word(info->g, generator); | 
| +    BIGNUM *g = BN_new(); | 
| +    BN_set_word(g, generator); | 
|  //     info->g->d = &generator; | 
|  //      info->g->top = 0; | 
|  //      info->g->dmax = 1; | 
|  //      info->g->neg = 0; | 
|  //      info->g->flags = 0; | 
| -    } | 
|   | 
| -    check = BN_mod_word(info->p, 24); | 
| +    DH_set0_pqg(info, p, NULL, g); | 
| + | 
| +    check = BN_mod_word(p, 24); | 
|      DH_check(info, &problems); | 
|      if (problems & DH_CHECK_P_NOT_PRIME) | 
|       log(WvLog::Error, "Using a composite number for authentication.\n"); | 
| @@ -64,7 +65,7 @@ WvDiffieHellman::WvDiffieHellman(const unsigned char *_key, int _keylen, | 
|      log(WvLog::Error,"Using an unsafe prime number for authentication.\n"); | 
|      if (problems & DH_NOT_SUITABLE_GENERATOR) | 
|      log(WvLog::Error, "Can you just use 2 instead of %s (%s)!!\n", | 
| -        BN_bn2hex(info->g), check); | 
| +        BN_bn2hex(g), check); | 
|      if (problems & DH_UNABLE_TO_CHECK_GENERATOR) | 
|      log(WvLog::Notice, "Using a strange argument for diffie-hellman.\n"); | 
|      DH_generate_key(info); | 
| @@ -72,18 +73,23 @@ WvDiffieHellman::WvDiffieHellman(const unsigned char *_key, int _keylen, | 
|   | 
|  int WvDiffieHellman::pub_key_len() | 
|  { | 
| -    return BN_num_bytes(info->pub_key); | 
| +    const BIGNUM *pub_key = NULL; | 
| +    DH_get0_key(info, &pub_key, NULL); | 
| +    return BN_num_bytes(pub_key); | 
|  } | 
|   | 
|  int WvDiffieHellman::get_public_value(WvBuf &outbuf, int len) | 
|  { | 
| -    int key_len = BN_num_bytes(info->pub_key); | 
| +    const BIGNUM *pub_key = NULL; | 
| +    DH_get0_key(info, &pub_key, NULL); | 
| + | 
| +    int key_len = BN_num_bytes(pub_key); | 
|      if (key_len < len) | 
|      len = key_len; | 
|   | 
|      // alloca is stack allocated, don't free it. | 
|      unsigned char *foo = (unsigned char*)alloca(key_len); | 
| -    BN_bn2bin(info->pub_key, foo); | 
| +    BN_bn2bin(pub_key, foo); | 
|      outbuf.put(foo, len); | 
|   | 
|      return len; | 
| @@ -91,8 +97,10 @@ int WvDiffieHellman::get_public_value(WvBuf &outbuf, int len) | 
|   | 
|  bool WvDiffieHellman::create_secret(WvBuf &inbuf, size_t in_len, WvBuf& outbuf) | 
|  { | 
| +   const BIGNUM *pub_key = NULL; | 
| +   DH_get0_key(info, &pub_key, NULL); | 
|      unsigned char *foo = (unsigned char *)alloca(DH_size(info)); | 
| -   log("My public value\n%s\nYour public value\n%s\n",BN_bn2hex(info->pub_key), | 
| +   log("My public value\n%s\nYour public value\n%s\n",BN_bn2hex(pub_key), | 
|         hexdump_buffer(inbuf.peek(0, in_len), in_len, false)); | 
|      int len = DH_compute_key (foo, BN_bin2bn(inbuf.get(in_len), in_len, NULL),  | 
|                    info); | 
| diff --git a/crypto/wvdigest.cc b/crypto/wvdigest.cc | 
| index 150edee..73ebb5d 100644 | 
| --- a/crypto/wvdigest.cc | 
| +++ b/crypto/wvdigest.cc | 
| @@ -13,10 +13,10 @@ | 
|   | 
|  /***** WvEVPMDDigest *****/ | 
|   | 
| -WvEVPMDDigest::WvEVPMDDigest(const env_md_st *_evpmd) : | 
| +WvEVPMDDigest::WvEVPMDDigest(const EVP_MD*_evpmd) : | 
|      evpmd(_evpmd), active(false) | 
|  { | 
| -    evpctx = new EVP_MD_CTX; | 
| +    evpctx = EVP_MD_CTX_new(); | 
|      _reset(); | 
|  } | 
|   | 
| @@ -24,7 +24,7 @@ WvEVPMDDigest::WvEVPMDDigest(const env_md_st *_evpmd) : | 
|  WvEVPMDDigest::~WvEVPMDDigest() | 
|  { | 
|      cleanup(); | 
| -    delete evpctx; | 
| +    EVP_MD_CTX_free(evpctx); | 
|  } | 
|   | 
|   | 
| @@ -60,7 +60,7 @@ bool WvEVPMDDigest::_reset() | 
|      // the typecast is necessary for API compatibility with different | 
|      // versions of openssl.  None of them *actually* change the contents of | 
|      // the pointer. | 
| -    EVP_DigestInit(evpctx, (env_md_st *)evpmd); | 
| +    EVP_DigestInit(evpctx, evpmd); | 
|      active = true; | 
|      return true; | 
|  } | 
| @@ -79,7 +79,7 @@ void WvEVPMDDigest::cleanup() | 
|   | 
|  size_t WvEVPMDDigest::digestsize() const | 
|  { | 
| -    return EVP_MD_size((env_md_st *)evpmd); | 
| +    return EVP_MD_size(evpmd); | 
|  } | 
|   | 
|   | 
| @@ -104,14 +104,14 @@ WvHMACDigest::WvHMACDigest(WvEVPMDDigest *_digest, | 
|  { | 
|      key = new unsigned char[keysize]; | 
|      memcpy(key, _key, keysize); | 
| -    hmacctx = new HMAC_CTX; | 
| +    hmacctx = HMAC_CTX_new(); | 
|      _reset(); | 
|  } | 
|   | 
|  WvHMACDigest::~WvHMACDigest() | 
|  { | 
|      cleanup(); | 
| -    delete hmacctx; | 
| +    HMAC_CTX_free(hmacctx); | 
|      deletev key; | 
|      delete digest; | 
|  } | 
| @@ -145,7 +145,7 @@ bool WvHMACDigest::_finish(WvBuf &outbuf) | 
|  bool WvHMACDigest::_reset() | 
|  { | 
|      cleanup(); | 
| -    HMAC_Init(hmacctx, key, keysize, (env_md_st *)digest->getevpmd()); | 
| +    HMAC_Init(hmacctx, key, keysize, digest->getevpmd()); | 
|      active = true; | 
|      return true; | 
|  } | 
| diff --git a/crypto/wvocsp.cc b/crypto/wvocsp.cc | 
| index ddb2de4..7d5da07 100644 | 
| --- a/crypto/wvocsp.cc | 
| +++ b/crypto/wvocsp.cc | 
| @@ -118,9 +118,10 @@ bool WvOCSPResp::check_nonce(const WvOCSPReq &req) const | 
|   | 
|  bool WvOCSPResp::signedbycert(const WvX509 &cert) const | 
|  { | 
| -    EVP_PKEY *skey = X509_get_pubkey(cert.cert); | 
| -    int i = OCSP_BASICRESP_verify(bs, skey, 0); | 
| -    EVP_PKEY_free(skey); | 
| +    STACK_OF(X509) *sk = sk_X509_new_null(); | 
| +    sk_X509_push(sk, cert.cert); | 
| +    int i = OCSP_basic_verify(bs, sk, NULL, OCSP_NOVERIFY); | 
| +    sk_X509_free(sk); | 
|   | 
|      if(i > 0) | 
|          return true; | 
| @@ -131,33 +132,15 @@ bool WvOCSPResp::signedbycert(const WvX509 &cert) const | 
|   | 
|  WvX509 WvOCSPResp::get_signing_cert() const | 
|  { | 
| -    if (!bs || !sk_X509_num(bs->certs)) | 
| +    const STACK_OF(X509) *certs = OCSP_resp_get0_certs(bs); | 
| +    if (!bs || !sk_X509_num(certs)) | 
|          return WvX509(); | 
|   | 
| -    // note: the following bit of code is taken almost verbatim from | 
| -    // ocsp_vfy.c in OpenSSL 0.9.8. Copyright and attribution should  | 
| -    // properly belong to them | 
| - | 
| -    OCSP_RESPID *id = bs->tbsResponseData->responderId; | 
| - | 
| -    if (id->type == V_OCSP_RESPID_NAME) | 
| -    { | 
| -        X509 *x = X509_find_by_subject(bs->certs, id->value.byName); | 
| -        if (x) | 
| -            return WvX509(X509_dup(x)); | 
| +    X509 *signer = NULL; | 
| +    if (OCSP_resp_get0_signer(bs, &signer, NULL) == 1) { | 
| +        return WvX509(X509_dup(signer)); | 
|      } | 
|   | 
| -    if (id->value.byKey->length != SHA_DIGEST_LENGTH) return NULL; | 
| -    unsigned char tmphash[SHA_DIGEST_LENGTH]; | 
| -    unsigned char *keyhash = id->value.byKey->data; | 
| -    for (int i = 0; i < sk_X509_num(bs->certs); i++) | 
| -    { | 
| -        X509 *x = sk_X509_value(bs->certs, i); | 
| -        X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL); | 
| -        if(!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH)) | 
| -            return WvX509(X509_dup(x)); | 
| -    } | 
| -     | 
|      return WvX509(); | 
|  } | 
|   | 
| diff --git a/crypto/wvx509.cc b/crypto/wvx509.cc | 
| index e4925ce..984156c 100644 | 
| --- a/crypto/wvx509.cc | 
| +++ b/crypto/wvx509.cc | 
| @@ -974,7 +974,7 @@ static void add_aia(WvStringParm type, WvString identifier, | 
|      sk_ACCESS_DESCRIPTION_push(ainfo, acc); | 
|      acc->method = OBJ_txt2obj(type.cstr(), 0); | 
|      acc->location->type = GEN_URI; | 
| -    acc->location->d.ia5 = M_ASN1_IA5STRING_new(); | 
| +    acc->location->d.ia5 = ASN1_IA5STRING_new(); | 
|      unsigned char *cident  | 
|      = reinterpret_cast<unsigned char *>(identifier.edit()); | 
|      ASN1_STRING_set(acc->location->d.ia5, cident, identifier.len()); | 
| @@ -1059,7 +1059,7 @@ void WvX509::set_crl_urls(WvStringList &urls) | 
|          GENERAL_NAMES *uris = GENERAL_NAMES_new(); | 
|          GENERAL_NAME *uri = GENERAL_NAME_new(); | 
|          uri->type = GEN_URI; | 
| -        uri->d.ia5 = M_ASN1_IA5STRING_new(); | 
| +        uri->d.ia5 = ASN1_IA5STRING_new(); | 
|          unsigned char *cident | 
|          = reinterpret_cast<unsigned char *>(i().edit());     | 
|          ASN1_STRING_set(uri->d.ia5, cident, i().len()); | 
| @@ -1162,10 +1162,11 @@ WvString WvX509::get_extension(int nid) const | 
|  #else | 
|              X509V3_EXT_METHOD *method = X509V3_EXT_get(ext); | 
|  #endif | 
| +            ASN1_OCTET_STRING *ext_data_str = X509_EXTENSION_get_data(ext); | 
|              if (!method) | 
|              { | 
|                  WvDynBuf buf; | 
| -                buf.put(ext->value->data, ext->value->length); | 
| +                buf.put(ext_data_str->data, ext_data_str->length); | 
|                  retval = buf.getstr(); | 
|              } | 
|              else | 
| @@ -1176,21 +1177,21 @@ WvString WvX509::get_extension(int nid) const | 
|                  // even though it's const (at least as of version 0.9.8e).  | 
|                  // gah. | 
|  #if OPENSSL_VERSION_NUMBER >= 0x0090800fL | 
| -                const unsigned char * ext_value_data = ext->value->data; | 
| +                const unsigned char * ext_value_data = ext_data_str->data; | 
|  #else | 
|                  unsigned char *ext_value_data = ext->value->data; | 
|  #endif | 
|                  if (method->it) | 
|                  { | 
|                      ext_data = ASN1_item_d2i(NULL, &ext_value_data, | 
| -                                             ext->value->length,  | 
| +                                             ext_data_str->length,  | 
|                                               ASN1_ITEM_ptr(method->it)); | 
|                      TRACE("Applied generic conversion!\n"); | 
|                  } | 
|                  else | 
|                  { | 
|                      ext_data = method->d2i(NULL, &ext_value_data, | 
| -                                           ext->value->length); | 
| +                                           ext_data_str->length); | 
|                      TRACE("Applied method specific conversion!\n"); | 
|                  } | 
|                   | 
| @@ -1325,13 +1326,13 @@ bool WvX509::verify(WvBuf &original, WvStringParm signature) const | 
|          return false; | 
|       | 
|      /* Verify the signature */ | 
| -    EVP_MD_CTX sig_ctx; | 
| -    EVP_VerifyInit(&sig_ctx, EVP_sha1()); | 
| -    EVP_VerifyUpdate(&sig_ctx, original.peek(0, original.used()), | 
| +    EVP_MD_CTX *sig_ctx = EVP_MD_CTX_new(); | 
| +    EVP_VerifyInit(sig_ctx, EVP_sha1()); | 
| +    EVP_VerifyUpdate(sig_ctx, original.peek(0, original.used()), | 
|               original.used()); | 
| -    int sig_err = EVP_VerifyFinal(&sig_ctx, sig_buf, sig_size, pk); | 
| +    int sig_err = EVP_VerifyFinal(sig_ctx, sig_buf, sig_size, pk); | 
|      EVP_PKEY_free(pk); | 
| -    EVP_MD_CTX_cleanup(&sig_ctx); // Again, not my fault...  | 
| +    EVP_MD_CTX_free(sig_ctx); // Again, not my fault...  | 
|      if (sig_err != 1)  | 
|      { | 
|          debug("Verify failed!\n"); | 
| @@ -1450,19 +1451,19 @@ void WvX509::set_ski() | 
|  { | 
|      CHECK_CERT_EXISTS_SET("ski"); | 
|   | 
| -    ASN1_OCTET_STRING *oct = M_ASN1_OCTET_STRING_new(); | 
| -    ASN1_BIT_STRING *pk = cert->cert_info->key->public_key; | 
| +    ASN1_OCTET_STRING *oct = ASN1_OCTET_STRING_new(); | 
| +    ASN1_BIT_STRING *pk = X509_get0_pubkey_bitstr(cert); | 
|      unsigned char pkey_dig[EVP_MAX_MD_SIZE]; | 
|      unsigned int diglen; | 
|   | 
|      EVP_Digest(pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), NULL); | 
|   | 
| -    M_ASN1_OCTET_STRING_set(oct, pkey_dig, diglen); | 
| +    ASN1_OCTET_STRING_set(oct, pkey_dig, diglen); | 
|      X509_EXTENSION *ext = X509V3_EXT_i2d(NID_subject_key_identifier, 0,  | 
|                      oct); | 
|      X509_add_ext(cert, ext, -1); | 
|      X509_EXTENSION_free(ext); | 
| -    M_ASN1_OCTET_STRING_free(oct); | 
| +    ASN1_OCTET_STRING_free(oct); | 
|  } | 
|   | 
|   | 
| diff --git a/crypto/wvx509mgr.cc b/crypto/wvx509mgr.cc | 
| index f249eec..156d3a4 100644 | 
| --- a/crypto/wvx509mgr.cc | 
| +++ b/crypto/wvx509mgr.cc | 
| @@ -350,6 +350,8 @@ bool WvX509Mgr::signcert(WvX509 &unsignedcert) const | 
|          return false; | 
|      } | 
|   | 
| +    uint32_t ex_flags = X509_get_extension_flags(cert); | 
| +    uint32_t ex_kusage = X509_get_key_usage(cert); | 
|      if (cert == unsignedcert.cert) | 
|      { | 
|      debug("Self Signing!\n"); | 
| @@ -362,8 +364,8 @@ bool WvX509Mgr::signcert(WvX509 &unsignedcert) const | 
|          return false; | 
|      } | 
|  #endif | 
| -    else if (!((cert->ex_flags & EXFLAG_KUSAGE) &&  | 
| -               (cert->ex_kusage & KU_KEY_CERT_SIGN))) | 
| +    else if (!((ex_flags & EXFLAG_KUSAGE) &&  | 
| +               (ex_kusage & KU_KEY_CERT_SIGN))) | 
|      { | 
|      debug("This Certificate is not allowed to sign certificates!\n"); | 
|      return false; | 
| @@ -390,6 +392,8 @@ bool WvX509Mgr::signcert(WvX509 &unsignedcert) const | 
|   | 
|  bool WvX509Mgr::signcrl(WvCRL &crl) const | 
|  { | 
| +    uint32_t ex_flags = X509_get_extension_flags(cert); | 
| +    uint32_t ex_kusage = X509_get_key_usage(cert); | 
|      if (!isok() || !crl.isok()) | 
|      { | 
|          debug(WvLog::Warning, "Asked to sign CRL, but certificate or CRL (or " | 
| @@ -403,12 +407,12 @@ bool WvX509Mgr::signcrl(WvCRL &crl) const | 
|                "CRLs!\n"); | 
|          return false; | 
|      } | 
| -    else if (!((cert->ex_flags & EXFLAG_KUSAGE) &&  | 
| -      (cert->ex_kusage & KU_CRL_SIGN))) | 
| +    else if (!((ex_flags & EXFLAG_KUSAGE) &&  | 
| +      (ex_kusage & KU_CRL_SIGN))) | 
|      { | 
|      debug("Certificate not allowed to sign CRLs! (%s %s)\n",  | 
| -              (cert->ex_flags & EXFLAG_KUSAGE), | 
| -          (cert->ex_kusage & KU_CRL_SIGN)); | 
| +              (ex_flags & EXFLAG_KUSAGE), | 
| +          (ex_kusage & KU_CRL_SIGN)); | 
|      return false; | 
|      } | 
|  #endif | 
| @@ -454,7 +458,6 @@ WvString WvX509Mgr::sign(WvBuf &data) const | 
|  { | 
|      assert(rsa); | 
|   | 
| -    EVP_MD_CTX sig_ctx; | 
|      unsigned char sig_buf[4096]; | 
|       | 
|      EVP_PKEY *pk = EVP_PKEY_new(); | 
| @@ -467,20 +470,22 @@ WvString WvX509Mgr::sign(WvBuf &data) const | 
|      return WvString::null; | 
|      } | 
|       | 
| -    EVP_SignInit(&sig_ctx, EVP_sha1()); | 
| -    EVP_SignUpdate(&sig_ctx, data.peek(0, data.used()), data.used()); | 
| +    EVP_MD_CTX *sig_ctx = EVP_MD_CTX_new(); | 
| +    EVP_SignInit(sig_ctx, EVP_sha1()); | 
| +    EVP_SignUpdate(sig_ctx, data.peek(0, data.used()), data.used()); | 
|      unsigned int sig_len = sizeof(sig_buf); | 
| -    int sig_err = EVP_SignFinal(&sig_ctx, sig_buf,  | 
| +    int sig_err = EVP_SignFinal(sig_ctx, sig_buf,  | 
|                  &sig_len, pk); | 
|      if (sig_err != 1) | 
|      { | 
|      debug("Error while signing.\n"); | 
|      EVP_PKEY_free(pk); | 
| +    EVP_MD_CTX_free(sig_ctx); | 
|      return WvString::null; | 
|      } | 
|   | 
|      EVP_PKEY_free(pk); | 
| -    EVP_MD_CTX_cleanup(&sig_ctx); // this isn't my fault :// | 
| +    EVP_MD_CTX_free(sig_ctx); // this isn't my fault :// | 
|      WvDynBuf buf; | 
|      buf.put(sig_buf, sig_len); | 
|      debug("Signature size: %s\n", buf.used()); | 
| diff --git a/include/wvdiffiehellman.h b/include/wvdiffiehellman.h | 
| index af75ffa..a2d001f 100644 | 
| --- a/include/wvdiffiehellman.h | 
| +++ b/include/wvdiffiehellman.h | 
| @@ -27,7 +27,7 @@ public: | 
|      bool create_secret(WvBuf &inbuf, size_t in_len, WvBuf& outbuf); | 
|   | 
|  protected: | 
| -    struct dh_st *info; | 
| +    DH *info; | 
|      BN_ULONG generator; | 
|   | 
|  private: | 
| diff --git a/include/wvdigest.h b/include/wvdigest.h | 
| index fdc39bd..f2eed40 100644 | 
| --- a/include/wvdigest.h | 
| +++ b/include/wvdigest.h | 
| @@ -9,10 +9,8 @@ | 
|   | 
|  #include "wvencoder.h" | 
|  #include <stdint.h> | 
| +#include <openssl/evp.h> | 
|   | 
| -struct env_md_st; | 
| -struct env_md_ctx_st; | 
| -struct hmac_ctx_st; | 
|   | 
|  /** | 
|   * Superclass for all message digests. | 
| @@ -45,8 +43,8 @@ public: | 
|  class WvEVPMDDigest : public WvDigest | 
|  { | 
|      friend class WvHMACDigest; | 
| -    const env_md_st *evpmd; | 
| -    env_md_ctx_st *evpctx; | 
| +    const EVP_MD *evpmd; | 
| +    EVP_MD_CTX *evpctx; | 
|      bool active; | 
|   | 
|  public: | 
| @@ -54,13 +52,13 @@ public: | 
|      virtual size_t digestsize() const; | 
|   | 
|  protected: | 
| -    WvEVPMDDigest(const env_md_st *_evpmd); | 
| +    WvEVPMDDigest(const EVP_MD *_evpmd); | 
|      virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, | 
|          bool flush); // consumes input | 
|      virtual bool _finish(WvBuf &outbuf); // outputs digest | 
|      virtual bool _reset(); // supported: resets digest value | 
|       | 
| -    const env_md_st *getevpmd() | 
| +    const EVP_MD *getevpmd() | 
|          { return evpmd; } | 
|   | 
|  private: | 
| @@ -104,7 +102,7 @@ class WvHMACDigest : public WvDigest | 
|      WvEVPMDDigest *digest; | 
|      unsigned char *key; | 
|      size_t keysize; | 
| -    hmac_ctx_st *hmacctx; | 
| +    HMAC_CTX *hmacctx; | 
|      bool active; | 
|   | 
|  public: | 
| diff --git a/include/wvtripledes.h b/include/wvtripledes.h | 
| index 185fe8a..a442e7a 100644 | 
| --- a/include/wvtripledes.h | 
| +++ b/include/wvtripledes.h | 
| @@ -70,11 +70,11 @@ protected: | 
|   | 
|  private: | 
|      Mode mode; | 
| -    des_cblock key; | 
| -    des_key_schedule deskey1; | 
| -    des_key_schedule deskey2; | 
| -    des_key_schedule deskey3; | 
| -    des_cblock ivec; // initialization vector | 
| +    DES_cblock key; | 
| +    DES_key_schedule deskey1; | 
| +    DES_key_schedule deskey2; | 
| +    DES_key_schedule deskey3; | 
| +    DES_cblock ivec; // initialization vector | 
|      int ivecoff; // current offset into initvec | 
|  }; | 
|   |