Procházet zdrojové kódy

LibCrypto: Add missing ASN1 tag kinds

stelar7 před 2 roky
rodič
revize
8273fc230c

+ 54 - 9
Userland/Libraries/LibCrypto/ASN1/ASN1.cpp

@@ -26,20 +26,66 @@ DeprecatedString kind_name(Kind kind)
         return "Null";
     case Kind::ObjectIdentifier:
         return "ObjectIdentifier";
-    case Kind::IA5String:
-        return "IA5String";
+    case Kind::ObjectDescriptor:
+        return "ObjectDescriptor";
+    case Kind::External:
+        return "External";
+    case Kind::Real:
+        return "Real";
+    case Kind::Enumerated:
+        return "Enumerated";
+    case Kind::EmbeddedPdv:
+        return "EmbeddedPdv";
+    case Kind::Utf8String:
+        return "Utf8String";
+    case Kind::RelativeOid:
+        return "RelativeOid";
+    case Kind::Time:
+        return "Time";
+    case Kind::Reserved:
+        return "Reserved";
+    case Kind::Sequence:
+        return "Sequence";
+    case Kind::Set:
+        return "Set";
+    case Kind::NumericString:
+        return "NumericString";
     case Kind::PrintableString:
         return "PrintableString";
-    case Kind::Utf8String:
-        return "UTF8String";
+    case Kind::T61String:
+        return "T61String";
+    case Kind::VideotexString:
+        return "VideotexString";
+    case Kind::IA5String:
+        return "IA5String";
     case Kind::UTCTime:
         return "UTCTime";
     case Kind::GeneralizedTime:
         return "GeneralizedTime";
-    case Kind::Sequence:
-        return "Sequence";
-    case Kind::Set:
-        return "Set";
+    case Kind::GraphicString:
+        return "GraphicString";
+    case Kind::VisibleString:
+        return "VisibleString";
+    case Kind::GeneralString:
+        return "GeneralString";
+    case Kind::UniversalString:
+        return "UniversalString";
+    case Kind::CharacterString:
+        return "CharacterString";
+    case Kind::BMPString:
+        return "BMPString";
+    case Kind::Date:
+        return "Date";
+    case Kind::TimeOfDay:
+        return "TimeOfDay";
+    case Kind::DateTime:
+        return "DateTime";
+    case Kind::Duration:
+        return "Duration";
+    case Kind::OidIri:
+        return "OidIri";
+    case Kind::RelativeOidIri:
+        return "RelativeOidIri";
     }
 
     return "InvalidKind";
@@ -190,5 +236,4 @@ done_parsing:;
     // Unceremoniously drop the milliseconds on the floor.
     return Core::DateTime::create(year.value(), month.value(), day.value(), hour.value(), minute.value_or(0), seconds.value_or(0));
 }
-
 }

+ 30 - 7
Userland/Libraries/LibCrypto/ASN1/ASN1.h

@@ -12,22 +12,45 @@
 
 namespace Crypto::ASN1 {
 
+// ITU-T X.680, section 8, table 1
 enum class Kind : u8 {
-    Eol,
+    Eol = 0x00,
     Boolean = 0x01,
     Integer = 0x02,
     BitString = 0x03,
     OctetString = 0x04,
     Null = 0x05,
     ObjectIdentifier = 0x06,
-    IA5String = 0x16,
-    PrintableString = 0x13,
-    Utf8String = 0x0c,
-    UTCTime = 0x017,
-    GeneralizedTime = 0x018,
+    ObjectDescriptor = 0x07,
+    External = 0x08,
+    Real = 0x09,
+    Enumerated = 0x0A,
+    EmbeddedPdv = 0x0B,
+    Utf8String = 0x0C,
+    RelativeOid = 0x0D,
+    Time = 0x0E,
+    Reserved = 0x0F,
     Sequence = 0x10,
     Set = 0x11,
-    // Choice = ??,
+    NumericString = 0x12,
+    PrintableString = 0x13,
+    T61String = 0x14,
+    VideotexString = 0x15,
+    IA5String = 0x16,
+    UTCTime = 0x017,
+    GeneralizedTime = 0x18,
+    GraphicString = 0x19,
+    VisibleString = 0x1A,
+    GeneralString = 0x1B,
+    UniversalString = 0x1C,
+    CharacterString = 0x1D,
+    BMPString = 0x1E,
+    Date = 0x1F,
+    TimeOfDay = 0x20,
+    DateTime = 0x21,
+    Duration = 0x22,
+    OidIri = 0x23,
+    RelativeOidIri = 0x24,
 };
 
 enum class Class : u8 {

+ 5 - 0
Userland/Libraries/LibCrypto/ASN1/DER.cpp

@@ -294,6 +294,8 @@ ErrorOr<void> pretty_print(Decoder& decoder, Stream& stream, int indent)
             case Kind::UTCTime:
             case Kind::GeneralizedTime:
             case Kind::IA5String:
+            case Kind::VisibleString:
+            case Kind::BMPString:
             case Kind::PrintableString: {
                 auto value = TRY(decoder.read<StringView>());
                 builder.append(' ');
@@ -310,6 +312,9 @@ ErrorOr<void> pretty_print(Decoder& decoder, Stream& stream, int indent)
             case Kind::Sequence:
             case Kind::Set:
                 return Error::from_string_literal("ASN1::Decoder: Unexpected Primitive");
+            default: {
+                dbgln("PrettyPrint error: Unhandled kind {}", static_cast<u8>(tag.kind));
+            }
             }
         }