14969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin/* Copyright (c) 2016, Google Inc.
24969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin *
34969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * Permission to use, copy, modify, and/or distribute this software for any
44969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * purpose with or without fee is hereby granted, provided that the above
54969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * copyright notice and this permission notice appear in all copies.
64969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin *
74969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
84969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
94969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
104969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
114969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
124969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
134969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
144969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
158ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#include <gtest/gtest.h>
164969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
17c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin#include <openssl/asn1.h>
184969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin#include <openssl/bytestring.h>
194969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin#include <openssl/crypto.h>
204969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin#include <openssl/obj.h>
214969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
2269939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan#include "../internal.h"
2369939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan
244969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
258ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert SloanTEST(ObjTest, TestBasic) {
264969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const int kNID = NID_sha256WithRSAEncryption;
274969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const char kShortName[] = "RSA-SHA256";
284969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const char kLongName[] = "sha256WithRSAEncryption";
294969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const char kText[] = "1.2.840.113549.1.1.11";
304969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const uint8_t kDER[] = {
314969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin      0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
324969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  };
334969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
344969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  CBS cbs;
354969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  CBS_init(&cbs, kDER, sizeof(kDER));
368ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_cbs2nid(&cbs));
378ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_sn2nid(kShortName));
388ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_ln2nid(kLongName));
398ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_txt2nid(kShortName));
408ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_txt2nid(kLongName));
418ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(kNID, OBJ_txt2nid(kText));
424969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
438ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_STREQ(kShortName, OBJ_nid2sn(kNID));
448ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_STREQ(kLongName, OBJ_nid2ln(kNID));
454969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
468ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(NID_undef, OBJ_sn2nid("this is not an OID"));
478ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(NID_undef, OBJ_ln2nid("this is not an OID"));
488ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(NID_undef, OBJ_txt2nid("this is not an OID"));
494969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
504969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  CBS_init(&cbs, NULL, 0);
518ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(NID_undef, OBJ_cbs2nid(&cbs));
524969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
534969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  // 1.2.840.113554.4.1.72585.2 (https://davidben.net/oid).
544969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  static const uint8_t kUnknownDER[] = {
554969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin      0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02,
564969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  };
574969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  CBS_init(&cbs, kUnknownDER, sizeof(kUnknownDER));
588ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(NID_undef, OBJ_cbs2nid(&cbs));
594969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin}
604969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
618ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert SloanTEST(ObjTest, TestSignatureAlgorithms) {
624969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  int digest_nid, pkey_nid;
638ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(OBJ_find_sigid_algs(NID_sha256WithRSAEncryption, &digest_nid,
648ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                                  &pkey_nid));
658ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(digest_nid, NID_sha256);
668ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(pkey_nid, NID_rsaEncryption);
674969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
688ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_FALSE(OBJ_find_sigid_algs(NID_sha256, &digest_nid, &pkey_nid));
694969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
704969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin  int sign_nid;
718ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(OBJ_find_sigid_by_algs(&sign_nid, NID_sha256, NID_rsaEncryption));
728ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(sign_nid, NID_sha256WithRSAEncryption);
738ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_FALSE(OBJ_find_sigid_by_algs(&sign_nid, NID_dsa, NID_rsaEncryption));
744969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin}
754969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
76c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjaminstatic bool ExpectObj2Txt(const uint8_t *der, size_t der_len,
77c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin                          bool always_return_oid, const char *expected) {
78c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  ASN1_OBJECT obj;
7969939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan  OPENSSL_memset(&obj, 0, sizeof(obj));
80c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.data = der;
81c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.length = static_cast<int>(der_len);
82c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
83c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  int expected_len = static_cast<int>(strlen(expected));
84c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
85c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  int len = OBJ_obj2txt(nullptr, 0, &obj, always_return_oid);
86c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  if (len != expected_len) {
87c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    fprintf(stderr,
88c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            "OBJ_obj2txt of %s with out_len = 0 returned %d, wanted %d.\n",
89c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            expected, len, expected_len);
90c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    return false;
91c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  }
92c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
93c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  char short_buf[1];
9469939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan  OPENSSL_memset(short_buf, 0xff, sizeof(short_buf));
95c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  len = OBJ_obj2txt(short_buf, sizeof(short_buf), &obj, always_return_oid);
96c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  if (len != expected_len) {
97c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    fprintf(stderr,
98c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            "OBJ_obj2txt of %s with out_len = 1 returned %d, wanted %d.\n",
99c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            expected, len, expected_len);
100c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    return false;
101c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  }
102c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
10369939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan  if (OPENSSL_memchr(short_buf, '\0', sizeof(short_buf)) == nullptr) {
104c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    fprintf(stderr,
105c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            "OBJ_obj2txt of %s with out_len = 1 did not NUL-terminate the "
106c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            "output.\n",
107c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            expected);
108c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    return false;
109c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  }
110c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
111c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  char buf[256];
112c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  len = OBJ_obj2txt(buf, sizeof(buf), &obj, always_return_oid);
113c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  if (len != expected_len) {
114c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    fprintf(stderr,
115c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            "OBJ_obj2txt of %s with out_len = 256 returned %d, wanted %d.\n",
116c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            expected, len, expected_len);
117c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    return false;
118c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  }
119c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
120c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  if (strcmp(buf, expected) != 0) {
121c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    fprintf(stderr, "OBJ_obj2txt returned \"%s\"; wanted \"%s\".\n", buf,
122c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin            expected);
123c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin    return false;
124c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  }
125c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
126c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  return true;
127c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin}
128c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
1298ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert SloanTEST(ObjTest, TestObj2Txt) {
130c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kSHA256WithRSAEncryption is the DER representation of
131c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // 1.2.840.113549.1.1.11, id-sha256WithRSAEncryption.
132c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kSHA256WithRSAEncryption[] = {
133c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
134c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
135c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
136c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kBasicConstraints is the DER representation of 2.5.29.19,
137c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // id-basicConstraints.
138c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kBasicConstraints[] = {
139c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x55, 0x1d, 0x13,
140c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
141c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
142c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kTestOID is the DER representation of 1.2.840.113554.4.1.72585.0,
143c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // from https://davidben.net/oid.
144c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kTestOID[] = {
145c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x00,
146c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
147c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
1488ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(
1498ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan      ExpectObj2Txt(kSHA256WithRSAEncryption, sizeof(kSHA256WithRSAEncryption),
1508ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                    true /* don't return name */, "1.2.840.113549.1.1.11"));
1518ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(
1528ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan      ExpectObj2Txt(kSHA256WithRSAEncryption, sizeof(kSHA256WithRSAEncryption),
1538ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                    false /* return name */, "sha256WithRSAEncryption"));
1548ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(kBasicConstraints, sizeof(kBasicConstraints),
1558ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            true /* don't return name */, "2.5.29.19"));
1568ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(kBasicConstraints, sizeof(kBasicConstraints),
1578ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            false /* return name */,
1588ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            "X509v3 Basic Constraints"));
1598ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(kTestOID, sizeof(kTestOID),
1608ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            true /* don't return name */,
1618ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            "1.2.840.113554.4.1.72585.0"));
1628ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(kTestOID, sizeof(kTestOID), false /* return name */,
1638ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            "1.2.840.113554.4.1.72585.0"));
1648ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  // Python depends on the empty OID successfully encoding as the empty
1658ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  // string.
1668ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(nullptr, 0, false /* return name */, ""));
1678ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_TRUE(ExpectObj2Txt(nullptr, 0, true /* don't return name */, ""));
168c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
169c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  ASN1_OBJECT obj;
17069939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan  OPENSSL_memset(&obj, 0, sizeof(obj));
171c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
172c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kNonMinimalOID is kBasicConstraints with the final component non-minimally
173c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // encoded.
174c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kNonMinimalOID[] = {
175c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x55, 0x1d, 0x80, 0x13,
176c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
177c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.data = kNonMinimalOID;
178c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.length = sizeof(kNonMinimalOID);
1798ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(-1, OBJ_obj2txt(NULL, 0, &obj, 0));
180c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
181c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kOverflowOID is the DER representation of
182c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // 1.2.840.113554.4.1.72585.18446744073709551616. (The final value is 2^64.)
183c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kOverflowOID[] = {
184c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09,
185c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
186c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
187c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.data = kOverflowOID;
188c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.length = sizeof(kOverflowOID);
1898ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(-1, OBJ_obj2txt(NULL, 0, &obj, 0));
190c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin
191c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // kInvalidOID is a mis-encoded version of kBasicConstraints with the final
192c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  // octet having the high bit set.
193c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  static const uint8_t kInvalidOID[] = {
194c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin      0x55, 0x1d, 0x93,
195c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  };
196c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.data = kInvalidOID;
197c895d6b1c580258e72e1ed3fcc86d38970ded9e1David Benjamin  obj.length = sizeof(kInvalidOID);
1988ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan  ASSERT_EQ(-1, OBJ_obj2txt(NULL, 0, &obj, 0));
1994969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin}
200