Define V_ASN1_RELATIVE_OID tag number

Hook up ASN.1 tag 13 to existing functions.

Bug: 571178555
Change-Id: I7af4e8dd88868dd0b8d02478f36557326a6a6964
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/103928
Reviewed-by: David Benjamin <davidben@google.com>
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: David Benjamin <davidben@google.com>
Auto-Submit: Lily Chen <chlily@google.com>
diff --git a/crypto/asn1/a_type.cc b/crypto/asn1/a_type.cc
index 4aac69a..35e0534 100644
--- a/crypto/asn1/a_type.cc
+++ b/crypto/asn1/a_type.cc
@@ -292,6 +292,12 @@
         return 0;
       }
       break;
+    case CBS_ASN1_RELATIVE_OID:
+      if (!CBS_is_valid_asn1_relative_oid(&body)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
+        return 0;
+      }
+      break;
     case CBS_ASN1_NULL:
       if (CBS_len(&body) != 0) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH);
diff --git a/crypto/asn1/asn1_par.cc b/crypto/asn1/asn1_par.cc
index 7767cca..54921d5 100644
--- a/crypto/asn1/asn1_par.cc
+++ b/crypto/asn1/asn1_par.cc
@@ -30,7 +30,7 @@
       "ENUMERATED",
       "<ASN1 11>",
       "UTF8STRING",
-      "<ASN1 13>",
+      "RELATIVE-OID",
       "<ASN1 14>",
       "<ASN1 15>",
       "SEQUENCE",
diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc
index 8a1d2ec..aa1e3bd 100644
--- a/crypto/asn1/asn1_test.cc
+++ b/crypto/asn1/asn1_test.cc
@@ -647,6 +647,9 @@
       // [UNIVERSAL 128] { `00` }
       // Unknown universal tags are parsed as `V_ASN1_OTHER`.
       {V_ASN1_OTHER, {0x1f, 0x81, 0x00, 0x01, 0x00}},
+      // RELATIVE-OID { 32473.1 }
+      // RELATIVE-OID has no dedicated `ASN1_TYPE` representation.
+      {V_ASN1_OTHER, {0x0d, 0x04, 0x81, 0xfd, 0x59, 0x01}},
   };
   for (const auto &t : kTests) {
     SCOPED_TRACE(Bytes(t.der));
@@ -710,6 +713,7 @@
       {0x26, 0x00},  // [OBJECT IDENTIFIER CONSTRUCTED] {}
       {0x2a, 0x00},  // [ENUMERATED CONSTRUCTED] {}
       {0x2c, 0x00},  // [UTF8String CONSTRUCTED] {}
+      {0x2d, 0x00},  // [RELATIVE-OID CONSTRUCTED] {}
       {0x3c, 0x00},  // [UniversalString CONSTRUCTED] {}
       {0x3e, 0x00},  // [BMPString CONSTRUCTED] {}
       // Supported constructed types should be rejected if primitive.
@@ -723,6 +727,9 @@
       {0x0a, 0x02, 0x00, 0x00},  // ENUMERATED { `0000` }
       {0x06, 0x00},              // OBJECT_IDENTIFIER { }
       {0x06, 0x01, 0xff},        // OBJECT_IDENTIFIER { `ff` }
+      {0x0d, 0x00},              // RELATIVE-OID { }
+      {0x0d, 0x01, 0xff},        // RELATIVE-OID { `ff` }
+      {0x0d, 0x02, 0x80, 0x01},  // RELATIVE-OID { `8001` }
       {0x03, 0x01, 0xff},        // BIT_STRING { `ff` }
       {0x05, 0x01, 0xff},        // NULL { `ff` }
       {0x01, 0x00},              // BOOLEAN {}
diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h
index 1dae5f7..f92153d 100644
--- a/include/openssl/asn1.h
+++ b/include/openssl/asn1.h
@@ -90,6 +90,7 @@
 #define V_ASN1_REAL 9
 #define V_ASN1_ENUMERATED 10
 #define V_ASN1_UTF8STRING 12
+#define V_ASN1_RELATIVE_OID 13
 #define V_ASN1_SEQUENCE 16
 #define V_ASN1_SET 17
 #define V_ASN1_NUMERICSTRING 18
diff --git a/include/openssl/bytestring.h b/include/openssl/bytestring.h
index d1d607c..3a49beb 100644
--- a/include/openssl/bytestring.h
+++ b/include/openssl/bytestring.h
@@ -238,6 +238,7 @@
 #define CBS_ASN1_OBJECT 0x6u
 #define CBS_ASN1_ENUMERATED 0xau
 #define CBS_ASN1_UTF8STRING 0xcu
+#define CBS_ASN1_RELATIVE_OID 0xdu
 #define CBS_ASN1_SEQUENCE (0x10u | CBS_ASN1_CONSTRUCTED)
 #define CBS_ASN1_SET (0x11u | CBS_ASN1_CONSTRUCTED)
 #define CBS_ASN1_NUMERICSTRING 0x12u