Fix EVP_get_digestbyobj for NID-less ASN1_OBJECTs. The recent rewrite didn't account for the OID being missing but the NID present. Change-Id: I335e52324c62ee3ba849c0c385aaf86123a8ffbb Reviewed-on: https://boringssl-review.googlesource.com/13660 Commit-Queue: David Benjamin <davidben@google.com> Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/digest/digest_test.cc b/crypto/digest/digest_test.cc index 8b29236..36a62ab 100644 --- a/crypto/digest/digest_test.cc +++ b/crypto/digest/digest_test.cc
@@ -18,12 +18,14 @@ #include <memory> +#include <openssl/asn1.h> #include <openssl/crypto.h> #include <openssl/digest.h> #include <openssl/err.h> #include <openssl/md4.h> #include <openssl/md5.h> #include <openssl/nid.h> +#include <openssl/obj.h> #include <openssl/sha.h> #include "../internal.h" @@ -250,6 +252,14 @@ return false; } + bssl::UniquePtr<ASN1_OBJECT> obj(OBJ_txt2obj("1.3.14.3.2.26", 0)); + if (!obj || + EVP_get_digestbyobj(obj.get()) != EVP_sha1() || + EVP_get_digestbyobj(OBJ_nid2obj(NID_md5_sha1)) != EVP_md5_sha1() || + EVP_get_digestbyobj(OBJ_nid2obj(NID_sha1)) != EVP_sha1()) { + return false; + } + return true; }
diff --git a/crypto/digest/digests.c b/crypto/digest/digests.c index 9656027..fd2a939 100644 --- a/crypto/digest/digests.c +++ b/crypto/digest/digests.c
@@ -329,6 +329,11 @@ }; const EVP_MD *EVP_get_digestbyobj(const ASN1_OBJECT *obj) { + /* Handle objects with no corresponding OID. */ + if (obj->nid != NID_undef) { + return EVP_get_digestbynid(obj->nid); + } + for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kMDOIDs); i++) { if (obj->length == kMDOIDs[i].oid_len && memcmp(obj->data, kMDOIDs[i].oid, obj->length) == 0) {