From e5a589dbfe5fc4392543ac3ee1e1fb1da74380d5 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Mon, 16 Sep 2013 09:14:36 -0700 Subject: [PATCH 001/182] Very basic file-analyzer for x509 certificates. Mostly ripped from the ssl-analyzer and the topic/bernhard/x509 branch. Simply prints information about the encountered certificates (I have not yet my mind up, what I will log...). Next step: extensions... --- scripts/base/files/x509/__load__.bro | 1 + scripts/base/files/x509/main.bro | 14 + scripts/base/init-bare.bro | 20 ++ scripts/base/init-default.bro | 2 +- scripts/base/protocols/ssl/__load__.bro | 1 + scripts/base/protocols/ssl/files.bro | 48 +++ src/analyzer/protocol/ssl/ssl-analyzer.pac | 8 + src/file_analysis/analyzer/CMakeLists.txt | 1 + .../analyzer/x509/CMakeLists.txt | 10 + src/file_analysis/analyzer/x509/Plugin.cc | 10 + src/file_analysis/analyzer/x509/X509.cc | 295 ++++++++++++++++++ src/file_analysis/analyzer/x509/X509.h | 38 +++ src/file_analysis/analyzer/x509/events.bif | 1 + src/file_analysis/analyzer/x509/types.bif | 1 + 14 files changed, 449 insertions(+), 1 deletion(-) create mode 100644 scripts/base/files/x509/__load__.bro create mode 100644 scripts/base/files/x509/main.bro create mode 100644 scripts/base/protocols/ssl/files.bro create mode 100644 src/file_analysis/analyzer/x509/CMakeLists.txt create mode 100644 src/file_analysis/analyzer/x509/Plugin.cc create mode 100644 src/file_analysis/analyzer/x509/X509.cc create mode 100644 src/file_analysis/analyzer/x509/X509.h create mode 100644 src/file_analysis/analyzer/x509/events.bif create mode 100644 src/file_analysis/analyzer/x509/types.bif diff --git a/scripts/base/files/x509/__load__.bro b/scripts/base/files/x509/__load__.bro new file mode 100644 index 0000000000..a10fe855df --- /dev/null +++ b/scripts/base/files/x509/__load__.bro @@ -0,0 +1 @@ +@load ./main diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro new file mode 100644 index 0000000000..205b8fbd25 --- /dev/null +++ b/scripts/base/files/x509/main.bro @@ -0,0 +1,14 @@ + +@load base/frameworks/files + +module X509; + +export { + redef enum Log::ID += { LOG }; +} + +event x509_cert(f: fa_file, cert: X509::Certificate) + { + print cert; + } + diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index fe3b84a93b..5d7914dc6b 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -2721,6 +2721,26 @@ export { }; } +module X509; +export { + type X509::Certificate: record { + version: count; ##< Version number. + serial: string; ##< Serial number. + subject: string; ##< Subject. + issuer: string; ##< Issuer. + not_valid_before: time; ##< Timestamp before when certificate is not valid. + not_valid_after: time; ##< Timestamp after when certificate is not valid. + key_alg: string; ##< name of the key algorithm + sig_alg: string; ##< name of the signature algorithm + key_type: string &optional; ##< key-type, if key parseable by openssl (either rsa, dsa or ec) + key_length: count &optional; ##< key-length in bits + exponent: string &optional; ##< exponent, if RSA-certificate + curve: string &optional; ##< curve, if EC-certificate + ca: bool &optional; ##< indicates the CA value in the X509v3 BasicConstraints extension + path_len: count &optional; ##< indicates the path_length value in the X509v3 BasicConstraints extension + }; +} + module SOCKS; export { ## This record is for a SOCKS client or server to provide either a diff --git a/scripts/base/init-default.bro b/scripts/base/init-default.bro index 202f8eaaab..c0fb29f081 100644 --- a/scripts/base/init-default.bro +++ b/scripts/base/init-default.bro @@ -57,6 +57,6 @@ @load base/files/hash @load base/files/extract @load base/files/unified2 - +@load base/files/x509 @load base/misc/find-checksum-offloading diff --git a/scripts/base/protocols/ssl/__load__.bro b/scripts/base/protocols/ssl/__load__.bro index 5a8590f234..42287fb039 100644 --- a/scripts/base/protocols/ssl/__load__.bro +++ b/scripts/base/protocols/ssl/__load__.bro @@ -1,5 +1,6 @@ @load ./consts @load ./main @load ./mozilla-ca-list +@load ./files @load-sigs ./dpd.sig diff --git a/scripts/base/protocols/ssl/files.bro b/scripts/base/protocols/ssl/files.bro new file mode 100644 index 0000000000..7582a428ae --- /dev/null +++ b/scripts/base/protocols/ssl/files.bro @@ -0,0 +1,48 @@ +@load ./main +@load base/utils/conn-ids +@load base/frameworks/files + +module SSL; + +export { + redef record Info += { + ## An ordered vector of file unique IDs which contains + ## all the certificates sent over the connection + fuids: vector of string &log &default=string_vec(); + }; + + ## Default file handle provider for SSL. + global get_file_handle: function(c: connection, is_orig: bool): string; + + ## Default file describer for SSL. + global describe_file: function(f: fa_file): string; +} + +function get_file_handle(c: connection, is_orig: bool): string + { + return cat(Analyzer::ANALYZER_SMTP, c$start_time); + } + +function describe_file(f: fa_file): string + { + # This shouldn't be needed, but just in case... + if ( f$source != "SSL" ) + return ""; + + return ""; + } + +event bro_init() &priority=5 + { + Files::register_protocol(Analyzer::ANALYZER_SSL, + [$get_file_handle = SSL::get_file_handle, + $describe = SSL::describe_file]); + } + +event file_over_new_connection(f: fa_file, c: connection, is_orig: bool) &priority=5 + { + if ( c?$ssl ) + c$ssl$fuids[|c$ssl$fuids|] = f$id; + + Files::add_analyzer(f, Files::ANALYZER_X509); + } diff --git a/src/analyzer/protocol/ssl/ssl-analyzer.pac b/src/analyzer/protocol/ssl/ssl-analyzer.pac index 3d9564eaab..4cd7599ef7 100644 --- a/src/analyzer/protocol/ssl/ssl-analyzer.pac +++ b/src/analyzer/protocol/ssl/ssl-analyzer.pac @@ -10,6 +10,8 @@ #include #include + +#include "file_analysis/Manager.h" %} @@ -253,6 +255,11 @@ refine connection SSL_Conn += { { const bytestring& cert = (*certificates)[i]; const uint8* data = cert.data(); + + file_mgr->DataIn(reinterpret_cast(data), cert.length(), + bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn(), false); + file_mgr->EndOfFile(bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn()); + X509* pTemp = d2i_X509_binpac(NULL, &data, cert.length()); if ( ! pTemp ) { @@ -261,6 +268,7 @@ refine connection SSL_Conn += { return false; } + RecordVal* pX509Cert = new RecordVal(x509_type); char tmp[256]; BIO *bio = BIO_new(BIO_s_mem()); diff --git a/src/file_analysis/analyzer/CMakeLists.txt b/src/file_analysis/analyzer/CMakeLists.txt index 1e19b7bd11..ede63dbd1b 100644 --- a/src/file_analysis/analyzer/CMakeLists.txt +++ b/src/file_analysis/analyzer/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(data_event) add_subdirectory(extract) add_subdirectory(hash) add_subdirectory(unified2) +add_subdirectory(x509) diff --git a/src/file_analysis/analyzer/x509/CMakeLists.txt b/src/file_analysis/analyzer/x509/CMakeLists.txt new file mode 100644 index 0000000000..759a01b55c --- /dev/null +++ b/src/file_analysis/analyzer/x509/CMakeLists.txt @@ -0,0 +1,10 @@ + +include(BroPlugin) + +include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}) + +bro_plugin_begin(Bro X509) +bro_plugin_cc(X509.cc Plugin.cc ../../Analyzer.cc) +bro_plugin_bif(events.bif types.bif) +bro_plugin_end() diff --git a/src/file_analysis/analyzer/x509/Plugin.cc b/src/file_analysis/analyzer/x509/Plugin.cc new file mode 100644 index 0000000000..1e76e3fdb7 --- /dev/null +++ b/src/file_analysis/analyzer/x509/Plugin.cc @@ -0,0 +1,10 @@ +#include "plugin/Plugin.h" + +#include "X509.h" + +BRO_PLUGIN_BEGIN(Bro, X509) + BRO_PLUGIN_DESCRIPTION("Parse X509 Certificate"); + BRO_PLUGIN_FILE_ANALYZER("X509", X509); + BRO_PLUGIN_BIF_FILE(events); + BRO_PLUGIN_BIF_FILE(types); +BRO_PLUGIN_END diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc new file mode 100644 index 0000000000..78d746ac9b --- /dev/null +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -0,0 +1,295 @@ +// See the file "COPYING" in the main distribution directory for copyright. + +#include + +#include "X509.h" +#include "Event.h" + +#include "events.bif.h" +#include "types.bif.h" + +#include "file_analysis/Manager.h" + +#include +#include +#include +#include + +using namespace file_analysis; + +file_analysis::X509::X509(RecordVal* args, file_analysis::File* file) + : file_analysis::Analyzer(file_mgr->GetComponentTag("X509"), args, file) + { + cert_data.clear(); + } + +bool file_analysis::X509::DeliverStream(const u_char* data, uint64 len) + { + // just add it to the data we have so far, since we cannot do anything else anyways... + cert_data.append(reinterpret_cast(data), len); + return true; + } + +bool file_analysis::X509::Undelivered(uint64 offset, uint64 len) + { + return false; + } + +bool file_analysis::X509::EndOfFile() + { + // ok, now we can try to parse the certificate with openssl. Should + // be rather straightforward... + const unsigned char* cert_char = reinterpret_cast(cert_data.data()); + ::X509* ssl_cert = d2i_X509(NULL, &cert_char, cert_data.size()); + if ( !ssl_cert ) + { + reporter->Error("Could not parse X509 certificate"); + return false; + } + + char buf[256]; // we need a buffer for some of the openssl functions + memset(buf, 0, 256); + + RecordVal* pX509Cert = new RecordVal(BifType::Record::X509::Certificate); + BIO *bio = BIO_new(BIO_s_mem()); + + pX509Cert->Assign(0, new Val((uint64) X509_get_version(ssl_cert), TYPE_COUNT)); + i2a_ASN1_INTEGER(bio, X509_get_serialNumber(ssl_cert)); + int len = BIO_read(bio, &(*buf), sizeof buf); + pX509Cert->Assign(1, new StringVal(len, buf)); + + X509_NAME_print_ex(bio, X509_get_subject_name(ssl_cert), 0, XN_FLAG_RFC2253); + len = BIO_gets(bio, &(*buf), sizeof buf); + pX509Cert->Assign(2, new StringVal(len, buf)); + X509_NAME_print_ex(bio, X509_get_issuer_name(ssl_cert), 0, XN_FLAG_RFC2253); + len = BIO_gets(bio, &(*buf), sizeof buf); + pX509Cert->Assign(3, new StringVal(len, buf)); + BIO_free(bio); + + pX509Cert->Assign(4, new Val(get_time_from_asn1(X509_get_notBefore(ssl_cert)), TYPE_TIME)); + pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notAfter(ssl_cert)), TYPE_TIME)); + + // we only read 255 bytes because byte 256 is always 0. + // if the string is longer than 255, that will be our null-termination, + // otherwhise i2t does null-terminate. + if ( ! i2t_ASN1_OBJECT(buf, 255, ssl_cert->cert_info->key->algor->algorithm) ) + buf[0] = 0; + pX509Cert->Assign(6, new StringVal(buf)); + + if ( ! i2t_ASN1_OBJECT(buf, 255, ssl_cert->sig_alg->algorithm) ) + buf[0] = 0; + pX509Cert->Assign(7, new StringVal(buf)); + + // Things we can do when we have the key... + EVP_PKEY *pkey = X509_extract_key(ssl_cert); + if ( pkey != NULL ) + { + if ( pkey->type == EVP_PKEY_DSA ) + { + pX509Cert->Assign(8, new StringVal("dsa")); + } + else if ( pkey->type == EVP_PKEY_RSA ) + { + pX509Cert->Assign(8, new StringVal("rsa")); + char *exponent = BN_bn2dec(pkey->pkey.rsa->e); + if ( exponent != NULL ) + { + pX509Cert->Assign(10, new StringVal(exponent)); + OPENSSL_free(exponent); + exponent = NULL; + } + } +#ifndef OPENSSL_NO_EC + else if ( pkey->type == EVP_PKEY_EC ) + { + pX509Cert->Assign(8, new StringVal("dsa")); + pX509Cert->Assign(11, key_curve(pkey)); + } +#endif + + unsigned int length = key_length(pkey); + if ( length > 0 ) + pX509Cert->Assign(9, new Val(length, TYPE_COUNT)); + } + + val_list* vl = new val_list(); + vl->append(GetFile()->GetVal()->Ref()); + vl->append(pX509Cert); + + mgr.QueueEvent(x509_cert, vl); + + return false; + } + +StringVal* file_analysis::X509::key_curve(EVP_PKEY *key) + { + assert(key != NULL); + +#ifdef OPENSSL_NO_EC + // well, we do not have EC-Support... + return NULL; +#else + if ( key->type != EVP_PKEY_EC ) { + // no EC-key - no curve name + return NULL; + } + + const EC_GROUP *group; + int nid; + if ( (group = EC_KEY_get0_group(key->pkey.ec)) == NULL) + // I guess we could not parse this + return NULL; + + nid = EC_GROUP_get_curve_name(group); + if ( nid == 0 ) + // and an invalid nid... + return NULL; + + const char * curve_name = OBJ_nid2sn(nid); + if ( curve_name == NULL ) + return NULL; + + return new StringVal(curve_name); +#endif + } + +unsigned int file_analysis::X509::key_length(EVP_PKEY *key) + { + assert(key != NULL); + unsigned int length; + + switch(key->type) { + case EVP_PKEY_RSA: + length = BN_num_bits(key->pkey.rsa->n); + break; + case EVP_PKEY_DSA: + length = BN_num_bits(key->pkey.dsa->p); + break; +#ifndef OPENSSL_NO_EC + case EVP_PKEY_EC: + { + const EC_GROUP *group; + BIGNUM* ec_order; + ec_order = BN_new(); + if ( !ec_order ) + // could not malloc bignum? + return 0; + + if ( (group = EC_KEY_get0_group(key->pkey.ec)) == NULL) + // unknown ex-group + return 0; + + if (!EC_GROUP_get_order(group, ec_order, NULL)) + // could not get ec-group-order + return 0; + + length = BN_num_bits(ec_order); + BN_free(ec_order); + break; + } +#endif + default: + return 0; // unknown public key type + } + + return length; + } + +double file_analysis::X509::get_time_from_asn1(const ASN1_TIME * atime) + { + time_t lResult = 0; + + char lBuffer[24]; + char * pBuffer = lBuffer; + + size_t lTimeLength = atime->length; + char * pString = (char *) atime->data; + + if ( atime->type == V_ASN1_UTCTIME ) + { + if ( lTimeLength < 11 || lTimeLength > 17 ) + return 0; + + memcpy(pBuffer, pString, 10); + pBuffer += 10; + pString += 10; + } + else + { + if ( lTimeLength < 13 ) + return 0; + + memcpy(pBuffer, pString, 12); + pBuffer += 12; + pString += 12; + } + + if ((*pString == 'Z') || (*pString == '-') || (*pString == '+')) + { + *(pBuffer++) = '0'; + *(pBuffer++) = '0'; + } + else + { + *(pBuffer++) = *(pString++); + *(pBuffer++) = *(pString++); + + // Skip any fractional seconds... + if (*pString == '.') + { + pString++; + while ((*pString >= '0') && (*pString <= '9')) + pString++; + } + } + + *(pBuffer++) = 'Z'; + *(pBuffer++) = '\0'; + + time_t lSecondsFromUTC; + + if ( *pString == 'Z' ) + lSecondsFromUTC = 0; + + else + { + if ((*pString != '+') && (pString[5] != '-')) + return 0; + + lSecondsFromUTC = ((pString[1]-'0') * 10 + (pString[2]-'0')) * 60; + lSecondsFromUTC += (pString[3]-'0') * 10 + (pString[4]-'0'); + + if (*pString == '-') + lSecondsFromUTC = -lSecondsFromUTC; + } + + tm lTime; + lTime.tm_sec = ((lBuffer[10] - '0') * 10) + (lBuffer[11] - '0'); + lTime.tm_min = ((lBuffer[8] - '0') * 10) + (lBuffer[9] - '0'); + lTime.tm_hour = ((lBuffer[6] - '0') * 10) + (lBuffer[7] - '0'); + lTime.tm_mday = ((lBuffer[4] - '0') * 10) + (lBuffer[5] - '0'); + lTime.tm_mon = (((lBuffer[2] - '0') * 10) + (lBuffer[3] - '0')) - 1; + lTime.tm_year = ((lBuffer[0] - '0') * 10) + (lBuffer[1] - '0'); + + if ( lTime.tm_year < 50 ) + lTime.tm_year += 100; // RFC 2459 + + lTime.tm_wday = 0; + lTime.tm_yday = 0; + lTime.tm_isdst = 0; // No DST adjustment requested + + lResult = mktime(&lTime); + + if ( lResult ) + { + if ( 0 != lTime.tm_isdst ) + lResult -= 3600; // mktime may adjust for DST (OS dependent) + + lResult += lSecondsFromUTC; + } + else + lResult = 0; + + return lResult; +} + diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h new file mode 100644 index 0000000000..ce74190b69 --- /dev/null +++ b/src/file_analysis/analyzer/x509/X509.h @@ -0,0 +1,38 @@ +#ifndef FILE_ANALYSIS_X509_H +#define FILE_ANALYSIS_X509_H + +#include + +#include "Val.h" +#include "../File.h" +#include "Analyzer.h" + +#include + +namespace file_analysis { + +class X509 : public file_analysis::Analyzer { +public: + //~X509(); + + static file_analysis::Analyzer* Instantiate(RecordVal* args, File* file) + { return new X509(args, file); } + + virtual bool DeliverStream(const u_char* data, uint64 len); + virtual bool Undelivered(uint64 offset, uint64 len); + virtual bool EndOfFile(); + +protected: + X509(RecordVal* args, File* file); + +private: + static double get_time_from_asn1(const ASN1_TIME * atime); + static StringVal* key_curve(EVP_PKEY *key); + static unsigned int key_length(EVP_PKEY *key); + + std::string cert_data; +}; + +} + +#endif diff --git a/src/file_analysis/analyzer/x509/events.bif b/src/file_analysis/analyzer/x509/events.bif new file mode 100644 index 0000000000..3c3049559d --- /dev/null +++ b/src/file_analysis/analyzer/x509/events.bif @@ -0,0 +1 @@ +event x509_cert%(f: fa_file, cert: X509::Certificate%); diff --git a/src/file_analysis/analyzer/x509/types.bif b/src/file_analysis/analyzer/x509/types.bif new file mode 100644 index 0000000000..9e4fd48420 --- /dev/null +++ b/src/file_analysis/analyzer/x509/types.bif @@ -0,0 +1 @@ +type X509::Certificate: record; From df552ca87d842ca66a9bd234f0feea2ac8174929 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Thu, 19 Sep 2013 14:35:11 -0700 Subject: [PATCH 002/182] parse out extension. One event for general extensions (just returns the openssl-parsed string-value), one event for basicconstraints (is a certificate a CA or not) and one event for subject-alternative-names (only DNS parts). --- scripts/base/files/x509/main.bro | 15 ++ scripts/base/init-bare.bro | 22 ++- src/analyzer/protocol/ssl/SSL.h | 2 +- src/analyzer/protocol/ssl/events.bif | 2 +- src/analyzer/protocol/ssl/ssl-analyzer.pac | 28 ---- src/file_analysis/analyzer/x509/X509.cc | 153 ++++++++++++++++++++- src/file_analysis/analyzer/x509/X509.h | 6 + src/file_analysis/analyzer/x509/events.bif | 3 + src/file_analysis/analyzer/x509/types.bif | 4 + 9 files changed, 202 insertions(+), 33 deletions(-) diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro index 205b8fbd25..458a389934 100644 --- a/scripts/base/files/x509/main.bro +++ b/scripts/base/files/x509/main.bro @@ -12,3 +12,18 @@ event x509_cert(f: fa_file, cert: X509::Certificate) print cert; } +event x509_extension(f: fa_file, ext: X509::Extension) +{ +print ext; +} + +event x509_ext_basic_constraints(f: fa_file, ext: X509::BasicConstraints) +{ +print ext; +} + +event x509_ext_subject_alternative_name(f: fa_file, ext: X509::SubjectAlternativeName) +{ +print ext; +} + diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index 5d7914dc6b..c8e2e52b8a 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -2736,9 +2736,27 @@ export { key_length: count &optional; ##< key-length in bits exponent: string &optional; ##< exponent, if RSA-certificate curve: string &optional; ##< curve, if EC-certificate - ca: bool &optional; ##< indicates the CA value in the X509v3 BasicConstraints extension - path_len: count &optional; ##< indicates the path_length value in the X509v3 BasicConstraints extension + #ca: bool &optional; ##< indicates the CA value in the X509v3 BasicConstraints extension + #path_len: count &optional; ##< indicates the path_length value in the X509v3 BasicConstraints extension }; + + type X509::Extension: record { + name: string; ##< long name of extension. oid if name not known + short_name: string &optional; ##< short name of extension if known. + oid: string; ##< oid of extension + critical: bool; ##< true if extension is critical + value: string; ##< extension content parsed to string for known extensions. Raw data otherwise. + }; + + type X509::BasicConstraints: record { + ca: bool; ##< CA flag set? + path_len: count &optional; + }; + + type X509::SubjectAlternativeName: record { + names: vector of string; + }; + } module SOCKS; diff --git a/src/analyzer/protocol/ssl/SSL.h b/src/analyzer/protocol/ssl/SSL.h index 6423d1b155..5749066780 100644 --- a/src/analyzer/protocol/ssl/SSL.h +++ b/src/analyzer/protocol/ssl/SSL.h @@ -28,7 +28,7 @@ public: { return ( ssl_client_hello || ssl_server_hello || ssl_established || ssl_extension || ssl_alert || - x509_certificate || x509_extension || x509_error ); + x509_certificate || x509_error ); } protected: diff --git a/src/analyzer/protocol/ssl/events.bif b/src/analyzer/protocol/ssl/events.bif index 3d0c7e9d6a..b7586561fc 100644 --- a/src/analyzer/protocol/ssl/events.bif +++ b/src/analyzer/protocol/ssl/events.bif @@ -176,7 +176,7 @@ event x509_certificate%(c: connection, is_orig: bool, cert: X509, chain_idx: cou ## ## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_extension ## ssl_server_hello x509_certificate x509_error x509_verify -event x509_extension%(c: connection, is_orig: bool, data: string%); +#event x509_extension%(c: connection, is_orig: bool, data: string%); ## Generated when errors occur during parsing an X509 certificate. ## diff --git a/src/analyzer/protocol/ssl/ssl-analyzer.pac b/src/analyzer/protocol/ssl/ssl-analyzer.pac index 4cd7599ef7..43e2ac5c73 100644 --- a/src/analyzer/protocol/ssl/ssl-analyzer.pac +++ b/src/analyzer/protocol/ssl/ssl-analyzer.pac @@ -296,34 +296,6 @@ refine connection SSL_Conn += { i, certificates->size(), der_cert); - // Are there any X509 extensions? - //printf("Number of x509 extensions: %d\n", X509_get_ext_count(pTemp)); - if ( x509_extension && X509_get_ext_count(pTemp) > 0 ) - { - int num_ext = X509_get_ext_count(pTemp); - for ( int k = 0; k < num_ext; ++k ) - { - unsigned char *pBuffer = 0; - int length = 0; - - X509_EXTENSION* ex = X509_get_ext(pTemp, k); - if (ex) - { - ASN1_STRING *pString = X509_EXTENSION_get_data(ex); - length = ASN1_STRING_to_UTF8(&pBuffer, pString); - //i2t_ASN1_OBJECT(&pBuffer, length, obj) - // printf("extension length: %d\n", length); - // -1 indicates an error. - if ( length >= 0 ) - { - StringVal* value = new StringVal(length, (char*)pBuffer); - BifEvent::generate_x509_extension(bro_analyzer(), - bro_analyzer()->Conn(), ${rec.is_orig}, value); - } - OPENSSL_free(pBuffer); - } - } - } X509_free(pTemp); } } diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 78d746ac9b..3d7871be9a 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -47,6 +47,27 @@ bool file_analysis::X509::EndOfFile() return false; } + ParseCertificate(ssl_cert); + + // after parsing the certificate - parse the extensions... + + int num_ext = X509_get_ext_count(ssl_cert); + for ( int k = 0; k < num_ext; ++k ) + { + X509_EXTENSION* ex = X509_get_ext(ssl_cert, k); + if ( !ex ) + continue; + + ParseExtension(ex); + } + + X509_free(ssl_cert); + + return false; + } + +void file_analysis::X509::ParseCertificate(::X509* ssl_cert) + { char buf[256]; // we need a buffer for some of the openssl functions memset(buf, 0, 256); @@ -117,8 +138,138 @@ bool file_analysis::X509::EndOfFile() vl->append(pX509Cert); mgr.QueueEvent(x509_cert, vl); + } + +void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) + { + char name[256]; + char oid[256]; + + ASN1_OBJECT* ext_asn = X509_EXTENSION_get_object(ex); + const char* short_name = OBJ_nid2sn(OBJ_obj2nid(ext_asn)); + + OBJ_obj2txt(name, 255, ext_asn, 0); + OBJ_obj2txt(oid, 255, ext_asn, 1); + + int critical = 0; + if ( X509_EXTENSION_get_critical(ex) != 0 ) + critical = 1; + + BIO *bio = BIO_new(BIO_s_mem()); + if(!X509V3_EXT_print(bio, ex, 0, 0)) + M_ASN1_OCTET_STRING_print(bio,ex->value); - return false; + BIO_flush(bio); + int length = BIO_pending(bio); + char *buffer = new char[length]; + BIO_read(bio, (void*)buffer, length); + StringVal* ext_val = new StringVal(length, buffer); + delete(buffer); + BIO_free_all(bio); + + RecordVal* pX509Ext = new RecordVal(BifType::Record::X509::Extension); + pX509Ext->Assign(0, new StringVal(name)); + if ( short_name and strlen(short_name) > 0 ) + pX509Ext->Assign(1, new StringVal(short_name)); + pX509Ext->Assign(2, new StringVal(oid)); + pX509Ext->Assign(3, new Val(critical, TYPE_BOOL)); + pX509Ext->Assign(4, ext_val); + + // send off generic extension event + // + // and then look if we have a specialized event for the extension we just + // parsed. And if we have it, we send the specialized event on top of the + // generic event that we just had. I know, that is... kind of not nice, + // but I am not sure if there is a better way to do it... + val_list* vl = new val_list(); + vl->append(GetFile()->GetVal()->Ref()); + vl->append(pX509Ext); + + mgr.QueueEvent(x509_extension, vl); + + + // look if we have a specialized handler for this event... + if ( OBJ_obj2nid(ext_asn) == NID_basic_constraints ) + ParseBasicConstraints(ex); + else if ( OBJ_obj2nid(ext_asn) == NID_subject_alt_name ) + ParseSAN(ex); + + + + } +void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) + { + assert(OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_basic_constraints); + + RecordVal* pBasicConstraint = new RecordVal(BifType::Record::X509::BasicConstraints); + BASIC_CONSTRAINTS *constr = (BASIC_CONSTRAINTS *) X509V3_EXT_d2i(ex); + if ( !constr ) + { + reporter->Error("Certificate with invalid BasicConstraint"); + } + else + { + pBasicConstraint->Assign(0, new Val(constr->ca ? 1 : 0, TYPE_BOOL)); + if ( constr->pathlen ) { + pBasicConstraint->Assign(1, new Val((int32_t) ASN1_INTEGER_get(constr->pathlen), TYPE_COUNT)); + } + val_list* vl = new val_list(); + vl->append(GetFile()->GetVal()->Ref()); + vl->append(pBasicConstraint); + + mgr.QueueEvent(x509_ext_basic_constraints, vl); + + } + + } + +void file_analysis::X509::ParseSAN(X509_EXTENSION* ext) + { + assert(OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_subject_alt_name); + + GENERAL_NAMES *altname = (GENERAL_NAMES*)X509V3_EXT_d2i(ext); + if ( !altname ) + { + reporter->Error("could not parse subject alternative names"); + return; + } + + VectorVal* names = new VectorVal(internal_type("string_vec")->AsVectorType()); + + int j = 0; + for ( int i = 0; i < sk_GENERAL_NAME_num(altname); i++ ) + { + GENERAL_NAME *gen = sk_GENERAL_NAME_value(altname, i); + assert(gen); + + if ( gen->type == GEN_DNS ) + { + if (ASN1_STRING_type(gen->d.ia5) != V_ASN1_IA5STRING) + { + reporter->Error("DNS-field does not contain an IA5String"); + continue; + } + const char* name = (const char*) ASN1_STRING_data(gen->d.ia5); + StringVal* bs = new StringVal(name); + names->Assign(j, bs); + j++; + } + else + { + // we should perhaps sometime parse out ip-addresses + reporter->Error("Subject alternative name contained non-dns fields"); + continue; + } + } + + RecordVal* pSan = new RecordVal(BifType::Record::X509::SubjectAlternativeName); + pSan->Assign(0, names); + + val_list* vl = new val_list(); + vl->append(GetFile()->GetVal()->Ref()); + vl->append(pSan); + + mgr.QueueEvent(x509_ext_basic_constraints, vl); } StringVal* file_analysis::X509::key_curve(EVP_PKEY *key) diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h index ce74190b69..cc0131afac 100644 --- a/src/file_analysis/analyzer/x509/X509.h +++ b/src/file_analysis/analyzer/x509/X509.h @@ -7,6 +7,7 @@ #include "../File.h" #include "Analyzer.h" +#include #include namespace file_analysis { @@ -30,6 +31,11 @@ private: static StringVal* key_curve(EVP_PKEY *key); static unsigned int key_length(EVP_PKEY *key); + void ParseCertificate(::X509* ssl_cert); + void ParseExtension(X509_EXTENSION* ex); + void ParseBasicConstraints(X509_EXTENSION* ex); + void ParseSAN(X509_EXTENSION* ex); + std::string cert_data; }; diff --git a/src/file_analysis/analyzer/x509/events.bif b/src/file_analysis/analyzer/x509/events.bif index 3c3049559d..148d09ec00 100644 --- a/src/file_analysis/analyzer/x509/events.bif +++ b/src/file_analysis/analyzer/x509/events.bif @@ -1 +1,4 @@ event x509_cert%(f: fa_file, cert: X509::Certificate%); +event x509_extension%(f: fa_file, ext: X509::Extension%); +event x509_ext_basic_constraints%(f: fa_file, ext: X509::BasicConstraints%); +event x509_ext_subject_alternative_name%(f: fa_file, ext: X509::SubjectAlternativeName%); diff --git a/src/file_analysis/analyzer/x509/types.bif b/src/file_analysis/analyzer/x509/types.bif index 9e4fd48420..49a915c7fc 100644 --- a/src/file_analysis/analyzer/x509/types.bif +++ b/src/file_analysis/analyzer/x509/types.bif @@ -1 +1,5 @@ type X509::Certificate: record; +type X509::Extension: record; +type X509::BasicConstraints: record; +type X509::SubjectAlternativeName: record; + From 2b87499fd96ea28cf66f999ffd97b94f5596a7b2 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 1 Oct 2013 16:20:55 -0700 Subject: [PATCH 003/182] rip out x509 code from ssl analyzer. Note that since at the moment the file analyzer does not yet re-populate the info record that means quite a lot of information is simply not available. --- scripts/base/protocols/ssl/main.bro | 43 ------- src/analyzer/protocol/ssl/CMakeLists.txt | 1 - src/analyzer/protocol/ssl/Plugin.cc | 1 - src/analyzer/protocol/ssl/SSL.h | 3 +- src/analyzer/protocol/ssl/events.bif | 73 +----------- src/analyzer/protocol/ssl/functions.bif | 132 --------------------- src/analyzer/protocol/ssl/ssl-analyzer.pac | 57 +-------- 7 files changed, 12 insertions(+), 298 deletions(-) delete mode 100644 src/analyzer/protocol/ssl/functions.bif diff --git a/scripts/base/protocols/ssl/main.bro b/scripts/base/protocols/ssl/main.bro index 2381b356e4..1b487ef4bf 100644 --- a/scripts/base/protocols/ssl/main.bro +++ b/scripts/base/protocols/ssl/main.bro @@ -168,49 +168,6 @@ event ssl_server_hello(c: connection, version: count, possible_ts: time, session c$ssl$cipher = cipher_desc[cipher]; } -event x509_certificate(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string) &priority=5 - { - set_session(c); - - # We aren't doing anything with client certificates yet. - if ( is_orig ) - { - if ( chain_idx == 0 ) - { - # Save the primary cert. - c$ssl$client_cert = der_cert; - - # Also save other certificate information about the primary cert. - c$ssl$client_subject = cert$subject; - c$ssl$client_issuer_subject = cert$issuer; - } - else - { - # Otherwise, add it to the cert validation chain. - c$ssl$client_cert_chain[|c$ssl$client_cert_chain|] = der_cert; - } - } - else - { - if ( chain_idx == 0 ) - { - # Save the primary cert. - c$ssl$cert = der_cert; - - # Also save other certificate information about the primary cert. - c$ssl$subject = cert$subject; - c$ssl$issuer_subject = cert$issuer; - c$ssl$not_valid_before = cert$not_valid_before; - c$ssl$not_valid_after = cert$not_valid_after; - } - else - { - # Otherwise, add it to the cert validation chain. - c$ssl$cert_chain[|c$ssl$cert_chain|] = der_cert; - } - } - } - event ssl_extension(c: connection, is_orig: bool, code: count, val: string) &priority=5 { set_session(c); diff --git a/src/analyzer/protocol/ssl/CMakeLists.txt b/src/analyzer/protocol/ssl/CMakeLists.txt index f1838e5f3b..2591c5dfec 100644 --- a/src/analyzer/protocol/ssl/CMakeLists.txt +++ b/src/analyzer/protocol/ssl/CMakeLists.txt @@ -6,6 +6,5 @@ include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DI bro_plugin_begin(Bro SSL) bro_plugin_cc(SSL.cc Plugin.cc) bro_plugin_bif(events.bif) -bro_plugin_bif(functions.bif) bro_plugin_pac(ssl.pac ssl-analyzer.pac ssl-protocol.pac ssl-defs.pac) bro_plugin_end() diff --git a/src/analyzer/protocol/ssl/Plugin.cc b/src/analyzer/protocol/ssl/Plugin.cc index c63be864f8..c1783b357d 100644 --- a/src/analyzer/protocol/ssl/Plugin.cc +++ b/src/analyzer/protocol/ssl/Plugin.cc @@ -7,5 +7,4 @@ BRO_PLUGIN_BEGIN(Bro, SSL) BRO_PLUGIN_DESCRIPTION("SSL analyzer"); BRO_PLUGIN_ANALYZER("SSL", ssl::SSL_Analyzer); BRO_PLUGIN_BIF_FILE(events); - BRO_PLUGIN_BIF_FILE(functions); BRO_PLUGIN_END diff --git a/src/analyzer/protocol/ssl/SSL.h b/src/analyzer/protocol/ssl/SSL.h index 5749066780..f674d64fed 100644 --- a/src/analyzer/protocol/ssl/SSL.h +++ b/src/analyzer/protocol/ssl/SSL.h @@ -27,8 +27,7 @@ public: static bool Available() { return ( ssl_client_hello || ssl_server_hello || - ssl_established || ssl_extension || ssl_alert || - x509_certificate || x509_error ); + ssl_established || ssl_extension || ssl_alert ); } protected: diff --git a/src/analyzer/protocol/ssl/events.bif b/src/analyzer/protocol/ssl/events.bif index b7586561fc..aff5f4798c 100644 --- a/src/analyzer/protocol/ssl/events.bif +++ b/src/analyzer/protocol/ssl/events.bif @@ -22,7 +22,7 @@ ## :bro:id:`SSL::cipher_desc` table maps them to descriptive names. ## ## .. bro:see:: ssl_alert ssl_established ssl_extension ssl_server_hello -## ssl_session_ticket_handshake x509_certificate x509_error x509_extension +## ssl_session_ticket_handshake event ssl_client_hello%(c: connection, version: count, possible_ts: time, session_id: string, ciphers: count_set%); ## Generated for an SSL/TLS server's initial *hello* message. SSL/TLS sessions @@ -52,7 +52,7 @@ event ssl_client_hello%(c: connection, version: count, possible_ts: time, sessio ## standardized as part of the SSL/TLS protocol. ## ## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_extension -## ssl_session_ticket_handshake x509_certificate x509_error x509_extension +## ssl_session_ticket_handshake event ssl_server_hello%(c: connection, version: count, possible_ts: time, session_id: string, cipher: count, comp_method: count%); ## Generated for SSL/TLS extensions seen in an initial handshake. SSL/TLS @@ -71,7 +71,7 @@ event ssl_server_hello%(c: connection, version: count, possible_ts: time, sessio ## val: The raw extension value that was sent in the message. ## ## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_server_hello -## ssl_session_ticket_handshake x509_certificate x509_error x509_extension +## ssl_session_ticket_handshake event ssl_extension%(c: connection, is_orig: bool, code: count, val: string%); ## Generated at the end of an SSL/TLS handshake. SSL/TLS sessions start with @@ -86,7 +86,7 @@ event ssl_extension%(c: connection, is_orig: bool, code: count, val: string%); ## c: The connection. ## ## .. bro:see:: ssl_alert ssl_client_hello ssl_extension ssl_server_hello -## ssl_session_ticket_handshake x509_certificate x509_error x509_extension +## ssl_session_ticket_handshake event ssl_established%(c: connection%); ## Generated for SSL/TLS alert records. SSL/TLS sessions start with an @@ -109,7 +109,7 @@ event ssl_established%(c: connection%); ## defined as part of the SSL/TLS protocol. ## ## .. bro:see:: ssl_client_hello ssl_established ssl_extension ssl_server_hello -## ssl_session_ticket_handshake x509_certificate x509_error x509_extension +## ssl_session_ticket_handshake event ssl_alert%(c: connection, is_orig: bool, level: count, desc: count%); ## Generated for SSL/TLS handshake messages that are a part of the @@ -130,66 +130,5 @@ event ssl_alert%(c: connection, is_orig: bool, level: count, desc: count%); ## ticket: The raw ticket data. ## ## .. bro:see:: ssl_client_hello ssl_established ssl_extension ssl_server_hello -## x509_certificate x509_error x509_extension ssl_alert +## ssl_alert event ssl_session_ticket_handshake%(c: connection, ticket_lifetime_hint: count, ticket: string%); - -## Generated for X509 certificates seen in SSL/TLS connections. During the -## initial SSL/TLS handshake, certificates are exchanged in the clear. Bro -## raises this event for each certificate seen (including both a site's primary -## cert, and further certs sent as part of the validation chain). -## -## See `Wikipedia `__ for more information -## about the X.509 format. -## -## c: The connection. -## -## is_orig: True if event is raised for originator side of the connection. -## -## cert: The parsed certificate. -## -## chain_idx: The index in the validation chain that this cert has. Index zero -## indicates an endpoint's primary cert, while higher indices -## indicate the place in the validation chain (which has length -## *chain_len*). -## -## chain_len: The total length of the validation chain that this cert is part -## of. -## -## der_cert: The complete cert encoded in `DER -## `__ -## format. -## -## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_extension -## ssl_server_hello x509_error x509_extension x509_verify -event x509_certificate%(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string%); - -## Generated for X509 extensions seen in a certificate. -## -## See `Wikipedia `__ for more information -## about the X.509 format. -## -## c: The connection. -## -## is_orig: True if event is raised for originator side of the connection. -## -## data: The raw data associated with the extension. -## -## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_extension -## ssl_server_hello x509_certificate x509_error x509_verify -#event x509_extension%(c: connection, is_orig: bool, data: string%); - -## Generated when errors occur during parsing an X509 certificate. -## -## See `Wikipedia `__ for more information -## about the X.509 format. -## -## c: The connection. -## -## is_orig: True if event is raised for originator side of the connection. -## -## err: An error code describing what went wrong. :bro:id:`SSL::x509_errors` -## maps error codes to a textual description. -## -## .. bro:see:: ssl_alert ssl_client_hello ssl_established ssl_extension -## ssl_server_hello x509_certificate x509_extension x509_err2str x509_verify -event x509_error%(c: connection, is_orig: bool, err: count%); diff --git a/src/analyzer/protocol/ssl/functions.bif b/src/analyzer/protocol/ssl/functions.bif deleted file mode 100644 index f2d4861007..0000000000 --- a/src/analyzer/protocol/ssl/functions.bif +++ /dev/null @@ -1,132 +0,0 @@ - -%%{ -#include -#include -#include - -// This is the indexed map of X509 certificate stores. -static map x509_stores; - -// ### NOTE: while d2i_X509 does not take a const u_char** pointer, -// here we assume d2i_X509 does not write to , so it is safe to -// convert data to a non-const pointer. Could some X509 guru verify -// this? - -X509* d2i_X509_(X509** px, const u_char** in, int len) - { -#ifdef OPENSSL_D2I_X509_USES_CONST_CHAR - return d2i_X509(px, in, len); -#else - return d2i_X509(px, (u_char**)in, len); -#endif - } - -%%} - - -## Verifies a certificate. -## -## der_cert: The X.509 certificate in DER format. -## -## cert_stack: Specifies a certificate chain to validate against, with index 0 -## typically being the root CA. Bro uses the Mozilla root CA list -## by default. -## -## root_certs: A list of additional root certificates that extends -## *cert_stack*. -## -## Returns: A status code of the verification which can be converted into an -## ASCII string via :bro:id:`x509_err2str`. -## -## .. bro:see:: x509_err2str -function x509_verify%(der_cert: string, cert_stack: string_vec, root_certs: table_string_of_string%): count - %{ - X509_STORE* ctx = 0; - int i = 0; - - // If this certificate store was built previously, just reuse the old one. - if ( x509_stores.count(root_certs) > 0 ) - ctx = x509_stores[root_certs]; - - if ( ! ctx ) // lookup to see if we have this one built already! - { - ctx = X509_STORE_new(); - TableVal* root_certs2 = root_certs->AsTableVal(); - ListVal* idxs = root_certs2->ConvertToPureList(); - - // Build the validation store - for ( i = 0; i < idxs->Length(); ++i ) - { - Val* key = idxs->Index(i); - StringVal *sv = root_certs2->Lookup(key)->AsStringVal(); - const uint8* data = sv->Bytes(); - X509* x = d2i_X509_(NULL, &data, sv->Len()); - if ( ! x ) - { - builtin_error(fmt("Root CA error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); - } - X509_STORE_add_cert(ctx, x); - } - delete idxs; - - // Save the newly constructed certificate store into the cacheing map. - x509_stores[root_certs] = ctx; - } - - const uint8 *cert_data = der_cert->Bytes(); - X509* cert = d2i_X509_(NULL, &cert_data, der_cert->Len()); - if ( ! cert ) - { - builtin_error(fmt("Certificate error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); - } - - STACK_OF(X509)* untrusted_certs = sk_X509_new_null(); - if ( ! untrusted_certs ) - { - builtin_error(fmt("Untrusted certificate stack initialization error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); - } - - VectorVal *cert_stack_vec = cert_stack->AsVectorVal(); - for ( i = 0; i < (int) cert_stack_vec->Size(); ++i ) - { - StringVal *sv = cert_stack_vec->Lookup(i)->AsStringVal(); - const uint8 *data = sv->Bytes(); - X509* x = d2i_X509_(NULL, &data, sv->Len()); - if ( ! x ) - { - X509_free(cert); - sk_X509_pop_free(untrusted_certs, X509_free); - builtin_error(fmt("Untrusted certificate stack creation error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); - } - sk_X509_push(untrusted_certs, x); - } - - X509_STORE_CTX csc; - X509_STORE_CTX_init(&csc, ctx, cert, untrusted_certs); - X509_STORE_CTX_set_time(&csc, 0, (time_t) network_time); - - int result = X509_verify_cert(&csc); - X509_STORE_CTX_cleanup(&csc); - - if ( untrusted_certs ) - sk_X509_pop_free(untrusted_certs, X509_free); - X509_free(cert); - - return new Val((uint64) csc.error, TYPE_COUNT); - %} - -## Converts a certificate verification error code into an ASCII string. -## -## err_num: The error code. -## -## Returns: A string representation of *err_num*. -## -## .. bro:see:: x509_verify -function x509_err2str%(err_num: count%): string - %{ - return new StringVal(X509_verify_cert_error_string(err_num)); - %} diff --git a/src/analyzer/protocol/ssl/ssl-analyzer.pac b/src/analyzer/protocol/ssl/ssl-analyzer.pac index 43e2ac5c73..4bf1e27d64 100644 --- a/src/analyzer/protocol/ssl/ssl-analyzer.pac +++ b/src/analyzer/protocol/ssl/ssl-analyzer.pac @@ -8,9 +8,6 @@ #include "util.h" -#include -#include - #include "file_analysis/Manager.h" %} @@ -247,57 +244,13 @@ refine connection SSL_Conn += { if ( certificates->size() == 0 ) return true; - if ( x509_certificate ) + for ( unsigned int i = 0; i < certificates->size(); ++i ) { - STACK_OF(X509)* untrusted_certs = 0; + const bytestring& cert = (*certificates)[i]; - for ( unsigned int i = 0; i < certificates->size(); ++i ) - { - const bytestring& cert = (*certificates)[i]; - const uint8* data = cert.data(); - - file_mgr->DataIn(reinterpret_cast(data), cert.length(), - bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn(), false); - file_mgr->EndOfFile(bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn()); - - X509* pTemp = d2i_X509_binpac(NULL, &data, cert.length()); - if ( ! pTemp ) - { - BifEvent::generate_x509_error(bro_analyzer(), bro_analyzer()->Conn(), - ${rec.is_orig}, ERR_get_error()); - return false; - } - - - RecordVal* pX509Cert = new RecordVal(x509_type); - char tmp[256]; - BIO *bio = BIO_new(BIO_s_mem()); - - pX509Cert->Assign(0, new Val((uint64) X509_get_version(pTemp), TYPE_COUNT)); - i2a_ASN1_INTEGER(bio, X509_get_serialNumber(pTemp)); - int len = BIO_read(bio, &(*tmp), sizeof tmp); - pX509Cert->Assign(1, new StringVal(len, tmp)); - - X509_NAME_print_ex(bio, X509_get_subject_name(pTemp), 0, XN_FLAG_RFC2253); - len = BIO_gets(bio, &(*tmp), sizeof tmp); - pX509Cert->Assign(2, new StringVal(len, tmp)); - X509_NAME_print_ex(bio, X509_get_issuer_name(pTemp), 0, XN_FLAG_RFC2253); - len = BIO_gets(bio, &(*tmp), sizeof tmp); - pX509Cert->Assign(3, new StringVal(len, tmp)); - BIO_free(bio); - - pX509Cert->Assign(4, new Val(get_time_from_asn1(X509_get_notBefore(pTemp)), TYPE_TIME)); - pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notAfter(pTemp)), TYPE_TIME)); - StringVal* der_cert = new StringVal(cert.length(), (const char*) cert.data()); - - BifEvent::generate_x509_certificate(bro_analyzer(), bro_analyzer()->Conn(), - ${rec.is_orig}, - pX509Cert, - i, certificates->size(), - der_cert); - - X509_free(pTemp); - } + file_mgr->DataIn(reinterpret_cast(cert.data()), cert.length(), + bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn(), ${rec.is_orig}); + file_mgr->EndOfFile(bro_analyzer()->GetAnalyzerTag(), bro_analyzer()->Conn()); } return true; %} From 2c7e7f962ea847259a95f04f3360775149d72702 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 8 Oct 2013 12:50:47 -0700 Subject: [PATCH 004/182] Make x509 certificates an opaque type --- src/SerialTypes.h | 1 + src/Type.h | 1 + src/analyzer/protocol/ssl/ssl-analyzer.pac | 16 --- src/analyzer/protocol/ssl/ssl-protocol.pac | 100 ------------------ .../analyzer/x509/CMakeLists.txt | 2 +- src/file_analysis/analyzer/x509/Plugin.cc | 1 + src/file_analysis/analyzer/x509/X509.cc | 64 +++++++++++ src/file_analysis/analyzer/x509/X509.h | 44 ++++++++ src/main.cc | 2 + 9 files changed, 114 insertions(+), 117 deletions(-) diff --git a/src/SerialTypes.h b/src/SerialTypes.h index 69927afb74..81ccbc030e 100644 --- a/src/SerialTypes.h +++ b/src/SerialTypes.h @@ -111,6 +111,7 @@ SERIAL_VAL(ENTROPY_VAL, 19) SERIAL_VAL(TOPK_VAL, 20) SERIAL_VAL(BLOOMFILTER_VAL, 21) SERIAL_VAL(CARDINALITY_VAL, 22) +SERIAL_VAL(X509_VAL, 23) #define SERIAL_EXPR(name, val) SERIAL_CONST(name, val, EXPR) SERIAL_EXPR(EXPR, 1) diff --git a/src/Type.h b/src/Type.h index a6163d5152..b880eac131 100644 --- a/src/Type.h +++ b/src/Type.h @@ -616,6 +616,7 @@ extern OpaqueType* entropy_type; extern OpaqueType* cardinality_type; extern OpaqueType* topk_type; extern OpaqueType* bloomfilter_type; +extern OpaqueType* x509_opaque_type; // Returns the BRO basic (non-parameterized) type with the given type. extern BroType* base_type(TypeTag tag); diff --git a/src/analyzer/protocol/ssl/ssl-analyzer.pac b/src/analyzer/protocol/ssl/ssl-analyzer.pac index 4bf1e27d64..f9de1a12a8 100644 --- a/src/analyzer/protocol/ssl/ssl-analyzer.pac +++ b/src/analyzer/protocol/ssl/ssl-analyzer.pac @@ -22,8 +22,6 @@ }; string orig_label(bool is_orig); - void free_X509(void *); - X509* d2i_X509_binpac(X509** px, const uint8** in, int len); string handshake_type_label(int type); %} @@ -33,20 +31,6 @@ string orig_label(bool is_orig) return string(is_orig ? "originator" :"responder"); } - void free_X509(void* cert) - { - X509_free((X509*) cert); - } - - X509* d2i_X509_binpac(X509** px, const uint8** in, int len) - { -#ifdef OPENSSL_D2I_X509_USES_CONST_CHAR - return d2i_X509(px, in, len); -#else - return d2i_X509(px, (u_char**) in, len); -#endif - } - string handshake_type_label(int type) { switch ( type ) { diff --git a/src/analyzer/protocol/ssl/ssl-protocol.pac b/src/analyzer/protocol/ssl/ssl-protocol.pac index b35d07f18b..4f24251a5c 100644 --- a/src/analyzer/protocol/ssl/ssl-protocol.pac +++ b/src/analyzer/protocol/ssl/ssl-protocol.pac @@ -22,7 +22,6 @@ type uint24 = record { }; string state_label(int state_nr); - double get_time_from_asn1(const ASN1_TIME * atime); %} extern type to_int; @@ -146,105 +145,6 @@ enum AnalyzerState { return string(fmt("UNKNOWN (%d)", state_nr)); } } - - - double get_time_from_asn1(const ASN1_TIME * atime) - { - time_t lResult = 0; - - char lBuffer[24]; - char * pBuffer = lBuffer; - - size_t lTimeLength = atime->length; - char * pString = (char *) atime->data; - - if ( atime->type == V_ASN1_UTCTIME ) - { - if ( lTimeLength < 11 || lTimeLength > 17 ) - return 0; - - memcpy(pBuffer, pString, 10); - pBuffer += 10; - pString += 10; - } - else - { - if ( lTimeLength < 13 ) - return 0; - - memcpy(pBuffer, pString, 12); - pBuffer += 12; - pString += 12; - } - - if ((*pString == 'Z') || (*pString == '-') || (*pString == '+')) - { - *(pBuffer++) = '0'; - *(pBuffer++) = '0'; - } - else - { - *(pBuffer++) = *(pString++); - *(pBuffer++) = *(pString++); - - // Skip any fractional seconds... - if (*pString == '.') - { - pString++; - while ((*pString >= '0') && (*pString <= '9')) - pString++; - } - } - - *(pBuffer++) = 'Z'; - *(pBuffer++) = '\0'; - - time_t lSecondsFromUTC; - - if ( *pString == 'Z' ) - lSecondsFromUTC = 0; - - else - { - if ((*pString != '+') && (pString[5] != '-')) - return 0; - - lSecondsFromUTC = ((pString[1]-'0') * 10 + (pString[2]-'0')) * 60; - lSecondsFromUTC += (pString[3]-'0') * 10 + (pString[4]-'0'); - - if (*pString == '-') - lSecondsFromUTC = -lSecondsFromUTC; - } - - tm lTime; - lTime.tm_sec = ((lBuffer[10] - '0') * 10) + (lBuffer[11] - '0'); - lTime.tm_min = ((lBuffer[8] - '0') * 10) + (lBuffer[9] - '0'); - lTime.tm_hour = ((lBuffer[6] - '0') * 10) + (lBuffer[7] - '0'); - lTime.tm_mday = ((lBuffer[4] - '0') * 10) + (lBuffer[5] - '0'); - lTime.tm_mon = (((lBuffer[2] - '0') * 10) + (lBuffer[3] - '0')) - 1; - lTime.tm_year = ((lBuffer[0] - '0') * 10) + (lBuffer[1] - '0'); - - if ( lTime.tm_year < 50 ) - lTime.tm_year += 100; // RFC 2459 - - lTime.tm_wday = 0; - lTime.tm_yday = 0; - lTime.tm_isdst = 0; // No DST adjustment requested - - lResult = mktime(&lTime); - - if ( lResult ) - { - if ( 0 != lTime.tm_isdst ) - lResult -= 3600; // mktime may adjust for DST (OS dependent) - - lResult += lSecondsFromUTC; - } - else - lResult = 0; - - return lResult; - } %} ###################################################################### diff --git a/src/file_analysis/analyzer/x509/CMakeLists.txt b/src/file_analysis/analyzer/x509/CMakeLists.txt index 759a01b55c..b07ef278f7 100644 --- a/src/file_analysis/analyzer/x509/CMakeLists.txt +++ b/src/file_analysis/analyzer/x509/CMakeLists.txt @@ -6,5 +6,5 @@ include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} bro_plugin_begin(Bro X509) bro_plugin_cc(X509.cc Plugin.cc ../../Analyzer.cc) -bro_plugin_bif(events.bif types.bif) +bro_plugin_bif(events.bif types.bif functions.bif) bro_plugin_end() diff --git a/src/file_analysis/analyzer/x509/Plugin.cc b/src/file_analysis/analyzer/x509/Plugin.cc index 1e76e3fdb7..5b0e5779c5 100644 --- a/src/file_analysis/analyzer/x509/Plugin.cc +++ b/src/file_analysis/analyzer/x509/Plugin.cc @@ -7,4 +7,5 @@ BRO_PLUGIN_BEGIN(Bro, X509) BRO_PLUGIN_FILE_ANALYZER("X509", X509); BRO_PLUGIN_BIF_FILE(events); BRO_PLUGIN_BIF_FILE(types); + BRO_PLUGIN_BIF_FILE(functions); BRO_PLUGIN_END diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 3d7871be9a..59ab644634 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -17,6 +17,8 @@ using namespace file_analysis; +IMPLEMENT_SERIAL(X509Val, SER_X509_VAL); + file_analysis::X509::X509(RecordVal* args, file_analysis::File* file) : file_analysis::Analyzer(file_mgr->GetComponentTag("X509"), args, file) { @@ -444,3 +446,65 @@ double file_analysis::X509::get_time_from_asn1(const ASN1_TIME * atime) return lResult; } +X509Val::X509Val(::X509* arg_certificate) : OpaqueVal(x509_opaque_type) + { + certificate = arg_certificate; + } + +X509Val::X509Val() : OpaqueVal(x509_opaque_type) + { + certificate = 0; + } + +X509Val::~X509Val() + { + if ( certificate ) + X509_free(certificate); + } + +::X509* X509Val::GetCertificate() const + { + return certificate; + } + +bool X509Val::DoSerialize(SerialInfo* info) const + { + DO_SERIALIZE(SER_X509_VAL, X509Val); + + unsigned char *buf = NULL; + + int length = i2d_X509(certificate, &buf); + + if ( length < 0 ) + return false; + + bool res = SERIALIZE_STR(reinterpret_cast(buf), length); + + OPENSSL_free(buf); + return res; + } + +bool X509Val::DoUnserialize(UnserialInfo* info) + { + DO_UNSERIALIZE(OpaqueVal) + + int length; + unsigned char *certbuf, *opensslbuf; + + if ( ! UNSERIALIZE_STR(reinterpret_cast(&certbuf), &length) ) + return false; + + opensslbuf = certbuf; // OpenSSL likes to shift pointers around. really. + certificate = d2i_X509(NULL, const_cast(&opensslbuf), length); + delete[] certbuf; + + if ( !certificate ) + return false; + + return true; + } + + + + + diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h index cc0131afac..80bb68209e 100644 --- a/src/file_analysis/analyzer/x509/X509.h +++ b/src/file_analysis/analyzer/x509/X509.h @@ -39,6 +39,50 @@ private: std::string cert_data; }; +/** + * This class wraps an OpenSSL X509 data structure. + * + * We need these to be able to pass OpenSSL pointers around in Bro + * script-land. Otherwise, we cannot verify certificates from Bro + * scriptland + */ +class X509Val : public OpaqueVal { +public: + /** + * Construct an X509Val. + * + * @param certificate specifies the wrapped OpenSSL certificate + * + * @return A newly initialized X509Val + */ + X509Val(::X509* certificate); + + /** + * Destructor. + */ + ~X509Val(); + + /** + * Get the wrapped X509 certificate. Please take care, that the + * internal OpenSSL reference counting stays the same. + * + * @return The wrapped OpenSSL X509 certificate + */ + ::X509* GetCertificate() const; + +protected: + /** + * Construct an empty X509Val. Only used for deserialization + */ + X509Val(); + +private: + ::X509* certificate; // the wrapped certificate + + DECLARE_SERIAL(X509Val); +}; + } + #endif diff --git a/src/main.cc b/src/main.cc index 313e1a40b0..ffa7a85f29 100644 --- a/src/main.cc +++ b/src/main.cc @@ -131,6 +131,7 @@ OpaqueType* entropy_type = 0; OpaqueType* cardinality_type = 0; OpaqueType* topk_type = 0; OpaqueType* bloomfilter_type = 0; +OpaqueType* x509_opaque_type = 0; extern std::list docs_generated; @@ -860,6 +861,7 @@ int main(int argc, char** argv) cardinality_type = new OpaqueType("cardinality"); topk_type = new OpaqueType("topk"); bloomfilter_type = new OpaqueType("bloomfilter"); + x509_opaque_type = new OpaqueType("x509"); // The leak-checker tends to produce some false // positives (memory which had already been From dd0856a57f386b12819b7ef54b141d2d706539d8 Mon Sep 17 00:00:00 2001 From: Seth Hall Date: Wed, 12 Feb 2014 22:38:59 -0500 Subject: [PATCH 005/182] HTTP CONNECT proxy support. - The HTTP analyzer now supports handling HTTP CONNECT proxies same as the SOCKS analyzer handles proxying. --- scripts/base/protocols/http/main.bro | 11 ++++++ src/analyzer/protocol/http/HTTP.cc | 35 ++++++++++++++++++ src/analyzer/protocol/http/HTTP.h | 4 ++ src/types.bif | 1 + .../conn.log | 10 +++++ .../http.log | 10 +++++ .../smtp.log | 10 +++++ .../tunnel.log | 10 +++++ .../btest/Traces/http/connect-with-smtp.trace | Bin 0 -> 4191 bytes .../base/protocols/http/http-connect.bro | 11 ++++++ 10 files changed, 102 insertions(+) create mode 100644 testing/btest/Baseline/scripts.base.protocols.http.http-connect/conn.log create mode 100644 testing/btest/Baseline/scripts.base.protocols.http.http-connect/http.log create mode 100644 testing/btest/Baseline/scripts.base.protocols.http.http-connect/smtp.log create mode 100644 testing/btest/Baseline/scripts.base.protocols.http.http-connect/tunnel.log create mode 100644 testing/btest/Traces/http/connect-with-smtp.trace create mode 100644 testing/btest/scripts/base/protocols/http/http-connect.bro diff --git a/scripts/base/protocols/http/main.bro b/scripts/base/protocols/http/main.bro index a164fcd6a6..27257be2d6 100644 --- a/scripts/base/protocols/http/main.bro +++ b/scripts/base/protocols/http/main.bro @@ -4,6 +4,7 @@ @load base/utils/numbers @load base/utils/files +@load base/frameworks/tunnels module HTTP; @@ -217,6 +218,16 @@ event http_reply(c: connection, version: string, code: count, reason: string) &p c$http$info_code = code; c$http$info_msg = reason; } + + if ( c$http?$method && c$http$method == "CONNECT" && code == 200 ) + { + # Copy this conn_id and set the orig_p to zero because in the case of CONNECT proxies there will + # be potentially many source ports since a new proxy connection is established for each + # proxied connection. We treat this as a singular "tunnel". + local tid = copy(c$id); + tid$orig_p = 0/tcp; + Tunnel::register([$cid=tid, $tunnel_type=Tunnel::HTTP]); + } } event http_header(c: connection, is_orig: bool, name: string, value: string) &priority=5 diff --git a/src/analyzer/protocol/http/HTTP.cc b/src/analyzer/protocol/http/HTTP.cc index f605dce402..93dbfbcb2e 100644 --- a/src/analyzer/protocol/http/HTTP.cc +++ b/src/analyzer/protocol/http/HTTP.cc @@ -889,6 +889,9 @@ HTTP_Analyzer::HTTP_Analyzer(Connection* conn) reply_code = 0; reply_reason_phrase = 0; + connect_request = false; + pia = 0; + content_line_orig = new tcp::ContentLine_Analyzer(conn, true); AddSupportAnalyzer(content_line_orig); @@ -945,6 +948,14 @@ void HTTP_Analyzer::DeliverStream(int len, const u_char* data, bool is_orig) if ( TCP() && TCP()->IsPartial() ) return; + if ( pia ) + { + // There will be a PIA instance if this connection has been identified + // as a connect proxy. + ForwardStream(len, data, is_orig); + return; + } + const char* line = reinterpret_cast(data); const char* end_of_line = line + len; @@ -1059,6 +1070,27 @@ void HTTP_Analyzer::DeliverStream(int len, const u_char* data, bool is_orig) reply_message, is_orig, ExpectReplyMessageBody(), len); + + if ( connect_request && reply_code == 200 ) + { + pia = new pia::PIA_TCP(Conn()); + if ( AddChildAnalyzer(pia) ) + { + pia->FirstPacket(true, 0); + pia->FirstPacket(false, 0); + + // This connection has transitioned to no longer + // being http and the content line support analyzers + // need to be removed. + RemoveSupportAnalyzer(content_line_orig); + RemoveSupportAnalyzer(content_line_resp); + } + else + { + pia = 0; + } + } + } else { @@ -1404,6 +1436,9 @@ void HTTP_Analyzer::HTTP_Request() // DEBUG_MSG("%.6f http_request\n", network_time); ConnectionEvent(http_request, vl); } + + if ( strcasecmp_n(request_method->AsString()->Len(), (const char*) (request_method->AsString()->Bytes()), "CONNECT") == 0 ) + connect_request = true; } void HTTP_Analyzer::HTTP_Reply() diff --git a/src/analyzer/protocol/http/HTTP.h b/src/analyzer/protocol/http/HTTP.h index a1fedee41d..48a611b63b 100644 --- a/src/analyzer/protocol/http/HTTP.h +++ b/src/analyzer/protocol/http/HTTP.h @@ -5,6 +5,7 @@ #include "analyzer/protocol/tcp/TCP.h" #include "analyzer/protocol/tcp/ContentLine.h" +#include "analyzer/protocol/pia/PIA.h" #include "analyzer/protocol/zip/ZIP.h" #include "analyzer/protocol/mime/MIME.h" #include "binpac_bro.h" @@ -237,6 +238,9 @@ protected: int connection_close; int request_ongoing, reply_ongoing; + bool connect_request; + pia::PIA_TCP *pia; + Val* request_method; // request_URI is in the original form (may contain '%' diff --git a/src/types.bif b/src/types.bif index 2931bf2d22..a44c3c1615 100644 --- a/src/types.bif +++ b/src/types.bif @@ -186,6 +186,7 @@ enum Type %{ TEREDO, SOCKS, GTPv1, + HTTP, %} type EncapsulatingConn: record; diff --git a/testing/btest/Baseline/scripts.base.protocols.http.http-connect/conn.log b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/conn.log new file mode 100644 index 0000000000..8b639edd93 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/conn.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2014-02-13-03-37-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1078232251.833846 CXWv6p3arKYeMETxOg 79.26.245.236 3378 254.228.86.79 8240 tcp http,smtp 6.722274 1685 223 SF - 0 ShADadfF 14 2257 16 944 (empty) +#close 2014-02-13-03-37-02 diff --git a/testing/btest/Baseline/scripts.base.protocols.http.http-connect/http.log b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/http.log new file mode 100644 index 0000000000..4a2cf1ad17 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/http.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path http +#open 2014-02-13-03-37-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer user_agent request_body_len response_body_len status_code status_msg info_code info_msg filename tags username password proxied orig_fuids orig_mime_types resp_fuids resp_mime_types +#types time string addr port addr port count string string string string string count count count string count string string table[enum] string string table[string] vector[string] vector[string] vector[string] vector[string] +1078232252.284420 CXWv6p3arKYeMETxOg 79.26.245.236 3378 254.228.86.79 8240 1 CONNECT - mailin03.sul.t-online.de:25 / - - 0 0 200 Connection established - - - (empty) - - - - - - - +#close 2014-02-13-03-37-02 diff --git a/testing/btest/Baseline/scripts.base.protocols.http.http-connect/smtp.log b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/smtp.log new file mode 100644 index 0000000000..e11a7e9ac0 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/smtp.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path smtp +#open 2014-02-13-03-37-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth helo mailfrom rcptto date from to reply_to msg_id in_reply_to subject x_originating_ip first_received second_received last_reply path user_agent fuids +#types time string addr port addr port count string string table[string] string string table[string] string string string string addr string string string vector[addr] string vector[string] +1078232255.642953 CXWv6p3arKYeMETxOg 79.26.245.236 3378 254.228.86.79 8240 1 208.191.73.21 Tue, 2 Mar 2004 13:57:49 +0100 Sybille Ostermann thenightwatch@t-online.de - - - Hier sind die dicken Girls hemmungloser denn je.. grcu - from mail.iosphere.net (mail.iosphere.net [216.58.97.33]) by mail.netsync.net with esmtp; Mrz, 02 2004 12:55:34 -0700 - 250 Message accepted. 254.228.86.79,79.26.245.236,216.58.97.33 Microsoft Outlook Build 10.0.2616 FVS9k93PUgScEUCOjd +#close 2014-02-13-03-37-02 diff --git a/testing/btest/Baseline/scripts.base.protocols.http.http-connect/tunnel.log b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/tunnel.log new file mode 100644 index 0000000000..9e18e38e03 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.http.http-connect/tunnel.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2014-02-13-03-37-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1078232252.284420 - 79.26.245.236 0 254.228.86.79 8240 Tunnel::HTTP Tunnel::DISCOVER +#close 2014-02-13-03-37-02 diff --git a/testing/btest/Traces/http/connect-with-smtp.trace b/testing/btest/Traces/http/connect-with-smtp.trace new file mode 100644 index 0000000000000000000000000000000000000000..dba5e69edc0c5c10ecf25db2bb50c46aa6b88ad7 GIT binary patch literal 4191 zcmcgvU2Ggz6~4P(r^%8PDM-{nqMmJETc3 zE|G7u9l~t_d_i$ zBovB-C1Uxl6^K4o4Y!8)&i(;%dc$))5>29l8cTig?1nEO>YGn~E`Is5c^~mY9r0I) zXtamO4xCYrCXVe3Px%}_AK>^VqTZL=GQV{5Iw6PTlSE?uC>0_vmrcYP_J z845^w-?p%}HMb>xD0jb%QEn0|av(yE;JzHS6t752_PURC=F4khwZ#wZ?j@ui5~NfW zhHcJi!DTiF>bUx}$sB_g>%@=zY*T}H&{gdV7k!ogvRY+rD`spbX6(;5XIEzInKw3( zZy;wmnuuHP`NU6u93Z~a7XgWrlDjQ#tYfq0%naQ~09~rNY*$0fkjm_zWui;>}`RVHwtQS2vM8 zD6Sk$YhuSow|uPU16VR!XL4=xFGdcdHAWxJqAhxrWM5L*-le3HHNn1eY;(g0O$Ppl zFPIlJ@EOdViUuCdz99+8O|pFZ@y%ox?#t2SgXBMbEVnPB z5$^aBAx9BOj;5emP!@&Hd}~1VQ^@=kWInt16d@yn`N3H9H<-d>-64`g7364g#L#V@ zTBSYUh*yvr`W8MMdySB;bT>Mp1F(V#7iO4iKv8#fw1~uS3Ad8H*eK-)svLS`@q3bM z<-GvcGsyKKay|O&zffiBdV(i%x@%~#zgAj`8kB@>0WUGm+&QKGk7j}P`a%6)o;;jV zdz7S#3k%oRk%wS<4hn{_xipwAij39{P z9|dU0Hl{G!sTx#JAE>?g)ZtXJM@jc8ecP3;t{MgZCY;xq1< zjN&L%D2Fj7Oa}~VSspK&wu846v4X&Hswhwv1rGrzFH-Tp^U5%bCZ?!xusLhszk^`6 zb}4rg`MD}Z(sb7CteQIG{pciJIMjXQ0p{3=-rjUyBKbfpI-0~&s<~={?in9;dcVBQ%HazrPaL>7_M8@ zIy+}(W)xpwms0NF%a~$0Fik7AWjQX4cnDcATvo=($~ZBFLC4gfM!0Sb7VVF402*xGV_c*Q{YRQZW`#RpAp%yBSKPvB_0)=s@ zD`$^I2TjzFvso010_IU$*EohQtE#A&63C&mb70w~DIMwSrN~X9j$wGra#^+NyBjlH z!S$wB(5W)*lW1>rV^!SYWva;sR=5?HU$I~difu=JJfL6Y4OYpJ%SqQ~D;6u6Me7M( zC{<(8<;E0$bwv|xs-AcJ>RDQ&dJc@>Yt`j(Y)p;nx#@>7lEFhcnwsdYk9{oqaG;4| zB}S~a_~mnzT7S<_$I($3y-=W4mll!e6)er8>2RaWH+TE%vNW5ouP)64BUqZRVh0@? zeu0p$er+PZjCEzb518A7T z9PuYR8dUf{{$%&YFOC1SrY|8 Date: Fri, 14 Feb 2014 12:06:24 -0800 Subject: [PATCH 006/182] Support for MPLS over VLAN. Patch by Chris Kanich. BIT-1017 #merged --- CHANGES | 4 ++++ VERSION | 2 +- src/PktSrc.cc | 22 ++++++++++++------ .../btest/Baseline/core.mpls-in-vlan/conn.log | 12 ++++++++++ testing/btest/Traces/mpls-in-vlan.trace | Bin 0 -> 2605 bytes testing/btest/core/mpls-in-vlan.bro | 2 ++ 6 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 testing/btest/Baseline/core.mpls-in-vlan/conn.log create mode 100644 testing/btest/Traces/mpls-in-vlan.trace create mode 100644 testing/btest/core/mpls-in-vlan.bro diff --git a/CHANGES b/CHANGES index f00e43a271..ba9102aeeb 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +2.2-174 | 2014-02-14 12:07:04 -0800 + + * Support for MPLS over VLAN. (Chris Kanich) + 2.2-173 | 2014-02-14 10:50:15 -0800 * Fix misidentification of SOCKS traffic that in particiular seemed diff --git a/VERSION b/VERSION index 60dee2b058..5b847786b5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2-173 +2.2-174 diff --git a/src/PktSrc.cc b/src/PktSrc.cc index 941c4acd83..179630cdbd 100644 --- a/src/PktSrc.cc +++ b/src/PktSrc.cc @@ -229,12 +229,21 @@ void PktSrc::Process() { // MPLS carried over the ethernet frame. case 0x8847: + // Remove the data link layer and denote a + // header size of zero before the IP header. have_mpls = true; + data += get_link_header_size(datalink); + pkt_hdr_size = 0; break; // VLAN carried over the ethernet frame. case 0x8100: data += get_link_header_size(datalink); + + // Check for MPLS in VLAN. + if ( ((data[2] << 8) + data[3]) == 0x8847 ) + have_mpls = true; + data += 4; // Skip the vlan header pkt_hdr_size = 0; @@ -274,8 +283,13 @@ void PktSrc::Process() protocol = (data[2] << 8) + data[3]; if ( protocol == 0x0281 ) - // MPLS Unicast + { + // MPLS Unicast. Remove the data link layer and + // denote a header size of zero before the IP header. have_mpls = true; + data += get_link_header_size(datalink); + pkt_hdr_size = 0; + } else if ( protocol != 0x0021 && protocol != 0x0057 ) { @@ -290,12 +304,6 @@ void PktSrc::Process() if ( have_mpls ) { - // Remove the data link layer - data += get_link_header_size(datalink); - - // Denote a header size of zero before the IP header - pkt_hdr_size = 0; - // Skip the MPLS label stack. bool end_of_stack = false; diff --git a/testing/btest/Baseline/core.mpls-in-vlan/conn.log b/testing/btest/Baseline/core.mpls-in-vlan/conn.log new file mode 100644 index 0000000000..e8ee793b75 --- /dev/null +++ b/testing/btest/Baseline/core.mpls-in-vlan/conn.log @@ -0,0 +1,12 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2014-02-14-20-04-20 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1371685686.536606 CXWv6p3arKYeMETxOg 65.65.65.65 19244 65.65.65.65 80 tcp - - - - OTH - 0 D 1 257 0 0 (empty) +1371686961.156859 CjhGID4nQcgTWjvg4c 65.65.65.65 32828 65.65.65.65 80 tcp - - - - OTH - 0 d 0 0 1 1500 (empty) +1371686961.479321 CCvvfg3TEfuqmmG4bh 65.65.65.65 61193 65.65.65.65 80 tcp - - - - OTH - 0 D 1 710 0 0 (empty) +#close 2014-02-14-20-04-20 diff --git a/testing/btest/Traces/mpls-in-vlan.trace b/testing/btest/Traces/mpls-in-vlan.trace new file mode 100644 index 0000000000000000000000000000000000000000..634f3fce1469f61f436ed1b79c5b1c42f8c29289 GIT binary patch literal 2605 zcmc&$O>7%Q6rKc{rYlxd;*t}LWDX_rdhM86Wl5!&#EGR8$t5We327Pcj@LuRGt2Bc zPFf)h5>ig|g2V+ODpi~~fdq$~T7E9v5Jyy1LeN{0IKY)RyIv=@TnSf2j5IrXGjHC! z@0<7L?a$wSd1Dqmj?s+wT8KmDxu-Sz%iRH=NB z(qv!%;^>*P;@M1ZiqSOAG>NwxDA^Uh#X2OQj*x=BIJ)3TE|rs8UtiY?1F2N2ER`?7 z#5<;ui)ARt-X$h>@ikCsaY=v|#e#OMx4^Q4mx|%O7Lr+~bUu|r8L@<2(u^eU#`w8dxVpAhTf;By;Ogd9y}C25lE{lT++v6M5biO=^w6W@DV%E(NCo94 z_vd=4qIOIB2RGhx+RXQ<(9kd`{iA>`*r*O-=!<9^8bu zLPz>tPSb__1Z92PApXkbGMqG}&30K^Xi5ddW!~Wu1Ovn#^Kou9X@g1Q{%@q`U9uTc)% z*Tg!dH20=t3k-4gz%w}0r(^(^G(N1qS!Qz<0U_}Lr&fFr0xekB4*9y8g_f0-C^~V|1_~h2_d+zDNPyGe&@YY9zVtMn;JN2Vi z7apouX2$==@kG5&>u|4Ep!)<~U|NtW7%jxRx)8(b|FDJlQR9T0_BA+P2&~X zqKc}qe~CwZ=znZ4!(`QjC)27KTxDV2r!8F+^O5hhhdP&t2)g?30aIaJ*~&u|c>7|p Ja6$j^`~zPp1hfDE literal 0 HcmV?d00001 diff --git a/testing/btest/core/mpls-in-vlan.bro b/testing/btest/core/mpls-in-vlan.bro new file mode 100644 index 0000000000..f57c1862ce --- /dev/null +++ b/testing/btest/core/mpls-in-vlan.bro @@ -0,0 +1,2 @@ +# @TEST-EXEC: bro -C -r $TRACES/mpls-in-vlan.trace +# @TEST-EXEC: btest-diff conn.log From b712d6436cfbfe48c0afcb0a2fd30bfd07a4687b Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 18 Feb 2014 02:54:03 -0800 Subject: [PATCH 007/182] update 3rdparty submodule (new SQLite version) --- src/3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty b/src/3rdparty index 42a4c9694a..92674c5745 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 42a4c9694a2b2677b050fbb7cbae26bc5ec4605a +Subproject commit 92674c57455cb71de5a2be6f482570e10be46aa6 From a0c06a957bf3c7fd60748f7b5074bff8cbd86868 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 18 Feb 2014 14:41:32 -0600 Subject: [PATCH 008/182] Add SNMP datagram parsing support. This supports parsing of SNMPv1 (RFC 1157), SNMPv2 (RFC 1901/3416), and SNMPv2 (RFC 3412). An event is raised for each SNMP PDU type, though there's not currently any event handlers for them and not a default snmp.log either. However, simple presence of SNMP is currently visible now in conn.log service field and known_services.log. --- scripts/base/init-bare.bro | 124 ++++ scripts/base/init-default.bro | 1 + scripts/base/protocols/snmp/README | 1 + scripts/base/protocols/snmp/__load__.bro | 1 + scripts/base/protocols/snmp/main.bro | 15 + src/analyzer/protocol/CMakeLists.txt | 1 + src/analyzer/protocol/snmp/CMakeLists.txt | 11 + src/analyzer/protocol/snmp/Plugin.cc | 9 + src/analyzer/protocol/snmp/SNMP.cc | 38 ++ src/analyzer/protocol/snmp/SNMP.h | 29 + src/analyzer/protocol/snmp/events.bif | 166 +++++ src/analyzer/protocol/snmp/snmp-analyzer.pac | 590 +++++++++++++++++ src/analyzer/protocol/snmp/snmp-protocol.pac | 272 ++++++++ src/analyzer/protocol/snmp/snmp.pac | 25 + src/analyzer/protocol/snmp/types.bif | 18 + .../Baseline/core.print-bpf-filters/output2 | 10 +- .../canonified_loaded_scripts.log | 6 +- .../canonified_loaded_scripts.log | 8 +- .../scripts.base.protocols.snmp.v1/out1 | 598 ++++++++++++++++++ .../scripts.base.protocols.snmp.v1/out2 | 26 + .../scripts.base.protocols.snmp.v1/out3 | 18 + .../scripts.base.protocols.snmp.v1/out4 | 11 + .../scripts.base.protocols.snmp.v2/out1 | 18 + .../scripts.base.protocols.snmp.v2/out2 | 18 + .../scripts.base.protocols.snmp.v2/out3 | 72 +++ .../scripts.base.protocols.snmp.v3/out1 | 34 + testing/btest/Traces/snmp/snmpv1_get.pcap | Bin 0 -> 7165 bytes .../btest/Traces/snmp/snmpv1_get_short.pcap | Bin 0 -> 299 bytes testing/btest/Traces/snmp/snmpv1_set.pcap | Bin 0 -> 219 bytes testing/btest/Traces/snmp/snmpv1_trap.pcap | Bin 0 -> 143 bytes testing/btest/Traces/snmp/snmpv2_get.pcap | Bin 0 -> 233 bytes .../btest/Traces/snmp/snmpv2_get_bulk.pcap | Bin 0 -> 214 bytes .../btest/Traces/snmp/snmpv2_get_next.pcap | Bin 0 -> 894 bytes .../btest/Traces/snmp/snmpv3_get_next.pcap | Bin 0 -> 661 bytes .../btest/scripts/base/protocols/snmp/v1.bro | 11 + .../btest/scripts/base/protocols/snmp/v2.bro | 9 + .../btest/scripts/base/protocols/snmp/v3.bro | 5 + testing/scripts/snmp-test.bro | 208 ++++++ 38 files changed, 2345 insertions(+), 8 deletions(-) create mode 100644 scripts/base/protocols/snmp/README create mode 100644 scripts/base/protocols/snmp/__load__.bro create mode 100644 scripts/base/protocols/snmp/main.bro create mode 100644 src/analyzer/protocol/snmp/CMakeLists.txt create mode 100644 src/analyzer/protocol/snmp/Plugin.cc create mode 100644 src/analyzer/protocol/snmp/SNMP.cc create mode 100644 src/analyzer/protocol/snmp/SNMP.h create mode 100644 src/analyzer/protocol/snmp/events.bif create mode 100644 src/analyzer/protocol/snmp/snmp-analyzer.pac create mode 100644 src/analyzer/protocol/snmp/snmp-protocol.pac create mode 100644 src/analyzer/protocol/snmp/snmp.pac create mode 100644 src/analyzer/protocol/snmp/types.bif create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v1/out1 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v1/out2 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v1/out3 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v1/out4 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v2/out1 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v2/out2 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v2/out3 create mode 100644 testing/btest/Baseline/scripts.base.protocols.snmp.v3/out1 create mode 100644 testing/btest/Traces/snmp/snmpv1_get.pcap create mode 100644 testing/btest/Traces/snmp/snmpv1_get_short.pcap create mode 100644 testing/btest/Traces/snmp/snmpv1_set.pcap create mode 100644 testing/btest/Traces/snmp/snmpv1_trap.pcap create mode 100644 testing/btest/Traces/snmp/snmpv2_get.pcap create mode 100644 testing/btest/Traces/snmp/snmpv2_get_bulk.pcap create mode 100644 testing/btest/Traces/snmp/snmpv2_get_next.pcap create mode 100644 testing/btest/Traces/snmp/snmpv3_get_next.pcap create mode 100644 testing/btest/scripts/base/protocols/snmp/v1.bro create mode 100644 testing/btest/scripts/base/protocols/snmp/v2.bro create mode 100644 testing/btest/scripts/base/protocols/snmp/v3.bro create mode 100644 testing/scripts/snmp-test.bro diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index d4e631ecf4..7e3840df0a 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -2775,6 +2775,130 @@ export { } module GLOBAL; +@load base/bif/plugins/Bro_SNMP.types.bif + +module SNMP; +export { + + ## The top-level message data structure of an SNMPv1 datagram, not + ## including the PDU data. See :rfc:`1157`. + type SNMP::HeaderV1: record { + community: string; + }; + + ## The top-level message data structure of an SNMPv2 datagram, not + ## including the PDU data. See :rfc:`1901`. + type SNMP::HeaderV2: record { + community: string; + }; + + ## The ``ScopedPduData`` data structure of an SNMPv3 datagram, not + ## including the PDU data (i.e. just the "context" fields). + ## See :rfc:`3412`. + type SNMP::ScopedPDU_Context: record { + engine_id: string; + name: string; + }; + + ## The top-level message data structure of an SNMPv3 datagram, not + ## including the PDU data. See :rfc:`3412`. + type SNMP::HeaderV3: record { + id: count; + max_size: count; + flags: count; + auth_flag: bool; + priv_flag: bool; + reportable_flag: bool; + security_model: count; + security_params: string; + pdu_context: SNMP::ScopedPDU_Context &optional; + }; + + ## A generic SNMP header data structure that may include data from + ## any version of SNMP. The value of the ``version`` field + ## determines what header field is initialized. + type SNMP::Header: record { + version: count; + v1: SNMP::HeaderV1 &optional; ##< Set when ``version`` is 0. + v2: SNMP::HeaderV2 &optional; ##< Set when ``version`` is 1. + v3: SNMP::HeaderV3 &optional; ##< Set when ``version`` is 3. + }; + + ## A generic SNMP object value, that may include any of the + ## valid ``ObjectSyntax`` values from :rfc:`1155` or :rfc:`3416`. + ## The value is decoded whenever possible and assigned to + ## the appropriate field, which can be determined from the value + ## of the ``tag`` field. For tags that can't be mapped to an + ## appropriate type, the ``octets`` field holds the BER encoded + ## ASN.1 content if there is any (though, ``octets`` is may also + ## be used for other tags such as OCTET STRINGS or Opaque). Null + ## values will only have their corresponding tag value set. + type SNMP::ObjectValue: record { + tag: count; + oid: string &optional; + signed: int &optional; + unsigned: count &optional; + address: addr &optional; + octets: string &optional; + }; + + # These aren't an enum because it's easier to type fields as count. + # That way don't have to deal with type conversion, plus doesn't + # mislead that these are the only valid tag values (it's just the set + # of known tags). + const SNMP::OBJ_INTEGER_TAG : count = 0x02; ##< Signed 64-bit integer. + const SNMP::OBJ_OCTETSTRING_TAG : count = 0x04; ##< An octet string. + const SNMP::OBJ_UNSPECIFIED_TAG : count = 0x05; ##< A NULL value. + const SNMP::OBJ_OID_TAG : count = 0x06; ##< An Object Identifier. + const SNMP::OBJ_IPADDRESS_TAG : count = 0x40; ##< An IP address. + const SNMP::OBJ_COUNTER32_TAG : count = 0x41; ##< Unsigned 32-bit integer. + const SNMP::OBJ_UNSIGNED32_TAG : count = 0x42; ##< Unsigned 32-bit integer. + const SNMP::OBJ_TIMETICKS_TAG : count = 0x43; ##< Unsigned 32-bit integer. + const SNMP::OBJ_OPAQUE_TAG : count = 0x44; ##< An octet string. + const SNMP::OBJ_COUNTER64_TAG : count = 0x46; ##< Unsigned 64-bit integer. + const SNMP::OBJ_NOSUCHOBJECT_TAG : count = 0x80; ##< A NULL value. + const SNMP::OBJ_NOSUCHINSTANCE_TAG: count = 0x81; ##< A NULL value. + const SNMP::OBJ_ENDOFMIBVIEW_TAG : count = 0x82; ##< A NULL value. + + ## The ``VarBind`` data structure from either :rfc:`1157` or + ## :rfc:`3416`, which maps an Object Identifier to a value. + type SNMP::Binding: record { + oid: string; + value: SNMP::ObjectValue; + }; + + ## A ``VarBindList`` data structure from either :rfc:`1157` or :rfc:`3416`. + ## A sequences of :bro:see:`SNMP::Binding`, which maps an OIDs to values. + type SNMP::Bindings: vector of SNMP::Binding; + + ## A ``PDU`` data structure from either :rfc:`1157` or :rfc:`3416`. + type SNMP::PDU: record { + request_id: int; + error_status: int; + error_index: int; + bindings: SNMP::Bindings; + }; + + ## A ``Trap-PDU`` data structure from :rfc:`1157`. + type SNMP::TrapPDU: record { + enterprise: string; + agent: addr; + generic_trap: int; + specific_trap: int; + time_stamp: count; + bindings: SNMP::Bindings; + }; + + ## A ``BulkPDU`` data structure from :rfc:`3416`. + type SNMP::BulkPDU: record { + request_id: int; + non_repeaters: count; + max_repititions: count; + bindings: SNMP::Bindings; + }; +} +module GLOBAL; + @load base/bif/event.bif ## BPF filter the user has set via the -f command line options. Empty if none. diff --git a/scripts/base/init-default.bro b/scripts/base/init-default.bro index d87574f4e5..edf6e21f56 100644 --- a/scripts/base/init-default.bro +++ b/scripts/base/init-default.bro @@ -47,6 +47,7 @@ @load base/protocols/irc @load base/protocols/modbus @load base/protocols/pop3 +@load base/protocols/snmp @load base/protocols/smtp @load base/protocols/socks @load base/protocols/ssh diff --git a/scripts/base/protocols/snmp/README b/scripts/base/protocols/snmp/README new file mode 100644 index 0000000000..524c3266cc --- /dev/null +++ b/scripts/base/protocols/snmp/README @@ -0,0 +1 @@ +Support for Simple Network Management Protocol (SNMP) analysis. diff --git a/scripts/base/protocols/snmp/__load__.bro b/scripts/base/protocols/snmp/__load__.bro new file mode 100644 index 0000000000..a10fe855df --- /dev/null +++ b/scripts/base/protocols/snmp/__load__.bro @@ -0,0 +1 @@ +@load ./main diff --git a/scripts/base/protocols/snmp/main.bro b/scripts/base/protocols/snmp/main.bro new file mode 100644 index 0000000000..a2fbb23713 --- /dev/null +++ b/scripts/base/protocols/snmp/main.bro @@ -0,0 +1,15 @@ +##! Enables analysis of SNMP datagrams. + +module SNMP; + +export { +} + +const ports = { 161/udp, 162/udp }; + +redef likely_server_ports += { ports }; + +event bro_init() &priority=5 + { + Analyzer::register_for_ports(Analyzer::ANALYZER_SNMP, ports); + } diff --git a/src/analyzer/protocol/CMakeLists.txt b/src/analyzer/protocol/CMakeLists.txt index fc63aa4b66..bf063dfafc 100644 --- a/src/analyzer/protocol/CMakeLists.txt +++ b/src/analyzer/protocol/CMakeLists.txt @@ -28,6 +28,7 @@ add_subdirectory(ntp) add_subdirectory(pia) add_subdirectory(pop3) add_subdirectory(rpc) +add_subdirectory(snmp) add_subdirectory(smb) add_subdirectory(smtp) add_subdirectory(socks) diff --git a/src/analyzer/protocol/snmp/CMakeLists.txt b/src/analyzer/protocol/snmp/CMakeLists.txt new file mode 100644 index 0000000000..7f1ffe2ed6 --- /dev/null +++ b/src/analyzer/protocol/snmp/CMakeLists.txt @@ -0,0 +1,11 @@ +include(BroPlugin) + +include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}) + +bro_plugin_begin(Bro SNMP) +bro_plugin_cc(SNMP.cc Plugin.cc) +bro_plugin_bif(types.bif) +bro_plugin_bif(events.bif) +bro_plugin_pac(snmp.pac snmp-protocol.pac snmp-analyzer.pac) +bro_plugin_end() diff --git a/src/analyzer/protocol/snmp/Plugin.cc b/src/analyzer/protocol/snmp/Plugin.cc new file mode 100644 index 0000000000..e9e74f67a6 --- /dev/null +++ b/src/analyzer/protocol/snmp/Plugin.cc @@ -0,0 +1,9 @@ +#include "plugin/Plugin.h" +#include "SNMP.h" + +BRO_PLUGIN_BEGIN(Bro, SNMP) + BRO_PLUGIN_DESCRIPTION("SNMP Analyzer"); + BRO_PLUGIN_ANALYZER("SNMP", snmp::SNMP_Analyzer); + BRO_PLUGIN_BIF_FILE(types); + BRO_PLUGIN_BIF_FILE(events); +BRO_PLUGIN_END diff --git a/src/analyzer/protocol/snmp/SNMP.cc b/src/analyzer/protocol/snmp/SNMP.cc new file mode 100644 index 0000000000..110479406c --- /dev/null +++ b/src/analyzer/protocol/snmp/SNMP.cc @@ -0,0 +1,38 @@ +#include "SNMP.h" +#include "Func.h" +#include "types.bif.h" +#include "events.bif.h" + +using namespace analyzer::snmp; + +SNMP_Analyzer::SNMP_Analyzer(Connection* conn) + : Analyzer("SNMP", conn) + { + interp = new binpac::SNMP::SNMP_Conn(this); + } + +SNMP_Analyzer::~SNMP_Analyzer() + { + delete interp; + } + +void SNMP_Analyzer::Done() + { + Analyzer::Done(); + Event(udp_session_done); + } + +void SNMP_Analyzer::DeliverPacket(int len, const u_char* data, bool orig, + int seq, const IP_Hdr* ip, int caplen) + { + Analyzer::DeliverPacket(len, data, orig, seq, ip, caplen); + + try + { + interp->NewData(orig, data, data + len); + } + catch ( const binpac::Exception& e ) + { + ProtocolViolation(e.c_msg()); + } + } diff --git a/src/analyzer/protocol/snmp/SNMP.h b/src/analyzer/protocol/snmp/SNMP.h new file mode 100644 index 0000000000..f6dedc7b87 --- /dev/null +++ b/src/analyzer/protocol/snmp/SNMP.h @@ -0,0 +1,29 @@ +#ifndef ANALYZER_PROTOCOL_SNMP_SNMP_H +#define ANALYZER_PROTOCOL_SNMP_SNMP_H + +#include "snmp_pac.h" + +namespace analyzer { namespace snmp { + +class SNMP_Analyzer : public analyzer::Analyzer { + +public: + + SNMP_Analyzer(Connection* conn); + virtual ~SNMP_Analyzer(); + + virtual void Done(); + virtual void DeliverPacket(int len, const u_char* data, bool orig, + int seq, const IP_Hdr* ip, int caplen); + + static analyzer::Analyzer* InstantiateAnalyzer(Connection* conn) + { return new SNMP_Analyzer(conn); } + +protected: + + binpac::SNMP::SNMP_Conn* interp; +}; + +} } // namespace analyzer::* + +#endif diff --git a/src/analyzer/protocol/snmp/events.bif b/src/analyzer/protocol/snmp/events.bif new file mode 100644 index 0000000000..af5f2ba969 --- /dev/null +++ b/src/analyzer/protocol/snmp/events.bif @@ -0,0 +1,166 @@ + +## An SNMP ``GetRequest-PDU`` message from either :rfc:`1157` or :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_get_request%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP ``GetNextRequest-PDU`` message from either :rfc:`1157` or +## :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_get_next_request%(c: connection, is_orig: bool, + header: SNMP::Header, pdu: SNMP::PDU%); + +## An SNMP ``GetResponse-PDU`` message from :rfc:`1157` or a +## ``Response-PDU`` from :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_response%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP ``SetRequest-PDU`` message from either :rfc:`1157` or :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_set_request%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP ``Trap-PDU`` message from :rfc:`1157`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_trap%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::TrapPDU%); + +## An SNMP ``GetBulkRequest-PDU`` message from :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_get_bulk_request%(c: connection, is_orig: bool, + header: SNMP::Header, pdu: SNMP::BulkPDU%); + +## An SNMP ``InformRequest-PDU`` message from :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_inform_request%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP ``SNMPv2-Trap-PDU`` message from :rfc:`1157`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_trapV2%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP ``Report-PDU`` message from :rfc:`3416`. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## pdu: An SNMP PDU data structure. +event snmp_report%(c: connection, is_orig: bool, header: SNMP::Header, + pdu: SNMP::PDU%); + +## An SNMP PDU message of unknown type. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## tag: The tag of the unknown SNMP PDU. +event snmp_unknown_pdu%(c: connection, is_orig: bool, header: SNMP::Header, + tag: count%); + +## An SNMPv3 ``ScopedPDUData`` of unknown type (neither plaintext or +## an encrypted PDU was in the datagram). +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +## +## tag: The tag of the unknown SNMP PDU scope. +event snmp_unknown_scoped_pdu%(c: connection, is_orig: bool, + header: SNMP::Header, tag: count%); + +## An SNMPv3 encrypted PDU message. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## header: SNMP version-dependent data that precedes PDU data in the top-level +## SNMP message structure. +event snmp_encrypted_pdu%(c: connection, is_orig: bool, header: SNMP::Header%); + +## A datagram with an unknown SNMP version. +## +## c: The connection overwhich the SNMP datagram is sent. +## +## is_orig: The endpoint which sent the SNMP datagram. +## +## version: The value of the unknown SNMP version. +event snmp_unknown_header_version%(c: connection, is_orig: bool, + version: count%); diff --git a/src/analyzer/protocol/snmp/snmp-analyzer.pac b/src/analyzer/protocol/snmp/snmp-analyzer.pac new file mode 100644 index 0000000000..1a864df8b9 --- /dev/null +++ b/src/analyzer/protocol/snmp/snmp-analyzer.pac @@ -0,0 +1,590 @@ + +%header{ +StringVal* asn1_oid_to_val(const ASN1Encoding* oid); +StringVal* asn1_oid_to_val(const ASN1ObjectIdentifier* oid); + +Val* asn1_integer_to_val(const ASN1Encoding* i, TypeTag t); +Val* asn1_integer_to_val(const ASN1Integer* i, TypeTag t); + +StringVal* asn1_octet_string_to_val(const ASN1Encoding* s); +StringVal* asn1_octet_string_to_val(const ASN1OctetString* s); + +AddrVal* network_address_to_val(const ASN1Encoding* na); +AddrVal* network_address_to_val(const NetworkAddress* na); + +Val* asn1_obj_to_val(const ASN1Encoding* obj); + +RecordVal* build_hdr(const Header* header); +RecordVal* build_hdrV3(const Header* header); +VectorVal* build_bindings(const VarBindList* vbl); +RecordVal* build_pdu(const CommonPDU* pdu); +RecordVal* build_trap_pdu(const TrapPDU* pdu); +RecordVal* build_bulk_pdu(const GetBulkRequestPDU* pdu); +%} + +%code{ + +StringVal* asn1_oid_to_val(const ASN1ObjectIdentifier* oid) + { + return asn1_oid_to_val(oid->encoding()); + } + +StringVal* asn1_oid_to_val(const ASN1Encoding* oid) + { + vector oid_components; + vector > subidentifiers; + vector subidentifier_values; + vector subidentifier; + bytestring const& bs = oid->content(); + + for ( int i = 0; i < bs.length(); ++i ) + { + if ( bs[i] & 0x80 ) + subidentifier.push_back(bs[i] & 0x7f); + else + { + subidentifier.push_back(bs[i]); + subidentifiers.push_back(subidentifier); + subidentifier.clear(); + } + } + + if ( ! subidentifier.empty() || subidentifiers.size() < 1 ) + // Underflow. + return new StringVal(""); + + for ( size_t i = 0; i < subidentifiers.size(); ++i ) + { + subidentifier = subidentifiers[i]; + uint64 value = 0; + + for ( size_t j = 0; j < subidentifier.size(); ++j ) + { + uint64 byte = subidentifier[j]; + value |= byte << (7 * (subidentifier.size() - (j + 1))); + } + + subidentifier_values.push_back(value); + } + + string rval; + + for ( size_t i = 0; i < subidentifier_values.size(); ++i ) + { + char tmp[32]; + + if ( i > 0 ) + { + rval += "."; + snprintf(tmp, sizeof(tmp), "%"PRIu64, subidentifier_values[i]); + rval += tmp; + } + else + { + std::div_t result = div(subidentifier_values[i], 40); + snprintf(tmp, sizeof(tmp), "%d", result.quot); + rval += tmp; + rval += "."; + snprintf(tmp, sizeof(tmp), "%d", result.rem); + rval += tmp; + } + } + + return new StringVal(rval); + } + +Val* asn1_obj_to_val(const ASN1Encoding* obj) + { + RecordVal* rval = new RecordVal(BifType::Record::SNMP::ObjectValue); + uint8 tag = obj->meta()->tag(); + + rval->Assign(0, new Val(tag, TYPE_COUNT)); + + switch ( tag ) { + case VARBIND_UNSPECIFIED_TAG: + case VARBIND_NOSUCHOBJECT_TAG: + case VARBIND_NOSUCHINSTANCE_TAG: + case VARBIND_ENDOFMIBVIEW_TAG: + break; + + case ASN1_OBJECT_IDENTIFIER_TAG: + rval->Assign(1, asn1_oid_to_val(obj)); + break; + + case ASN1_INTEGER_TAG: + rval->Assign(2, asn1_integer_to_val(obj, TYPE_INT)); + break; + + case APP_COUNTER32_TAG: + case APP_UNSIGNED32_TAG: + case APP_TIMETICKS_TAG: + case APP_COUNTER64_TAG: + rval->Assign(3, asn1_integer_to_val(obj, TYPE_COUNT)); + break; + + case APP_IPADDRESS_TAG: + rval->Assign(4, network_address_to_val(obj)); + break; + + case ASN1_OCTET_STRING_TAG: + case APP_OPAQUE_TAG: + default: + rval->Assign(5, asn1_octet_string_to_val(obj)); + break; + } + + return rval; + } + +StringVal* asn1_octet_string_to_val(const ASN1OctetString* s) + { + return asn1_octet_string_to_val(s->encoding()); + } + +StringVal* asn1_octet_string_to_val(const ASN1Encoding* s) + { + bytestring const& bs = s->content(); + return new StringVal(bs.length(), reinterpret_cast(bs.data())); + } + +Val* asn1_integer_to_val(const ASN1Integer* i, TypeTag t) + { + return asn1_integer_to_val(i->encoding(), t); + } + +Val* asn1_integer_to_val(const ASN1Encoding* i, TypeTag t) + { + return new Val(binary_to_int64(i->content()), t); + } + +AddrVal* network_address_to_val(const NetworkAddress* na) + { + return network_address_to_val(na->encoding()); + } + +AddrVal* network_address_to_val(const ASN1Encoding* na) + { + bytestring const& bs = na->content(); + + // IPv6 can probably be presumed to be a octet string of length 16, + // but standards don't seem to currently make any provisions for IPv6, + // so ignore anything that can't be IPv4. + if ( bs.length() != 4 ) + return new AddrVal(IPAddr()); + + const u_char* data = reinterpret_cast(bs.data()); + uint32 network_order = extract_uint32(data); + return new AddrVal(network_order); + } + +Val* time_ticks_to_val(const TimeTicks* tt) + { + return asn1_integer_to_val(tt->asn1_integer(), TYPE_COUNT); + } + +RecordVal* build_hdr(const Header* header) + { + RecordVal* rv = new RecordVal(BifType::Record::SNMP::Header); + rv->Assign(0, new Val(header->version(), TYPE_COUNT)); + + switch ( header->version() ) { + case SNMPV1_TAG: + { + RecordVal* v1 = new RecordVal(BifType::Record::SNMP::HeaderV1); + v1->Assign(0, asn1_octet_string_to_val(header->v1()->community())); + rv->Assign(1, v1); + } + break; + + case SNMPV2_TAG: + { + RecordVal* v2 = new RecordVal(BifType::Record::SNMP::HeaderV2); + v2->Assign(0, asn1_octet_string_to_val(header->v2()->community())); + rv->Assign(2, v2); + } + break; + + case SNMPV3_TAG: + { + rv->Assign(3, build_hdrV3(header)); + } + break; + } + + return rv; + } + +RecordVal* build_hdrV3(const Header* header) + { + RecordVal* v3 = new RecordVal(BifType::Record::SNMP::HeaderV3); + const v3Header* v3hdr = header->v3(); + const v3HeaderData* global_data = v3hdr->global_data(); + bytestring const& flags = global_data->flags()->encoding()->content(); + uint8 flags_byte = flags.length() > 0 ? flags[0] : 0; + + v3->Assign(0, asn1_integer_to_val(global_data->id(), TYPE_COUNT)); + v3->Assign(1, asn1_integer_to_val(global_data->max_size(), + TYPE_COUNT)); + v3->Assign(2, new Val(flags_byte, TYPE_COUNT)); + v3->Assign(3, new Val(flags_byte & 0x01, TYPE_BOOL)); + v3->Assign(4, new Val(flags_byte & 0x02, TYPE_BOOL)); + v3->Assign(5, new Val(flags_byte & 0x04, TYPE_BOOL)); + v3->Assign(6, asn1_integer_to_val(global_data->security_model(), + TYPE_COUNT)); + v3->Assign(7, asn1_octet_string_to_val(v3hdr->security_parameters())); + + if ( v3hdr->next()->tag() == ASN1_SEQUENCE_TAG ) + { + const v3ScopedPDU* spdu = v3hdr->plaintext_pdu(); + RecordVal* rv = new RecordVal(BifType::Record::SNMP::ScopedPDU_Context); + rv->Assign(0, asn1_octet_string_to_val(spdu->context_engine_id())); + rv->Assign(1, asn1_octet_string_to_val(spdu->context_name())); + v3->Assign(8, rv); + } + + return v3; + } + +VectorVal* build_bindings(const VarBindList* vbl) + { + VectorVal* vv = new VectorVal(BifType::Vector::SNMP::Bindings); + + for ( size_t i = 0; i < vbl->bindings()->size(); ++i ) + { + VarBind* vb = (*vbl->bindings())[i]; + RecordVal* binding = new RecordVal(BifType::Record::SNMP::Binding); + binding->Assign(0, asn1_oid_to_val(vb->name()->oid())); + binding->Assign(1, asn1_obj_to_val(vb->value()->encoding())); + vv->Assign(i, binding); + } + + return vv; + } + +RecordVal* build_pdu(const CommonPDU* pdu) + { + RecordVal* rv = new RecordVal(BifType::Record::SNMP::PDU); + rv->Assign(0, asn1_integer_to_val(pdu->request_id(), TYPE_INT)); + rv->Assign(1, asn1_integer_to_val(pdu->error_status(), TYPE_INT)); + rv->Assign(2, asn1_integer_to_val(pdu->error_index(), TYPE_INT)); + rv->Assign(3, build_bindings(pdu->var_bindings())); + return rv; + } + +RecordVal* build_trap_pdu(const TrapPDU* pdu) + { + RecordVal* rv = new RecordVal(BifType::Record::SNMP::TrapPDU); + rv->Assign(0, asn1_oid_to_val(pdu->enterprise())); + rv->Assign(1, network_address_to_val(pdu->agent_addr())); + rv->Assign(2, asn1_integer_to_val(pdu->generic_trap(), TYPE_INT)); + rv->Assign(3, asn1_integer_to_val(pdu->specific_trap(), TYPE_INT)); + rv->Assign(4, time_ticks_to_val(pdu->time_stamp())); + rv->Assign(5, build_bindings(pdu->var_bindings())); + return rv; + } + +RecordVal* build_bulk_pdu(const GetBulkRequestPDU* pdu) + { + RecordVal* rv = new RecordVal(BifType::Record::SNMP::BulkPDU); + rv->Assign(0, asn1_integer_to_val(pdu->request_id(), TYPE_INT)); + rv->Assign(1, asn1_integer_to_val(pdu->non_repeaters(), TYPE_COUNT)); + rv->Assign(2, asn1_integer_to_val(pdu->max_repititions(), TYPE_COUNT)); + rv->Assign(3, build_bindings(pdu->var_bindings())); + return rv; + } +%} + +refine connection SNMP_Conn += { + + function proc_get_request(pdu: GetRequestPDU): bool + %{ + if ( ! snmp_get_request ) + return false; + + BifEvent::generate_snmp_get_request(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_get_next_request(pdu: GetNextRequestPDU): bool + %{ + if ( ! snmp_get_next_request ) + return false; + + BifEvent::generate_snmp_get_next_request(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_response(pdu: ResponsePDU): bool + %{ + if ( ! snmp_response ) + return false; + + BifEvent::generate_snmp_response(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_set_request(pdu: SetRequestPDU): bool + %{ + if ( ! snmp_set_request ) + return false; + + BifEvent::generate_snmp_set_request(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_trap(pdu: TrapPDU): bool + %{ + if ( ! snmp_trap ) + return false; + + BifEvent::generate_snmp_trap(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_trap_pdu(${pdu})); + return true; + %} + + function proc_get_bulk_request(pdu: GetBulkRequestPDU): bool + %{ + if ( ! snmp_get_bulk_request ) + return false; + + BifEvent::generate_snmp_get_bulk_request(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_bulk_pdu(${pdu})); + return true; + %} + + function proc_inform_request(pdu: InformRequestPDU): bool + %{ + if ( ! snmp_inform_request ) + return false; + + BifEvent::generate_snmp_inform_request(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_v2_trap(pdu: v2TrapPDU): bool + %{ + if ( ! snmp_trapV2 ) + return false; + + BifEvent::generate_snmp_trapV2(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_report(pdu: ReportPDU): bool + %{ + if ( ! snmp_report ) + return false; + + BifEvent::generate_snmp_report(bro_analyzer(), + bro_analyzer()->Conn(), + ${pdu.header.is_orig}, + build_hdr(${pdu.header}), + build_pdu(${pdu.pdu})); + return true; + %} + + function proc_unknown_version_header(rec: UnknownVersionHeader): bool + %{ + if ( ! snmp_unknown_header_version ) + return false; + + BifEvent::generate_snmp_unknown_header_version(bro_analyzer(), + bro_analyzer()->Conn(), + ${rec.header.is_orig}, + ${rec.header.version}); + return true; + %} + + function proc_unknown_pdu(rec: UnknownPDU): bool + %{ + if ( ! snmp_unknown_pdu ) + return false; + + BifEvent::generate_snmp_unknown_pdu(bro_analyzer(), + bro_analyzer()->Conn(), + ${rec.header.is_orig}, + build_hdr(${rec.header}), + ${rec.tag}); + return true; + %} + + function proc_unknown_scoped_pdu(rec: UnknownScopedPDU): bool + %{ + if ( ! snmp_unknown_scoped_pdu ) + return false; + + BifEvent::generate_snmp_unknown_scoped_pdu(bro_analyzer(), + bro_analyzer()->Conn(), + ${rec.header.is_orig}, + build_hdr(${rec.header}), + ${rec.tag}); + return true; + %} + + function proc_encrypted_pdu(rec: EncryptedPDU): bool + %{ + if ( ! snmp_encrypted_pdu ) + return false; + + BifEvent::generate_snmp_encrypted_pdu(bro_analyzer(), + bro_analyzer()->Conn(), + ${rec.header.is_orig}, + build_hdr(${rec.header})); + return true; + %} + + function proc_header(rec: Header): bool + %{ + if ( rec->unknown() ) + return false; + + bro_analyzer()->ProtocolConfirmation(); + return true; + %} + + function proc_v3_header_data(rec: v3HeaderData): bool + %{ + if ( rec->flags()->encoding()->content().length() == 1 ) + return true; + + bro_analyzer()->ProtocolViolation("Invalid v3 HeaderData msgFlags"); + return false; + %} + + function check_tag(rec: ASN1EncodingMeta, expect: uint8): bool + %{ + if ( rec->tag() == expect ) + return true; + + // Unwind now to stop parsing because it's definitely the + // wrong protocol and parsing further could be expensive. + // Upper layer of analyzer will catch and call ProtocolViolation(). + throw binpac::Exception(fmt("Got ASN.1 tag %d, expect %d", + rec->tag(), expect)); + return false; + %} + + function check_int_width(rec: ASN1Integer): bool + %{ + int len = rec->encoding()->content().length(); + + if ( len <= 9 ) + // All integers use two's complement form, so an unsigned 64-bit + // integer value can require 9 octets to encode if the highest + // order bit is set. + return true; + + throw binpac::Exception(fmt("ASN.1 integer width overflow: %d", len)); + return false; + %} + + function check_int(rec: ASN1Integer): bool + %{ + return check_tag(rec->encoding()->meta(), ASN1_INTEGER_TAG) && + check_int_width(rec); + %} +}; + +refine typeattr GetRequestPDU += &let { + proc: bool = $context.connection.proc_get_request(this); +}; +refine typeattr GetNextRequestPDU += &let { + proc: bool = $context.connection.proc_get_next_request(this); +}; +refine typeattr ResponsePDU += &let { + proc: bool = $context.connection.proc_response(this); +}; +refine typeattr SetRequestPDU += &let { + proc: bool = $context.connection.proc_set_request(this); +}; +refine typeattr TrapPDU += &let { + proc: bool = $context.connection.proc_trap(this); +}; +refine typeattr GetBulkRequestPDU += &let { + proc: bool = $context.connection.proc_get_bulk_request(this); +}; +refine typeattr InformRequestPDU += &let { + proc: bool = $context.connection.proc_inform_request(this); +}; +refine typeattr v2TrapPDU += &let { + proc: bool = $context.connection.proc_v2_trap(this); +}; +refine typeattr ReportPDU += &let { + proc: bool = $context.connection.proc_report(this); +}; + +refine typeattr UnknownVersionHeader += &let { + proc: bool = $context.connection.proc_unknown_version_header(this); +}; +refine typeattr UnknownPDU += &let { + proc: bool = $context.connection.proc_unknown_pdu(this); +}; +refine typeattr UnknownScopedPDU += &let { + proc: bool = $context.connection.proc_unknown_scoped_pdu(this); +}; +refine typeattr EncryptedPDU += &let { + proc: bool = $context.connection.proc_encrypted_pdu(this); +}; + +refine typeattr Header += &let { + proc: bool = $context.connection.proc_header(this); +}; + +refine typeattr v3HeaderData += &let { + proc: bool = $context.connection.proc_v3_header_data(this); +}; + +refine typeattr NetworkAddress += &let { + valid: bool = $context.connection.check_tag(encoding.meta, + APP_IPADDRESS_TAG); +}; +refine typeattr TimeTicks += &let { + valid: bool = $context.connection.check_tag(asn1_integer.meta, + APP_TIMETICKS_TAG); +}; + +refine typeattr ASN1SequenceMeta += &let { + valid: bool = $context.connection.check_tag(encoding, + ASN1_SEQUENCE_TAG); +}; +refine typeattr ASN1Integer += &let { + valid: bool = $context.connection.check_int(this); +}; +refine typeattr ASN1OctetString += &let { + valid: bool = $context.connection.check_tag(encoding.meta, + ASN1_OCTET_STRING_TAG); +}; +refine typeattr ASN1ObjectIdentifier += &let { + valid: bool = $context.connection.check_tag(encoding.meta, + ASN1_OBJECT_IDENTIFIER_TAG); +}; diff --git a/src/analyzer/protocol/snmp/snmp-protocol.pac b/src/analyzer/protocol/snmp/snmp-protocol.pac new file mode 100644 index 0000000000..8d9b602ea2 --- /dev/null +++ b/src/analyzer/protocol/snmp/snmp-protocol.pac @@ -0,0 +1,272 @@ +# SNMPv1: RFC 1157 +# SNMPv2: RFC 1901 and 3416 +# SNMPv3: RFC 3412 +# Variable Bindings use definitions from RFC 1155 (and 3416). +# +# The SNMP protocol uses a well-defined subset of ASN.1 with the +# Basic Encoding Rules (BER). Definite-length encodings are always +# used. Primitive or non-constructor encodings are preferred over +# constructor encodings. + +type TopLevelMessage(is_orig: bool) = record { + asn1_sequence_meta: ASN1SequenceMeta; + version: ASN1Integer; + header: Header(version_value, is_orig); + pdu_or_not: case have_plaintext_pdu(header) of { + false -> none: empty; + true -> pdu: PDU_Choice(header); + }; +} &let { + version_value: int64 = binary_to_int64(version.encoding.content); +}; + +############################## SNMP Header Versions + +enum SNMP_VersionTag { + SNMPV1_TAG = 0, + SNMPV2_TAG = 1, + SNMPV3_TAG = 3, +}; + +type Header(version: int64, is_orig: bool) = case version of { + SNMPV1_TAG -> v1: v1Header(this); + SNMPV2_TAG -> v2: v2Header(this); + SNMPV3_TAG -> v3: v3Header(this); + default -> unknown: UnknownVersionHeader(this); +}; + +function have_plaintext_pdu(header: Header): bool = + case header.version of { + SNMPV1_TAG -> true; + SNMPV2_TAG -> true; + SNMPV3_TAG -> header.v3.next.tag == ASN1_SEQUENCE_TAG; + default -> false; + }; + +type PDU_Choice(header: Header) = record { + choice: ASN1EncodingMeta; + pdu: PDU(choice.tag, header); +}; + +type PDU(choice: uint8, header: Header) = case choice of { + default -> unknown: UnknownPDU(choice, header); +}; + +refine casetype PDU += { + # PDU choices from RFC 1157. + 0xa0 -> get_request: GetRequestPDU(header); + 0xa1 -> get_next_request: GetNextRequestPDU(header); + 0xa2 -> response: ResponsePDU(header); + 0xa3 -> set_request: SetRequestPDU(header); + 0xa4 -> trap: TrapPDU(header); +}; + +refine casetype PDU += { + # PDU choices from RFC 3416. + 0xa5 -> get_bulk_request: GetBulkRequestPDU(header); + 0xa6 -> inform_request: InformRequestPDU(header); + 0xa7 -> v2_trap: v2TrapPDU(header); + 0xa8 -> report: ReportPDU(header); +}; + +type v1Header(header: Header) = record { + community: ASN1OctetString; +}; + +type v2Header(header: Header) = record { + community: ASN1OctetString; +}; + +type v3Header(header: Header) = record { + global_data: v3HeaderData; + security_parameters: ASN1OctetString; + next: ASN1EncodingMeta; + scoped_pdu_data: case next.tag of { + ASN1_SEQUENCE_TAG -> plaintext_pdu: v3ScopedPDU; + ASN1_OCTET_STRING_TAG -> encrypted_pdu: EncryptedPDU(header); + default -> unknown_pdu: UnknownScopedPDU(next.tag, + header); + }; +}; + +type v3HeaderData = record { + asn1_sequence_meta: ASN1SequenceMeta; + id: ASN1Integer; + max_size: ASN1Integer; + flags: ASN1OctetString; + security_model: ASN1Integer; +}; + +type v3ScopedPDU = record { + context_engine_id: ASN1OctetString; + context_name: ASN1OctetString; +}; + +type EncryptedPDU(header: Header) = record { + data: bytestring &restofdata &transient; +}; + +type UnknownScopedPDU(tag: uint8, header: Header) = record { + data: bytestring &restofdata &transient; +}; + +type UnknownVersionHeader(header: Header) = record { + data: bytestring &restofdata &transient; +}; + +############################## SNMP PDUs + +type CommonPDU(header: Header) = record { + request_id: ASN1Integer; + error_status: ASN1Integer; + error_index: ASN1Integer; + var_bindings: VarBindList; +}; + +type GetRequestPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type GetNextRequestPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type ResponsePDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type SetRequestPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type TrapPDU(header: Header) = record { + enterprise: ASN1ObjectIdentifier; + agent_addr: NetworkAddress; + generic_trap: ASN1Integer; + specific_trap: ASN1Integer; + time_stamp: TimeTicks; + var_bindings: VarBindList; +}; + +type GetBulkRequestPDU(header: Header) = record { + request_id: ASN1Integer; + non_repeaters: ASN1Integer; + max_repititions: ASN1Integer; + var_bindings: VarBindList; +}; + +type InformRequestPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type v2TrapPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type ReportPDU(header: Header) = record { + pdu: CommonPDU(header); +}; + +type UnknownPDU(tag: uint8, header: Header) = record { + data: bytestring &restofdata &transient; +}; + +type VarBindList = record { + asn1_sequence_meta: ASN1SequenceMeta; + bindings: VarBind[]; +}; + +type VarBind = record { + asn1_sequence_meta: ASN1SequenceMeta; + name: ObjectName; + value: ObjectSyntax; +}; + +############################## Variable Binding Encodings (RFC 1155 and 3416) + +type ObjectName = record { + oid: ASN1ObjectIdentifier; +}; + +type ObjectSyntax = record { + encoding: ASN1Encoding; # The tag may be a CHOICE among several; +}; + +type NetworkAddress = record { + encoding: ASN1Encoding; +}; + +type TimeTicks = record { + asn1_integer: ASN1Encoding; +}; + +enum AppSyntaxTypeTag { + APP_IPADDRESS_TAG = 0x40, + APP_COUNTER32_TAG = 0x41, + APP_UNSIGNED32_TAG = 0x42, + APP_TIMETICKS_TAG = 0x43, + APP_OPAQUE_TAG = 0x44, + APP_COUNTER64_TAG = 0x46, +}; + +enum VarBindNullTag { + VARBIND_UNSPECIFIED_TAG = 0x05, + VARBIND_NOSUCHOBJECT_TAG = 0x80, + VARBIND_NOSUCHINSTANCE_TAG = 0x81, + VARBIND_ENDOFMIBVIEW_TAG = 0x82, +}; + +############################## ASN.1 Encodings + +enum ASN1TypeTag { + ASN1_INTEGER_TAG = 0x02, + ASN1_OCTET_STRING_TAG = 0x04, + ASN1_NULL_TAG = 0x05, + ASN1_OBJECT_IDENTIFIER_TAG = 0x06, + ASN1_SEQUENCE_TAG = 0x30, +}; + +type ASN1Encoding = record { + meta: ASN1EncodingMeta; + content: bytestring &length = meta.length; +}; + +type ASN1EncodingMeta = record { + tag: uint8; + len: uint8; + more_len: bytestring &length = long_len ? len & 0x7f : 0; +} &let { + long_len: bool = len & 0x80; + length: uint64 = long_len ? binary_to_int64(more_len) : len & 0x7f; +}; + +type ASN1SequenceMeta = record { + encoding: ASN1EncodingMeta; +}; + +type ASN1Integer = record { + encoding: ASN1Encoding; +}; + +type ASN1OctetString = record { + encoding: ASN1Encoding; +}; + +type ASN1ObjectIdentifier = record { + encoding: ASN1Encoding; +}; + +############################## ASN.1 Conversion Functions + +function binary_to_int64(bs: bytestring): int64 + %{ + int64 rval = 0; + + for ( int i = 0; i < bs.length(); ++i ) + { + uint64 byte = bs[i]; + rval |= byte << (8 * (bs.length() - (i + 1))); + } + + return rval; + %} diff --git a/src/analyzer/protocol/snmp/snmp.pac b/src/analyzer/protocol/snmp/snmp.pac new file mode 100644 index 0000000000..29b9d32e73 --- /dev/null +++ b/src/analyzer/protocol/snmp/snmp.pac @@ -0,0 +1,25 @@ +%include binpac.pac +%include bro.pac + +%extern{ +#include "types.bif.h" +#include "events.bif.h" +%} + +analyzer SNMP withcontext { + connection: SNMP_Conn; + flow: SNMP_Flow; +}; + +connection SNMP_Conn(bro_analyzer: BroAnalyzer) { + upflow = SNMP_Flow(true); + downflow = SNMP_Flow(false); +}; + +%include snmp-protocol.pac + +flow SNMP_Flow(is_orig: bool) { + datagram = TopLevelMessage(is_orig) withcontext(connection, this); +}; + +%include snmp-analyzer.pac diff --git a/src/analyzer/protocol/snmp/types.bif b/src/analyzer/protocol/snmp/types.bif new file mode 100644 index 0000000000..40d995284d --- /dev/null +++ b/src/analyzer/protocol/snmp/types.bif @@ -0,0 +1,18 @@ + +module SNMP; + +type Header: record; +type HeaderV1: record; +type HeaderV2: record; +type HeaderV3: record; + +type PDU: record; +type TrapPDU: record; +type BulkPDU: record; +type ScopedPDU_Context: record; + +type ObjectValue: record; +type Binding: record; +type Bindings: vector; + +module GLOBAL; diff --git a/testing/btest/Baseline/core.print-bpf-filters/output2 b/testing/btest/Baseline/core.print-bpf-filters/output2 index daa23f3b7a..f2825e6cb8 100644 --- a/testing/btest/Baseline/core.print-bpf-filters/output2 +++ b/testing/btest/Baseline/core.print-bpf-filters/output2 @@ -1,5 +1,7 @@ 2 1080 1 137 +1 161 +1 162 1 20000 1 21 1 2123 @@ -39,8 +41,8 @@ 1 992 1 993 1 995 -43 and -42 or -43 port +45 and +44 or +45 port 32 tcp -11 udp +13 udp diff --git a/testing/btest/Baseline/coverage.bare-load-baseline/canonified_loaded_scripts.log b/testing/btest/Baseline/coverage.bare-load-baseline/canonified_loaded_scripts.log index 0218611d1c..6828e6aa58 100644 --- a/testing/btest/Baseline/coverage.bare-load-baseline/canonified_loaded_scripts.log +++ b/testing/btest/Baseline/coverage.bare-load-baseline/canonified_loaded_scripts.log @@ -3,7 +3,7 @@ #empty_field (empty) #unset_field - #path loaded_scripts -#open 2013-10-30-16-52-11 +#open 2014-02-18-18-10-43 #fields name #types string scripts/base/init-bare.bro @@ -12,6 +12,7 @@ scripts/base/init-bare.bro build/scripts/base/bif/strings.bif.bro build/scripts/base/bif/bro.bif.bro build/scripts/base/bif/reporter.bif.bro + build/scripts/base/bif/plugins/Bro_SNMP.types.bif.bro build/scripts/base/bif/event.bif.bro build/scripts/base/bif/plugins/__load__.bro build/scripts/base/bif/plugins/Bro_ARP.events.bif.bro @@ -53,6 +54,7 @@ scripts/base/init-bare.bro build/scripts/base/bif/plugins/Bro_SMB.events.bif.bro build/scripts/base/bif/plugins/Bro_SMTP.events.bif.bro build/scripts/base/bif/plugins/Bro_SMTP.functions.bif.bro + build/scripts/base/bif/plugins/Bro_SNMP.events.bif.bro build/scripts/base/bif/plugins/Bro_SOCKS.events.bif.bro build/scripts/base/bif/plugins/Bro_SSH.events.bif.bro build/scripts/base/bif/plugins/Bro_SSL.events.bif.bro @@ -101,4 +103,4 @@ scripts/base/init-bare.bro build/scripts/base/bif/top-k.bif.bro scripts/policy/misc/loaded-scripts.bro scripts/base/utils/paths.bro -#close 2013-10-30-16-52-11 +#close 2014-02-18-18-10-43 diff --git a/testing/btest/Baseline/coverage.default-load-baseline/canonified_loaded_scripts.log b/testing/btest/Baseline/coverage.default-load-baseline/canonified_loaded_scripts.log index 76b3f3a596..5d32b25823 100644 --- a/testing/btest/Baseline/coverage.default-load-baseline/canonified_loaded_scripts.log +++ b/testing/btest/Baseline/coverage.default-load-baseline/canonified_loaded_scripts.log @@ -3,7 +3,7 @@ #empty_field (empty) #unset_field - #path loaded_scripts -#open 2014-01-31-22-54-38 +#open 2014-02-18-18-10-44 #fields name #types string scripts/base/init-bare.bro @@ -12,6 +12,7 @@ scripts/base/init-bare.bro build/scripts/base/bif/strings.bif.bro build/scripts/base/bif/bro.bif.bro build/scripts/base/bif/reporter.bif.bro + build/scripts/base/bif/plugins/Bro_SNMP.types.bif.bro build/scripts/base/bif/event.bif.bro build/scripts/base/bif/plugins/__load__.bro build/scripts/base/bif/plugins/Bro_ARP.events.bif.bro @@ -53,6 +54,7 @@ scripts/base/init-bare.bro build/scripts/base/bif/plugins/Bro_SMB.events.bif.bro build/scripts/base/bif/plugins/Bro_SMTP.events.bif.bro build/scripts/base/bif/plugins/Bro_SMTP.functions.bif.bro + build/scripts/base/bif/plugins/Bro_SNMP.events.bif.bro build/scripts/base/bif/plugins/Bro_SOCKS.events.bif.bro build/scripts/base/bif/plugins/Bro_SSH.events.bif.bro build/scripts/base/bif/plugins/Bro_SSL.events.bif.bro @@ -200,6 +202,8 @@ scripts/base/init-default.bro scripts/base/protocols/modbus/consts.bro scripts/base/protocols/modbus/main.bro scripts/base/protocols/pop3/__load__.bro + scripts/base/protocols/snmp/__load__.bro + scripts/base/protocols/snmp/main.bro scripts/base/protocols/smtp/__load__.bro scripts/base/protocols/smtp/main.bro scripts/base/protocols/smtp/entities.bro @@ -222,4 +226,4 @@ scripts/base/init-default.bro scripts/base/misc/find-checksum-offloading.bro scripts/base/misc/find-filtered-trace.bro scripts/policy/misc/loaded-scripts.bro -#close 2014-01-31-22-54-38 +#close 2014-02-18-18-10-44 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out1 b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out1 new file mode 100644 index 0000000000..f564ee0c62 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out1 @@ -0,0 +1,598 @@ +snmp_get_request + [orig_h=172.31.19.54, orig_p=15916/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 38 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15916/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 38 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x06): 1.3.6.1.4.1.2001.1.1.1.297.93.1.27.2.2.1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15917/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 39 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15917/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 39 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x04): B6300 + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x04): Chandra's cube +snmp_get_request + [orig_h=172.31.19.54, orig_p=15918/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 40 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15918/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 40 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x04): ^H\07^U\xe6\xbc +snmp_get_request + [orig_h=172.31.19.54, orig_p=15919/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 41 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15919/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 41 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x04): 172.31.19.2 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x04): 255.255.255.0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15920/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 42 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15920/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 42 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x02): 3 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15921/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 43 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15921/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 43 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15922/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 44 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15922/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 44 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x06): 1.3.6.1.4.1.2001.1.1.1.297.93.1.27.2.2.1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15923/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 45 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15923/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 45 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x04): B6300 + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x04): Chandra's cube +snmp_get_request + [orig_h=172.31.19.54, orig_p=15924/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 46 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15924/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 46 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x04): ^H\07^U\xe6\xbc +snmp_get_request + [orig_h=172.31.19.54, orig_p=15925/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 47 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15925/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 47 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x04): 172.31.19.2 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x04): 255.255.255.0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15926/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 48 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15926/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 48 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x02): 3 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15927/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 49 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15927/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 49 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15928/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 50 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15928/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 50 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x06): 1.3.6.1.4.1.2001.1.1.1.297.93.1.27.2.2.1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15929/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 51 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15929/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 51 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x04): B6300 + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x04): Chandra's cube +snmp_get_request + [orig_h=172.31.19.54, orig_p=15930/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 52 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15930/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 52 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.6.1 + value (tag=0x04): ^H\07^U\xe6\xbc +snmp_get_request + [orig_h=172.31.19.54, orig_p=15931/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 53 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15931/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 53 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104 + value (tag=0x04): 172.31.19.2 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130102 + value (tag=0x04): 255.255.255.0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15932/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 54 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15932/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 54 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.43.14.1.1.6.1.5 + value (tag=0x02): 3 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15933/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 55 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15933/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 55 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.64.4.2.1.5.10.14150900 + value (tag=0x02): 1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15934/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 56 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15934/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 56 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x06): 1.3.6.1.4.1.2001.1.1.1.297.93.1.27.2.2.1 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15935/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 57 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.8.1.3.0 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.51.8.1.1.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15935/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 57 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.8.1.3.0 + value (tag=0x02): 0 + oid: 1.3.6.1.4.1.253.8.51.8.1.1.0 + value (tag=0x02): 300 +snmp_set_request + [orig_h=172.31.19.54, orig_p=15936/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 58 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.2.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.3.1 + value (tag=0x04): FujiXeroxExodus + oid: 1.3.6.1.4.1.253.8.51.8.2.1.4.1 + value (tag=0x06): 1.3.6.1.4.1.253.8.51.8.2 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.5.1 + value (tag=0x02): 300 +snmp_response + [orig_h=172.31.19.54, orig_p=15936/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 58 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.2.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.3.1 + value (tag=0x04): FujiXeroxExodus + oid: 1.3.6.1.4.1.253.8.51.8.2.1.4.1 + value (tag=0x06): 1.3.6.1.4.1.253.8.51.8.2 + oid: 1.3.6.1.4.1.253.8.51.8.2.1.5.1 + value (tag=0x02): 300 +snmp_set_request + [orig_h=172.31.19.54, orig_p=15937/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 59 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.2.10.1 + value (tag=0x02): 6 +snmp_response + [orig_h=172.31.19.54, orig_p=15937/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 59 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.2.10.1 + value (tag=0x02): 6 +snmp_set_request + [orig_h=172.31.19.54, orig_p=15938/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 60 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130101 + value (tag=0x04): 172.31.19.73 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.5.10.14130400 + value (tag=0x02): 2 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130102 + value (tag=0x04): 255.255.255.0 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130104 + value (tag=0x04): 172.31.19.2 +snmp_response + [orig_h=172.31.19.54, orig_p=15938/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 60 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130101 + value (tag=0x04): 172.31.19.73 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.5.10.14130400 + value (tag=0x02): 2 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130102 + value (tag=0x04): 255.255.255.0 + oid: 1.3.6.1.4.1.253.8.51.10.2.1.7.10.14130104 + value (tag=0x04): 172.31.19.2 +snmp_set_request + [orig_h=172.31.19.54, orig_p=15939/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 61 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.2.10.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.4.10.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.3.10.1 + value (tag=0x02): 10 +snmp_response + [orig_h=172.31.19.54, orig_p=15939/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 61 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.2.10.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.4.10.1 + value (tag=0x02): 4 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.3.10.1 + value (tag=0x02): 10 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15940/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 62 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.5.10.1 + value (tag=0x05): + oid: 1.3.6.1.4.1.253.8.51.9.2.1.6.10.1 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15940/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 62 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.5.10.1 + value (tag=0x02): 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.6.10.1 + value (tag=0x02): 0 +snmp_set_request + [orig_h=172.31.19.54, orig_p=15941/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 63 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.4.10.1 + value (tag=0x02): 8 +snmp_response + [orig_h=172.31.19.54, orig_p=15941/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 63 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.4.1.253.8.51.9.2.1.4.10.1 + value (tag=0x02): 8 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15942/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 64 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x05): +snmp_get_request + [orig_h=172.31.19.54, orig_p=15945/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 65 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x05): +snmp_get_request + [orig_h=172.31.19.54, orig_p=15952/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 66 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15952/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 66 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x43): 300 +snmp_get_request + [orig_h=172.31.19.54, orig_p=15953/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 67 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x05): +snmp_response + [orig_h=172.31.19.54, orig_p=15953/udp, resp_h=172.31.19.73, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 67 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.2.0 + value (tag=0x06): 1.3.6.1.4.1.2001.1.1.1.297.93.1.27.2.2.1 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out2 b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out2 new file mode 100644 index 0000000000..743f18bbf1 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out2 @@ -0,0 +1,26 @@ +snmp_get_request + [orig_h=203.143.168.235, orig_p=1026/udp, resp_h=129.94.135.39, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 1567 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.25.3.2.1.5.1 + value (tag=0x05): + oid: 1.3.6.1.2.1.25.3.5.1.1.1 + value (tag=0x05): + oid: 1.3.6.1.2.1.25.3.5.1.2.1 + value (tag=0x05): +snmp_response + [orig_h=203.143.168.235, orig_p=1026/udp, resp_h=129.94.135.39, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 1567 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.25.3.2.1.5.1 + value (tag=0x02): 5 + oid: 1.3.6.1.2.1.25.3.5.1.1.1 + value (tag=0x02): 1 + oid: 1.3.6.1.2.1.25.3.5.1.2.1 + value (tag=0x04): \xc0 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out3 b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out3 new file mode 100644 index 0000000000..b8319b67ec --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out3 @@ -0,0 +1,18 @@ +snmp_set_request + [orig_h=127.0.0.1, orig_p=63034/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: T + [community=] + request_id: 2064150121 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x04): musec +snmp_response + [orig_h=127.0.0.1, orig_p=63034/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: F + [community=] + request_id: 2064150121 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out4 b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out4 new file mode 100644 index 0000000000..0854c7096c --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v1/out4 @@ -0,0 +1,11 @@ +snmp_trap + [orig_h=127.0.0.1, orig_p=57150/udp, resp_h=127.0.0.1, resp_p=162/udp] + is_orig: T + [community=public] + enterprise: 1.3.6.1.4.1.31337.0 + agent: 1.0.0.127 + generic_trap: 0 + specific_trap: 0 + time_stamp: 0 + oid: 1.3.6.1.2.1.2.1.0 + value (tag=0x02): 33 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out1 b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out1 new file mode 100644 index 0000000000..cb18518552 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out1 @@ -0,0 +1,18 @@ +snmp_get_request + [orig_h=10.10.1.159, orig_p=51217/udp, resp_h=10.10.3.109, resp_p=161/udp] + is_orig: T + [community=public] + request_id: 895734538 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.17.1 + value (tag=0x05): +snmp_response + [orig_h=10.10.1.159, orig_p=51217/udp, resp_h=10.10.3.109, resp_p=161/udp] + is_orig: F + [community=public] + request_id: 895734538 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.2.2.1.17.1 + value (tag=0x41): 854387 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out2 b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out2 new file mode 100644 index 0000000000..0c1971c9f5 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out2 @@ -0,0 +1,18 @@ +snmp_get_bulk_request + [orig_h=127.0.0.1, orig_p=28456/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: T + [community=] + request_id: 1817072941 + non_repeaters: 0 + max_repititions: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): +snmp_response + [orig_h=127.0.0.1, orig_p=28456/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: F + [community=] + request_id: 1817072941 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.5.0 + value (tag=0x05): diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out3 b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out3 new file mode 100644 index 0000000000..4abbb8f819 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v2/out3 @@ -0,0 +1,72 @@ +snmp_get_request + [orig_h=10.144.246.184, orig_p=33938/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: T + [community=[R0_C@cti!]] + request_id: 722681733 + error_stat: 0 + error_idx: 0 + oid: 0.1 + value (tag=0x05): +snmp_response + [orig_h=10.144.246.184, orig_p=33938/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: F + [community=[R0_C@cti!]] + request_id: 722681733 + error_stat: 0 + error_idx: 0 + oid: 1.0.8802.1.1.1.1.1.1.0 + value (tag=0x02): 2 +snmp_get_request + [orig_h=10.144.246.184, orig_p=43824/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: T + [community=[R0_C@cti!]] + request_id: 555232471 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x05): +snmp_response + [orig_h=10.144.246.184, orig_p=43824/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: F + [community=[R0_C@cti!]] + request_id: 555232471 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.3.0 + value (tag=0x43): 76705700 +snmp_get_request + [orig_h=10.144.246.184, orig_p=40807/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: T + [community=[R0_C@cti!]] + request_id: 349867006 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.31.1.1.1.10.1 + value (tag=0x05): +snmp_response + [orig_h=10.144.246.184, orig_p=40807/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: F + [community=[R0_C@cti!]] + request_id: 349867006 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.31.1.1.1.10.1 + value (tag=0x46): 2232821312 +snmp_get_request + [orig_h=10.144.246.184, orig_p=54059/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: T + [community=[R0_C@cti!]] + request_id: 107891391 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.31.1.1.1.6.1 + value (tag=0x05): +snmp_response + [orig_h=10.144.246.184, orig_p=54059/udp, resp_h=10.144.246.161, resp_p=161/udp] + is_orig: F + [community=[R0_C@cti!]] + request_id: 107891391 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.31.1.1.1.6.1 + value (tag=0x46): 12606463906 diff --git a/testing/btest/Baseline/scripts.base.protocols.snmp.v3/out1 b/testing/btest/Baseline/scripts.base.protocols.snmp.v3/out1 new file mode 100644 index 0000000000..20f6d45ab0 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.snmp.v3/out1 @@ -0,0 +1,34 @@ +snmp_get_request + [orig_h=127.0.0.1, orig_p=54211/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: T + [id=544943986, max_size=16384, flags=4, auth_flag=F, priv_flag=F, reportable_flag=T, security_model=3, security_params=0^N^D\0^B^A*^B^A*^D\0^D\0^D\0, pdu_context=[engine_id=, name=]] + request_id: 544943986 + error_stat: 0 + error_idx: 0 +snmp_report + [orig_h=127.0.0.1, orig_p=54211/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: F + [id=544943986, max_size=16384, flags=0, auth_flag=F, priv_flag=F, reportable_flag=F, security_model=3, security_params=0\x1b^D^M\x80\0\x1f\x88\x80\xa9I\x8e^:,0C^B^A\xdd^B^A\xdd^D\0^D\0^D\0, pdu_context=[engine_id=\x80\0\x1f\x88\x80\xa9I\x8e^:,0C, name=]] + request_id: 544943986 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.6.3.15.1.1.0 + value (tag=0x41): 3 +snmp_get_request + [orig_h=127.0.0.1, orig_p=54211/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: T + [id=544943986, max_size=16384, flags=4, auth_flag=F, priv_flag=F, reportable_flag=T, security_model=3, security_params=0/^D^M\x80\0\x1f\x88\x80\xa9I\x8e^:,0C^B^A\xdd^B^A\xdd^D^Husername^D^L\0\0\0\0\0\0\0\0\0\0\0\0^D\0, pdu_context=[engine_id=\x80\0\x1f\x88\x80\xa9I\x8e^:,0C, name=]] + request_id: 544943986 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x05): +snmp_response + [orig_h=127.0.0.1, orig_p=54211/udp, resp_h=127.0.0.1, resp_p=161/udp] + is_orig: F + [id=544943986, max_size=16384, flags=0, auth_flag=F, priv_flag=F, reportable_flag=F, security_model=3, security_params=0#^D^M\x80\0\x1f\x88\x80\xa9I\x8e^:,0C^B^A\xdd^B^A\xdd^D^Husername^D\0^D\0, pdu_context=[engine_id=\x80\0\x1f\x88\x80\xa9I\x8e^:,0C, name=]] + request_id: 544943986 + error_stat: 0 + error_idx: 0 + oid: 1.3.6.1.2.1.1.6.0 + value (tag=0x04): diff --git a/testing/btest/Traces/snmp/snmpv1_get.pcap b/testing/btest/Traces/snmp/snmpv1_get.pcap new file mode 100644 index 0000000000000000000000000000000000000000..de8505b529dde4a6bf171e462a9799627fca7da1 GIT binary patch literal 7165 zcmd6sZE#f89mdbSxw-61j0Rd-7K1@37!o!oyV=c>z$V#*NF)J50UahPFUg205o)AO z?Wo5ojs(~!o=(kuHt7h3Es^<*b=Up*6g{0(*fD5i?wjB#Ng?0l zD>U#0zJfg)T9$EW*f5OmHr{H?H%)`6KFkN$Hpo#^s5TZNg6dU|YB{LV(?h&X(#$P2 z4P1iiTA!*KRQ@O1VSM*wfK5V+n!-31xmGYfFEK7>!%zQ!-ze$jJAAzsUgt7aGpjn2 zjC0N-?k$^HwY|Hx-!*#o_N9{zJNNAvBjj(t7GRs8PEA4XFTiFL@=Xsp3gnpeB)>uG zLT4e_G&(eE_*`eGWbX@fTc$B9 zbl}|=Qz&Jn`$_eFHNJmxThWETeh^^KqF>Y$7mh?02p8^^TxenY|DNODlKPh4?e}dv zUs$PcR=Bl27LB(?TUSJ5d{Kq3B(1AriA2k6mo_`OU}m&Vr%#^)r)IMVo#lE$vyzmvva8w%>u7&Zg>bq~1> z$T91HlE##rxGJad!Qr4TjTb2+vkhrHt)#K5p-JP@BSBpn!%)y1@@NvE8UOgAlEy6# z%@s}K#%~05X}nmtaF0~%1k(7hlE!Y|{yS-0pAG8L7^Q=uuX%=IRfIIoC}~WAM#E!< zG|oO4)TQxPgf*{7)+CX}9ZDLzDl?_=`;TeU7!@d)-tBj3A*f#Ts8)a~J)Ka}IPOqs(^xS6Hl$1AWr8s$ zF|I%w?^n{;)%#b|n7Yt^Hl$1Ar2_eP9&!heW7fS&8q@ZGMyRqjCXJytLb^0=5}5Lf zwF7CKRnpkim?4cx=^uXx>C*THL37Zf=>*OA#~&(boN#EaSQ=B`?)WIAOXFtY!fvV9 zok-(Hlr(nx_McB<>h!G7Lb^1@EX0hU9cpo&uY{p(7n4dFCmlm8q%o;%VqskxFBjIF zl&o2aG>$51?5b2sW0IK+hjnXXOt+Hhy$UcL7j99~xZQ!7F^x&9e{NW}HjWCU6B5!Y zr11tNja@B$8lP_n>(Uq#3}CbnFIFiHFkX{Y(wNQ_aFw4_5YG6bur7^T1WrN1Nh6I1 zlr(k~E-Q`KN5gC!I}2*cR%WDt2?MI1dQ@GYT61uWr-9&|zu;}Q!l7D%9n)3fOavR< zc)+NlzGuF1FTup7%(~d8C!A+{kB_DU-`{O76jV z(`Y8~A9jY>3FuN&u%9VlG64HF54#)KkFWiJXCIQ(k58Ef4oyTgC!kd8bDKDTG7Sqm z>yn#QhIMuSzVSP68M}MW)at1{qx&X#ed$*$!wyT&!3jml6RHiD;NdQxK(X(cNUN}K zt29`;+2ey{1o{6d!K|CY-WyA)!C(Qi7d3dnt3eNHklK_ld1D>NX-=n80(xUz?O7K@ z0Ya#OP1SB5@|6^?1|u=y)h{KldZ2W?M2XIgE<@?`&0%&9V~U!>bgFq1Va@mGVW0h02OvSNimEW~!gerHd=x%5W93N;5dc9H{pNg~z$M;K)_o7#8N_v&Q z^1b>|TaeuapQtHbZ7U#o;MLQfSAFnma8HtFB(HKq(7HPS3^lX?Y@N4 zH=#8AvY}hrU}l4f_6|j+elYRy*OjGBx5FfDH0k~S02I1!*B&gc5(@MKMNwfuC`>2{ zJ(U$6fx_QTX&GJ+3iR}%!Umx*rYO)T#U(G#h=CNwUopI0oKlZ|8^`h8b)WP}_1M5- zXP1@i;_~=~!&RVNobyvv73;;igfz@^T8du@iiAfoOcXUc6$(7AoPvH1BZUXvG&GA$ X`zL}TE>R3)k=djyGF^pBE;9cK##mi- literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/snmp/snmpv1_get_short.pcap b/testing/btest/Traces/snmp/snmpv1_get_short.pcap new file mode 100644 index 0000000000000000000000000000000000000000..a765af6640a64c2e590c8f2be4db96d753fea29f GIT binary patch literal 299 zcmca|c+)~A1{MYw`2U}Qff2~5zsT*f_6-+91&|HG4BWRTi={B|h8bVs;9ziNV90Vg z#K6!XSaINV|BBa*aqa3XObiPd!iwY!e3%#+Sl9|mlX5bX7uYi~vB?7kfXKkufS-+9 zn~jl)QIeU7k(H5^0ZD+Bkr7=0s0Qqg$DgqQoZ5Fi_b*;rYanHU+Fm|0laI2c?R7~DXr z90aSE)&n(w@HZ=lg$za-yapOfj6eeyD>AWEbL3?LIY49}Y#_+Sq0Pn!G=r6ag*CUd zI5in$$AwEQ4E{iqKp0{=#3ryEj!-*R!R%mI2((34Ji$O2Y{w!Q6g&6~co255G5`Sh CZXtI7 literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/snmp/snmpv1_trap.pcap b/testing/btest/Traces/snmp/snmpv1_trap.pcap new file mode 100644 index 0000000000000000000000000000000000000000..e77219efd2efa7258ca4031a6d5f4e0195aa8d3c GIT binary patch literal 143 zcmca|c+)~A1{MYw`2U}Qff2|NSflI7X3WQs4rGHc8!HPl6C)!NGYcyl2ZJjELnKI* zgJAWfdY}dnzHi5{h{1K&Zv$&4Mg|tPg3_d%%;Y6{Y@FI`j4X_eUosgSSU~E4vOwev Sw$gy#fR~K}sDKF~tOx+r$`%6v literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/snmp/snmpv2_get.pcap b/testing/btest/Traces/snmp/snmpv2_get.pcap new file mode 100644 index 0000000000000000000000000000000000000000..705af973ba23bc1c199f3b836c797546f04abc52 GIT binary patch literal 233 zcmca|c+)~A1{MYw`2U}Qff2}=@si1V+dVdha3C9m86ATkgz z;A7*`W@BVxWMX0zWMl%2tzD@SO&Jn2WSb<8pS4%6(Fk^76L7@IH+o% Whh)tnMHFj<4Fr*`ab)J@ECv9V2r#Gs literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/snmp/snmpv2_get_bulk.pcap b/testing/btest/Traces/snmp/snmpv2_get_bulk.pcap new file mode 100644 index 0000000000000000000000000000000000000000..5099c7a3234abf655b516d2400d4c919511f3d6a GIT binary patch literal 214 zcmca|c+)~A1{MYw`2U}Qff2}guv*tsVJ|a-KadT=Y^*HIOpJ_7%q*;I91N}u42~dG z4uaLI>VXt?l?mjZ6JMAZqJZ{*Fou78p#D*Z`De8O&_5P`jvMHqTed)kiA7OD z=Q`9sd4PycNLr4(u%xgtvfp*?5#17@^y=NCCwr zAp-$~P0lPVlk%5<{Pi-A84-x+@#GKnmkP{Z^V5O;vfh<~8HfvjfhcmT`ybR_pg`mX z`%4}ej9kzdiz;PiNCNr_gfYAp!uKBRHGPEFfYv#%uQxEm@R|yWWnu;*D3-agGPH`R zIe@%( O9vh<@E7SY*_(cGDH`}EE literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/snmp/snmpv3_get_next.pcap b/testing/btest/Traces/snmp/snmpv3_get_next.pcap new file mode 100644 index 0000000000000000000000000000000000000000..13ed2e76462aaf1ddc8ad864be54851cfb64115e GIT binary patch literal 661 zcmaixy-EW?6ov21-W@g&cN3zbsKg)^{*fzK3Brm5NpB~LA}JJN5fzCk3@8!^h?QdJ z3W8#%kB~>uR`5;Yoyo3{UC?39Fu(VFocZj$1riXV*6jiaUVOhUl&^9g?DJep*=R{2 zq=mL}paig~Z~58A%{f2N`shFa>+L+PNMTV%;$)*(lhOwi$UB%J7eR_y?#PA+G^oc1 zH@qqM5XcyphCI0C@>)I1p1m<{g~of4F$8RVeCg3a!k9~1I6-4L(1d)e`BJ{#UY@5l zDZaRe6icx~gy%vZQjW4JHK&BKJRx9JXJzSl-iJMS;)PZso;%6Ae)eo5qBQYbq-Lm| zpfvF;QZWV+QaUF`mD=HMwSs9b`P(?Z_ydGsypPout1 +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv1_get_short.pcap %INPUT $SCRIPTS/snmp-test.bro >out2 +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv1_set.pcap %INPUT $SCRIPTS/snmp-test.bro >out3 +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv1_trap.pcap %INPUT $SCRIPTS/snmp-test.bro >out4 + +# @TEST-EXEC: btest-diff out1 +# @TEST-EXEC: btest-diff out2 +# @TEST-EXEC: btest-diff out3 +# @TEST-EXEC: btest-diff out4 + +@load base/protocols/snmp diff --git a/testing/btest/scripts/base/protocols/snmp/v2.bro b/testing/btest/scripts/base/protocols/snmp/v2.bro new file mode 100644 index 0000000000..a2b9885fbb --- /dev/null +++ b/testing/btest/scripts/base/protocols/snmp/v2.bro @@ -0,0 +1,9 @@ +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv2_get.pcap %INPUT $SCRIPTS/snmp-test.bro >out1 +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv2_get_bulk.pcap %INPUT $SCRIPTS/snmp-test.bro >out2 +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv2_get_next.pcap %INPUT $SCRIPTS/snmp-test.bro >out3 + +# @TEST-EXEC: btest-diff out1 +# @TEST-EXEC: btest-diff out2 +# @TEST-EXEC: btest-diff out3 + +@load base/protocols/snmp diff --git a/testing/btest/scripts/base/protocols/snmp/v3.bro b/testing/btest/scripts/base/protocols/snmp/v3.bro new file mode 100644 index 0000000000..43edbdc2df --- /dev/null +++ b/testing/btest/scripts/base/protocols/snmp/v3.bro @@ -0,0 +1,5 @@ +# @TEST-EXEC: bro -b -r $TRACES/snmp/snmpv3_get_next.pcap %INPUT $SCRIPTS/snmp-test.bro >out1 + +# @TEST-EXEC: btest-diff out1 + +@load base/protocols/snmp diff --git a/testing/scripts/snmp-test.bro b/testing/scripts/snmp-test.bro new file mode 100644 index 0000000000..399935db4c --- /dev/null +++ b/testing/scripts/snmp-test.bro @@ -0,0 +1,208 @@ + +function format_snmp_val(tag: count, s: string): string + { + return fmt(" value (tag=0x%02x): %s", tag, s); + } + +function print_snmp_value(val: SNMP::ObjectValue) + { + switch ( val$tag ) { + case SNMP::OBJ_OID_TAG: + print format_snmp_val(val$tag, fmt("%s", val$oid)); + break; + + case SNMP::OBJ_INTEGER_TAG: + print format_snmp_val(val$tag, fmt("%s", val$signed)); + break; + + case SNMP::OBJ_COUNTER32_TAG, + SNMP::OBJ_UNSIGNED32_TAG, + SNMP::OBJ_TIMETICKS_TAG, + SNMP::OBJ_COUNTER64_TAG: + print format_snmp_val(val$tag, fmt("%s", val$unsigned)); + break; + + case SNMP::OBJ_IPADDRESS_TAG: + print format_snmp_val(val$tag, fmt("%s", val$address)); + break; + + case SNMP::OBJ_OCTETSTRING_TAG, + SNMP::OBJ_OPAQUE_TAG: + print format_snmp_val(val$tag, fmt("%s", val$octets)); + break; + + case SNMP::OBJ_UNSPECIFIED_TAG: + print format_snmp_val(val$tag, fmt("%s", "")); + break; + + case SNMP::OBJ_NOSUCHOBJECT_TAG: + print format_snmp_val(val$tag, fmt("%s", "")); + break; + + case SNMP::OBJ_NOSUCHINSTANCE_TAG: + print format_snmp_val(val$tag, fmt("%s", "")); + break; + + case SNMP::OBJ_ENDOFMIBVIEW_TAG: + print format_snmp_val(val$tag, fmt("%s", "")); + break; + + default: + print format_snmp_val(val$tag, ""); + break; + } + } + +function print_snmp_binding(binding: SNMP::Binding) + { + print fmt(" oid: %s", binding$oid); + print_snmp_value(binding$value); + } + +function print_snmp_bindings(bindings: SNMP::Bindings) + { + for ( i in bindings ) + print_snmp_binding(bindings[i]); + } + +function print_snmp_pdu(pdu: SNMP::PDU) + { + print fmt(" request_id: %s", pdu$request_id); + print fmt(" error_stat: %s", pdu$error_status); + print fmt(" error_idx: %s", pdu$error_index); + print_snmp_bindings(pdu$bindings); + } + +function print_snmp_trap_pdu(pdu: SNMP::TrapPDU) + { + print fmt(" enterprise: %s", pdu$enterprise); + print fmt(" agent: %s", pdu$agent); + print fmt(" generic_trap: %s", pdu$generic_trap); + print fmt(" specific_trap: %s", pdu$specific_trap); + print fmt(" time_stamp: %s", pdu$time_stamp); + print_snmp_bindings(pdu$bindings); + } + +function print_snmp_bulk_pdu(pdu: SNMP::BulkPDU) + { + print fmt(" request_id: %s", pdu$request_id); + print fmt(" non_repeaters: %s", pdu$non_repeaters); + print fmt(" max_repititions: %s", pdu$max_repititions); + print_snmp_bindings(pdu$bindings); + } + +function print_snmp_conn(c: connection, is_orig: bool) + { + print fmt(" %s", c$id); + print fmt(" is_orig: %s", is_orig); + } + +function print_snmp_header(header: SNMP::Header) + { + switch ( header$version ) { + case 0: + print fmt(" %s", header$v1); + break; + + case 1: + print fmt(" %s", header$v2); + break; + + case 3: + print fmt(" %s", header$v3); + break; + + default: + break; + } + } + +function print_snmp(msg: string, c: connection, is_orig: bool, + header: SNMP::Header, pdu: SNMP::PDU) + { + print msg; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + print_snmp_pdu(pdu); + } + +event snmp_get_request(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_get_request", c, is_orig, header, pdu); + } + +event snmp_get_next_request(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_get_request", c, is_orig, header, pdu); + } + +event snmp_response(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_response", c, is_orig, header, pdu); + } + +event snmp_set_request(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_set_request", c, is_orig, header, pdu); + } + +event snmp_trap(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::TrapPDU) + { + print "snmp_trap"; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + print_snmp_trap_pdu(pdu); + } + +event snmp_get_bulk_request(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::BulkPDU) + { + print "snmp_get_bulk_request"; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + print_snmp_bulk_pdu(pdu); + } + +event snmp_inform_request(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_inform_request", c, is_orig, header, pdu); + } + +event snmp_trapV2(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_trapv2", c, is_orig, header, pdu); + } + +event snmp_report(c: connection, is_orig: bool, header: SNMP::Header, pdu: SNMP::PDU) + { + print_snmp("snmp_report", c, is_orig, header, pdu); + } + +event snmp_unknown_pdu(c: connection, is_orig: bool, header: SNMP::Header, tag: count) + { + print "snmp_unknown_pdu"; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + print fmt(" tag: %s", tag); + } + +event snmp_unknown_scoped_pdu(c: connection, is_orig: bool, header: SNMP::Header, tag: count) + { + print "snmp_unknown_scoped_pdu"; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + print fmt(" tag: %s", tag); + } + +event snmp_encrypted_pdu(c: connection, is_orig: bool, header: SNMP::Header) + { + print "snmp_encrypted_pdu"; + print_snmp_conn(c, is_orig); + print_snmp_header(header); + } + +event snmp_unknown_header_version(c: connection, is_orig: bool, version: count) + { + print "snmp_unknown_header_version"; + print_snmp_conn(c, is_orig); + print fmt(" version %s", version); + } From 3f008c8f0bf4378eb5f2058224293cc48da6639f Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 18 Feb 2014 15:40:41 -0600 Subject: [PATCH 009/182] Fix compiler nitpicks from new SNMP code. --- src/analyzer/protocol/snmp/snmp-analyzer.pac | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/analyzer/protocol/snmp/snmp-analyzer.pac b/src/analyzer/protocol/snmp/snmp-analyzer.pac index 1a864df8b9..cc190e6ebe 100644 --- a/src/analyzer/protocol/snmp/snmp-analyzer.pac +++ b/src/analyzer/protocol/snmp/snmp-analyzer.pac @@ -1,3 +1,11 @@ +%extern{ +#include +#include +#include + +#include "net_util.h" +#include "util.h" +%} %header{ StringVal* asn1_oid_to_val(const ASN1Encoding* oid); @@ -81,7 +89,7 @@ StringVal* asn1_oid_to_val(const ASN1Encoding* oid) } else { - std::div_t result = div(subidentifier_values[i], 40); + std::div_t result = std::div(subidentifier_values[i], 40); snprintf(tmp, sizeof(tmp), "%d", result.quot); rval += tmp; rval += "."; From 2636d3aee74fc523dac5e0c4ec7fddba4b5d3d1b Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 18 Feb 2014 15:58:53 -0600 Subject: [PATCH 010/182] Add memory leak unit test for SNMP. --- testing/btest/core/leaks/snmp.test | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 testing/btest/core/leaks/snmp.test diff --git a/testing/btest/core/leaks/snmp.test b/testing/btest/core/leaks/snmp.test new file mode 100644 index 0000000000..c58c1f5b58 --- /dev/null +++ b/testing/btest/core/leaks/snmp.test @@ -0,0 +1,10 @@ +# Needs perftools support. +# +# @TEST-REQUIRES: bro --help 2>&1 | grep -q mem-leaks +# +# @TEST-GROUP: leaks +# +# @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -b -m -r $TRACES/snmp/snmpv1_get.pcap -r $TRACES/snmp/snmpv1_get_short.pcap -r $TRACES/snmp/snmpv1_set.pcap -r $TRACES/snmp/snmpv1_trap.pcap -r $TRACES/snmp/snmpv2_get_bulk.pcap -r $TRACES/snmp/snmpv2_get_next.pcap -r $TRACES/snmp/snmpv2_get.pcap -r $TRACES/snmp/snmpv3_get_next.pcap $SCRIPTS/snmp-test.bro %INPUT +# @TEST-EXEC: btest-bg-wait 30 + +@load base/protocols/snmp From 90026f7196d721d4141077954f9a415791c48fc0 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 19 Feb 2014 10:32:27 -0600 Subject: [PATCH 011/182] Update to libmagic version 5.17, address BIT-1136. --- CMakeLists.txt | 2 +- testing/btest/bifs/identify_data.bro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28027d63d3..f773381ae8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,7 +56,7 @@ set(LIBMAGIC_LIB_DIR ${LIBMAGIC_PREFIX}/lib) set(LIBMAGIC_LIBRARY ${LIBMAGIC_LIB_DIR}/libmagic.a) ExternalProject_Add(libmagic PREFIX ${LIBMAGIC_PREFIX} - URL ${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/file-5.16.tar.gz + URL ${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/file-5.17.tar.gz CONFIGURE_COMMAND ./configure --enable-static --disable-shared --prefix=${LIBMAGIC_PREFIX} --includedir=${LIBMAGIC_INCLUDE_DIR} diff --git a/testing/btest/bifs/identify_data.bro b/testing/btest/bifs/identify_data.bro index 836a5a428f..d49a144b1e 100644 --- a/testing/btest/bifs/identify_data.bro +++ b/testing/btest/bifs/identify_data.bro @@ -10,7 +10,7 @@ event bro_init() print identify_data(a, T); # PNG image - local b = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"; + local b = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00"; print identify_data(b, F); print identify_data(b, T); } From 18d89d6320db4ffd15f0250b2db8a1ec11750ac4 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Thu, 20 Feb 2014 14:37:43 -0800 Subject: [PATCH 012/182] New alert from https://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-04 --- scripts/base/protocols/ssl/consts.bro | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/base/protocols/ssl/consts.bro b/scripts/base/protocols/ssl/consts.bro index b81aebfbbb..c50ad13648 100644 --- a/scripts/base/protocols/ssl/consts.bro +++ b/scripts/base/protocols/ssl/consts.bro @@ -55,6 +55,7 @@ export { [113] = "bad_certificate_status_response", [114] = "bad_certificate_hash_value", [115] = "unknown_psk_identity", + [120] = "no_application_protocol", } &default=function(i: count):string { return fmt("unknown-%d", i); }; ## Mapping between numeric codes and human readable strings for SSL/TLS From 10d89a464896f3d041985672c9910c3fb14bdcda Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Thu, 20 Feb 2014 17:27:46 -0800 Subject: [PATCH 013/182] Updating submodule(s). [nomail] --- CHANGES | 4 ++++ VERSION | 2 +- src/3rdparty | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index ba9102aeeb..1b4d3841bd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +2.2-177 | 2014-02-20 17:27:46 -0800 + + * Update to libmagic version 5.17. Addresses BIT-1136. (Jon Siwek) + 2.2-174 | 2014-02-14 12:07:04 -0800 * Support for MPLS over VLAN. (Chris Kanich) diff --git a/VERSION b/VERSION index 5b847786b5..598049d62c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2-174 +2.2-177 diff --git a/src/3rdparty b/src/3rdparty index 42a4c9694a..e96d95a130 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 42a4c9694a2b2677b050fbb7cbae26bc5ec4605a +Subproject commit e96d95a130a572b611fe70b3c3ede2b4727aaa22 From 0e7d70e21924beb04cf0109e899c2b0003b55ffd Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 21 Feb 2014 06:05:12 -0800 Subject: [PATCH 014/182] Correct return type of topk_get_top, addresses BIT-1144 --- src/probabilistic/top-k.bif | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/probabilistic/top-k.bif b/src/probabilistic/top-k.bif index 5362750467..0589608d22 100644 --- a/src/probabilistic/top-k.bif +++ b/src/probabilistic/top-k.bif @@ -49,7 +49,7 @@ function topk_add%(handle: opaque of topk, value: any%): any ## ## .. bro:see:: topk_init topk_add topk_count topk_epsilon ## topk_size topk_sum topk_merge topk_merge_prune -function topk_get_top%(handle: opaque of topk, k: count%): any +function topk_get_top%(handle: opaque of topk, k: count%): index_vec %{ assert(handle); probabilistic::TopkVal* h = (probabilistic::TopkVal*) handle; From 81e561e5dea6a00c7d70058974964434450fe292 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 21 Feb 2014 11:18:35 -0800 Subject: [PATCH 015/182] Revert "Correct return type of topk_get_top, addresses BIT-1144" This reverts commit 0e7d70e21924beb04cf0109e899c2b0003b55ffd. Sorry, bad idea. --- src/probabilistic/top-k.bif | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/probabilistic/top-k.bif b/src/probabilistic/top-k.bif index 0589608d22..5362750467 100644 --- a/src/probabilistic/top-k.bif +++ b/src/probabilistic/top-k.bif @@ -49,7 +49,7 @@ function topk_add%(handle: opaque of topk, value: any%): any ## ## .. bro:see:: topk_init topk_add topk_count topk_epsilon ## topk_size topk_sum topk_merge topk_merge_prune -function topk_get_top%(handle: opaque of topk, k: count%): index_vec +function topk_get_top%(handle: opaque of topk, k: count%): any %{ assert(handle); probabilistic::TopkVal* h = (probabilistic::TopkVal*) handle; From ca2cdd88615584e782564d334e703883f40f6abf Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 21 Feb 2014 11:24:03 -0800 Subject: [PATCH 016/182] new TLS constants from https://tools.ietf.org/html/draft-bmoeller-tls-downgrade-scsv-01 --- scripts/base/protocols/ssl/consts.bro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/base/protocols/ssl/consts.bro b/scripts/base/protocols/ssl/consts.bro index c50ad13648..9e9222f12c 100644 --- a/scripts/base/protocols/ssl/consts.bro +++ b/scripts/base/protocols/ssl/consts.bro @@ -47,6 +47,7 @@ export { [70] = "protocol_version", [71] = "insufficient_security", [80] = "internal_error", + [86] = "inappropriate_fallback", [90] = "user_canceled", [100] = "no_renegotiation", [110] = "unsupported_extension", @@ -264,6 +265,8 @@ export { const TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C3; const TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C4; const TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C5; + # draft-bmoeller-tls-downgrade-scsv-01 + const TLS_FALLBACK_SCSV = 0x5600; # RFC 4492 const TLS_ECDH_ECDSA_WITH_NULL_SHA = 0xC001; const TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0xC002; @@ -630,6 +633,7 @@ export { [TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256] = "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", [TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256] = "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", [TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256] = "TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256", + [TLS_FALLBACK_SCSV] = "TLS_FALLBACK_SCSV", [TLS_ECDH_ECDSA_WITH_NULL_SHA] = "TLS_ECDH_ECDSA_WITH_NULL_SHA", [TLS_ECDH_ECDSA_WITH_RC4_128_SHA] = "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", [TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA] = "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", From 09c2491896971ef361e3ca339175e625c98d406e Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Mon, 24 Feb 2014 08:13:38 -0800 Subject: [PATCH 017/182] Remove unused and potentially unsafe function ListVal::IncludedInString --- src/Val.cc | 17 ----------------- src/Val.h | 7 ------- 2 files changed, 24 deletions(-) diff --git a/src/Val.cc b/src/Val.cc index e072914afb..8c60f4c490 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1171,23 +1171,6 @@ ListVal::~ListVal() Unref(type); } -const char* ListVal::IncludedInString(const char* str) const - { - if ( tag != TYPE_STRING ) - Internal("non-string list in ListVal::IncludedInString"); - - loop_over_list(vals, i) - { - const char* vs = (const char*) (vals[i]->AsString()->Bytes()); - - const char* embedded = strstr(str, vs); - if ( embedded ) - return embedded; - } - - return 0; - } - RE_Matcher* ListVal::BuildRE() const { if ( tag != TYPE_STRING ) diff --git a/src/Val.h b/src/Val.h index 33bd89c0d5..3d4141cd7a 100644 --- a/src/Val.h +++ b/src/Val.h @@ -669,13 +669,6 @@ public: Val* Index(const int n) { return vals[n]; } const Val* Index(const int n) const { return vals[n]; } - // Returns offset of where str includes one of the strings in this - // ListVal (which had better be a list of strings), nil if none. - // - // Assumes that all of the strings in the list are NUL-terminated - // and do not have any embedded NULs. - const char* IncludedInString(const char* str) const; - // Returns an RE_Matcher() that will match any string that // includes embedded within it one of the patterns listed // (as a string, e.g., "foo|bar") in this ListVal. From bc75988bd9e76bc595a086d61e2ee2fa960209a0 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Mon, 24 Feb 2014 12:53:48 -0800 Subject: [PATCH 018/182] More google tls extensions that are being actively used. --- scripts/base/protocols/ssl/consts.bro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/base/protocols/ssl/consts.bro b/scripts/base/protocols/ssl/consts.bro index 9e9222f12c..1ccace102c 100644 --- a/scripts/base/protocols/ssl/consts.bro +++ b/scripts/base/protocols/ssl/consts.bro @@ -89,6 +89,8 @@ export { [13175] = "origin_bound_certificates", [13180] = "encrypted_client_certificates", [30031] = "channel_id", + [30032] = "channel_id_new", + [35655] = "padding", [65281] = "renegotiation_info" } &default=function(i: count):string { return fmt("unknown-%d", i); }; From b3bd509b3fa9d4803d7bec15399faf0471085b31 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 25 Feb 2014 15:30:29 -0800 Subject: [PATCH 019/182] Allow iterating over bif functions with result type vector of any. This changes the internal type that is used to signal that a vector is unspecified from any to void. I tried to verify that the behavior of Bro is still the same. After a lot of playing around, I think everything still should worl as before. However, it might be good for someone to take a look at this. addresses BIT-1144 --- scripts/base/init-bare.bro | 7 +++++++ src/Expr.cc | 4 +++- src/Type.cc | 17 ++++++++++++++++- src/Type.h | 2 +- src/Val.cc | 6 ++++-- src/Val.h | 2 ++ src/probabilistic/top-k.bif | 2 +- testing/btest/Baseline/bifs.topk/out | 9 +++++++++ .../Baseline/language.vector-unspecified/output | 1 + testing/btest/bifs/topk.bro | 12 +++++++++++- testing/btest/language/vector-unspecified.bro | 11 +++++++++++ 11 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 testing/btest/Baseline/language.vector-unspecified/output create mode 100644 testing/btest/language/vector-unspecified.bro diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index d4e631ecf4..80747e5564 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -39,6 +39,13 @@ type count_set: set[count]; ## directly and then remove this alias. type index_vec: vector of count; +## A vector of any, used by some builtin functions to store a list of varying types. +## +## .. todo:: We need this type definition only for declaring builtin functions +## via ``bifcl``. We should extend ``bifcl`` to understand composite types +## directly and then remove this alias. +type any_vec: vector of any; + ## A vector of strings. ## ## .. todo:: We need this type definition only for declaring builtin functions diff --git a/src/Expr.cc b/src/Expr.cc index 5f6c7d41c6..a5315b533d 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3819,7 +3819,9 @@ VectorConstructorExpr::VectorConstructorExpr(ListExpr* constructor_list, if ( constructor_list->Exprs().length() == 0 ) { // vector(). - SetType(new ::VectorType(base_type(TYPE_ANY))); + // By default, assign VOID type here. A vector with + // void type set is seen as an unspecified vector. + SetType(new ::VectorType(base_type(TYPE_VOID))); return; } diff --git a/src/Type.cc b/src/Type.cc index 340ab973bc..61adbbad87 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -1626,6 +1626,21 @@ VectorType::~VectorType() Unref(yield_type); } +BroType* VectorType::YieldType() + { + // cheat around the fact that we use void internally to + // mark a vector as being unspecified + if ( IsUnspecifiedVector() ) + { + BroType* ret = ::base_type(TYPE_ANY); + Unref(ret); // unref, because this won't be held by anyone. + assert(ret); + return ret; + } + + return yield_type; + } + int VectorType::MatchesIndex(ListExpr*& index) const { expr_list& el = index->Exprs(); @@ -1645,7 +1660,7 @@ int VectorType::MatchesIndex(ListExpr*& index) const bool VectorType::IsUnspecifiedVector() const { - return yield_type->Tag() == TYPE_ANY; + return yield_type->Tag() == TYPE_VOID; } IMPLEMENT_SERIAL(VectorType, SER_VECTOR_TYPE); diff --git a/src/Type.h b/src/Type.h index f6328aed4a..361c2794f0 100644 --- a/src/Type.h +++ b/src/Type.h @@ -572,7 +572,7 @@ class VectorType : public BroType { public: VectorType(BroType* t); virtual ~VectorType(); - BroType* YieldType() { return yield_type; } + BroType* YieldType(); int MatchesIndex(ListExpr*& index) const; diff --git a/src/Val.cc b/src/Val.cc index e072914afb..46a2f89cca 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2976,7 +2976,9 @@ VectorVal::~VectorVal() bool VectorVal::Assign(unsigned int index, Val* element, Opcode op) { if ( element && - ! same_type(element->Type(), vector_type->YieldType(), 0) ) + ! same_type(element->Type(), vector_type->YieldType(), 0) && + // if we are unspecified, you can assign anything to us. + ! vector_type->IsUnspecifiedVector() ) { Unref(element); return false; @@ -3139,7 +3141,7 @@ bool VectorVal::DoUnserialize(UnserialInfo* info) for ( int i = 0; i < len; ++i ) { Val* v; - UNSERIALIZE_OPTIONAL(v, Val::Unserialize(info, TYPE_ANY)); + UNSERIALIZE_OPTIONAL(v, Val::Unserialize(info, TYPE_ANY)); // accept any type Assign(i, v); } diff --git a/src/Val.h b/src/Val.h index 33bd89c0d5..f44bba2059 100644 --- a/src/Val.h +++ b/src/Val.h @@ -656,6 +656,8 @@ protected: DECLARE_SERIAL(PatternVal); }; +// ListVals are mainly used to index tables that have more than one +// element in their index. class ListVal : public Val { public: ListVal(TypeTag t); diff --git a/src/probabilistic/top-k.bif b/src/probabilistic/top-k.bif index 5362750467..8f7b071a4c 100644 --- a/src/probabilistic/top-k.bif +++ b/src/probabilistic/top-k.bif @@ -49,7 +49,7 @@ function topk_add%(handle: opaque of topk, value: any%): any ## ## .. bro:see:: topk_init topk_add topk_count topk_epsilon ## topk_size topk_sum topk_merge topk_merge_prune -function topk_get_top%(handle: opaque of topk, k: count%): any +function topk_get_top%(handle: opaque of topk, k: count%): any_vec %{ assert(handle); probabilistic::TopkVal* h = (probabilistic::TopkVal*) handle; diff --git a/testing/btest/Baseline/bifs.topk/out b/testing/btest/Baseline/bifs.topk/out index 1ce5c4b850..48d7e23f96 100644 --- a/testing/btest/Baseline/bifs.topk/out +++ b/testing/btest/Baseline/bifs.topk/out @@ -79,3 +79,12 @@ 0 8 0 +0, c +1, e +2, d +0, c +1, e +2, d +0, c +1, e +2, d diff --git a/testing/btest/Baseline/language.vector-unspecified/output b/testing/btest/Baseline/language.vector-unspecified/output new file mode 100644 index 0000000000..8d726561ab --- /dev/null +++ b/testing/btest/Baseline/language.vector-unspecified/output @@ -0,0 +1 @@ +[5, Hi, 127.0.0.1] diff --git a/testing/btest/bifs/topk.bro b/testing/btest/bifs/topk.bro index 02d13c4195..1e650335a7 100644 --- a/testing/btest/bifs/topk.bro +++ b/testing/btest/bifs/topk.bro @@ -148,7 +148,17 @@ event bro_init() print topk_count(k3, "d"); print topk_epsilon(k3, "d"); - + local styped: vector of count; + styped = topk_get_top(k3, 3); + for ( i in styped ) + print i, styped[i]; + local anytyped: vector of any; + anytyped = topk_get_top(k3, 3); + for ( i in anytyped ) + print i, anytyped[i]; + local suntyped = topk_get_top(k3, 3); + for ( i in suntyped ) + print i, suntyped[i]; } diff --git a/testing/btest/language/vector-unspecified.bro b/testing/btest/language/vector-unspecified.bro new file mode 100644 index 0000000000..b91f910504 --- /dev/null +++ b/testing/btest/language/vector-unspecified.bro @@ -0,0 +1,11 @@ +# @TEST-EXEC: bro -b %INPUT >output 2>&1 +# @TEST-EXEC: btest-diff output + +# Test assignment behavior of unspecified vectors +local a = vector(); + +a[0] = 5; +a[1] = "Hi"; +a[2] = 127.0.0.1; + +print a; From 3f584a08fddb16e4da24eec852a6eb843c6f971e Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 25 Feb 2014 19:20:42 -0800 Subject: [PATCH 020/182] Remove packet sorter. Addresses BIT-700 --- scripts/base/init-bare.bro | 7 - src/CMakeLists.txt | 1 - src/Net.cc | 77 +------ src/Net.h | 2 +- src/NetVar.cc | 4 - src/NetVar.h | 2 - src/PacketSort.cc | 364 -------------------------------- src/PacketSort.h | 132 ------------ src/PktSrc.cc | 10 +- src/RemoteSerializer.cc | 2 +- src/Sessions.cc | 102 ++++----- src/Sessions.h | 6 +- src/analyzer/protocol/arp/ARP.h | 6 +- 13 files changed, 65 insertions(+), 650 deletions(-) delete mode 100644 src/PacketSort.cc delete mode 100644 src/PacketSort.h diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index d4e631ecf4..46a838e8ae 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -1028,13 +1028,6 @@ const rpc_timeout = 24 sec &redef; ## means "forever", which resists evasion, but can lead to state accrual. const frag_timeout = 0.0 sec &redef; -## Time window for reordering packets. This is used for dealing with timestamp -## discrepancy between multiple packet sources. -## -## .. note:: Setting this can have a major performance impact as now packets -## need to be potentially copied and buffered. -const packet_sort_window = 0 usecs &redef; - ## If positive, indicates the encapsulation header size that should ## be skipped. This applies to all packets. const encap_hdr_size = 0 &redef; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c85b3b526f..ecf8683ddd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -293,7 +293,6 @@ set(bro_SRCS OpaqueVal.cc OSFinger.cc PacketFilter.cc - PacketSort.cc PersistenceSerializer.cc PktSrc.cc PolicyFile.cc diff --git a/src/Net.cc b/src/Net.cc index ac4dacf9b8..83fcde1df4 100644 --- a/src/Net.cc +++ b/src/Net.cc @@ -27,7 +27,6 @@ #include "Reporter.h" #include "Net.h" #include "Anon.h" -#include "PacketSort.h" #include "Serializer.h" #include "PacketDumper.h" @@ -58,8 +57,6 @@ double bro_start_network_time; // timestamp of first packet double last_watchdog_proc_time = 0.0; // value of above during last watchdog bool terminating = false; // whether we're done reading and finishing up -PacketSortGlobalPQ* packet_sorter = 0; - const struct pcap_pkthdr* current_hdr = 0; const u_char* current_pkt = 0; int current_dispatched = 0; @@ -286,9 +283,6 @@ void net_init(name_list& interfaces, name_list& readfiles, init_ip_addr_anonymizers(); - if ( packet_sort_window > 0 ) - packet_sorter = new PacketSortGlobalPQ(); - sessions = new NetSessions(); if ( do_watchdog ) @@ -313,7 +307,7 @@ void expire_timers(PktSrc* src_ps) void net_packet_dispatch(double t, const struct pcap_pkthdr* hdr, const u_char* pkt, int hdr_size, - PktSrc* src_ps, PacketSortElement* pkt_elem) + PktSrc* src_ps) { if ( ! bro_start_network_time ) bro_start_network_time = t; @@ -351,7 +345,7 @@ void net_packet_dispatch(double t, const struct pcap_pkthdr* hdr, } } - sessions->DispatchPacket(t, hdr, pkt, hdr_size, src_ps, pkt_elem); + sessions->DispatchPacket(t, hdr, pkt, hdr_size, src_ps); mgr.Drain(); if ( sp ) @@ -367,62 +361,11 @@ void net_packet_dispatch(double t, const struct pcap_pkthdr* hdr, current_pktsrc = 0; } -int process_packet_sorter(double latest_packet_time) - { - if ( ! packet_sorter ) - return 0; - - double min_t = latest_packet_time - packet_sort_window; - - int num_pkts_dispatched = 0; - PacketSortElement* pkt_elem; - - // Dispatch packets in the packet_sorter until timestamp min_t. - // It's possible that zero or multiple packets are dispatched. - while ( (pkt_elem = packet_sorter->RemoveMin(min_t)) != 0 ) - { - net_packet_dispatch(pkt_elem->TimeStamp(), - pkt_elem->Hdr(), pkt_elem->Pkt(), - pkt_elem->HdrSize(), pkt_elem->Src(), - pkt_elem); - ++num_pkts_dispatched; - delete pkt_elem; - } - - return num_pkts_dispatched; - } - -void net_packet_arrival(double t, const struct pcap_pkthdr* hdr, - const u_char* pkt, int hdr_size, - PktSrc* src_ps) - { - if ( packet_sorter ) - { - // Note that when we enable packet sorter, there will - // be a small window between the time packet arrives - // to Bro and when it is processed ("dispatched"). We - // define network_time to be the latest timestamp for - // packets *dispatched* so far (usually that's the - // timestamp of the current packet). - - // Add the packet to the packet_sorter. - packet_sorter->Add( - new PacketSortElement(src_ps, t, hdr, pkt, hdr_size)); - - // Do we have any packets to dispatch from packet_sorter? - process_packet_sorter(t); - } - else - // Otherwise we dispatch the packet immediately - net_packet_dispatch(t, hdr, pkt, hdr_size, src_ps, 0); - } - void net_run() { set_processing_status("RUNNING", "net_run"); while ( io_sources.Size() || - (packet_sorter && ! packet_sorter->Empty()) || (BifConst::exit_only_after_terminate && ! terminating) ) { double ts; @@ -445,14 +388,12 @@ void net_run() current_iosrc = src; if ( src ) - src->Process(); // which will call net_packet_arrival() + src->Process(); // which will call net_packet_dispatch() else if ( reading_live && ! pseudo_realtime) { // live but no source is currently active double ct = current_time(); - if ( packet_sorter && ! packet_sorter->Empty() ) - process_packet_sorter(ct); - else if ( ! net_is_processing_suspended() ) + if ( ! net_is_processing_suspended() ) { // Take advantage of the lull to get up to // date on timers and events. @@ -462,15 +403,6 @@ void net_run() } } - else if ( packet_sorter && ! packet_sorter->Empty() ) - { - // We are no longer reading live; done with all the - // sources. - // Drain packets remaining in the packet sorter. - process_packet_sorter( - network_time + packet_sort_window + 1000000); - } - else if ( (have_pending_timers || using_communication) && ! pseudo_realtime ) { @@ -581,7 +513,6 @@ void net_delete() set_processing_status("TERMINATING", "net_delete"); delete sessions; - delete packet_sorter; for ( int i = 0; i < NUM_ADDR_ANONYMIZATION_METHODS; ++i ) delete ip_anonymizer[i]; diff --git a/src/Net.h b/src/Net.h index 07c856d1dd..b5b25b0cee 100644 --- a/src/Net.h +++ b/src/Net.h @@ -20,7 +20,7 @@ extern void net_run(); extern void net_get_final_stats(); extern void net_finish(int drain_events); extern void net_delete(); // Reclaim all memory, etc. -extern void net_packet_arrival(double t, const struct pcap_pkthdr* hdr, +extern void net_packet_dispatch(double t, const struct pcap_pkthdr* hdr, const u_char* pkt, int hdr_size, PktSrc* src_ps); extern int net_packet_match(BPF_Program* fp, const u_char* pkt, diff --git a/src/NetVar.cc b/src/NetVar.cc index 05a4e16b47..3e13728cd8 100644 --- a/src/NetVar.cc +++ b/src/NetVar.cc @@ -156,8 +156,6 @@ int table_incremental_step; RecordType* packet_type; -double packet_sort_window; - double connection_status_update_interval; StringVal* state_dir; @@ -481,8 +479,6 @@ void init_net_var() packet_type = internal_type("packet")->AsRecordType(); - packet_sort_window = opt_internal_double("packet_sort_window"); - orig_addr_anonymization = opt_internal_int("orig_addr_anonymization"); resp_addr_anonymization = opt_internal_int("resp_addr_anonymization"); other_addr_anonymization = opt_internal_int("other_addr_anonymization"); diff --git a/src/NetVar.h b/src/NetVar.h index 8ef6571313..6a56e957ae 100644 --- a/src/NetVar.h +++ b/src/NetVar.h @@ -159,8 +159,6 @@ extern int table_incremental_step; extern RecordType* packet_type; -extern double packet_sort_window; - extern int orig_addr_anonymization, resp_addr_anonymization; extern int other_addr_anonymization; extern TableVal* preserve_orig_addr; diff --git a/src/PacketSort.cc b/src/PacketSort.cc deleted file mode 100644 index 429d8e2720..0000000000 --- a/src/PacketSort.cc +++ /dev/null @@ -1,364 +0,0 @@ -#include "IP.h" -#include "PacketSort.h" - -const bool DEBUG_packetsort = false; - -PacketSortElement::PacketSortElement(PktSrc* arg_src, - double arg_timestamp, const struct pcap_pkthdr* arg_hdr, - const u_char* arg_pkt, int arg_hdr_size) - { - src = arg_src; - timestamp = arg_timestamp; - hdr = *arg_hdr; - hdr_size = arg_hdr_size; - - pkt = new u_char[hdr.caplen]; - memcpy(pkt, arg_pkt, hdr.caplen); - - is_tcp = 0; - ip_hdr = 0; - tcp_flags = 0; - endp = 0; - payload_length = 0; - key = 0; - - // Now check if it is a "parsable" TCP packet. - uint32 caplen = hdr.caplen; - uint32 tcp_offset; - - if ( caplen >= sizeof(struct ip) + hdr_size ) - { - const struct ip* ip = (const struct ip*) (pkt + hdr_size); - if ( ip->ip_v == 4 ) - ip_hdr = new IP_Hdr(ip, false); - else if ( ip->ip_v == 6 && (caplen >= sizeof(struct ip6_hdr) + hdr_size) ) - ip_hdr = new IP_Hdr((const struct ip6_hdr*) ip, false, caplen - hdr_size); - else - // Weird will be generated later in NetSessions::NextPacket. - return; - - if ( ip_hdr->NextProto() == IPPROTO_TCP && - // Note: can't sort fragmented packets - ( ! ip_hdr->IsFragment() ) ) - { - tcp_offset = hdr_size + ip_hdr->HdrLen(); - if ( caplen >= tcp_offset + sizeof(struct tcphdr) ) - { - const struct tcphdr* tp = (const struct tcphdr*) - (pkt + tcp_offset); - - id.src_addr = ip_hdr->SrcAddr(); - id.dst_addr = ip_hdr->DstAddr(); - id.src_port = tp->th_sport; - id.dst_port = tp->th_dport; - id.is_one_way = 0; - - endp = addr_port_canon_lt(id.src_addr, - id.src_port, - id.dst_addr, - id.dst_port) ? 0 : 1; - - seq[endp] = ntohl(tp->th_seq); - - if ( tp->th_flags & TH_ACK ) - seq[1-endp] = ntohl(tp->th_ack); - else - seq[1-endp] = 0; - - tcp_flags = tp->th_flags; - - // DEBUG_MSG("%.6f: %u, %u\n", timestamp, seq[0], seq[1]); - - payload_length = ip_hdr->PayloadLen() - tp->th_off * 4; - - key = BuildConnIDHashKey(id); - - is_tcp = 1; - } - } - } - - if ( DEBUG_packetsort && ! is_tcp ) - DEBUG_MSG("%.6f non-TCP packet\n", timestamp); - } - -PacketSortElement::~PacketSortElement() - { - delete [] pkt; - delete ip_hdr; - delete key; - } - -int PacketSortPQ::Timestamp_Cmp(PacketSortElement* a, PacketSortElement* b) - { - double d = a->timestamp - b->timestamp; - - if ( d > 0 ) return 1; - else if ( d < 0 ) return -1; - else return 0; - } - -int PacketSortPQ::UpdatePQ(PacketSortElement* prev_e, PacketSortElement* new_e) - { - int index = prev_e->pq_index[pq_level]; - - new_e->pq_index[pq_level] = index; - pq[index] = new_e; - - if ( Cmp(prev_e, new_e) > 0 ) - return FixUp(new_e, index); - else - { - FixDown(new_e, index); - return index == 0; - } - } - -int PacketSortPQ::AddToPQ(PacketSortElement* new_e) - { - int index = pq.size(); - - new_e->pq_index[pq_level] = index; - pq.push_back(new_e); - - return FixUp(new_e, index); - } - -int PacketSortPQ::RemoveFromPQ(PacketSortElement* prev_e) - { - if ( pq.size() > 1 ) - { - PacketSortElement* new_e = pq[pq.size() - 1]; - pq.pop_back(); - return UpdatePQ(prev_e, new_e); - } - else - { - pq.pop_back(); - return 1; - } - } - -void PacketSortPQ::Assign(int k, PacketSortElement* e) - { - pq[k] = e; - e->pq_index[pq_level] = k; - } - -PacketSortConnPQ::~PacketSortConnPQ() - { - // Delete elements only in ConnPQ (not in GlobalPQ) to avoid - // double delete. - for ( int i = 0; i < (int) pq.size(); ++i ) - { - delete pq[i]; - pq[i] = 0; - } - } - -int PacketSortConnPQ::Cmp(PacketSortElement* a, PacketSortElement* b) - { - // Note: here we do not distinguish between packets without - // an ACK and packets with seq/ack of 0. The later will sorted - // only by their timestamps. - - if ( a->seq[0] && b->seq[0] && a->seq[0] != b->seq[0] ) - return (a->seq[0] > b->seq[0]) ? 1 : -1; - - else if ( a->seq[1] && b->seq[1] && a->seq[1] != b->seq[1] ) - return (a->seq[1] > b->seq[1]) ? 1 : -1; - - else - return Timestamp_Cmp(a, b); - } - -int PacketSortPQ::FixUp(PacketSortElement* e, int k) - { - if ( k == 0 ) - { - Assign(0, e); - return 1; - } - - int parent = (k-1) / 2; - if ( Cmp(pq[parent], e) > 0 ) - { - Assign(k, pq[parent]); - return FixUp(e, parent); - } - else - { - Assign(k, e); - return 0; - } - } - -void PacketSortPQ::FixDown(PacketSortElement* e, int k) - { - uint32 kid = k * 2 + 1; - - if ( kid >= pq.size() ) - { - Assign(k, e); - return; - } - - if ( kid + 1 < pq.size() && Cmp(pq[kid], pq[kid+1]) > 0 ) - ++kid; - - if ( Cmp(e, pq[kid]) > 0 ) - { - Assign(k, pq[kid]); - FixDown(e, kid); - } - else - Assign(k, e); - } - - -int PacketSortConnPQ::Add(PacketSortElement* e) - { -#if 0 - int endp = e->endp; - uint32 end_seq = e->seq[endp] + e->payload_length; - - int p = 1 - endp; - if ( (e->tcp_flags & TH_RST) && ! (e->tcp_flags & TH_ACK) ) - { - DEBUG_MSG("%.6f %c: %u -> %u\n", - e->TimeStamp(), (p == endp) ? 'S' : 'A', - e->seq[p], next_seq[p]); - e->seq[p] = next_seq[p]; - } - - if ( end_seq > next_seq[endp] ) - next_seq[endp] = end_seq; -#endif - - return AddToPQ(e); - } - -void PacketSortConnPQ::UpdateDeliveredSeq(int endp, int seq, int len, int ack) - { - if ( delivered_seq[endp] == 0 || delivered_seq[endp] == seq ) - delivered_seq[endp] = seq + len; - if ( ack > delivered_seq[1 - endp] ) - delivered_seq[endp] = ack; - } - -bool PacketSortConnPQ::IsContentGapSafe(PacketSortElement* e) - { - int ack = e->seq[1 - e->endp]; - return ack <= delivered_seq[1 - e->endp]; - } - -int PacketSortConnPQ::Remove(PacketSortElement* e) - { - int ret = RemoveFromPQ(e); - UpdateDeliveredSeq(e->endp, e->seq[e->endp], e->payload_length, - e->seq[1 - e->endp]); - return ret; - } - -static void DeleteConnPQ(void* p) - { - delete (PacketSortConnPQ*) p; - } - -PacketSortGlobalPQ::PacketSortGlobalPQ() - { - pq_level = GLOBAL_PQ; - conn_pq_table.SetDeleteFunc(DeleteConnPQ); - } - -PacketSortGlobalPQ::~PacketSortGlobalPQ() - { - // Destruction of PacketSortConnPQ will delete all conn_pq's. - } - -int PacketSortGlobalPQ::Add(PacketSortElement* e) - { - if ( e->is_tcp ) - { - // TCP packets are sorted by sequence numbers - PacketSortConnPQ* conn_pq = FindConnPQ(e); - PacketSortElement* prev_min = conn_pq->Min(); - - if ( conn_pq->Add(e) ) - { - ASSERT(conn_pq->Min() != prev_min); - - if ( prev_min ) - return UpdatePQ(prev_min, e); - else - return AddToPQ(e); - } - - else - { - ASSERT(conn_pq->Min() == prev_min); - return 0; - } - } - else - return AddToPQ(e); - } - -PacketSortElement* PacketSortGlobalPQ::RemoveMin(double timestamp) - { - PacketSortElement* e = Min(); - - if ( ! e ) - return 0; - - if ( e->is_tcp ) - { - PacketSortConnPQ* conn_pq = FindConnPQ(e); - -#if 0 - // Note: the content gap safety check does not work - // because we remove the state for a connection once - // it has no packet in the priority queue. - - // Do not deliver e if it arrives later than timestamp, - // and is not content-gap-safe. - if ( e->timestamp > timestamp && - ! conn_pq->IsContentGapSafe(e) ) - return 0; -#else - if ( e->timestamp > timestamp ) - return 0; -#endif - - conn_pq->Remove(e); - PacketSortElement* new_e = conn_pq->Min(); - - if ( new_e ) - UpdatePQ(e, new_e); - else - { - RemoveFromPQ(e); - conn_pq_table.Remove(e->key); - delete conn_pq; - } - } - else - RemoveFromPQ(e); - - return e; - } - -PacketSortConnPQ* PacketSortGlobalPQ::FindConnPQ(PacketSortElement* e) - { - if ( ! e->is_tcp ) - reporter->InternalError("cannot find a connection for an invalid id"); - - PacketSortConnPQ* pq = (PacketSortConnPQ*) conn_pq_table.Lookup(e->key); - if ( ! pq ) - { - pq = new PacketSortConnPQ(); - conn_pq_table.Insert(e->key, pq); - } - - return pq; - } diff --git a/src/PacketSort.h b/src/PacketSort.h deleted file mode 100644 index 199da0732f..0000000000 --- a/src/PacketSort.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef packetsort_h -#define packetsort_h - -// Timestamps can be imprecise and even inconsistent among packets -// from different sources. This class tries to guess a "correct" -// order by looking at TCP sequence numbers. -// -// In particular, it tries to eliminate "false" content gaps. - -#include "Dict.h" -#include "Conn.h" - -enum { - CONN_PQ, - GLOBAL_PQ, - NUM_OF_PQ_LEVEL, -}; - -class PktSrc; - -class PacketSortElement { -public: - PacketSortElement(PktSrc* src, double timestamp, - const struct pcap_pkthdr* hdr, - const u_char* pkt, int hdr_size); - ~PacketSortElement(); - - PktSrc* Src() const { return src; } - double TimeStamp() const { return timestamp; } - const struct pcap_pkthdr* Hdr() const { return &hdr; } - const u_char* Pkt() const { return pkt; } - int HdrSize() const { return hdr_size; } - const IP_Hdr* IPHdr() const { return ip_hdr; } - -protected: - PktSrc* src; - double timestamp; - struct pcap_pkthdr hdr; - u_char* pkt; - int hdr_size; - - IP_Hdr* ip_hdr; - int is_tcp; - ConnID id; - uint32 seq[2]; // indexed by endpoint - int tcp_flags; - int endp; // 0 or 1 - int payload_length; - - HashKey* key; - - int pq_index[NUM_OF_PQ_LEVEL]; - - friend class PacketSortPQ; - friend class PacketSortConnPQ; - friend class PacketSortGlobalPQ; -}; - -class PacketSortPQ { -public: - PacketSortPQ() - { pq_level = -1; } - virtual ~PacketSortPQ() {} - - PacketSortElement* Min() const { return (pq.size() > 0) ? pq[0] : 0; } - -protected: - virtual int Cmp(PacketSortElement* a, PacketSortElement* b) = 0; - int Timestamp_Cmp(PacketSortElement* a, PacketSortElement* b); - - int UpdatePQ(PacketSortElement* prev_e, PacketSortElement* new_e); - int AddToPQ(PacketSortElement* e); - int RemoveFromPQ(PacketSortElement* e); - - void Assign(int k, PacketSortElement* e); - int FixUp(PacketSortElement* e, int k); - void FixDown(PacketSortElement* e, int k); - - vector pq; - int pq_level; -}; - -// Sort by sequence numbers within a connection -class PacketSortConnPQ : public PacketSortPQ { -public: - PacketSortConnPQ() - { - pq_level = CONN_PQ; - delivered_seq[0] = delivered_seq[1] = 0; - } - ~PacketSortConnPQ(); - - int Add(PacketSortElement* e); - - int Remove(PacketSortElement* e); - - bool IsContentGapSafe(PacketSortElement* e); - -protected: - int Cmp(PacketSortElement* a, PacketSortElement* b); - void UpdateDeliveredSeq(int endp, int seq, int len, int ack); - - int delivered_seq[2]; -}; - -declare(PDict, PacketSortConnPQ); - -// Sort by timestamps. -class PacketSortGlobalPQ : public PacketSortPQ { -public: - PacketSortGlobalPQ(); - ~PacketSortGlobalPQ(); - - int Add(PacketSortElement* e); - - int Empty() const { return conn_pq_table.Length() == 0; } - - // Returns the next packet to dispatch if it arrives earlier than the - // given timestamp, otherwise returns 0. - // The packet, if to be returned, is also removed from the - // priority queue. - PacketSortElement* RemoveMin(double timestamp); - -protected: - int Cmp(PacketSortElement* a, PacketSortElement* b) - { return Timestamp_Cmp(a, b); } - PacketSortConnPQ* FindConnPQ(PacketSortElement* e); - - PDict(PacketSortConnPQ) conn_pq_table; -}; - -#endif diff --git a/src/PktSrc.cc b/src/PktSrc.cc index 179630cdbd..528f10f92c 100644 --- a/src/PktSrc.cc +++ b/src/PktSrc.cc @@ -220,6 +220,12 @@ void PktSrc::Process() break; } + case DLT_IEEE802_11: + { + printf("Here\n"); + exit(0); + } + case DLT_EN10MB: { // Get protocol being carried from the ethernet frame. @@ -317,13 +323,13 @@ void PktSrc::Process() if ( pseudo_realtime ) { current_pseudo = CheckPseudoTime(); - net_packet_arrival(current_pseudo, &hdr, data, pkt_hdr_size, this); + net_packet_dispatch(current_pseudo, &hdr, data, pkt_hdr_size, this); if ( ! first_wallclock ) first_wallclock = current_time(true); } else - net_packet_arrival(current_timestamp, &hdr, data, pkt_hdr_size, this); + net_packet_dispatch(current_timestamp, &hdr, data, pkt_hdr_size, this); data = 0; } diff --git a/src/RemoteSerializer.cc b/src/RemoteSerializer.cc index c8cf03667b..8d07f34d38 100644 --- a/src/RemoteSerializer.cc +++ b/src/RemoteSerializer.cc @@ -1466,7 +1466,7 @@ void RemoteSerializer::Process() current_pkt = p->pkt; current_pktsrc = 0; current_iosrc = this; - sessions->NextPacket(p->time, p->hdr, p->pkt, p->hdr_size, 0); + sessions->NextPacket(p->time, p->hdr, p->pkt, p->hdr_size); mgr.Drain(); current_hdr = 0; // done with these diff --git a/src/Sessions.cc b/src/Sessions.cc index f7f2f37470..ec275a1689 100644 --- a/src/Sessions.cc +++ b/src/Sessions.cc @@ -30,7 +30,6 @@ #include "Discard.h" #include "RuleMatcher.h" -#include "PacketSort.h" #include "TunnelEncapsulation.h" #include "analyzer/Manager.h" @@ -168,7 +167,7 @@ void NetSessions::Done() void NetSessions::DispatchPacket(double t, const struct pcap_pkthdr* hdr, const u_char* pkt, int hdr_size, - PktSrc* src_ps, PacketSortElement* pkt_elem) + PktSrc* src_ps) { const struct ip* ip_hdr = 0; const u_char* ip_data = 0; @@ -186,14 +185,13 @@ void NetSessions::DispatchPacket(double t, const struct pcap_pkthdr* hdr, hdr_size += encap_hdr_size; if ( src_ps->FilterType() == TYPE_FILTER_NORMAL ) - NextPacket(t, hdr, pkt, hdr_size, pkt_elem); + NextPacket(t, hdr, pkt, hdr_size); else NextPacketSecondary(t, hdr, pkt, hdr_size, src_ps); } void NetSessions::NextPacket(double t, const struct pcap_pkthdr* hdr, - const u_char* const pkt, int hdr_size, - PacketSortElement* pkt_elem) + const u_char* const pkt, int hdr_size) { SegmentProfiler(segment_logger, "processing-packet"); if ( pkt_profiler ) @@ -206,70 +204,58 @@ void NetSessions::NextPacket(double t, const struct pcap_pkthdr* hdr, if ( record_all_packets ) DumpPacket(hdr, pkt); - if ( pkt_elem && pkt_elem->IPHdr() ) - // Fast path for "normal" IP packets if an IP_Hdr is - // already extracted when doing PacketSort. Otherwise - // the code below tries to extract the IP header, the - // difference here is that header extraction in - // PacketSort does not generate Weird events. + // ### The following isn't really correct. What we *should* + // do is understanding the different link layers in order to + // find the network-layer protocol ID. That's a big + // portability pain, though, unless we just assume everything's + // Ethernet .... not great, given the potential need to deal + // with PPP or FDDI (for some older traces). So instead + // we look to see if what we have is consistent with an + // IPv4 packet. If not, it's either ARP or IPv6 or weird. - DoNextPacket(t, hdr, pkt_elem->IPHdr(), pkt, hdr_size, 0); - - else + if ( hdr_size > static_cast(hdr->caplen) ) { - // ### The following isn't really correct. What we *should* - // do is understanding the different link layers in order to - // find the network-layer protocol ID. That's a big - // portability pain, though, unless we just assume everything's - // Ethernet .... not great, given the potential need to deal - // with PPP or FDDI (for some older traces). So instead - // we look to see if what we have is consistent with an - // IPv4 packet. If not, it's either ARP or IPv6 or weird. + Weird("truncated_link_frame", hdr, pkt); + return; + } - if ( hdr_size > static_cast(hdr->caplen) ) - { - Weird("truncated_link_frame", hdr, pkt); - return; - } + uint32 caplen = hdr->caplen - hdr_size; + if ( caplen < sizeof(struct ip) ) + { + Weird("truncated_IP", hdr, pkt); + return; + } - uint32 caplen = hdr->caplen - hdr_size; - if ( caplen < sizeof(struct ip) ) + const struct ip* ip = (const struct ip*) (pkt + hdr_size); + + if ( ip->ip_v == 4 ) + { + IP_Hdr ip_hdr(ip, false); + DoNextPacket(t, hdr, &ip_hdr, pkt, hdr_size, 0); + } + + else if ( ip->ip_v == 6 ) + { + if ( caplen < sizeof(struct ip6_hdr) ) { Weird("truncated_IP", hdr, pkt); return; } - const struct ip* ip = (const struct ip*) (pkt + hdr_size); + IP_Hdr ip_hdr((const struct ip6_hdr*) (pkt + hdr_size), false, caplen); + DoNextPacket(t, hdr, &ip_hdr, pkt, hdr_size, 0); + } - if ( ip->ip_v == 4 ) - { - IP_Hdr ip_hdr(ip, false); - DoNextPacket(t, hdr, &ip_hdr, pkt, hdr_size, 0); - } + else if ( analyzer::arp::ARP_Analyzer::IsARP(pkt, hdr_size) ) + { + if ( arp_analyzer ) + arp_analyzer->NextPacket(t, hdr, pkt, hdr_size); + } - else if ( ip->ip_v == 6 ) - { - if ( caplen < sizeof(struct ip6_hdr) ) - { - Weird("truncated_IP", hdr, pkt); - return; - } - - IP_Hdr ip_hdr((const struct ip6_hdr*) (pkt + hdr_size), false, caplen); - DoNextPacket(t, hdr, &ip_hdr, pkt, hdr_size, 0); - } - - else if ( analyzer::arp::ARP_Analyzer::IsARP(pkt, hdr_size) ) - { - if ( arp_analyzer ) - arp_analyzer->NextPacket(t, hdr, pkt, hdr_size); - } - - else - { - Weird("unknown_packet_type", hdr, pkt); - return; - } + else + { + Weird("unknown_packet_type", hdr, pkt); + return; } if ( dump_this_packet && ! record_all_packets ) diff --git a/src/Sessions.h b/src/Sessions.h index e2dec3b1aa..06cdbca978 100644 --- a/src/Sessions.h +++ b/src/Sessions.h @@ -28,7 +28,6 @@ declare(PDict,FragReassembler); class Discarder; class PacketFilter; -class PacketSortElement; namespace analyzer { namespace stepping_stone { class SteppingStoneManager; } } namespace analyzer { namespace arp { class ARP_Analyzer; } } @@ -74,7 +73,7 @@ public: // employing the packet sorter first. void DispatchPacket(double t, const struct pcap_pkthdr* hdr, const u_char* const pkt, int hdr_size, - PktSrc* src_ps, PacketSortElement* pkt_elem); + PktSrc* src_ps); void Done(); // call to drain events before destructing @@ -220,8 +219,7 @@ protected: uint8 tcp_flags, bool& flip_roles); void NextPacket(double t, const struct pcap_pkthdr* hdr, - const u_char* const pkt, int hdr_size, - PacketSortElement* pkt_elem); + const u_char* const pkt, int hdr_size); void NextPacketSecondary(double t, const struct pcap_pkthdr* hdr, const u_char* const pkt, int hdr_size, diff --git a/src/analyzer/protocol/arp/ARP.h b/src/analyzer/protocol/arp/ARP.h index f09dc6c398..83f447817e 100644 --- a/src/analyzer/protocol/arp/ARP.h +++ b/src/analyzer/protocol/arp/ARP.h @@ -24,7 +24,11 @@ #endif #include "NetVar.h" -#include "PacketSort.h" + +// for pcap_pkthdr +extern "C" { +#include +} namespace analyzer { namespace arp { From 80c319b522dcad8f1ee41de52d9f962fb3e615d5 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Wed, 26 Feb 2014 14:47:40 -0800 Subject: [PATCH 021/182] adjust timings of a few leak tests. Without the longer timeouts, these consistently fail for me on caddy when doing "make test". --- testing/btest/core/leaks/ayiya.test | 2 +- testing/btest/core/leaks/bloomfilter.bro | 2 +- testing/btest/core/leaks/gridftp.test | 2 +- testing/btest/core/leaks/gtp_opt_header.test | 2 +- testing/btest/core/leaks/input-reread.bro | 8 ++++---- testing/btest/core/leaks/teredo.bro | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/testing/btest/core/leaks/ayiya.test b/testing/btest/core/leaks/ayiya.test index 36e925951b..bf9f867cdd 100644 --- a/testing/btest/core/leaks/ayiya.test +++ b/testing/btest/core/leaks/ayiya.test @@ -5,4 +5,4 @@ # @TEST-GROUP: leaks # # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -r $TRACES/tunnels/ayiya3.trace -# @TEST-EXEC: btest-bg-wait 15 +# @TEST-EXEC: btest-bg-wait 30 diff --git a/testing/btest/core/leaks/bloomfilter.bro b/testing/btest/core/leaks/bloomfilter.bro index 6d9b74114e..e35294f98c 100644 --- a/testing/btest/core/leaks/bloomfilter.bro +++ b/testing/btest/core/leaks/bloomfilter.bro @@ -5,7 +5,7 @@ # @TEST-REQUIRES: bro --help 2>&1 | grep -q mem-leaks # # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -b -r $TRACES/wikipedia.trace %INPUT -# @TEST-EXEC: btest-bg-wait 15 +# @TEST-EXEC: btest-bg-wait 30 function test_basic_bloom_filter() { diff --git a/testing/btest/core/leaks/gridftp.test b/testing/btest/core/leaks/gridftp.test index b9a0a70127..f0ba6cf8e6 100644 --- a/testing/btest/core/leaks/gridftp.test +++ b/testing/btest/core/leaks/gridftp.test @@ -5,7 +5,7 @@ # @TEST-GROUP: leaks # # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -r $TRACES/globus-url-copy.trace %INPUT -# @TEST-EXEC: btest-bg-wait 15 +# @TEST-EXEC: btest-bg-wait 30 @load base/protocols/ftp/gridftp diff --git a/testing/btest/core/leaks/gtp_opt_header.test b/testing/btest/core/leaks/gtp_opt_header.test index 771e4b3861..4205766ee0 100644 --- a/testing/btest/core/leaks/gtp_opt_header.test +++ b/testing/btest/core/leaks/gtp_opt_header.test @@ -5,7 +5,7 @@ # @TEST-GROUP: leaks # # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -r $TRACES/tunnels/gtp/gtp6_gtp_0x32.pcap %INPUT >out -# @TEST-EXEC: btest-bg-wait 15 +# @TEST-EXEC: btest-bg-wait 30 # Some GTPv1 headers have some optional fields totaling to a 4-byte extension # of the mandatory header. diff --git a/testing/btest/core/leaks/input-reread.bro b/testing/btest/core/leaks/input-reread.bro index c6ff5361be..e9aab062d0 100644 --- a/testing/btest/core/leaks/input-reread.bro +++ b/testing/btest/core/leaks/input-reread.bro @@ -6,13 +6,13 @@ # # @TEST-EXEC: cp input1.log input.log # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -b %INPUT -# @TEST-EXEC: sleep 5 +# @TEST-EXEC: sleep 10 # @TEST-EXEC: cp input2.log input.log -# @TEST-EXEC: sleep 5 +# @TEST-EXEC: sleep 10 # @TEST-EXEC: cp input3.log input.log -# @TEST-EXEC: sleep 5 +# @TEST-EXEC: sleep 10 # @TEST-EXEC: cp input4.log input.log -# @TEST-EXEC: sleep 5 +# @TEST-EXEC: sleep 10 # @TEST-EXEC: cp input5.log input.log # @TEST-EXEC: btest-bg-wait 30 diff --git a/testing/btest/core/leaks/teredo.bro b/testing/btest/core/leaks/teredo.bro index 69c961fec4..a97172271e 100644 --- a/testing/btest/core/leaks/teredo.bro +++ b/testing/btest/core/leaks/teredo.bro @@ -5,7 +5,7 @@ # @TEST-GROUP: leaks # # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -r $TRACES/tunnels/Teredo.pcap %INPUT >output -# @TEST-EXEC: btest-bg-wait 15 +# @TEST-EXEC: btest-bg-wait 30 function print_teredo(name: string, outer: connection, inner: teredo_hdr) { From 1735e33691dad0d500f024300a0c2dfb716a3fdc Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 28 Feb 2014 02:09:06 -0800 Subject: [PATCH 022/182] Backport crash fix that made it into master with the x509_extension backport from here. --- src/file_analysis/analyzer/x509/X509.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 59ab644634..c2c2a0b8bc 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -163,10 +163,13 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) BIO_flush(bio); int length = BIO_pending(bio); - char *buffer = new char[length]; + + // Use OPENSSL_malloc here. Using new or anything else can lead + // to interesting, hard to debug segfaults. + char *buffer = (char*) OPENSSL_malloc(length); BIO_read(bio, (void*)buffer, length); StringVal* ext_val = new StringVal(length, buffer); - delete(buffer); + OPENSSL_free(buffer); BIO_free_all(bio); RecordVal* pX509Ext = new RecordVal(BifType::Record::X509::Extension); @@ -189,16 +192,13 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) mgr.QueueEvent(x509_extension, vl); - // look if we have a specialized handler for this event... if ( OBJ_obj2nid(ext_asn) == NID_basic_constraints ) ParseBasicConstraints(ex); else if ( OBJ_obj2nid(ext_asn) == NID_subject_alt_name ) ParseSAN(ex); - - - } + void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_basic_constraints); @@ -222,7 +222,6 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) mgr.QueueEvent(x509_ext_basic_constraints, vl); } - } void file_analysis::X509::ParseSAN(X509_EXTENSION* ext) From 7ba6bcff2ca20c5d57244b7e6f11a22c95520819 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 28 Feb 2014 02:43:16 -0800 Subject: [PATCH 023/182] Second try on the event interface. Now the x509 opaque is wrapped in the certificate structure. After pondering on it for a bit, this might not be the brightest idea. --- scripts/base/files/x509/main.bro | 6 +-- scripts/base/init-bare.bro | 25 +----------- src/NetVar.cc | 6 --- src/NetVar.h | 3 -- src/file_analysis/analyzer/x509/X509.cc | 45 ++++++++++++++-------- src/file_analysis/analyzer/x509/X509.h | 11 +++--- src/file_analysis/analyzer/x509/events.bif | 6 +-- 7 files changed, 40 insertions(+), 62 deletions(-) diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro index 458a389934..d19327f07c 100644 --- a/scripts/base/files/x509/main.bro +++ b/scripts/base/files/x509/main.bro @@ -12,17 +12,17 @@ event x509_cert(f: fa_file, cert: X509::Certificate) print cert; } -event x509_extension(f: fa_file, ext: X509::Extension) +event x509_extension(f: fa_file, cert: X509::Certificate, ext: X509::Extension) { print ext; } -event x509_ext_basic_constraints(f: fa_file, ext: X509::BasicConstraints) +event x509_ext_basic_constraints(f: fa_file, cert: X509::Certificate, ext: X509::BasicConstraints) { print ext; } -event x509_ext_subject_alternative_name(f: fa_file, ext: X509::SubjectAlternativeName) +event x509_ext_subject_alternative_name(f: fa_file, cert: X509::Certificate, ext: X509::SubjectAlternativeName) { print ext; } diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index 8573fc2876..e4c1803fcb 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -2420,29 +2420,6 @@ global dns_skip_all_addl = T &redef; ## traffic and do not process it. Set to 0 to turn off this functionality. global dns_max_queries = 5; -## An X509 certificate. -## -## .. bro:see:: x509_certificate -type X509: record { - version: count; ##< Version number. - serial: string; ##< Serial number. - subject: string; ##< Subject. - issuer: string; ##< Issuer. - not_valid_before: time; ##< Timestamp before when certificate is not valid. - not_valid_after: time; ##< Timestamp after when certificate is not valid. -}; - -## An X509 extension. -## -## .. bro:see:: x509_extension -type X509_extension_info: record { - name: string; ##< Long name of extension; oid if name not known. - short_name: string &optional; ##< Short name of extension if known. - oid: string; ##< Oid of extension. - critical: bool; ##< True if extension is critical. - value: string; ##< Extension content parsed to string for known extensions. Raw data otherwise. -}; - ## HTTP session statistics. ## ## .. bro:see:: http_stats @@ -2767,6 +2744,7 @@ export { module X509; export { type X509::Certificate: record { + certificate: opaque of x509; ##< OpenSSL certificate reference version: count; ##< Version number. serial: string; ##< Serial number. subject: string; ##< Subject. @@ -2799,7 +2777,6 @@ export { type X509::SubjectAlternativeName: record { names: vector of string; }; - } module SOCKS; diff --git a/src/NetVar.cc b/src/NetVar.cc index 05a4e16b47..2883adcf9f 100644 --- a/src/NetVar.cc +++ b/src/NetVar.cc @@ -47,9 +47,6 @@ int tcp_max_initial_window; int tcp_max_above_hole_without_any_acks; int tcp_excessive_data_without_further_acks; -RecordType* x509_type; -RecordType* x509_extension_type; - RecordType* socks_address; double non_analyzed_lifetime; @@ -356,9 +353,6 @@ void init_net_var() tcp_excessive_data_without_further_acks = opt_internal_int("tcp_excessive_data_without_further_acks"); - x509_type = internal_type("X509")->AsRecordType(); - x509_extension_type = internal_type("X509_extension_info")->AsRecordType(); - socks_address = internal_type("SOCKS::Address")->AsRecordType(); non_analyzed_lifetime = opt_internal_double("non_analyzed_lifetime"); diff --git a/src/NetVar.h b/src/NetVar.h index 8ef6571313..55f3955fa4 100644 --- a/src/NetVar.h +++ b/src/NetVar.h @@ -50,9 +50,6 @@ extern int tcp_max_initial_window; extern int tcp_max_above_hole_without_any_acks; extern int tcp_excessive_data_without_further_acks; -extern RecordType* x509_type; -extern RecordType* x509_extension_type; - extern RecordType* socks_address; extern double non_analyzed_lifetime; diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index c2c2a0b8bc..684f4f54ba 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -49,7 +49,7 @@ bool file_analysis::X509::EndOfFile() return false; } - ParseCertificate(ssl_cert); + RecordVal* cert_record = ParseCertificate(ssl_cert); // cert_record takes ownership of ssl_cert // after parsing the certificate - parse the extensions... @@ -60,37 +60,43 @@ bool file_analysis::X509::EndOfFile() if ( !ex ) continue; - ParseExtension(ex); + ParseExtension(ex, cert_record); } - X509_free(ssl_cert); + // X509_free(ssl_cert); We do _not_ free the certificate here. It is refcounted + // inside the X509Val that is sent on in the cert record to scriptland. + // + // The certificate will be freed when the last X509Val is Unref'd. + + Unref(cert_record); // Unref the RecordVal that we kept around from ParseCertificate return false; } -void file_analysis::X509::ParseCertificate(::X509* ssl_cert) +RecordVal* file_analysis::X509::ParseCertificate(::X509* ssl_cert) { char buf[256]; // we need a buffer for some of the openssl functions - memset(buf, 0, 256); + memset(buf, 0, 256); RecordVal* pX509Cert = new RecordVal(BifType::Record::X509::Certificate); BIO *bio = BIO_new(BIO_s_mem()); - pX509Cert->Assign(0, new Val((uint64) X509_get_version(ssl_cert), TYPE_COUNT)); + pX509Cert->Assign(0, new X509Val(ssl_cert)); // take ownership for cleanup + pX509Cert->Assign(1, new Val((uint64) X509_get_version(ssl_cert), TYPE_COUNT)); i2a_ASN1_INTEGER(bio, X509_get_serialNumber(ssl_cert)); int len = BIO_read(bio, &(*buf), sizeof buf); - pX509Cert->Assign(1, new StringVal(len, buf)); + pX509Cert->Assign(2, new StringVal(len, buf)); X509_NAME_print_ex(bio, X509_get_subject_name(ssl_cert), 0, XN_FLAG_RFC2253); len = BIO_gets(bio, &(*buf), sizeof buf); - pX509Cert->Assign(2, new StringVal(len, buf)); + pX509Cert->Assign(3, new StringVal(len, buf)); X509_NAME_print_ex(bio, X509_get_issuer_name(ssl_cert), 0, XN_FLAG_RFC2253); len = BIO_gets(bio, &(*buf), sizeof buf); - pX509Cert->Assign(3, new StringVal(len, buf)); + pX509Cert->Assign(4, new StringVal(len, buf)); BIO_free(bio); - pX509Cert->Assign(4, new Val(get_time_from_asn1(X509_get_notBefore(ssl_cert)), TYPE_TIME)); - pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notAfter(ssl_cert)), TYPE_TIME)); + pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notBefore(ssl_cert)), TYPE_TIME)); + pX509Cert->Assign(6, new Val(get_time_from_asn1(X509_get_notAfter(ssl_cert)), TYPE_TIME)); // we only read 255 bytes because byte 256 is always 0. // if the string is longer than 255, that will be our null-termination, @@ -137,12 +143,14 @@ void file_analysis::X509::ParseCertificate(::X509* ssl_cert) val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); - vl->append(pX509Cert); + vl->append(pX509Cert->Ref()); // we Ref it here, because we want to keep a copy around for now... mgr.QueueEvent(x509_cert, vl); + + return pX509Cert; } -void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) +void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r) { char name[256]; char oid[256]; @@ -188,18 +196,19 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) // but I am not sure if there is a better way to do it... val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(r->Ref()); vl->append(pX509Ext); mgr.QueueEvent(x509_extension, vl); // look if we have a specialized handler for this event... if ( OBJ_obj2nid(ext_asn) == NID_basic_constraints ) - ParseBasicConstraints(ex); + ParseBasicConstraints(ex, r); else if ( OBJ_obj2nid(ext_asn) == NID_subject_alt_name ) - ParseSAN(ex); + ParseSAN(ex, r); } -void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) +void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_basic_constraints); @@ -217,6 +226,7 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) } val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(r->Ref()); vl->append(pBasicConstraint); mgr.QueueEvent(x509_ext_basic_constraints, vl); @@ -224,7 +234,7 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) } } -void file_analysis::X509::ParseSAN(X509_EXTENSION* ext) +void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_subject_alt_name); @@ -268,6 +278,7 @@ void file_analysis::X509::ParseSAN(X509_EXTENSION* ext) val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(r->Ref()); vl->append(pSan); mgr.QueueEvent(x509_ext_basic_constraints, vl); diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h index 80bb68209e..f64aa3eb58 100644 --- a/src/file_analysis/analyzer/x509/X509.h +++ b/src/file_analysis/analyzer/x509/X509.h @@ -31,10 +31,10 @@ private: static StringVal* key_curve(EVP_PKEY *key); static unsigned int key_length(EVP_PKEY *key); - void ParseCertificate(::X509* ssl_cert); - void ParseExtension(X509_EXTENSION* ex); - void ParseBasicConstraints(X509_EXTENSION* ex); - void ParseSAN(X509_EXTENSION* ex); + RecordVal* ParseCertificate(::X509* ssl_cert); + void ParseExtension(X509_EXTENSION* ex, RecordVal* r); + void ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r); + void ParseSAN(X509_EXTENSION* ex, RecordVal* r); std::string cert_data; }; @@ -55,7 +55,7 @@ public: * * @return A newly initialized X509Val */ - X509Val(::X509* certificate); + explicit X509Val(::X509* certificate); /** * Destructor. @@ -84,5 +84,4 @@ private: } - #endif diff --git a/src/file_analysis/analyzer/x509/events.bif b/src/file_analysis/analyzer/x509/events.bif index 148d09ec00..2787746e0c 100644 --- a/src/file_analysis/analyzer/x509/events.bif +++ b/src/file_analysis/analyzer/x509/events.bif @@ -1,4 +1,4 @@ event x509_cert%(f: fa_file, cert: X509::Certificate%); -event x509_extension%(f: fa_file, ext: X509::Extension%); -event x509_ext_basic_constraints%(f: fa_file, ext: X509::BasicConstraints%); -event x509_ext_subject_alternative_name%(f: fa_file, ext: X509::SubjectAlternativeName%); +event x509_extension%(f: fa_file, cert: X509::Certificate, ext: X509::Extension%); +event x509_ext_basic_constraints%(f: fa_file, cert: X509::Certificate, ext: X509::BasicConstraints%); +event x509_ext_subject_alternative_name%(f: fa_file, cert: X509::Certificate, ext: X509::SubjectAlternativeName%); From a1d91509641c1b5ed3808635dfc411f8be6ed39d Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Fri, 28 Feb 2014 03:40:18 -0800 Subject: [PATCH 024/182] Update mozilla root bundle --- scripts/base/protocols/ssl/mozilla-ca-list.bro | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/scripts/base/protocols/ssl/mozilla-ca-list.bro b/scripts/base/protocols/ssl/mozilla-ca-list.bro index d7c5578166..7450692fdd 100644 --- a/scripts/base/protocols/ssl/mozilla-ca-list.bro +++ b/scripts/base/protocols/ssl/mozilla-ca-list.bro @@ -1,5 +1,5 @@ # Don't edit! This file is automatically generated. -# Generated at: 2013-11-01 05:23:08 -0700 +# Generated at: 2014-02-28 03:34:22 -0800 # Generated from: http://mxr.mozilla.org/mozilla-central/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # # The original source file comes with this licensing statement: @@ -11,7 +11,6 @@ @load base/protocols/ssl module SSL; redef root_certs += { - ["CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US"] = "\x30\x82\x02\x5A\x30\x82\x01\xC3\x02\x02\x01\xA5\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x75\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x18\x30\x16\x06\x03\x55\x04\x0A\x13\x0F\x47\x54\x45\x20\x43\x6F\x72\x70\x6F\x72\x61\x74\x69\x6F\x6E\x31\x27\x30\x25\x06\x03\x55\x04\x0B\x13\x1E\x47\x54\x45\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x53\x6F\x6C\x75\x74\x69\x6F\x6E\x73\x2C\x20\x49\x6E\x63\x2E\x31\x23\x30\x21\x06\x03\x55\x04\x03\x13\x1A\x47\x54\x45\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x30\x1E\x17\x0D\x39\x38\x30\x38\x31\x33\x30\x30\x32\x39\x30\x30\x5A\x17\x0D\x31\x38\x30\x38\x31\x33\x32\x33\x35\x39\x30\x30\x5A\x30\x75\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x18\x30\x16\x06\x03\x55\x04\x0A\x13\x0F\x47\x54\x45\x20\x43\x6F\x72\x70\x6F\x72\x61\x74\x69\x6F\x6E\x31\x27\x30\x25\x06\x03\x55\x04\x0B\x13\x1E\x47\x54\x45\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x53\x6F\x6C\x75\x74\x69\x6F\x6E\x73\x2C\x20\x49\x6E\x63\x2E\x31\x23\x30\x21\x06\x03\x55\x04\x03\x13\x1A\x47\x54\x45\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\x95\x0F\xA0\xB6\xF0\x50\x9C\xE8\x7A\xC7\x88\xCD\xDD\x17\x0E\x2E\xB0\x94\xD0\x1B\x3D\x0E\xF6\x94\xC0\x8A\x94\xC7\x06\xC8\x90\x97\xC8\xB8\x64\x1A\x7A\x7E\x6C\x3C\x53\xE1\x37\x28\x73\x60\x7F\xB2\x97\x53\x07\x9F\x53\xF9\x6D\x58\x94\xD2\xAF\x8D\x6D\x88\x67\x80\xE6\xED\xB2\x95\xCF\x72\x31\xCA\xA5\x1C\x72\xBA\x5C\x02\xE7\x64\x42\xE7\xF9\xA9\x2C\xD6\x3A\x0D\xAC\x8D\x42\xAA\x24\x01\x39\xE6\x9C\x3F\x01\x85\x57\x0D\x58\x87\x45\xF8\xD3\x85\xAA\x93\x69\x26\x85\x70\x48\x80\x3F\x12\x15\xC7\x79\xB4\x1F\x05\x2F\x3B\x62\x99\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x6D\xEB\x1B\x09\xE9\x5E\xD9\x51\xDB\x67\x22\x61\xA4\x2A\x3C\x48\x77\xE3\xA0\x7C\xA6\xDE\x73\xA2\x14\x03\x85\x3D\xFB\xAB\x0E\x30\xC5\x83\x16\x33\x81\x13\x08\x9E\x7B\x34\x4E\xDF\x40\xC8\x74\xD7\xB9\x7D\xDC\xF4\x76\x55\x7D\x9B\x63\x54\x18\xE9\xF0\xEA\xF3\x5C\xB1\xD9\x8B\x42\x1E\xB9\xC0\x95\x4E\xBA\xFA\xD5\xE2\x7C\xF5\x68\x61\xBF\x8E\xEC\x05\x97\x5F\x5B\xB0\xD7\xA3\x85\x34\xC4\x24\xA7\x0D\x0F\x95\x93\xEF\xCB\x94\xD8\x9E\x1F\x9D\x5C\x85\x6D\xC7\xAA\xAE\x4F\x1F\x22\xB5\xCD\x95\xAD\xBA\xA7\xCC\xF9\xAB\x0B\x7A\x7F", ["emailAddress=server-certs@thawte.com,CN=Thawte Server CA,OU=Certification Services Division,O=Thawte Consulting cc,L=Cape Town,ST=Western Cape,C=ZA"] = "\x30\x82\x03\x13\x30\x82\x02\x7C\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x81\xC4\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x5A\x41\x31\x15\x30\x13\x06\x03\x55\x04\x08\x13\x0C\x57\x65\x73\x74\x65\x72\x6E\x20\x43\x61\x70\x65\x31\x12\x30\x10\x06\x03\x55\x04\x07\x13\x09\x43\x61\x70\x65\x20\x54\x6F\x77\x6E\x31\x1D\x30\x1B\x06\x03\x55\x04\x0A\x13\x14\x54\x68\x61\x77\x74\x65\x20\x43\x6F\x6E\x73\x75\x6C\x74\x69\x6E\x67\x20\x63\x63\x31\x28\x30\x26\x06\x03\x55\x04\x0B\x13\x1F\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x44\x69\x76\x69\x73\x69\x6F\x6E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x54\x68\x61\x77\x74\x65\x20\x53\x65\x72\x76\x65\x72\x20\x43\x41\x31\x26\x30\x24\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x17\x73\x65\x72\x76\x65\x72\x2D\x63\x65\x72\x74\x73\x40\x74\x68\x61\x77\x74\x65\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x39\x36\x30\x38\x30\x31\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x32\x30\x31\x32\x33\x31\x32\x33\x35\x39\x35\x39\x5A\x30\x81\xC4\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x5A\x41\x31\x15\x30\x13\x06\x03\x55\x04\x08\x13\x0C\x57\x65\x73\x74\x65\x72\x6E\x20\x43\x61\x70\x65\x31\x12\x30\x10\x06\x03\x55\x04\x07\x13\x09\x43\x61\x70\x65\x20\x54\x6F\x77\x6E\x31\x1D\x30\x1B\x06\x03\x55\x04\x0A\x13\x14\x54\x68\x61\x77\x74\x65\x20\x43\x6F\x6E\x73\x75\x6C\x74\x69\x6E\x67\x20\x63\x63\x31\x28\x30\x26\x06\x03\x55\x04\x0B\x13\x1F\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x44\x69\x76\x69\x73\x69\x6F\x6E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x54\x68\x61\x77\x74\x65\x20\x53\x65\x72\x76\x65\x72\x20\x43\x41\x31\x26\x30\x24\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x17\x73\x65\x72\x76\x65\x72\x2D\x63\x65\x72\x74\x73\x40\x74\x68\x61\x77\x74\x65\x2E\x63\x6F\x6D\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xD3\xA4\x50\x6E\xC8\xFF\x56\x6B\xE6\xCF\x5D\xB6\xEA\x0C\x68\x75\x47\xA2\xAA\xC2\xDA\x84\x25\xFC\xA8\xF4\x47\x51\xDA\x85\xB5\x20\x74\x94\x86\x1E\x0F\x75\xC9\xE9\x08\x61\xF5\x06\x6D\x30\x6E\x15\x19\x02\xE9\x52\xC0\x62\xDB\x4D\x99\x9E\xE2\x6A\x0C\x44\x38\xCD\xFE\xBE\xE3\x64\x09\x70\xC5\xFE\xB1\x6B\x29\xB6\x2F\x49\xC8\x3B\xD4\x27\x04\x25\x10\x97\x2F\xE7\x90\x6D\xC0\x28\x42\x99\xD7\x4C\x43\xDE\xC3\xF5\x21\x6D\x54\x9F\x5D\xC3\x58\xE1\xC0\xE4\xD9\x5B\xB0\xB8\xDC\xB4\x7B\xDF\x36\x3A\xC2\xB5\x66\x22\x12\xD6\x87\x0D\x02\x03\x01\x00\x01\xA3\x13\x30\x11\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x07\xFA\x4C\x69\x5C\xFB\x95\xCC\x46\xEE\x85\x83\x4D\x21\x30\x8E\xCA\xD9\xA8\x6F\x49\x1A\xE6\xDA\x51\xE3\x60\x70\x6C\x84\x61\x11\xA1\x1A\xC8\x48\x3E\x59\x43\x7D\x4F\x95\x3D\xA1\x8B\xB7\x0B\x62\x98\x7A\x75\x8A\xDD\x88\x4E\x4E\x9E\x40\xDB\xA8\xCC\x32\x74\xB9\x6F\x0D\xC6\xE3\xB3\x44\x0B\xD9\x8A\x6F\x9A\x29\x9B\x99\x18\x28\x3B\xD1\xE3\x40\x28\x9A\x5A\x3C\xD5\xB5\xE7\x20\x1B\x8B\xCA\xA4\xAB\x8D\xE9\x51\xD9\xE2\x4C\x2C\x59\xA9\xDA\xB9\xB2\x75\x1B\xF6\x42\xF2\xEF\xC7\xF2\x18\xF9\x89\xBC\xA3\xFF\x8A\x23\x2E\x70\x47", ["emailAddress=premium-server@thawte.com,CN=Thawte Premium Server CA,OU=Certification Services Division,O=Thawte Consulting cc,L=Cape Town,ST=Western Cape,C=ZA"] = "\x30\x82\x03\x27\x30\x82\x02\x90\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x81\xCE\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x5A\x41\x31\x15\x30\x13\x06\x03\x55\x04\x08\x13\x0C\x57\x65\x73\x74\x65\x72\x6E\x20\x43\x61\x70\x65\x31\x12\x30\x10\x06\x03\x55\x04\x07\x13\x09\x43\x61\x70\x65\x20\x54\x6F\x77\x6E\x31\x1D\x30\x1B\x06\x03\x55\x04\x0A\x13\x14\x54\x68\x61\x77\x74\x65\x20\x43\x6F\x6E\x73\x75\x6C\x74\x69\x6E\x67\x20\x63\x63\x31\x28\x30\x26\x06\x03\x55\x04\x0B\x13\x1F\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x44\x69\x76\x69\x73\x69\x6F\x6E\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x54\x68\x61\x77\x74\x65\x20\x50\x72\x65\x6D\x69\x75\x6D\x20\x53\x65\x72\x76\x65\x72\x20\x43\x41\x31\x28\x30\x26\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x19\x70\x72\x65\x6D\x69\x75\x6D\x2D\x73\x65\x72\x76\x65\x72\x40\x74\x68\x61\x77\x74\x65\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x39\x36\x30\x38\x30\x31\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x32\x30\x31\x32\x33\x31\x32\x33\x35\x39\x35\x39\x5A\x30\x81\xCE\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x5A\x41\x31\x15\x30\x13\x06\x03\x55\x04\x08\x13\x0C\x57\x65\x73\x74\x65\x72\x6E\x20\x43\x61\x70\x65\x31\x12\x30\x10\x06\x03\x55\x04\x07\x13\x09\x43\x61\x70\x65\x20\x54\x6F\x77\x6E\x31\x1D\x30\x1B\x06\x03\x55\x04\x0A\x13\x14\x54\x68\x61\x77\x74\x65\x20\x43\x6F\x6E\x73\x75\x6C\x74\x69\x6E\x67\x20\x63\x63\x31\x28\x30\x26\x06\x03\x55\x04\x0B\x13\x1F\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x44\x69\x76\x69\x73\x69\x6F\x6E\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x54\x68\x61\x77\x74\x65\x20\x50\x72\x65\x6D\x69\x75\x6D\x20\x53\x65\x72\x76\x65\x72\x20\x43\x41\x31\x28\x30\x26\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x19\x70\x72\x65\x6D\x69\x75\x6D\x2D\x73\x65\x72\x76\x65\x72\x40\x74\x68\x61\x77\x74\x65\x2E\x63\x6F\x6D\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xD2\x36\x36\x6A\x8B\xD7\xC2\x5B\x9E\xDA\x81\x41\x62\x8F\x38\xEE\x49\x04\x55\xD6\xD0\xEF\x1C\x1B\x95\x16\x47\xEF\x18\x48\x35\x3A\x52\xF4\x2B\x6A\x06\x8F\x3B\x2F\xEA\x56\xE3\xAF\x86\x8D\x9E\x17\xF7\x9E\xB4\x65\x75\x02\x4D\xEF\xCB\x09\xA2\x21\x51\xD8\x9B\xD0\x67\xD0\xBA\x0D\x92\x06\x14\x73\xD4\x93\xCB\x97\x2A\x00\x9C\x5C\x4E\x0C\xBC\xFA\x15\x52\xFC\xF2\x44\x6E\xDA\x11\x4A\x6E\x08\x9F\x2F\x2D\xE3\xF9\xAA\x3A\x86\x73\xB6\x46\x53\x58\xC8\x89\x05\xBD\x83\x11\xB8\x73\x3F\xAA\x07\x8D\xF4\x42\x4D\xE7\x40\x9D\x1C\x37\x02\x03\x01\x00\x01\xA3\x13\x30\x11\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x26\x48\x2C\x16\xC2\x58\xFA\xE8\x16\x74\x0C\xAA\xAA\x5F\x54\x3F\xF2\xD7\xC9\x78\x60\x5E\x5E\x6E\x37\x63\x22\x77\x36\x7E\xB2\x17\xC4\x34\xB9\xF5\x08\x85\xFC\xC9\x01\x38\xFF\x4D\xBE\xF2\x16\x42\x43\xE7\xBB\x5A\x46\xFB\xC1\xC6\x11\x1F\xF1\x4A\xB0\x28\x46\xC9\xC3\xC4\x42\x7D\xBC\xFA\xAB\x59\x6E\xD5\xB7\x51\x88\x11\xE3\xA4\x85\x19\x6B\x82\x4C\xA4\x0C\x12\xAD\xE9\xA4\xAE\x3F\xF1\xC3\x49\x65\x9A\x8C\xC5\xC8\x3E\x25\xB7\x94\x99\xBB\x92\x32\x71\x07\xF0\x86\x5E\xED\x50\x27\xA6\x0D\xA6\x23\xF9\xBB\xCB\xA6\x07\x14\x42", ["OU=Equifax Secure Certificate Authority,O=Equifax,C=US"] = "\x30\x82\x03\x20\x30\x82\x02\x89\xA0\x03\x02\x01\x02\x02\x04\x35\xDE\xF4\xCF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x4E\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x10\x30\x0E\x06\x03\x55\x04\x0A\x13\x07\x45\x71\x75\x69\x66\x61\x78\x31\x2D\x30\x2B\x06\x03\x55\x04\x0B\x13\x24\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x39\x38\x30\x38\x32\x32\x31\x36\x34\x31\x35\x31\x5A\x17\x0D\x31\x38\x30\x38\x32\x32\x31\x36\x34\x31\x35\x31\x5A\x30\x4E\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x10\x30\x0E\x06\x03\x55\x04\x0A\x13\x07\x45\x71\x75\x69\x66\x61\x78\x31\x2D\x30\x2B\x06\x03\x55\x04\x0B\x13\x24\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xC1\x5D\xB1\x58\x67\x08\x62\xEE\xA0\x9A\x2D\x1F\x08\x6D\x91\x14\x68\x98\x0A\x1E\xFE\xDA\x04\x6F\x13\x84\x62\x21\xC3\xD1\x7C\xCE\x9F\x05\xE0\xB8\x01\xF0\x4E\x34\xEC\xE2\x8A\x95\x04\x64\xAC\xF1\x6B\x53\x5F\x05\xB3\xCB\x67\x80\xBF\x42\x02\x8E\xFE\xDD\x01\x09\xEC\xE1\x00\x14\x4F\xFC\xFB\xF0\x0C\xDD\x43\xBA\x5B\x2B\xE1\x1F\x80\x70\x99\x15\x57\x93\x16\xF1\x0F\x97\x6A\xB7\xC2\x68\x23\x1C\xCC\x4D\x59\x30\xAC\x51\x1E\x3B\xAF\x2B\xD6\xEE\x63\x45\x7B\xC5\xD9\x5F\x50\xD2\xE3\x50\x0F\x3A\x88\xE7\xBF\x14\xFD\xE0\xC7\xB9\x02\x03\x01\x00\x01\xA3\x82\x01\x09\x30\x82\x01\x05\x30\x70\x06\x03\x55\x1D\x1F\x04\x69\x30\x67\x30\x65\xA0\x63\xA0\x61\xA4\x5F\x30\x5D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x10\x30\x0E\x06\x03\x55\x04\x0A\x13\x07\x45\x71\x75\x69\x66\x61\x78\x31\x2D\x30\x2B\x06\x03\x55\x04\x0B\x13\x24\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x0D\x30\x0B\x06\x03\x55\x04\x03\x13\x04\x43\x52\x4C\x31\x30\x1A\x06\x03\x55\x1D\x10\x04\x13\x30\x11\x81\x0F\x32\x30\x31\x38\x30\x38\x32\x32\x31\x36\x34\x31\x35\x31\x5A\x30\x0B\x06\x03\x55\x1D\x0F\x04\x04\x03\x02\x01\x06\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x48\xE6\x68\xF9\x2B\xD2\xB2\x95\xD7\x47\xD8\x23\x20\x10\x4F\x33\x98\x90\x9F\xD4\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x48\xE6\x68\xF9\x2B\xD2\xB2\x95\xD7\x47\xD8\x23\x20\x10\x4F\x33\x98\x90\x9F\xD4\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x1A\x06\x09\x2A\x86\x48\x86\xF6\x7D\x07\x41\x00\x04\x0D\x30\x0B\x1B\x05\x56\x33\x2E\x30\x63\x03\x02\x06\xC0\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x58\xCE\x29\xEA\xFC\xF7\xDE\xB5\xCE\x02\xB9\x17\xB5\x85\xD1\xB9\xE3\xE0\x95\xCC\x25\x31\x0D\x00\xA6\x92\x6E\x7F\xB6\x92\x63\x9E\x50\x95\xD1\x9A\x6F\xE4\x11\xDE\x63\x85\x6E\x98\xEE\xA8\xFF\x5A\xC8\xD3\x55\xB2\x66\x71\x57\xDE\xC0\x21\xEB\x3D\x2A\xA7\x23\x49\x01\x04\x86\x42\x7B\xFC\xEE\x7F\xA2\x16\x52\xB5\x67\x67\xD3\x40\xDB\x3B\x26\x58\xB2\x28\x77\x3D\xAE\x14\x77\x61\xD6\xFA\x2A\x66\x27\xA0\x0D\xFA\xA7\x73\x5C\xEA\x70\xF1\x94\x21\x65\x44\x5F\xFA\xFC\xEF\x29\x68\xA9\xA2\x87\x79\xEF\x79\xEF\x4F\xAC\x07\x77\x38", @@ -19,12 +18,8 @@ redef root_certs += { ["OU=VeriSign Trust Network,OU=(c) 1998 VeriSign\, Inc. - For authorized use only,OU=Class 3 Public Primary Certification Authority - G2,O=VeriSign\, Inc.,C=US"] = "\x30\x82\x03\x02\x30\x82\x02\x6B\x02\x10\x7D\xD9\xFE\x07\xCF\xA8\x1E\xB7\x10\x79\x67\xFB\xA7\x89\x34\xC6\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xC1\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x3C\x30\x3A\x06\x03\x55\x04\x0B\x13\x33\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x32\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x38\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x30\x1E\x17\x0D\x39\x38\x30\x35\x31\x38\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x32\x38\x30\x38\x30\x31\x32\x33\x35\x39\x35\x39\x5A\x30\x81\xC1\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x3C\x30\x3A\x06\x03\x55\x04\x0B\x13\x33\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x32\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x38\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xCC\x5E\xD1\x11\x5D\x5C\x69\xD0\xAB\xD3\xB9\x6A\x4C\x99\x1F\x59\x98\x30\x8E\x16\x85\x20\x46\x6D\x47\x3F\xD4\x85\x20\x84\xE1\x6D\xB3\xF8\xA4\xED\x0C\xF1\x17\x0F\x3B\xF9\xA7\xF9\x25\xD7\xC1\xCF\x84\x63\xF2\x7C\x63\xCF\xA2\x47\xF2\xC6\x5B\x33\x8E\x64\x40\x04\x68\xC1\x80\xB9\x64\x1C\x45\x77\xC7\xD8\x6E\xF5\x95\x29\x3C\x50\xE8\x34\xD7\x78\x1F\xA8\xBA\x6D\x43\x91\x95\x8F\x45\x57\x5E\x7E\xC5\xFB\xCA\xA4\x04\xEB\xEA\x97\x37\x54\x30\x6F\xBB\x01\x47\x32\x33\xCD\xDC\x57\x9B\x64\x69\x61\xF8\x9B\x1D\x1C\x89\x4F\x5C\x67\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x51\x4D\xCD\xBE\x5C\xCB\x98\x19\x9C\x15\xB2\x01\x39\x78\x2E\x4D\x0F\x67\x70\x70\x99\xC6\x10\x5A\x94\xA4\x53\x4D\x54\x6D\x2B\xAF\x0D\x5D\x40\x8B\x64\xD3\xD7\xEE\xDE\x56\x61\x92\x5F\xA6\xC4\x1D\x10\x61\x36\xD3\x2C\x27\x3C\xE8\x29\x09\xB9\x11\x64\x74\xCC\xB5\x73\x9F\x1C\x48\xA9\xBC\x61\x01\xEE\xE2\x17\xA6\x0C\xE3\x40\x08\x3B\x0E\xE7\xEB\x44\x73\x2A\x9A\xF1\x69\x92\xEF\x71\x14\xC3\x39\xAC\x71\xA7\x91\x09\x6F\xE4\x71\x06\xB3\xBA\x59\x57\x26\x79\x00\xF6\xF8\x0D\xA2\x33\x30\x28\xD4\xAA\x58\xA0\x9D\x9D\x69\x91\xFD", ["CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE"] = "\x30\x82\x03\x75\x30\x82\x02\x5D\xA0\x03\x02\x01\x02\x02\x0B\x04\x00\x00\x00\x00\x01\x15\x4B\x5A\xC3\x94\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x57\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x42\x45\x31\x19\x30\x17\x06\x03\x55\x04\x0A\x13\x10\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x6E\x76\x2D\x73\x61\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x13\x07\x52\x6F\x6F\x74\x20\x43\x41\x31\x1B\x30\x19\x06\x03\x55\x04\x03\x13\x12\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x1E\x17\x0D\x39\x38\x30\x39\x30\x31\x31\x32\x30\x30\x30\x30\x5A\x17\x0D\x32\x38\x30\x31\x32\x38\x31\x32\x30\x30\x30\x30\x5A\x30\x57\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x42\x45\x31\x19\x30\x17\x06\x03\x55\x04\x0A\x13\x10\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x6E\x76\x2D\x73\x61\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x13\x07\x52\x6F\x6F\x74\x20\x43\x41\x31\x1B\x30\x19\x06\x03\x55\x04\x03\x13\x12\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xDA\x0E\xE6\x99\x8D\xCE\xA3\xE3\x4F\x8A\x7E\xFB\xF1\x8B\x83\x25\x6B\xEA\x48\x1F\xF1\x2A\xB0\xB9\x95\x11\x04\xBD\xF0\x63\xD1\xE2\x67\x66\xCF\x1C\xDD\xCF\x1B\x48\x2B\xEE\x8D\x89\x8E\x9A\xAF\x29\x80\x65\xAB\xE9\xC7\x2D\x12\xCB\xAB\x1C\x4C\x70\x07\xA1\x3D\x0A\x30\xCD\x15\x8D\x4F\xF8\xDD\xD4\x8C\x50\x15\x1C\xEF\x50\xEE\xC4\x2E\xF7\xFC\xE9\x52\xF2\x91\x7D\xE0\x6D\xD5\x35\x30\x8E\x5E\x43\x73\xF2\x41\xE9\xD5\x6A\xE3\xB2\x89\x3A\x56\x39\x38\x6F\x06\x3C\x88\x69\x5B\x2A\x4D\xC5\xA7\x54\xB8\x6C\x89\xCC\x9B\xF9\x3C\xCA\xE5\xFD\x89\xF5\x12\x3C\x92\x78\x96\xD6\xDC\x74\x6E\x93\x44\x61\xD1\x8D\xC7\x46\xB2\x75\x0E\x86\xE8\x19\x8A\xD5\x6D\x6C\xD5\x78\x16\x95\xA2\xE9\xC8\x0A\x38\xEB\xF2\x24\x13\x4F\x73\x54\x93\x13\x85\x3A\x1B\xBC\x1E\x34\xB5\x8B\x05\x8C\xB9\x77\x8B\xB1\xDB\x1F\x20\x91\xAB\x09\x53\x6E\x90\xCE\x7B\x37\x74\xB9\x70\x47\x91\x22\x51\x63\x16\x79\xAE\xB1\xAE\x41\x26\x08\xC8\x19\x2B\xD1\x46\xAA\x48\xD6\x64\x2A\xD7\x83\x34\xFF\x2C\x2A\xC1\x6C\x19\x43\x4A\x07\x85\xE7\xD3\x7C\xF6\x21\x68\xEF\xEA\xF2\x52\x9F\x7F\x93\x90\xCF\x02\x03\x01\x00\x01\xA3\x42\x30\x40\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x60\x7B\x66\x1A\x45\x0D\x97\xCA\x89\x50\x2F\x7D\x04\xCD\x34\xA8\xFF\xFC\xFD\x4B\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\xD6\x73\xE7\x7C\x4F\x76\xD0\x8D\xBF\xEC\xBA\xA2\xBE\x34\xC5\x28\x32\xB5\x7C\xFC\x6C\x9C\x2C\x2B\xBD\x09\x9E\x53\xBF\x6B\x5E\xAA\x11\x48\xB6\xE5\x08\xA3\xB3\xCA\x3D\x61\x4D\xD3\x46\x09\xB3\x3E\xC3\xA0\xE3\x63\x55\x1B\xF2\xBA\xEF\xAD\x39\xE1\x43\xB9\x38\xA3\xE6\x2F\x8A\x26\x3B\xEF\xA0\x50\x56\xF9\xC6\x0A\xFD\x38\xCD\xC4\x0B\x70\x51\x94\x97\x98\x04\xDF\xC3\x5F\x94\xD5\x15\xC9\x14\x41\x9C\xC4\x5D\x75\x64\x15\x0D\xFF\x55\x30\xEC\x86\x8F\xFF\x0D\xEF\x2C\xB9\x63\x46\xF6\xAA\xFC\xDF\xBC\x69\xFD\x2E\x12\x48\x64\x9A\xE0\x95\xF0\xA6\xEF\x29\x8F\x01\xB1\x15\xB5\x0C\x1D\xA5\xFE\x69\x2C\x69\x24\x78\x1E\xB3\xA7\x1C\x71\x62\xEE\xCA\xC8\x97\xAC\x17\x5D\x8A\xC2\xF8\x47\x86\x6E\x2A\xC4\x56\x31\x95\xD0\x67\x89\x85\x2B\xF9\x6C\xA6\x5D\x46\x9D\x0C\xAA\x82\xE4\x99\x51\xDD\x70\xB7\xDB\x56\x3D\x61\xE4\x6A\xE1\x5C\xD6\xF6\xFE\x3D\xDE\x41\xCC\x07\xAE\x63\x52\xBF\x53\x53\xF4\x2B\xE9\xC7\xFD\xB6\xF7\x82\x5F\x85\xD2\x41\x18\xDB\x81\xB3\x04\x1C\xC5\x1F\xA4\x80\x6F\x15\x20\xC9\xDE\x0C\x88\x0A\x1D\xD6\x66\x55\xE2\xFC\x48\xC9\x29\x26\x69\xE0", ["CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2"] = "\x30\x82\x03\xBA\x30\x82\x02\xA2\xA0\x03\x02\x01\x02\x02\x0B\x04\x00\x00\x00\x00\x01\x0F\x86\x26\xE6\x0D\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x4C\x31\x20\x30\x1E\x06\x03\x55\x04\x0B\x13\x17\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x2D\x20\x52\x32\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x31\x13\x30\x11\x06\x03\x55\x04\x03\x13\x0A\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x30\x1E\x17\x0D\x30\x36\x31\x32\x31\x35\x30\x38\x30\x30\x30\x30\x5A\x17\x0D\x32\x31\x31\x32\x31\x35\x30\x38\x30\x30\x30\x30\x5A\x30\x4C\x31\x20\x30\x1E\x06\x03\x55\x04\x0B\x13\x17\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x2D\x20\x52\x32\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x31\x13\x30\x11\x06\x03\x55\x04\x03\x13\x0A\x47\x6C\x6F\x62\x61\x6C\x53\x69\x67\x6E\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xA6\xCF\x24\x0E\xBE\x2E\x6F\x28\x99\x45\x42\xC4\xAB\x3E\x21\x54\x9B\x0B\xD3\x7F\x84\x70\xFA\x12\xB3\xCB\xBF\x87\x5F\xC6\x7F\x86\xD3\xB2\x30\x5C\xD6\xFD\xAD\xF1\x7B\xDC\xE5\xF8\x60\x96\x09\x92\x10\xF5\xD0\x53\xDE\xFB\x7B\x7E\x73\x88\xAC\x52\x88\x7B\x4A\xA6\xCA\x49\xA6\x5E\xA8\xA7\x8C\x5A\x11\xBC\x7A\x82\xEB\xBE\x8C\xE9\xB3\xAC\x96\x25\x07\x97\x4A\x99\x2A\x07\x2F\xB4\x1E\x77\xBF\x8A\x0F\xB5\x02\x7C\x1B\x96\xB8\xC5\xB9\x3A\x2C\xBC\xD6\x12\xB9\xEB\x59\x7D\xE2\xD0\x06\x86\x5F\x5E\x49\x6A\xB5\x39\x5E\x88\x34\xEC\xBC\x78\x0C\x08\x98\x84\x6C\xA8\xCD\x4B\xB4\xA0\x7D\x0C\x79\x4D\xF0\xB8\x2D\xCB\x21\xCA\xD5\x6C\x5B\x7D\xE1\xA0\x29\x84\xA1\xF9\xD3\x94\x49\xCB\x24\x62\x91\x20\xBC\xDD\x0B\xD5\xD9\xCC\xF9\xEA\x27\x0A\x2B\x73\x91\xC6\x9D\x1B\xAC\xC8\xCB\xE8\xE0\xA0\xF4\x2F\x90\x8B\x4D\xFB\xB0\x36\x1B\xF6\x19\x7A\x85\xE0\x6D\xF2\x61\x13\x88\x5C\x9F\xE0\x93\x0A\x51\x97\x8A\x5A\xCE\xAF\xAB\xD5\xF7\xAA\x09\xAA\x60\xBD\xDC\xD9\x5F\xDF\x72\xA9\x60\x13\x5E\x00\x01\xC9\x4A\xFA\x3F\xA4\xEA\x07\x03\x21\x02\x8E\x82\xCA\x03\xC2\x9B\x8F\x02\x03\x01\x00\x01\xA3\x81\x9C\x30\x81\x99\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x9B\xE2\x07\x57\x67\x1C\x1E\xC0\x6A\x06\xDE\x59\xB4\x9A\x2D\xDF\xDC\x19\x86\x2E\x30\x36\x06\x03\x55\x1D\x1F\x04\x2F\x30\x2D\x30\x2B\xA0\x29\xA0\x27\x86\x25\x68\x74\x74\x70\x3A\x2F\x2F\x63\x72\x6C\x2E\x67\x6C\x6F\x62\x61\x6C\x73\x69\x67\x6E\x2E\x6E\x65\x74\x2F\x72\x6F\x6F\x74\x2D\x72\x32\x2E\x63\x72\x6C\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x9B\xE2\x07\x57\x67\x1C\x1E\xC0\x6A\x06\xDE\x59\xB4\x9A\x2D\xDF\xDC\x19\x86\x2E\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x99\x81\x53\x87\x1C\x68\x97\x86\x91\xEC\xE0\x4A\xB8\x44\x0B\xAB\x81\xAC\x27\x4F\xD6\xC1\xB8\x1C\x43\x78\xB3\x0C\x9A\xFC\xEA\x2C\x3C\x6E\x61\x1B\x4D\x4B\x29\xF5\x9F\x05\x1D\x26\xC1\xB8\xE9\x83\x00\x62\x45\xB6\xA9\x08\x93\xB9\xA9\x33\x4B\x18\x9A\xC2\xF8\x87\x88\x4E\xDB\xDD\x71\x34\x1A\xC1\x54\xDA\x46\x3F\xE0\xD3\x2A\xAB\x6D\x54\x22\xF5\x3A\x62\xCD\x20\x6F\xBA\x29\x89\xD7\xDD\x91\xEE\xD3\x5C\xA2\x3E\xA1\x5B\x41\xF5\xDF\xE5\x64\x43\x2D\xE9\xD5\x39\xAB\xD2\xA2\xDF\xB7\x8B\xD0\xC0\x80\x19\x1C\x45\xC0\x2D\x8C\xE8\xF8\x2D\xA4\x74\x56\x49\xC5\x05\xB5\x4F\x15\xDE\x6E\x44\x78\x39\x87\xA8\x7E\xBB\xF3\x79\x18\x91\xBB\xF4\x6F\x9D\xC1\xF0\x8C\x35\x8C\x5D\x01\xFB\xC3\x6D\xB9\xEF\x44\x6D\x79\x46\x31\x7E\x0A\xFE\xA9\x82\xC1\xFF\xEF\xAB\x6E\x20\xC4\x50\xC9\x5F\x9D\x4D\x9B\x17\x8C\x0C\xE5\x01\xC9\xA0\x41\x6A\x73\x53\xFA\xA5\x50\xB4\x6E\x25\x0F\xFB\x4C\x18\xF4\xFD\x52\xD9\x8E\x69\xB1\xE8\x11\x0F\xDE\x88\xD8\xFB\x1D\x49\xF7\xAA\xDE\x95\xCF\x20\x78\xC2\x60\x12\xDB\x25\x40\x8C\x6A\xFC\x7E\x42\x38\x40\x64\x12\xF7\x9E\x81\xE1\x93\x2E", - ["emailAddress=info@valicert.com,CN=http://www.valicert.com/,OU=ValiCert Class 1 Policy Validation Authority,O=ValiCert\, Inc.,L=ValiCert Validation Network"] = "\x30\x82\x02\xE7\x30\x82\x02\x50\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x31\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x39\x39\x30\x36\x32\x35\x32\x32\x32\x33\x34\x38\x5A\x17\x0D\x31\x39\x30\x36\x32\x35\x32\x32\x32\x33\x34\x38\x5A\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x31\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xD8\x59\x82\x7A\x89\xB8\x96\xBA\xA6\x2F\x68\x6F\x58\x2E\xA7\x54\x1C\x06\x6E\xF4\xEA\x8D\x48\xBC\x31\x94\x17\xF0\xF3\x4E\xBC\xB2\xB8\x35\x92\x76\xB0\xD0\xA5\xA5\x01\xD7\x00\x03\x12\x22\x19\x08\xF8\xFF\x11\x23\x9B\xCE\x07\xF5\xBF\x69\x1A\x26\xFE\x4E\xE9\xD1\x7F\x9D\x2C\x40\x1D\x59\x68\x6E\xA6\xF8\x58\xB0\x9D\x1A\x8F\xD3\x3F\xF1\xDC\x19\x06\x81\xA8\x0E\xE0\x3A\xDD\xC8\x53\x45\x09\x06\xE6\x0F\x70\xC3\xFA\x40\xA6\x0E\xE2\x56\x05\x0F\x18\x4D\xFC\x20\x82\xD1\x73\x55\x74\x8D\x76\x72\xA0\x1D\x9D\x1D\xC0\xDD\x3F\x71\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x50\x68\x3D\x49\xF4\x2C\x1C\x06\x94\xDF\x95\x60\x7F\x96\x7B\x17\xFE\x4F\x71\xAD\x64\xC8\xDD\x77\xD2\xEF\x59\x55\xE8\x3F\xE8\x8E\x05\x2A\x21\xF2\x07\xD2\xB5\xA7\x52\xFE\x9C\xB1\xB6\xE2\x5B\x77\x17\x40\xEA\x72\xD6\x23\xCB\x28\x81\x32\xC3\x00\x79\x18\xEC\x59\x17\x89\xC9\xC6\x6A\x1E\x71\xC9\xFD\xB7\x74\xA5\x25\x45\x69\xC5\x48\xAB\x19\xE1\x45\x8A\x25\x6B\x19\xEE\xE5\xBB\x12\xF5\x7F\xF7\xA6\x8D\x51\xC3\xF0\x9D\x74\xB7\xA9\x3E\xA0\xA5\xFF\xB6\x49\x03\x13\xDA\x22\xCC\xED\x71\x82\x2B\x99\xCF\x3A\xB7\xF5\x2D\x72\xC8", - ["emailAddress=info@valicert.com,CN=http://www.valicert.com/,OU=ValiCert Class 2 Policy Validation Authority,O=ValiCert\, Inc.,L=ValiCert Validation Network"] = "\x30\x82\x02\xE7\x30\x82\x02\x50\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x39\x39\x30\x36\x32\x36\x30\x30\x31\x39\x35\x34\x5A\x17\x0D\x31\x39\x30\x36\x32\x36\x30\x30\x31\x39\x35\x34\x5A\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xCE\x3A\x71\xCA\xE5\xAB\xC8\x59\x92\x55\xD7\xAB\xD8\x74\x0E\xF9\xEE\xD9\xF6\x55\x47\x59\x65\x47\x0E\x05\x55\xDC\xEB\x98\x36\x3C\x5C\x53\x5D\xD3\x30\xCF\x38\xEC\xBD\x41\x89\xED\x25\x42\x09\x24\x6B\x0A\x5E\xB3\x7C\xDD\x52\x2D\x4C\xE6\xD4\xD6\x7D\x5A\x59\xA9\x65\xD4\x49\x13\x2D\x24\x4D\x1C\x50\x6F\xB5\xC1\x85\x54\x3B\xFE\x71\xE4\xD3\x5C\x42\xF9\x80\xE0\x91\x1A\x0A\x5B\x39\x36\x67\xF3\x3F\x55\x7C\x1B\x3F\xB4\x5F\x64\x73\x34\xE3\xB4\x12\xBF\x87\x64\xF8\xDA\x12\xFF\x37\x27\xC1\xB3\x43\xBB\xEF\x7B\x6E\x2E\x69\xF7\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x3B\x7F\x50\x6F\x6F\x50\x94\x99\x49\x62\x38\x38\x1F\x4B\xF8\xA5\xC8\x3E\xA7\x82\x81\xF6\x2B\xC7\xE8\xC5\xCE\xE8\x3A\x10\x82\xCB\x18\x00\x8E\x4D\xBD\xA8\x58\x7F\xA1\x79\x00\xB5\xBB\xE9\x8D\xAF\x41\xD9\x0F\x34\xEE\x21\x81\x19\xA0\x32\x49\x28\xF4\xC4\x8E\x56\xD5\x52\x33\xFD\x50\xD5\x7E\x99\x6C\x03\xE4\xC9\x4C\xFC\xCB\x6C\xAB\x66\xB3\x4A\x21\x8C\xE5\xB5\x0C\x32\x3E\x10\xB2\xCC\x6C\xA1\xDC\x9A\x98\x4C\x02\x5B\xF3\xCE\xB9\x9E\xA5\x72\x0E\x4A\xB7\x3F\x3C\xE6\x16\x68\xF8\xBE\xED\x74\x4C\xBC\x5B\xD5\x62\x1F\x43\xDD", - ["emailAddress=info@valicert.com,CN=http://www.valicert.com/,OU=ValiCert Class 3 Policy Validation Authority,O=ValiCert\, Inc.,L=ValiCert Validation Network"] = "\x30\x82\x02\xE7\x30\x82\x02\x50\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x39\x39\x30\x36\x32\x36\x30\x30\x32\x32\x33\x33\x5A\x17\x0D\x31\x39\x30\x36\x32\x36\x30\x30\x32\x32\x33\x33\x5A\x30\x81\xBB\x31\x24\x30\x22\x06\x03\x55\x04\x07\x13\x1B\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x61\x6C\x69\x43\x65\x72\x74\x2C\x20\x49\x6E\x63\x2E\x31\x35\x30\x33\x06\x03\x55\x04\x0B\x13\x2C\x56\x61\x6C\x69\x43\x65\x72\x74\x20\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x6F\x6C\x69\x63\x79\x20\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x21\x30\x1F\x06\x03\x55\x04\x03\x13\x18\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x2F\x31\x20\x30\x1E\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x11\x69\x6E\x66\x6F\x40\x76\x61\x6C\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xE3\x98\x51\x96\x1C\xE8\xD5\xB1\x06\x81\x6A\x57\xC3\x72\x75\x93\xAB\xCF\x9E\xA6\xFC\xF3\x16\x52\xD6\x2D\x4D\x9F\x35\x44\xA8\x2E\x04\x4D\x07\x49\x8A\x38\x29\xF5\x77\x37\xE7\xB7\xAB\x5D\xDF\x36\x71\x14\x99\x8F\xDC\xC2\x92\xF1\xE7\x60\x92\x97\xEC\xD8\x48\xDC\xBF\xC1\x02\x20\xC6\x24\xA4\x28\x4C\x30\x5A\x76\x6D\xB1\x5C\xF3\xDD\xDE\x9E\x10\x71\xA1\x88\xC7\x5B\x9B\x41\x6D\xCA\xB0\xB8\x8E\x15\xEE\xAD\x33\x2B\xCF\x47\x04\x5C\x75\x71\x0A\x98\x24\x98\x29\xA7\x49\x59\xA5\xDD\xF8\xB7\x43\x62\x61\xF3\xD3\xE2\xD0\x55\x3F\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x56\xBB\x02\x58\x84\x67\x08\x2C\xDF\x1F\xDB\x7B\x49\x33\xF5\xD3\x67\x9D\xF4\xB4\x0A\x10\xB3\xC9\xC5\x2C\xE2\x92\x6A\x71\x78\x27\xF2\x70\x83\x42\xD3\x3E\xCF\xA9\x54\xF4\xF1\xD8\x92\x16\x8C\xD1\x04\xCB\x4B\xAB\xC9\x9F\x45\xAE\x3C\x8A\xA9\xB0\x71\x33\x5D\xC8\xC5\x57\xDF\xAF\xA8\x35\xB3\x7F\x89\x87\xE9\xE8\x25\x92\xB8\x7F\x85\x7A\xAE\xD6\xBC\x1E\x37\x58\x2A\x67\xC9\x91\xCF\x2A\x81\x3E\xED\xC6\x39\xDF\xC0\x3E\x19\x9C\x19\xCC\x13\x4D\x82\x41\xB5\x8C\xDE\xE0\x3D\x60\x08\x20\x0F\x45\x7E\x6B\xA2\x7F\xA3\x8C\x15\xEE", ["CN=VeriSign Class 3 Public Primary Certification Authority - G3,OU=(c) 1999 VeriSign\, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US"] = "\x30\x82\x04\x1A\x30\x82\x03\x02\x02\x11\x00\x9B\x7E\x06\x49\xA3\x3E\x62\xB9\xD5\xEE\x90\x48\x71\x29\xEF\x57\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xCA\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x39\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x45\x30\x43\x06\x03\x55\x04\x03\x13\x3C\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x33\x30\x1E\x17\x0D\x39\x39\x31\x30\x30\x31\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x33\x36\x30\x37\x31\x36\x32\x33\x35\x39\x35\x39\x5A\x30\x81\xCA\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x39\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x45\x30\x43\x06\x03\x55\x04\x03\x13\x3C\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x43\x6C\x61\x73\x73\x20\x33\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x33\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xCB\xBA\x9C\x52\xFC\x78\x1F\x1A\x1E\x6F\x1B\x37\x73\xBD\xF8\xC9\x6B\x94\x12\x30\x4F\xF0\x36\x47\xF5\xD0\x91\x0A\xF5\x17\xC8\xA5\x61\xC1\x16\x40\x4D\xFB\x8A\x61\x90\xE5\x76\x20\xC1\x11\x06\x7D\xAB\x2C\x6E\xA6\xF5\x11\x41\x8E\xFA\x2D\xAD\x2A\x61\x59\xA4\x67\x26\x4C\xD0\xE8\xBC\x52\x5B\x70\x20\x04\x58\xD1\x7A\xC9\xA4\x69\xBC\x83\x17\x64\xAD\x05\x8B\xBC\xD0\x58\xCE\x8D\x8C\xF5\xEB\xF0\x42\x49\x0B\x9D\x97\x27\x67\x32\x6E\xE1\xAE\x93\x15\x1C\x70\xBC\x20\x4D\x2F\x18\xDE\x92\x88\xE8\x6C\x85\x57\x11\x1A\xE9\x7E\xE3\x26\x11\x54\xA2\x45\x96\x55\x83\xCA\x30\x89\xE8\xDC\xD8\xA3\xED\x2A\x80\x3F\x7F\x79\x65\x57\x3E\x15\x20\x66\x08\x2F\x95\x93\xBF\xAA\x47\x2F\xA8\x46\x97\xF0\x12\xE2\xFE\xC2\x0A\x2B\x51\xE6\x76\xE6\xB7\x46\xB7\xE2\x0D\xA6\xCC\xA8\xC3\x4C\x59\x55\x89\xE6\xE8\x53\x5C\x1C\xEA\x9D\xF0\x62\x16\x0B\xA7\xC9\x5F\x0C\xF0\xDE\xC2\x76\xCE\xAF\xF7\x6A\xF2\xFA\x41\xA6\xA2\x33\x14\xC9\xE5\x7A\x63\xD3\x9E\x62\x37\xD5\x85\x65\x9E\x0E\xE6\x53\x24\x74\x1B\x5E\x1D\x12\x53\x5B\xC7\x2C\xE7\x83\x49\x3B\x15\xAE\x8A\x68\xB9\x57\x97\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x11\x14\x96\xC1\xAB\x92\x08\xF7\x3F\x2F\xC9\xB2\xFE\xE4\x5A\x9F\x64\xDE\xDB\x21\x4F\x86\x99\x34\x76\x36\x57\xDD\xD0\x15\x2F\xC5\xAD\x7F\x15\x1F\x37\x62\x73\x3E\xD4\xE7\x5F\xCE\x17\x03\xDB\x35\xFA\x2B\xDB\xAE\x60\x09\x5F\x1E\x5F\x8F\x6E\xBB\x0B\x3D\xEA\x5A\x13\x1E\x0C\x60\x6F\xB5\xC0\xB5\x23\x22\x2E\x07\x0B\xCB\xA9\x74\xCB\x47\xBB\x1D\xC1\xD7\xA5\x6B\xCC\x2F\xD2\x42\xFD\x49\xDD\xA7\x89\xCF\x53\xBA\xDA\x00\x5A\x28\xBF\x82\xDF\xF8\xBA\x13\x1D\x50\x86\x82\xFD\x8E\x30\x8F\x29\x46\xB0\x1E\x3D\x35\xDA\x38\x62\x16\x18\x4A\xAD\xE6\xB6\x51\x6C\xDE\xAF\x62\xEB\x01\xD0\x1E\x24\xFE\x7A\x8F\x12\x1A\x12\x68\xB8\xFB\x66\x99\x14\x14\x45\x5C\xAE\xE7\xAE\x69\x17\x81\x2B\x5A\x37\xC9\x5E\x2A\xF4\xC6\xE2\xA1\x5C\x54\x9B\xA6\x54\x00\xCF\xF0\xF1\xC1\xC7\x98\x30\x1A\x3B\x36\x16\xDB\xA3\x6E\xEA\xFD\xAD\xB2\xC2\xDA\xEF\x02\x47\x13\x8A\xC0\xF1\xB3\x31\xAD\x4F\x1C\xE1\x4F\x9C\xAF\x0F\x0C\x9D\xF7\x78\x0D\xD8\xF4\x35\x56\x80\xDA\xB7\x6D\x17\x8F\x9D\x1E\x81\x64\xE1\xFE\xC5\x45\xBA\xAD\x6B\xB9\x0A\x7A\x4E\x4F\x4B\x84\xEE\x4B\xF1\x7D\xDD\x11", ["CN=VeriSign Class 4 Public Primary Certification Authority - G3,OU=(c) 1999 VeriSign\, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US"] = "\x30\x82\x04\x1A\x30\x82\x03\x02\x02\x11\x00\xEC\xA0\xA7\x8B\x6E\x75\x6A\x01\xCF\xC4\x7C\xCC\x2F\x94\x5E\xD7\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xCA\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x39\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x45\x30\x43\x06\x03\x55\x04\x03\x13\x3C\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x43\x6C\x61\x73\x73\x20\x34\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x33\x30\x1E\x17\x0D\x39\x39\x31\x30\x30\x31\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x33\x36\x30\x37\x31\x36\x32\x33\x35\x39\x35\x39\x5A\x30\x81\xCA\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x0A\x13\x0E\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x13\x16\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x54\x72\x75\x73\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x31\x3A\x30\x38\x06\x03\x55\x04\x0B\x13\x31\x28\x63\x29\x20\x31\x39\x39\x39\x20\x56\x65\x72\x69\x53\x69\x67\x6E\x2C\x20\x49\x6E\x63\x2E\x20\x2D\x20\x46\x6F\x72\x20\x61\x75\x74\x68\x6F\x72\x69\x7A\x65\x64\x20\x75\x73\x65\x20\x6F\x6E\x6C\x79\x31\x45\x30\x43\x06\x03\x55\x04\x03\x13\x3C\x56\x65\x72\x69\x53\x69\x67\x6E\x20\x43\x6C\x61\x73\x73\x20\x34\x20\x50\x75\x62\x6C\x69\x63\x20\x50\x72\x69\x6D\x61\x72\x79\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x2D\x20\x47\x33\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xAD\xCB\xA5\x11\x69\xC6\x59\xAB\xF1\x8F\xB5\x19\x0F\x56\xCE\xCC\xB5\x1F\x20\xE4\x9E\x26\x25\x4B\xE0\x73\x65\x89\x59\xDE\xD0\x83\xE4\xF5\x0F\xB5\xBB\xAD\xF1\x7C\xE8\x21\xFC\xE4\xE8\x0C\xEE\x7C\x45\x22\x19\x76\x92\xB4\x13\xB7\x20\x5B\x09\xFA\x61\xAE\xA8\xF2\xA5\x8D\x85\xC2\x2A\xD6\xDE\x66\x36\xD2\x9B\x02\xF4\xA8\x92\x60\x7C\x9C\x69\xB4\x8F\x24\x1E\xD0\x86\x52\xF6\x32\x9C\x41\x58\x1E\x22\xBD\xCD\x45\x62\x95\x08\x6E\xD0\x66\xDD\x53\xA2\xCC\xF0\x10\xDC\x54\x73\x8B\x04\xA1\x46\x33\x33\x5C\x17\x40\xB9\x9E\x4D\xD3\xF3\xBE\x55\x83\xE8\xB1\x89\x8E\x5A\x7C\x9A\x96\x22\x90\x3B\x88\x25\xF2\xD2\x53\x88\x02\x0C\x0B\x78\xF2\xE6\x37\x17\x4B\x30\x46\x07\xE4\x80\x6D\xA6\xD8\x96\x2E\xE8\x2C\xF8\x11\xB3\x38\x0D\x66\xA6\x9B\xEA\xC9\x23\x5B\xDB\x8E\xE2\xF3\x13\x8E\x1A\x59\x2D\xAA\x02\xF0\xEC\xA4\x87\x66\xDC\xC1\x3F\xF5\xD8\xB9\xF4\xEC\x82\xC6\xD2\x3D\x95\x1D\xE5\xC0\x4F\x84\xC9\xD9\xA3\x44\x28\x06\x6A\xD7\x45\xAC\xF0\x6B\x6A\xEF\x4E\x5F\xF8\x11\x82\x1E\x38\x63\x34\x66\x50\xD4\x3E\x93\x73\xFA\x30\xC3\x66\xAD\xFF\x93\x2D\x97\xEF\x03\x02\x03\x01\x00\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x8F\xFA\x25\x6B\x4F\x5B\xE4\xA4\x4E\x27\x55\xAB\x22\x15\x59\x3C\xCA\xB5\x0A\xD4\x4A\xDB\xAB\xDD\xA1\x5F\x53\xC5\xA0\x57\x39\xC2\xCE\x47\x2B\xBE\x3A\xC8\x56\xBF\xC2\xD9\x27\x10\x3A\xB1\x05\x3C\xC0\x77\x31\xBB\x3A\xD3\x05\x7B\x6D\x9A\x1C\x30\x8C\x80\xCB\x93\x93\x2A\x83\xAB\x05\x51\x82\x02\x00\x11\x67\x6B\xF3\x88\x61\x47\x5F\x03\x93\xD5\x5B\x0D\xE0\xF1\xD4\xA1\x32\x35\x85\xB2\x3A\xDB\xB0\x82\xAB\xD1\xCB\x0A\xBC\x4F\x8C\x5B\xC5\x4B\x00\x3B\x1F\x2A\x82\xA6\x7E\x36\x85\xDC\x7E\x3C\x67\x00\xB5\xE4\x3B\x52\xE0\xA8\xEB\x5D\x15\xF9\xC6\x6D\xF0\xAD\x1D\x0E\x85\xB7\xA9\x9A\x73\x14\x5A\x5B\x8F\x41\x28\xC0\xD5\xE8\x2D\x4D\xA4\x5E\xCD\xAA\xD9\xED\xCE\xDC\xD8\xD5\x3C\x42\x1D\x17\xC1\x12\x5D\x45\x38\xC3\x38\xF3\xFC\x85\x2E\x83\x46\x48\xB2\xD7\x20\x5F\x92\x36\x8F\xE7\x79\x0F\x98\x5E\x99\xE8\xF0\xD0\xA4\xBB\xF5\x53\xBD\x2A\xCE\x59\xB0\xAF\x6E\x7F\x6C\xBB\xD2\x1E\x00\xB0\x21\xED\xF8\x41\x62\x82\xB9\xD8\xB2\xC4\xBB\x46\x50\xF3\x31\xC5\x8F\x01\xA8\x74\xEB\xF5\x78\x27\xDA\xE7\xF7\x66\x43\xF3\x9E\x83\x3E\x20\xAA\xC3\x35\x60\x91\xCE", - ["CN=Entrust.net Secure Server Certification Authority,OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS incorp. by ref. (limits liab.),O=Entrust.net,C=US"] = "\x30\x82\x04\xD8\x30\x82\x04\x41\xA0\x03\x02\x01\x02\x02\x04\x37\x4A\xD2\x43\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xC3\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x31\x3B\x30\x39\x06\x03\x55\x04\x0B\x13\x32\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x50\x53\x20\x69\x6E\x63\x6F\x72\x70\x2E\x20\x62\x79\x20\x72\x65\x66\x2E\x20\x28\x6C\x69\x6D\x69\x74\x73\x20\x6C\x69\x61\x62\x2E\x29\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x28\x63\x29\x20\x31\x39\x39\x39\x20\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x4C\x69\x6D\x69\x74\x65\x64\x31\x3A\x30\x38\x06\x03\x55\x04\x03\x13\x31\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x53\x65\x63\x75\x72\x65\x20\x53\x65\x72\x76\x65\x72\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x39\x39\x30\x35\x32\x35\x31\x36\x30\x39\x34\x30\x5A\x17\x0D\x31\x39\x30\x35\x32\x35\x31\x36\x33\x39\x34\x30\x5A\x30\x81\xC3\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x31\x3B\x30\x39\x06\x03\x55\x04\x0B\x13\x32\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x50\x53\x20\x69\x6E\x63\x6F\x72\x70\x2E\x20\x62\x79\x20\x72\x65\x66\x2E\x20\x28\x6C\x69\x6D\x69\x74\x73\x20\x6C\x69\x61\x62\x2E\x29\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x28\x63\x29\x20\x31\x39\x39\x39\x20\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x4C\x69\x6D\x69\x74\x65\x64\x31\x3A\x30\x38\x06\x03\x55\x04\x03\x13\x31\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x53\x65\x63\x75\x72\x65\x20\x53\x65\x72\x76\x65\x72\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x81\x9D\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8B\x00\x30\x81\x87\x02\x81\x81\x00\xCD\x28\x83\x34\x54\x1B\x89\xF3\x0F\xAF\x37\x91\x31\xFF\xAF\x31\x60\xC9\xA8\xE8\xB2\x10\x68\xED\x9F\xE7\x93\x36\xF1\x0A\x64\xBB\x47\xF5\x04\x17\x3F\x23\x47\x4D\xC5\x27\x19\x81\x26\x0C\x54\x72\x0D\x88\x2D\xD9\x1F\x9A\x12\x9F\xBC\xB3\x71\xD3\x80\x19\x3F\x47\x66\x7B\x8C\x35\x28\xD2\xB9\x0A\xDF\x24\xDA\x9C\xD6\x50\x79\x81\x7A\x5A\xD3\x37\xF7\xC2\x4A\xD8\x29\x92\x26\x64\xD1\xE4\x98\x6C\x3A\x00\x8A\xF5\x34\x9B\x65\xF8\xED\xE3\x10\xFF\xFD\xB8\x49\x58\xDC\xA0\xDE\x82\x39\x6B\x81\xB1\x16\x19\x61\xB9\x54\xB6\xE6\x43\x02\x01\x03\xA3\x82\x01\xD7\x30\x82\x01\xD3\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x82\x01\x19\x06\x03\x55\x1D\x1F\x04\x82\x01\x10\x30\x82\x01\x0C\x30\x81\xDE\xA0\x81\xDB\xA0\x81\xD8\xA4\x81\xD5\x30\x81\xD2\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x31\x3B\x30\x39\x06\x03\x55\x04\x0B\x13\x32\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x50\x53\x20\x69\x6E\x63\x6F\x72\x70\x2E\x20\x62\x79\x20\x72\x65\x66\x2E\x20\x28\x6C\x69\x6D\x69\x74\x73\x20\x6C\x69\x61\x62\x2E\x29\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x28\x63\x29\x20\x31\x39\x39\x39\x20\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x4C\x69\x6D\x69\x74\x65\x64\x31\x3A\x30\x38\x06\x03\x55\x04\x03\x13\x31\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x53\x65\x63\x75\x72\x65\x20\x53\x65\x72\x76\x65\x72\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x0D\x30\x0B\x06\x03\x55\x04\x03\x13\x04\x43\x52\x4C\x31\x30\x29\xA0\x27\xA0\x25\x86\x23\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x52\x4C\x2F\x6E\x65\x74\x31\x2E\x63\x72\x6C\x30\x2B\x06\x03\x55\x1D\x10\x04\x24\x30\x22\x80\x0F\x31\x39\x39\x39\x30\x35\x32\x35\x31\x36\x30\x39\x34\x30\x5A\x81\x0F\x32\x30\x31\x39\x30\x35\x32\x35\x31\x36\x30\x39\x34\x30\x5A\x30\x0B\x06\x03\x55\x1D\x0F\x04\x04\x03\x02\x01\x06\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\xF0\x17\x62\x13\x55\x3D\xB3\xFF\x0A\x00\x6B\xFB\x50\x84\x97\xF3\xED\x62\xD0\x1A\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xF0\x17\x62\x13\x55\x3D\xB3\xFF\x0A\x00\x6B\xFB\x50\x84\x97\xF3\xED\x62\xD0\x1A\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x19\x06\x09\x2A\x86\x48\x86\xF6\x7D\x07\x41\x00\x04\x0C\x30\x0A\x1B\x04\x56\x34\x2E\x30\x03\x02\x04\x90\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x81\x81\x00\x90\xDC\x30\x02\xFA\x64\x74\xC2\xA7\x0A\xA5\x7C\x21\x8D\x34\x17\xA8\xFB\x47\x0E\xFF\x25\x7C\x8D\x13\x0A\xFB\xE4\x98\xB5\xEF\x8C\xF8\xC5\x10\x0D\xF7\x92\xBE\xF1\xC3\xD5\xD5\x95\x6A\x04\xBB\x2C\xCE\x26\x36\x65\xC8\x31\xC6\xE7\xEE\x3F\xE3\x57\x75\x84\x7A\x11\xEF\x46\x4F\x18\xF4\xD3\x98\xBB\xA8\x87\x32\xBA\x72\xF6\x3C\xE2\x3D\x9F\xD7\x1D\xD9\xC3\x60\x43\x8C\x58\x0E\x22\x96\x2F\x62\xA3\x2C\x1F\xBA\xAD\x05\xEF\xAB\x32\x78\x87\xA0\x54\x73\x19\xB5\x5C\x05\xF9\x52\x3E\x6D\x2D\x45\x0B\xF7\x0A\x93\xEA\xED\x06\xF9\xB2", ["CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net"] = "\x30\x82\x04\x2A\x30\x82\x03\x12\xA0\x03\x02\x01\x02\x02\x04\x38\x63\xDE\xF8\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\xB4\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x31\x40\x30\x3E\x06\x03\x55\x04\x0B\x14\x37\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x50\x53\x5F\x32\x30\x34\x38\x20\x69\x6E\x63\x6F\x72\x70\x2E\x20\x62\x79\x20\x72\x65\x66\x2E\x20\x28\x6C\x69\x6D\x69\x74\x73\x20\x6C\x69\x61\x62\x2E\x29\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x28\x63\x29\x20\x31\x39\x39\x39\x20\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x4C\x69\x6D\x69\x74\x65\x64\x31\x33\x30\x31\x06\x03\x55\x04\x03\x13\x2A\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x28\x32\x30\x34\x38\x29\x30\x1E\x17\x0D\x39\x39\x31\x32\x32\x34\x31\x37\x35\x30\x35\x31\x5A\x17\x0D\x32\x39\x30\x37\x32\x34\x31\x34\x31\x35\x31\x32\x5A\x30\x81\xB4\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x31\x40\x30\x3E\x06\x03\x55\x04\x0B\x14\x37\x77\x77\x77\x2E\x65\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x2F\x43\x50\x53\x5F\x32\x30\x34\x38\x20\x69\x6E\x63\x6F\x72\x70\x2E\x20\x62\x79\x20\x72\x65\x66\x2E\x20\x28\x6C\x69\x6D\x69\x74\x73\x20\x6C\x69\x61\x62\x2E\x29\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x28\x63\x29\x20\x31\x39\x39\x39\x20\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x4C\x69\x6D\x69\x74\x65\x64\x31\x33\x30\x31\x06\x03\x55\x04\x03\x13\x2A\x45\x6E\x74\x72\x75\x73\x74\x2E\x6E\x65\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x28\x32\x30\x34\x38\x29\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xAD\x4D\x4B\xA9\x12\x86\xB2\xEA\xA3\x20\x07\x15\x16\x64\x2A\x2B\x4B\xD1\xBF\x0B\x4A\x4D\x8E\xED\x80\x76\xA5\x67\xB7\x78\x40\xC0\x73\x42\xC8\x68\xC0\xDB\x53\x2B\xDD\x5E\xB8\x76\x98\x35\x93\x8B\x1A\x9D\x7C\x13\x3A\x0E\x1F\x5B\xB7\x1E\xCF\xE5\x24\x14\x1E\xB1\x81\xA9\x8D\x7D\xB8\xCC\x6B\x4B\x03\xF1\x02\x0C\xDC\xAB\xA5\x40\x24\x00\x7F\x74\x94\xA1\x9D\x08\x29\xB3\x88\x0B\xF5\x87\x77\x9D\x55\xCD\xE4\xC3\x7E\xD7\x6A\x64\xAB\x85\x14\x86\x95\x5B\x97\x32\x50\x6F\x3D\xC8\xBA\x66\x0C\xE3\xFC\xBD\xB8\x49\xC1\x76\x89\x49\x19\xFD\xC0\xA8\xBD\x89\xA3\x67\x2F\xC6\x9F\xBC\x71\x19\x60\xB8\x2D\xE9\x2C\xC9\x90\x76\x66\x7B\x94\xE2\xAF\x78\xD6\x65\x53\x5D\x3C\xD6\x9C\xB2\xCF\x29\x03\xF9\x2F\xA4\x50\xB2\xD4\x48\xCE\x05\x32\x55\x8A\xFD\xB2\x64\x4C\x0E\xE4\x98\x07\x75\xDB\x7F\xDF\xB9\x08\x55\x60\x85\x30\x29\xF9\x7B\x48\xA4\x69\x86\xE3\x35\x3F\x1E\x86\x5D\x7A\x7A\x15\xBD\xEF\x00\x8E\x15\x22\x54\x17\x00\x90\x26\x93\xBC\x0E\x49\x68\x91\xBF\xF8\x47\xD3\x9D\x95\x42\xC1\x0E\x4D\xDF\x6F\x26\xCF\xC3\x18\x21\x62\x66\x43\x70\xD6\xD5\xC0\x07\xE1\x02\x03\x01\x00\x01\xA3\x42\x30\x40\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x55\xE4\x81\xD1\x11\x80\xBE\xD8\x89\xB9\x08\xA3\x31\xF9\xA1\x24\x09\x16\xB9\x70\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x3B\x9B\x8F\x56\x9B\x30\xE7\x53\x99\x7C\x7A\x79\xA7\x4D\x97\xD7\x19\x95\x90\xFB\x06\x1F\xCA\x33\x7C\x46\x63\x8F\x96\x66\x24\xFA\x40\x1B\x21\x27\xCA\xE6\x72\x73\xF2\x4F\xFE\x31\x99\xFD\xC8\x0C\x4C\x68\x53\xC6\x80\x82\x13\x98\xFA\xB6\xAD\xDA\x5D\x3D\xF1\xCE\x6E\xF6\x15\x11\x94\x82\x0C\xEE\x3F\x95\xAF\x11\xAB\x0F\xD7\x2F\xDE\x1F\x03\x8F\x57\x2C\x1E\xC9\xBB\x9A\x1A\x44\x95\xEB\x18\x4F\xA6\x1F\xCD\x7D\x57\x10\x2F\x9B\x04\x09\x5A\x84\xB5\x6E\xD8\x1D\x3A\xE1\xD6\x9E\xD1\x6C\x79\x5E\x79\x1C\x14\xC5\xE3\xD0\x4C\x93\x3B\x65\x3C\xED\xDF\x3D\xBE\xA6\xE5\x95\x1A\xC3\xB5\x19\xC3\xBD\x5E\x5B\xBB\xFF\x23\xEF\x68\x19\xCB\x12\x93\x27\x5C\x03\x2D\x6F\x30\xD0\x1E\xB6\x1A\xAC\xDE\x5A\xF7\xD1\xAA\xA8\x27\xA6\xFE\x79\x81\xC4\x79\x99\x33\x57\xBA\x12\xB0\xA9\xE0\x42\x6C\x93\xCA\x56\xDE\xFE\x6D\x84\x0B\x08\x8B\x7E\x8D\xEA\xD7\x98\x21\xC6\xF3\xE7\x3C\x79\x2F\x5E\x9C\xD1\x4C\x15\x8D\xE1\xEC\x22\x37\xCC\x9A\x43\x0B\x97\xDC\x80\x90\x8D\xB3\x67\x9B\x6F\x48\x08\x15\x56\xCF\xBF\xF1\x2B\x7C\x5E\x9A\x76\xE9\x59\x90\xC5\x7C\x83\x35\x11\x65\x51", ["CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE"] = "\x30\x82\x03\x77\x30\x82\x02\x5F\xA0\x03\x02\x01\x02\x02\x04\x02\x00\x00\xB9\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x5A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x49\x45\x31\x12\x30\x10\x06\x03\x55\x04\x0A\x13\x09\x42\x61\x6C\x74\x69\x6D\x6F\x72\x65\x31\x13\x30\x11\x06\x03\x55\x04\x0B\x13\x0A\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x31\x22\x30\x20\x06\x03\x55\x04\x03\x13\x19\x42\x61\x6C\x74\x69\x6D\x6F\x72\x65\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x52\x6F\x6F\x74\x30\x1E\x17\x0D\x30\x30\x30\x35\x31\x32\x31\x38\x34\x36\x30\x30\x5A\x17\x0D\x32\x35\x30\x35\x31\x32\x32\x33\x35\x39\x30\x30\x5A\x30\x5A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x49\x45\x31\x12\x30\x10\x06\x03\x55\x04\x0A\x13\x09\x42\x61\x6C\x74\x69\x6D\x6F\x72\x65\x31\x13\x30\x11\x06\x03\x55\x04\x0B\x13\x0A\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x31\x22\x30\x20\x06\x03\x55\x04\x03\x13\x19\x42\x61\x6C\x74\x69\x6D\x6F\x72\x65\x20\x43\x79\x62\x65\x72\x54\x72\x75\x73\x74\x20\x52\x6F\x6F\x74\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xA3\x04\xBB\x22\xAB\x98\x3D\x57\xE8\x26\x72\x9A\xB5\x79\xD4\x29\xE2\xE1\xE8\x95\x80\xB1\xB0\xE3\x5B\x8E\x2B\x29\x9A\x64\xDF\xA1\x5D\xED\xB0\x09\x05\x6D\xDB\x28\x2E\xCE\x62\xA2\x62\xFE\xB4\x88\xDA\x12\xEB\x38\xEB\x21\x9D\xC0\x41\x2B\x01\x52\x7B\x88\x77\xD3\x1C\x8F\xC7\xBA\xB9\x88\xB5\x6A\x09\xE7\x73\xE8\x11\x40\xA7\xD1\xCC\xCA\x62\x8D\x2D\xE5\x8F\x0B\xA6\x50\xD2\xA8\x50\xC3\x28\xEA\xF5\xAB\x25\x87\x8A\x9A\x96\x1C\xA9\x67\xB8\x3F\x0C\xD5\xF7\xF9\x52\x13\x2F\xC2\x1B\xD5\x70\x70\xF0\x8F\xC0\x12\xCA\x06\xCB\x9A\xE1\xD9\xCA\x33\x7A\x77\xD6\xF8\xEC\xB9\xF1\x68\x44\x42\x48\x13\xD2\xC0\xC2\xA4\xAE\x5E\x60\xFE\xB6\xA6\x05\xFC\xB4\xDD\x07\x59\x02\xD4\x59\x18\x98\x63\xF5\xA5\x63\xE0\x90\x0C\x7D\x5D\xB2\x06\x7A\xF3\x85\xEA\xEB\xD4\x03\xAE\x5E\x84\x3E\x5F\xFF\x15\xED\x69\xBC\xF9\x39\x36\x72\x75\xCF\x77\x52\x4D\xF3\xC9\x90\x2C\xB9\x3D\xE5\xC9\x23\x53\x3F\x1F\x24\x98\x21\x5C\x07\x99\x29\xBD\xC6\x3A\xEC\xE7\x6E\x86\x3A\x6B\x97\x74\x63\x33\xBD\x68\x18\x31\xF0\x78\x8D\x76\xBF\xFC\x9E\x8E\x5D\x2A\x86\xA7\x4D\x90\xDC\x27\x1A\x39\x02\x03\x01\x00\x01\xA3\x45\x30\x43\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xE5\x9D\x59\x30\x82\x47\x58\xCC\xAC\xFA\x08\x54\x36\x86\x7B\x3A\xB5\x04\x4D\xF0\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x03\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x85\x0C\x5D\x8E\xE4\x6F\x51\x68\x42\x05\xA0\xDD\xBB\x4F\x27\x25\x84\x03\xBD\xF7\x64\xFD\x2D\xD7\x30\xE3\xA4\x10\x17\xEB\xDA\x29\x29\xB6\x79\x3F\x76\xF6\x19\x13\x23\xB8\x10\x0A\xF9\x58\xA4\xD4\x61\x70\xBD\x04\x61\x6A\x12\x8A\x17\xD5\x0A\xBD\xC5\xBC\x30\x7C\xD6\xE9\x0C\x25\x8D\x86\x40\x4F\xEC\xCC\xA3\x7E\x38\xC6\x37\x11\x4F\xED\xDD\x68\x31\x8E\x4C\xD2\xB3\x01\x74\xEE\xBE\x75\x5E\x07\x48\x1A\x7F\x70\xFF\x16\x5C\x84\xC0\x79\x85\xB8\x05\xFD\x7F\xBE\x65\x11\xA3\x0F\xC0\x02\xB4\xF8\x52\x37\x39\x04\xD5\xA9\x31\x7A\x18\xBF\xA0\x2A\xF4\x12\x99\xF7\xA3\x45\x82\xE3\x3C\x5E\xF5\x9D\x9E\xB5\xC8\x9E\x7C\x2E\xC8\xA4\x9E\x4E\x08\x14\x4B\x6D\xFD\x70\x6D\x6B\x1A\x63\xBD\x64\xE6\x1F\xB7\xCE\xF0\xF2\x9F\x2E\xBB\x1B\xB7\xF2\x50\x88\x73\x92\xC2\xE2\xE3\x16\x8D\x9A\x32\x02\xAB\x8E\x18\xDD\xE9\x10\x11\xEE\x7E\x35\xAB\x90\xAF\x3E\x30\x94\x7A\xD0\x33\x3D\xA7\x65\x0F\xF5\xFC\x8E\x9E\x62\xCF\x47\x44\x2C\x01\x5D\xBB\x1D\xB5\x32\xD2\x47\xD2\x38\x2E\xD0\xFE\x81\xDC\x32\x6A\x1E\xB5\xEE\x3C\xD5\xFC\xE7\x81\x1D\x19\xC3\x24\x42\xEA\x63\x39\xA9", ["CN=Equifax Secure Global eBusiness CA-1,O=Equifax Secure Inc.,C=US"] = "\x30\x82\x02\x90\x30\x82\x01\xF9\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x5A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x1C\x30\x1A\x06\x03\x55\x04\x0A\x13\x13\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x49\x6E\x63\x2E\x31\x2D\x30\x2B\x06\x03\x55\x04\x03\x13\x24\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x47\x6C\x6F\x62\x61\x6C\x20\x65\x42\x75\x73\x69\x6E\x65\x73\x73\x20\x43\x41\x2D\x31\x30\x1E\x17\x0D\x39\x39\x30\x36\x32\x31\x30\x34\x30\x30\x30\x30\x5A\x17\x0D\x32\x30\x30\x36\x32\x31\x30\x34\x30\x30\x30\x30\x5A\x30\x5A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x1C\x30\x1A\x06\x03\x55\x04\x0A\x13\x13\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x49\x6E\x63\x2E\x31\x2D\x30\x2B\x06\x03\x55\x04\x03\x13\x24\x45\x71\x75\x69\x66\x61\x78\x20\x53\x65\x63\x75\x72\x65\x20\x47\x6C\x6F\x62\x61\x6C\x20\x65\x42\x75\x73\x69\x6E\x65\x73\x73\x20\x43\x41\x2D\x31\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xBA\xE7\x17\x90\x02\x65\xB1\x34\x55\x3C\x49\xC2\x51\xD5\xDF\xA7\xD1\x37\x8F\xD1\xE7\x81\x73\x41\x52\x60\x9B\x9D\xA1\x17\x26\x78\xAD\xC7\xB1\xE8\x26\x94\x32\xB5\xDE\x33\x8D\x3A\x2F\xDB\xF2\x9A\x7A\x5A\x73\x98\xA3\x5C\xE9\xFB\x8A\x73\x1B\x5C\xE7\xC3\xBF\x80\x6C\xCD\xA9\xF4\xD6\x2B\xC0\xF7\xF9\x99\xAA\x63\xA2\xB1\x47\x02\x0F\xD4\xE4\x51\x3A\x12\x3C\x6C\x8A\x5A\x54\x84\x70\xDB\xC1\xC5\x90\xCF\x72\x45\xCB\xA8\x59\xC0\xCD\x33\x9D\x3F\xA3\x96\xEB\x85\x33\x21\x1C\x3E\x1E\x3E\x60\x6E\x76\x9C\x67\x85\xC5\xC8\xC3\x61\x02\x03\x01\x00\x01\xA3\x66\x30\x64\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\xBE\xA8\xA0\x74\x72\x50\x6B\x44\xB7\xC9\x23\xD8\xFB\xA8\xFF\xB3\x57\x6B\x68\x6C\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xBE\xA8\xA0\x74\x72\x50\x6B\x44\xB7\xC9\x23\xD8\xFB\xA8\xFF\xB3\x57\x6B\x68\x6C\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x30\xE2\x01\x51\xAA\xC7\xEA\x5F\xDA\xB9\xD0\x65\x0F\x30\xD6\x3E\xDA\x0D\x14\x49\x6E\x91\x93\x27\x14\x31\xEF\xC4\xF7\x2D\x45\xF8\xEC\xC7\xBF\xA2\x41\x0D\x23\xB4\x92\xF9\x19\x00\x67\xBD\x01\xAF\xCD\xE0\x71\xFC\x5A\xCF\x64\xC4\xE0\x96\x98\xD0\xA3\x40\xE2\x01\x8A\xEF\x27\x07\xF1\x65\x01\x8A\x44\x2D\x06\x65\x75\x52\xC0\x86\x10\x20\x21\x5F\x6C\x6B\x0F\x6C\xAE\x09\x1C\xAF\xF2\xA2\x18\x34\xC4\x75\xA4\x73\x1C\xF1\x8D\xDC\xEF\xAD\xF9\xB3\x76\xB4\x92\xBF\xDC\x95\x10\x1E\xBE\xCB\xC8\x3B\x5A\x84\x60\x19\x56\x94\xA9\x55", @@ -58,15 +53,11 @@ redef root_certs += { ["CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU"] = "\x30\x82\x04\xBD\x30\x82\x03\xA5\xA0\x03\x02\x01\x02\x02\x01\x00\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x7F\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x55\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x41\x43\x20\x43\x61\x6D\x65\x72\x66\x69\x72\x6D\x61\x20\x53\x41\x20\x43\x49\x46\x20\x41\x38\x32\x37\x34\x33\x32\x38\x37\x31\x23\x30\x21\x06\x03\x55\x04\x0B\x13\x1A\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x31\x22\x30\x20\x06\x03\x55\x04\x03\x13\x19\x43\x68\x61\x6D\x62\x65\x72\x73\x20\x6F\x66\x20\x43\x6F\x6D\x6D\x65\x72\x63\x65\x20\x52\x6F\x6F\x74\x30\x1E\x17\x0D\x30\x33\x30\x39\x33\x30\x31\x36\x31\x33\x34\x33\x5A\x17\x0D\x33\x37\x30\x39\x33\x30\x31\x36\x31\x33\x34\x34\x5A\x30\x7F\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x55\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x41\x43\x20\x43\x61\x6D\x65\x72\x66\x69\x72\x6D\x61\x20\x53\x41\x20\x43\x49\x46\x20\x41\x38\x32\x37\x34\x33\x32\x38\x37\x31\x23\x30\x21\x06\x03\x55\x04\x0B\x13\x1A\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x31\x22\x30\x20\x06\x03\x55\x04\x03\x13\x19\x43\x68\x61\x6D\x62\x65\x72\x73\x20\x6F\x66\x20\x43\x6F\x6D\x6D\x65\x72\x63\x65\x20\x52\x6F\x6F\x74\x30\x82\x01\x20\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0D\x00\x30\x82\x01\x08\x02\x82\x01\x01\x00\xB7\x36\x55\xE5\xA5\x5D\x18\x30\xE0\xDA\x89\x54\x91\xFC\xC8\xC7\x52\xF8\x2F\x50\xD9\xEF\xB1\x75\x73\x65\x47\x7D\x1B\x5B\xBA\x75\xC5\xFC\xA1\x88\x24\xFA\x2F\xED\xCA\x08\x4A\x39\x54\xC4\x51\x7A\xB5\xDA\x60\xEA\x38\x3C\x81\xB2\xCB\xF1\xBB\xD9\x91\x23\x3F\x48\x01\x70\x75\xA9\x05\x2A\xAD\x1F\x71\xF3\xC9\x54\x3D\x1D\x06\x6A\x40\x3E\xB3\x0C\x85\xEE\x5C\x1B\x79\xC2\x62\xC4\xB8\x36\x8E\x35\x5D\x01\x0C\x23\x04\x47\x35\xAA\x9B\x60\x4E\xA0\x66\x3D\xCB\x26\x0A\x9C\x40\xA1\xF4\x5D\x98\xBF\x71\xAB\xA5\x00\x68\x2A\xED\x83\x7A\x0F\xA2\x14\xB5\xD4\x22\xB3\x80\xB0\x3C\x0C\x5A\x51\x69\x2D\x58\x18\x8F\xED\x99\x9E\xF1\xAE\xE2\x95\xE6\xF6\x47\xA8\xD6\x0C\x0F\xB0\x58\x58\xDB\xC3\x66\x37\x9E\x9B\x91\x54\x33\x37\xD2\x94\x1C\x6A\x48\xC9\xC9\xF2\xA5\xDA\xA5\x0C\x23\xF7\x23\x0E\x9C\x32\x55\x5E\x71\x9C\x84\x05\x51\x9A\x2D\xFD\xE6\x4E\x2A\x34\x5A\xDE\xCA\x40\x37\x67\x0C\x54\x21\x55\x77\xDA\x0A\x0C\xCC\x97\xAE\x80\xDC\x94\x36\x4A\xF4\x3E\xCE\x36\x13\x1E\x53\xE4\xAC\x4E\x3A\x05\xEC\xDB\xAE\x72\x9C\x38\x8B\xD0\x39\x3B\x89\x0A\x3E\x77\xFE\x75\x02\x01\x03\xA3\x82\x01\x44\x30\x82\x01\x40\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x0C\x30\x3C\x06\x03\x55\x1D\x1F\x04\x35\x30\x33\x30\x31\xA0\x2F\xA0\x2D\x86\x2B\x68\x74\x74\x70\x3A\x2F\x2F\x63\x72\x6C\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x2F\x63\x68\x61\x6D\x62\x65\x72\x73\x72\x6F\x6F\x74\x2E\x63\x72\x6C\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xE3\x94\xF5\xB1\x4D\xE9\xDB\xA1\x29\x5B\x57\x8B\x4D\x76\x06\x76\xE1\xD1\xA2\x8A\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x27\x06\x03\x55\x1D\x11\x04\x20\x30\x1E\x81\x1C\x63\x68\x61\x6D\x62\x65\x72\x73\x72\x6F\x6F\x74\x40\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x30\x27\x06\x03\x55\x1D\x12\x04\x20\x30\x1E\x81\x1C\x63\x68\x61\x6D\x62\x65\x72\x73\x72\x6F\x6F\x74\x40\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x30\x58\x06\x03\x55\x1D\x20\x04\x51\x30\x4F\x30\x4D\x06\x0B\x2B\x06\x01\x04\x01\x81\x87\x2E\x0A\x03\x01\x30\x3E\x30\x3C\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x30\x68\x74\x74\x70\x3A\x2F\x2F\x63\x70\x73\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x2F\x63\x70\x73\x2F\x63\x68\x61\x6D\x62\x65\x72\x73\x72\x6F\x6F\x74\x2E\x68\x74\x6D\x6C\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x0C\x41\x97\xC2\x1A\x86\xC0\x22\x7C\x9F\xFB\x90\xF3\x1A\xD1\x03\xB1\xEF\x13\xF9\x21\x5F\x04\x9C\xDA\xC9\xA5\x8D\x27\x6C\x96\x87\x91\xBE\x41\x90\x01\x72\x93\xE7\x1E\x7D\x5F\xF6\x89\xC6\x5D\xA7\x40\x09\x3D\xAC\x49\x45\x45\xDC\x2E\x8D\x30\x68\xB2\x09\xBA\xFB\xC3\x2F\xCC\xBA\x0B\xDF\x3F\x77\x7B\x46\x7D\x3A\x12\x24\x8E\x96\x8F\x3C\x05\x0A\x6F\xD2\x94\x28\x1D\x6D\x0C\xC0\x2E\x88\x22\xD5\xD8\xCF\x1D\x13\xC7\xF0\x48\xD7\xD7\x05\xA7\xCF\xC7\x47\x9E\x3B\x3C\x34\xC8\x80\x4F\xD4\x14\xBB\xFC\x0D\x50\xF7\xFA\xB3\xEC\x42\x5F\xA9\xDD\x6D\xC8\xF4\x75\xCF\x7B\xC1\x72\x26\xB1\x01\x1C\x5C\x2C\xFD\x7A\x4E\xB4\x01\xC5\x05\x57\xB9\xE7\x3C\xAA\x05\xD9\x88\xE9\x07\x46\x41\xCE\xEF\x41\x81\xAE\x58\xDF\x83\xA2\xAE\xCA\xD7\x77\x1F\xE7\x00\x3C\x9D\x6F\x8E\xE4\x32\x09\x1D\x4D\x78\x34\x78\x34\x3C\x94\x9B\x26\xED\x4F\x71\xC6\x19\x7A\xBD\x20\x22\x48\x5A\xFE\x4B\x7D\x03\xB7\xE7\x58\xBE\xC6\x32\x4E\x74\x1E\x68\xDD\xA8\x68\x5B\xB3\x3E\xEE\x62\x7D\xD9\x80\xE8\x0A\x75\x7A\xB7\xEE\xB4\x65\x9A\x21\x90\xE0\xAA\xD0\x98\xBC\x38\xB5\x73\x3C\x8B\xF8\xDC", ["CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU"] = "\x30\x82\x04\xC5\x30\x82\x03\xAD\xA0\x03\x02\x01\x02\x02\x01\x00\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x7D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x55\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x41\x43\x20\x43\x61\x6D\x65\x72\x66\x69\x72\x6D\x61\x20\x53\x41\x20\x43\x49\x46\x20\x41\x38\x32\x37\x34\x33\x32\x38\x37\x31\x23\x30\x21\x06\x03\x55\x04\x0B\x13\x1A\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x31\x20\x30\x1E\x06\x03\x55\x04\x03\x13\x17\x47\x6C\x6F\x62\x61\x6C\x20\x43\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x20\x52\x6F\x6F\x74\x30\x1E\x17\x0D\x30\x33\x30\x39\x33\x30\x31\x36\x31\x34\x31\x38\x5A\x17\x0D\x33\x37\x30\x39\x33\x30\x31\x36\x31\x34\x31\x38\x5A\x30\x7D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x55\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x41\x43\x20\x43\x61\x6D\x65\x72\x66\x69\x72\x6D\x61\x20\x53\x41\x20\x43\x49\x46\x20\x41\x38\x32\x37\x34\x33\x32\x38\x37\x31\x23\x30\x21\x06\x03\x55\x04\x0B\x13\x1A\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x31\x20\x30\x1E\x06\x03\x55\x04\x03\x13\x17\x47\x6C\x6F\x62\x61\x6C\x20\x43\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x20\x52\x6F\x6F\x74\x30\x82\x01\x20\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0D\x00\x30\x82\x01\x08\x02\x82\x01\x01\x00\xA2\x70\xA2\xD0\x9F\x42\xAE\x5B\x17\xC7\xD8\x7D\xCF\x14\x83\xFC\x4F\xC9\xA1\xB7\x13\xAF\x8A\xD7\x9E\x3E\x04\x0A\x92\x8B\x60\x56\xFA\xB4\x32\x2F\x88\x4D\xA1\x60\x08\xF4\xB7\x09\x4E\xA0\x49\x2F\x49\xD6\xD3\xDF\x9D\x97\x5A\x9F\x94\x04\x70\xEC\x3F\x59\xD9\xB7\xCC\x66\x8B\x98\x52\x28\x09\x02\xDF\xC5\x2F\x84\x8D\x7A\x97\x77\xBF\xEC\x40\x9D\x25\x72\xAB\xB5\x3F\x32\x98\xFB\xB7\xB7\xFC\x72\x84\xE5\x35\x87\xF9\x55\xFA\xA3\x1F\x0E\x6F\x2E\x28\xDD\x69\xA0\xD9\x42\x10\xC6\xF8\xB5\x44\xC2\xD0\x43\x7F\xDB\xBC\xE4\xA2\x3C\x6A\x55\x78\x0A\x77\xA9\xD8\xEA\x19\x32\xB7\x2F\xFE\x5C\x3F\x1B\xEE\xB1\x98\xEC\xCA\xAD\x7A\x69\x45\xE3\x96\x0F\x55\xF6\xE6\xED\x75\xEA\x65\xE8\x32\x56\x93\x46\x89\xA8\x25\x8A\x65\x06\xEE\x6B\xBF\x79\x07\xD0\xF1\xB7\xAF\xED\x2C\x4D\x92\xBB\xC0\xA8\x5F\xA7\x67\x7D\x04\xF2\x15\x08\x70\xAC\x92\xD6\x7D\x04\xD2\x33\xFB\x4C\xB6\x0B\x0B\xFB\x1A\xC9\xC4\x8D\x03\xA9\x7E\x5C\xF2\x50\xAB\x12\xA5\xA1\xCF\x48\x50\xA5\xEF\xD2\xC8\x1A\x13\xFA\xB0\x7F\xB1\x82\x1C\x77\x6A\x0F\x5F\xDC\x0B\x95\x8F\xEF\x43\x7E\xE6\x45\x09\x25\x02\x01\x03\xA3\x82\x01\x50\x30\x82\x01\x4C\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x0C\x30\x3F\x06\x03\x55\x1D\x1F\x04\x38\x30\x36\x30\x34\xA0\x32\xA0\x30\x86\x2E\x68\x74\x74\x70\x3A\x2F\x2F\x63\x72\x6C\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x2F\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x72\x6F\x6F\x74\x2E\x63\x72\x6C\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x43\x9C\x36\x9F\xB0\x9E\x30\x4D\xC6\xCE\x5F\xAD\x10\xAB\xE5\x03\xA5\xFA\xA9\x14\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x2A\x06\x03\x55\x1D\x11\x04\x23\x30\x21\x81\x1F\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x72\x6F\x6F\x74\x40\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x30\x2A\x06\x03\x55\x1D\x12\x04\x23\x30\x21\x81\x1F\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x72\x6F\x6F\x74\x40\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x30\x5B\x06\x03\x55\x1D\x20\x04\x54\x30\x52\x30\x50\x06\x0B\x2B\x06\x01\x04\x01\x81\x87\x2E\x0A\x01\x01\x30\x41\x30\x3F\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x33\x68\x74\x74\x70\x3A\x2F\x2F\x63\x70\x73\x2E\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x2E\x6F\x72\x67\x2F\x63\x70\x73\x2F\x63\x68\x61\x6D\x62\x65\x72\x73\x69\x67\x6E\x72\x6F\x6F\x74\x2E\x68\x74\x6D\x6C\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x3C\x3B\x70\x91\xF9\x04\x54\x27\x91\xE1\xED\xED\xFE\x68\x7F\x61\x5D\xE5\x41\x65\x4F\x32\xF1\x18\x05\x94\x6A\x1C\xDE\x1F\x70\xDB\x3E\x7B\x32\x02\x34\xB5\x0C\x6C\xA1\x8A\x7C\xA5\xF4\x8F\xFF\xD4\xD8\xAD\x17\xD5\x2D\x04\xD1\x3F\x58\x80\xE2\x81\x59\x88\xBE\xC0\xE3\x46\x93\x24\xFE\x90\xBD\x26\xA2\x30\x2D\xE8\x97\x26\x57\x35\x89\x74\x96\x18\xF6\x15\xE2\xAF\x24\x19\x56\x02\x02\xB2\xBA\x0F\x14\xEA\xC6\x8A\x66\xC1\x86\x45\x55\x8B\xBE\x92\xBE\x9C\xA4\x04\xC7\x49\x3C\x9E\xE8\x29\x7A\x89\xD7\xFE\xAF\xFF\x68\xF5\xA5\x17\x90\xBD\xAC\x99\xCC\xA5\x86\x57\x09\x67\x46\xDB\xD6\x16\xC2\x46\xF1\xE4\xA9\x50\xF5\x8F\xD1\x92\x15\xD3\x5F\x3E\xC6\x00\x49\x3A\x6E\x58\xB2\xD1\xD1\x27\x0D\x25\xC8\x32\xF8\x20\x11\xCD\x7D\x32\x33\x48\x94\x54\x4C\xDD\xDC\x79\xC4\x30\x9F\xEB\x8E\xB8\x55\xB5\xD7\x88\x5C\xC5\x6A\x24\x3D\xB2\xD3\x05\x03\x51\xC6\x07\xEF\xCC\x14\x72\x74\x3D\x6E\x72\xCE\x18\x28\x8C\x4A\xA0\x77\xE5\x09\x2B\x45\x44\x47\xAC\xB7\x67\x7F\x01\x8A\x05\x5A\x93\xBE\xA1\xC1\xFF\xF8\xE7\x0E\x67\xA4\x47\x49\x76\x5D\x75\x90\x1A\xF5\x26\x8F\xF0", ["CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado,OU=Tanusitvanykiadok,O=NetLock Halozatbiztonsagi Kft.,L=Budapest,ST=Hungary,C=HU"] = "\x30\x82\x06\x7D\x30\x82\x05\x65\xA0\x03\x02\x01\x02\x02\x02\x01\x03\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x81\xAF\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x10\x30\x0E\x06\x03\x55\x04\x08\x13\x07\x48\x75\x6E\x67\x61\x72\x79\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x36\x30\x34\x06\x03\x55\x04\x03\x13\x2D\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x6F\x7A\x6A\x65\x67\x79\x7A\x6F\x69\x20\x28\x43\x6C\x61\x73\x73\x20\x41\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x1E\x17\x0D\x39\x39\x30\x32\x32\x34\x32\x33\x31\x34\x34\x37\x5A\x17\x0D\x31\x39\x30\x32\x31\x39\x32\x33\x31\x34\x34\x37\x5A\x30\x81\xAF\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x10\x30\x0E\x06\x03\x55\x04\x08\x13\x07\x48\x75\x6E\x67\x61\x72\x79\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x36\x30\x34\x06\x03\x55\x04\x03\x13\x2D\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x6F\x7A\x6A\x65\x67\x79\x7A\x6F\x69\x20\x28\x43\x6C\x61\x73\x73\x20\x41\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xBC\x74\x8C\x0F\xBB\x4C\xF4\x37\x1E\xA9\x05\x82\xD8\xE6\xE1\x6C\x70\xEA\x78\xB5\x6E\xD1\x38\x44\x0D\xA8\x83\xCE\x5D\xD2\xD6\xD5\x81\xC5\xD4\x4B\xE7\x5B\x94\x70\x26\xDB\x3B\x9D\x6A\x4C\x62\xF7\x71\xF3\x64\xD6\x61\x3B\x3D\xEB\x73\xA3\x37\xD9\xCF\xEA\x8C\x92\x3B\xCD\xF7\x07\xDC\x66\x74\x97\xF4\x45\x22\xDD\xF4\x5C\xE0\xBF\x6D\xF3\xBE\x65\x33\xE4\x15\x3A\xBF\xDB\x98\x90\x55\x38\xC4\xED\xA6\x55\x63\x0B\xB0\x78\x04\xF4\xE3\x6E\xC1\x3F\x8E\xFC\x51\x78\x1F\x92\x9E\x83\xC2\xFE\xD9\xB0\xA9\xC9\xBC\x5A\x00\xFF\xA9\xA8\x98\x74\xFB\xF6\x2C\x3E\x15\x39\x0D\xB6\x04\x55\xA8\x0E\x98\x20\x42\xB3\xB1\x25\xAD\x7E\x9A\x6F\x5D\x53\xB1\xAB\x0C\xFC\xEB\xE0\xF3\x7A\xB3\xA8\xB3\xFF\x46\xF6\x63\xA2\xD8\x3A\x98\x7B\xB6\xAC\x85\xFF\xB0\x25\x4F\x74\x63\xE7\x13\x07\xA5\x0A\x8F\x05\xF7\xC0\x64\x6F\x7E\xA7\x27\x80\x96\xDE\xD4\x2E\x86\x60\xC7\x6B\x2B\x5E\x73\x7B\x17\xE7\x91\x3F\x64\x0C\xD8\x4B\x22\x34\x2B\x9B\x32\xF2\x48\x1F\x9F\xA1\x0A\x84\x7A\xE2\xC2\xAD\x97\x3D\x8E\xD5\xC1\xF9\x56\xA3\x50\xE9\xC6\xB4\xFA\x98\xA2\xEE\x95\xE6\x2A\x03\x8C\xDF\x02\x03\x01\x00\x01\xA3\x82\x02\x9F\x30\x82\x02\x9B\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x00\x06\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x04\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x82\x02\x60\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x0D\x04\x82\x02\x51\x16\x82\x02\x4D\x46\x49\x47\x59\x45\x4C\x45\x4D\x21\x20\x45\x7A\x65\x6E\x20\x74\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x41\x6C\x74\x61\x6C\x61\x6E\x6F\x73\x20\x53\x7A\x6F\x6C\x67\x61\x6C\x74\x61\x74\x61\x73\x69\x20\x46\x65\x6C\x74\x65\x74\x65\x6C\x65\x69\x62\x65\x6E\x20\x6C\x65\x69\x72\x74\x20\x65\x6C\x6A\x61\x72\x61\x73\x6F\x6B\x20\x61\x6C\x61\x70\x6A\x61\x6E\x20\x6B\x65\x73\x7A\x75\x6C\x74\x2E\x20\x41\x20\x68\x69\x74\x65\x6C\x65\x73\x69\x74\x65\x73\x20\x66\x6F\x6C\x79\x61\x6D\x61\x74\x61\x74\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x74\x65\x72\x6D\x65\x6B\x66\x65\x6C\x65\x6C\x6F\x73\x73\x65\x67\x2D\x62\x69\x7A\x74\x6F\x73\x69\x74\x61\x73\x61\x20\x76\x65\x64\x69\x2E\x20\x41\x20\x64\x69\x67\x69\x74\x61\x6C\x69\x73\x20\x61\x6C\x61\x69\x72\x61\x73\x20\x65\x6C\x66\x6F\x67\x61\x64\x61\x73\x61\x6E\x61\x6B\x20\x66\x65\x6C\x74\x65\x74\x65\x6C\x65\x20\x61\x7A\x20\x65\x6C\x6F\x69\x72\x74\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x69\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6D\x65\x67\x74\x65\x74\x65\x6C\x65\x2E\x20\x41\x7A\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6C\x65\x69\x72\x61\x73\x61\x20\x6D\x65\x67\x74\x61\x6C\x61\x6C\x68\x61\x74\x6F\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x49\x6E\x74\x65\x72\x6E\x65\x74\x20\x68\x6F\x6E\x6C\x61\x70\x6A\x61\x6E\x20\x61\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x63\x69\x6D\x65\x6E\x20\x76\x61\x67\x79\x20\x6B\x65\x72\x68\x65\x74\x6F\x20\x61\x7A\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x20\x65\x2D\x6D\x61\x69\x6C\x20\x63\x69\x6D\x65\x6E\x2E\x20\x49\x4D\x50\x4F\x52\x54\x41\x4E\x54\x21\x20\x54\x68\x65\x20\x69\x73\x73\x75\x61\x6E\x63\x65\x20\x61\x6E\x64\x20\x74\x68\x65\x20\x75\x73\x65\x20\x6F\x66\x20\x74\x68\x69\x73\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x69\x73\x20\x73\x75\x62\x6A\x65\x63\x74\x20\x74\x6F\x20\x74\x68\x65\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x43\x50\x53\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x61\x74\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x6F\x72\x20\x62\x79\x20\x65\x2D\x6D\x61\x69\x6C\x20\x61\x74\x20\x63\x70\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2E\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x82\x01\x01\x00\x48\x24\x46\xF7\xBA\x56\x6F\xFA\xC8\x28\x03\x40\x4E\xE5\x31\x39\x6B\x26\x6B\x53\x7F\xDB\xDF\xDF\xF3\x71\x3D\x26\xC0\x14\x0E\xC6\x67\x7B\x23\xA8\x0C\x73\xDD\x01\xBB\xC6\xCA\x6E\x37\x39\x55\xD5\xC7\x8C\x56\x20\x0E\x28\x0A\x0E\xD2\x2A\xA4\xB0\x49\x52\xC6\x38\x07\xFE\xBE\x0A\x09\x8C\xD1\x98\xCF\xCA\xDA\x14\x31\xA1\x4F\xD2\x39\xFC\x0F\x11\x2C\x43\xC3\xDD\xAB\x93\xC7\x55\x3E\x47\x7C\x18\x1A\x00\xDC\xF3\x7B\xD8\xF2\x7F\x52\x6C\x20\xF4\x0B\x5F\x69\x52\xF4\xEE\xF8\xB2\x29\x60\xEB\xE3\x49\x31\x21\x0D\xD6\xB5\x10\x41\xE2\x41\x09\x6C\xE2\x1A\x9A\x56\x4B\x77\x02\xF6\xA0\x9B\x9A\x27\x87\xE8\x55\x29\x71\xC2\x90\x9F\x45\x78\x1A\xE1\x15\x64\x3D\xD0\x0E\xD8\xA0\x76\x9F\xAE\xC5\xD0\x2E\xEA\xD6\x0F\x56\xEC\x64\x7F\x5A\x9B\x14\x58\x01\x27\x7E\x13\x50\xC7\x6B\x2A\xE6\x68\x3C\xBF\x5C\xA0\x0A\x1B\xE1\x0E\x7A\xE9\xE2\x80\xC3\xE9\xE9\xF6\xFD\x6C\x11\x9E\xD0\xE5\x28\x27\x2B\x54\x32\x42\x14\x82\x75\xE6\x4A\xF0\x2B\x66\x75\x63\x8C\xA2\xFB\x04\x3E\x83\x0E\x9B\x36\xF0\x18\xE4\x26\x20\xC3\x8C\xF0\x28\x07\xAD\x3C\x17\x66\x88\xB5\xFD\xB6\x88", - ["CN=NetLock Uzleti (Class B) Tanusitvanykiado,OU=Tanusitvanykiadok,O=NetLock Halozatbiztonsagi Kft.,L=Budapest,C=HU"] = "\x30\x82\x05\x4B\x30\x82\x04\xB4\xA0\x03\x02\x01\x02\x02\x01\x69\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x81\x99\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x32\x30\x30\x06\x03\x55\x04\x03\x13\x29\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x55\x7A\x6C\x65\x74\x69\x20\x28\x43\x6C\x61\x73\x73\x20\x42\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x1E\x17\x0D\x39\x39\x30\x32\x32\x35\x31\x34\x31\x30\x32\x32\x5A\x17\x0D\x31\x39\x30\x32\x32\x30\x31\x34\x31\x30\x32\x32\x5A\x30\x81\x99\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x32\x30\x30\x06\x03\x55\x04\x03\x13\x29\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x55\x7A\x6C\x65\x74\x69\x20\x28\x43\x6C\x61\x73\x73\x20\x42\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xB1\xEA\x04\xEC\x20\xA0\x23\xC2\x8F\x38\x60\xCF\xC7\x46\xB3\xD5\x1B\xFE\xFB\xB9\x99\x9E\x04\xDC\x1C\x7F\x8C\x4A\x81\x98\xEE\xA4\xD4\xCA\x8A\x17\xB9\x22\x7F\x83\x0A\x75\x4C\x9B\xC0\x69\xD8\x64\x39\xA3\xED\x92\xA3\xFD\x5B\x5C\x74\x1A\xC0\x47\xCA\x3A\x69\x76\x9A\xBA\xE2\x44\x17\xFC\x4C\xA3\xD5\xFE\xB8\x97\x88\xAF\x88\x03\x89\x1F\xA4\xF2\x04\x3E\xC8\x07\x0B\xE6\xF9\xB3\x2F\x7A\x62\x14\x09\x46\x14\xCA\x64\xF5\x8B\x80\xB5\x62\xA8\xD8\x6B\xD6\x71\x93\x2D\xB3\xBF\x09\x54\x58\xED\x06\xEB\xA8\x7B\xDC\x43\xB1\xA1\x69\x02\x03\x01\x00\x01\xA3\x82\x02\x9F\x30\x82\x02\x9B\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x04\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x00\x06\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x82\x02\x60\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x0D\x04\x82\x02\x51\x16\x82\x02\x4D\x46\x49\x47\x59\x45\x4C\x45\x4D\x21\x20\x45\x7A\x65\x6E\x20\x74\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x41\x6C\x74\x61\x6C\x61\x6E\x6F\x73\x20\x53\x7A\x6F\x6C\x67\x61\x6C\x74\x61\x74\x61\x73\x69\x20\x46\x65\x6C\x74\x65\x74\x65\x6C\x65\x69\x62\x65\x6E\x20\x6C\x65\x69\x72\x74\x20\x65\x6C\x6A\x61\x72\x61\x73\x6F\x6B\x20\x61\x6C\x61\x70\x6A\x61\x6E\x20\x6B\x65\x73\x7A\x75\x6C\x74\x2E\x20\x41\x20\x68\x69\x74\x65\x6C\x65\x73\x69\x74\x65\x73\x20\x66\x6F\x6C\x79\x61\x6D\x61\x74\x61\x74\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x74\x65\x72\x6D\x65\x6B\x66\x65\x6C\x65\x6C\x6F\x73\x73\x65\x67\x2D\x62\x69\x7A\x74\x6F\x73\x69\x74\x61\x73\x61\x20\x76\x65\x64\x69\x2E\x20\x41\x20\x64\x69\x67\x69\x74\x61\x6C\x69\x73\x20\x61\x6C\x61\x69\x72\x61\x73\x20\x65\x6C\x66\x6F\x67\x61\x64\x61\x73\x61\x6E\x61\x6B\x20\x66\x65\x6C\x74\x65\x74\x65\x6C\x65\x20\x61\x7A\x20\x65\x6C\x6F\x69\x72\x74\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x69\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6D\x65\x67\x74\x65\x74\x65\x6C\x65\x2E\x20\x41\x7A\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6C\x65\x69\x72\x61\x73\x61\x20\x6D\x65\x67\x74\x61\x6C\x61\x6C\x68\x61\x74\x6F\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x49\x6E\x74\x65\x72\x6E\x65\x74\x20\x68\x6F\x6E\x6C\x61\x70\x6A\x61\x6E\x20\x61\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x63\x69\x6D\x65\x6E\x20\x76\x61\x67\x79\x20\x6B\x65\x72\x68\x65\x74\x6F\x20\x61\x7A\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x20\x65\x2D\x6D\x61\x69\x6C\x20\x63\x69\x6D\x65\x6E\x2E\x20\x49\x4D\x50\x4F\x52\x54\x41\x4E\x54\x21\x20\x54\x68\x65\x20\x69\x73\x73\x75\x61\x6E\x63\x65\x20\x61\x6E\x64\x20\x74\x68\x65\x20\x75\x73\x65\x20\x6F\x66\x20\x74\x68\x69\x73\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x69\x73\x20\x73\x75\x62\x6A\x65\x63\x74\x20\x74\x6F\x20\x74\x68\x65\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x43\x50\x53\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x61\x74\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x6F\x72\x20\x62\x79\x20\x65\x2D\x6D\x61\x69\x6C\x20\x61\x74\x20\x63\x70\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2E\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x04\xDB\xAE\x8C\x17\xAF\xF8\x0E\x90\x31\x4E\xCD\x3E\x09\xC0\x6D\x3A\xB0\xF8\x33\x4C\x47\x4C\xE3\x75\x88\x10\x97\xAC\xB0\x38\x15\x91\xC6\x29\x96\xCC\x21\xC0\x6D\x3C\xA5\x74\xCF\xD8\x82\xA5\x39\xC3\x65\xE3\x42\x70\xBB\x22\x90\xE3\x7D\xDB\x35\x76\xE1\xA0\xB5\xDA\x9F\x70\x6E\x93\x1A\x30\x39\x1D\x30\xDB\x2E\xE3\x7C\xB2\x91\xB2\xD1\x37\x29\xFA\xB9\xD6\x17\x5C\x47\x4F\xE3\x1D\x38\xEB\x9F\xD5\x7B\x95\xA8\x28\x9E\x15\x4A\xD1\xD1\xD0\x2B\x00\x97\xA0\xE2\x92\x36\x2B\x63\xAC\x58\x01\x6B\x33\x29\x50\x86\x83\xF1\x01\x48", - ["CN=NetLock Expressz (Class C) Tanusitvanykiado,OU=Tanusitvanykiadok,O=NetLock Halozatbiztonsagi Kft.,L=Budapest,C=HU"] = "\x30\x82\x05\x4F\x30\x82\x04\xB8\xA0\x03\x02\x01\x02\x02\x01\x68\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x30\x81\x9B\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x34\x30\x32\x06\x03\x55\x04\x03\x13\x2B\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x45\x78\x70\x72\x65\x73\x73\x7A\x20\x28\x43\x6C\x61\x73\x73\x20\x43\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x1E\x17\x0D\x39\x39\x30\x32\x32\x35\x31\x34\x30\x38\x31\x31\x5A\x17\x0D\x31\x39\x30\x32\x32\x30\x31\x34\x30\x38\x31\x31\x5A\x30\x81\x9B\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x48\x55\x31\x11\x30\x0F\x06\x03\x55\x04\x07\x13\x08\x42\x75\x64\x61\x70\x65\x73\x74\x31\x27\x30\x25\x06\x03\x55\x04\x0A\x13\x1E\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x48\x61\x6C\x6F\x7A\x61\x74\x62\x69\x7A\x74\x6F\x6E\x73\x61\x67\x69\x20\x4B\x66\x74\x2E\x31\x1A\x30\x18\x06\x03\x55\x04\x0B\x13\x11\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x6B\x31\x34\x30\x32\x06\x03\x55\x04\x03\x13\x2B\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x45\x78\x70\x72\x65\x73\x73\x7A\x20\x28\x43\x6C\x61\x73\x73\x20\x43\x29\x20\x54\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x6B\x69\x61\x64\x6F\x30\x81\x9F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x81\x8D\x00\x30\x81\x89\x02\x81\x81\x00\xEB\xEC\xB0\x6C\x61\x8A\x23\x25\xAF\x60\x20\xE3\xD9\x9F\xFC\x93\x0B\xDB\x5D\x8D\xB0\xA1\xB3\x40\x3A\x82\xCE\xFD\x75\xE0\x78\x32\x03\x86\x5A\x86\x95\x91\xED\x53\xFA\x9D\x40\xFC\xE6\xE8\xDD\xD9\x5B\x7A\x03\xBD\x5D\xF3\x3B\x0C\xC3\x51\x79\x9B\xAD\x55\xA0\xE9\xD0\x03\x10\xAF\x0A\xBA\x14\x42\xD9\x52\x26\x11\x22\xC7\xD2\x20\xCC\x82\xA4\x9A\xA9\xFE\xB8\x81\x76\x9D\x6A\xB7\xD2\x36\x75\x3E\xB1\x86\x09\xF6\x6E\x6D\x7E\x4E\xB7\x7A\xEC\xAE\x71\x84\xF6\x04\x33\x08\x25\x32\xEB\x74\xAC\x16\x44\xC6\xE4\x40\x93\x1D\x7F\xAD\x02\x03\x01\x00\x01\xA3\x82\x02\x9F\x30\x82\x02\x9B\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x04\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x00\x06\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x82\x02\x60\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x0D\x04\x82\x02\x51\x16\x82\x02\x4D\x46\x49\x47\x59\x45\x4C\x45\x4D\x21\x20\x45\x7A\x65\x6E\x20\x74\x61\x6E\x75\x73\x69\x74\x76\x61\x6E\x79\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x41\x6C\x74\x61\x6C\x61\x6E\x6F\x73\x20\x53\x7A\x6F\x6C\x67\x61\x6C\x74\x61\x74\x61\x73\x69\x20\x46\x65\x6C\x74\x65\x74\x65\x6C\x65\x69\x62\x65\x6E\x20\x6C\x65\x69\x72\x74\x20\x65\x6C\x6A\x61\x72\x61\x73\x6F\x6B\x20\x61\x6C\x61\x70\x6A\x61\x6E\x20\x6B\x65\x73\x7A\x75\x6C\x74\x2E\x20\x41\x20\x68\x69\x74\x65\x6C\x65\x73\x69\x74\x65\x73\x20\x66\x6F\x6C\x79\x61\x6D\x61\x74\x61\x74\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x74\x65\x72\x6D\x65\x6B\x66\x65\x6C\x65\x6C\x6F\x73\x73\x65\x67\x2D\x62\x69\x7A\x74\x6F\x73\x69\x74\x61\x73\x61\x20\x76\x65\x64\x69\x2E\x20\x41\x20\x64\x69\x67\x69\x74\x61\x6C\x69\x73\x20\x61\x6C\x61\x69\x72\x61\x73\x20\x65\x6C\x66\x6F\x67\x61\x64\x61\x73\x61\x6E\x61\x6B\x20\x66\x65\x6C\x74\x65\x74\x65\x6C\x65\x20\x61\x7A\x20\x65\x6C\x6F\x69\x72\x74\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x69\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6D\x65\x67\x74\x65\x74\x65\x6C\x65\x2E\x20\x41\x7A\x20\x65\x6C\x6A\x61\x72\x61\x73\x20\x6C\x65\x69\x72\x61\x73\x61\x20\x6D\x65\x67\x74\x61\x6C\x61\x6C\x68\x61\x74\x6F\x20\x61\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x4B\x66\x74\x2E\x20\x49\x6E\x74\x65\x72\x6E\x65\x74\x20\x68\x6F\x6E\x6C\x61\x70\x6A\x61\x6E\x20\x61\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x63\x69\x6D\x65\x6E\x20\x76\x61\x67\x79\x20\x6B\x65\x72\x68\x65\x74\x6F\x20\x61\x7A\x20\x65\x6C\x6C\x65\x6E\x6F\x72\x7A\x65\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x20\x65\x2D\x6D\x61\x69\x6C\x20\x63\x69\x6D\x65\x6E\x2E\x20\x49\x4D\x50\x4F\x52\x54\x41\x4E\x54\x21\x20\x54\x68\x65\x20\x69\x73\x73\x75\x61\x6E\x63\x65\x20\x61\x6E\x64\x20\x74\x68\x65\x20\x75\x73\x65\x20\x6F\x66\x20\x74\x68\x69\x73\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x69\x73\x20\x73\x75\x62\x6A\x65\x63\x74\x20\x74\x6F\x20\x74\x68\x65\x20\x4E\x65\x74\x4C\x6F\x63\x6B\x20\x43\x50\x53\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x61\x74\x20\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2F\x64\x6F\x63\x73\x20\x6F\x72\x20\x62\x79\x20\x65\x2D\x6D\x61\x69\x6C\x20\x61\x74\x20\x63\x70\x73\x40\x6E\x65\x74\x6C\x6F\x63\x6B\x2E\x6E\x65\x74\x2E\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04\x05\x00\x03\x81\x81\x00\x10\xAD\x7F\xD7\x0C\x32\x80\x0A\xD8\x86\xF1\x79\x98\xB5\xAD\xD4\xCD\xB3\x36\xC4\x96\x48\xC1\x5C\xCD\x9A\xD9\x05\x2E\x9F\xBE\x50\xEB\xF4\x26\x14\x10\x2D\xD4\x66\x17\xF8\x9E\xC1\x27\xFD\xF1\xED\xE4\x7B\x4B\xA0\x6C\xB5\xAB\x9A\x57\x70\xA6\xED\xA0\xA4\xED\x2E\xF5\xFD\xFC\xBD\xFE\x4D\x37\x08\x0C\xBC\xE3\x96\x83\x22\xF5\x49\x1B\x7F\x4B\x2B\xB4\x54\xC1\x80\x7C\x99\x4E\x1D\xD0\x8C\xEE\xD0\xAC\xE5\x92\xFA\x75\x56\xFE\x64\xA0\x13\x8F\xB8\xB8\x16\x9D\x61\x05\x67\x80\xC8\xD0\xD8\xA5\x07\x02\x34\x98\x04\x8D\x33\x04\xD4", ["CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US"] = "\x30\x82\x04\x30\x30\x82\x03\x18\xA0\x03\x02\x01\x02\x02\x10\x50\x94\x6C\xEC\x18\xEA\xD5\x9C\x4D\xD5\x97\xEF\x75\x8F\xA0\xAD\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x1E\x30\x1C\x06\x03\x55\x04\x0B\x13\x15\x77\x77\x77\x2E\x78\x72\x61\x6D\x70\x73\x65\x63\x75\x72\x69\x74\x79\x2E\x63\x6F\x6D\x31\x24\x30\x22\x06\x03\x55\x04\x0A\x13\x1B\x58\x52\x61\x6D\x70\x20\x53\x65\x63\x75\x72\x69\x74\x79\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x49\x6E\x63\x31\x2D\x30\x2B\x06\x03\x55\x04\x03\x13\x24\x58\x52\x61\x6D\x70\x20\x47\x6C\x6F\x62\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x34\x31\x31\x30\x31\x31\x37\x31\x34\x30\x34\x5A\x17\x0D\x33\x35\x30\x31\x30\x31\x30\x35\x33\x37\x31\x39\x5A\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x1E\x30\x1C\x06\x03\x55\x04\x0B\x13\x15\x77\x77\x77\x2E\x78\x72\x61\x6D\x70\x73\x65\x63\x75\x72\x69\x74\x79\x2E\x63\x6F\x6D\x31\x24\x30\x22\x06\x03\x55\x04\x0A\x13\x1B\x58\x52\x61\x6D\x70\x20\x53\x65\x63\x75\x72\x69\x74\x79\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x49\x6E\x63\x31\x2D\x30\x2B\x06\x03\x55\x04\x03\x13\x24\x58\x52\x61\x6D\x70\x20\x47\x6C\x6F\x62\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\x98\x24\x1E\xBD\x15\xB4\xBA\xDF\xC7\x8C\xA5\x27\xB6\x38\x0B\x69\xF3\xB6\x4E\xA8\x2C\x2E\x21\x1D\x5C\x44\xDF\x21\x5D\x7E\x23\x74\xFE\x5E\x7E\xB4\x4A\xB7\xA6\xAD\x1F\xAE\xE0\x06\x16\xE2\x9B\x5B\xD9\x67\x74\x6B\x5D\x80\x8F\x29\x9D\x86\x1B\xD9\x9C\x0D\x98\x6D\x76\x10\x28\x58\xE4\x65\xB0\x7F\x4A\x98\x79\x9F\xE0\xC3\x31\x7E\x80\x2B\xB5\x8C\xC0\x40\x3B\x11\x86\xD0\xCB\xA2\x86\x36\x60\xA4\xD5\x30\x82\x6D\xD9\x6E\xD0\x0F\x12\x04\x33\x97\x5F\x4F\x61\x5A\xF0\xE4\xF9\x91\xAB\xE7\x1D\x3B\xBC\xE8\xCF\xF4\x6B\x2D\x34\x7C\xE2\x48\x61\x1C\x8E\xF3\x61\x44\xCC\x6F\xA0\x4A\xA9\x94\xB0\x4D\xDA\xE7\xA9\x34\x7A\x72\x38\xA8\x41\xCC\x3C\x94\x11\x7D\xEB\xC8\xA6\x8C\xB7\x86\xCB\xCA\x33\x3B\xD9\x3D\x37\x8B\xFB\x7A\x3E\x86\x2C\xE7\x73\xD7\x0A\x57\xAC\x64\x9B\x19\xEB\xF4\x0F\x04\x08\x8A\xAC\x03\x17\x19\x64\xF4\x5A\x25\x22\x8D\x34\x2C\xB2\xF6\x68\x1D\x12\x6D\xD3\x8A\x1E\x14\xDA\xC4\x8F\xA6\xE2\x23\x85\xD5\x7A\x0D\xBD\x6A\xE0\xE9\xEC\xEC\x17\xBB\x42\x1B\x67\xAA\x25\xED\x45\x83\x21\xFC\xC1\xC9\x7C\xD5\x62\x3E\xFA\xF2\xC5\x2D\xD3\xFD\xD4\x65\x02\x03\x01\x00\x01\xA3\x81\x9F\x30\x81\x9C\x30\x13\x06\x09\x2B\x06\x01\x04\x01\x82\x37\x14\x02\x04\x06\x1E\x04\x00\x43\x00\x41\x30\x0B\x06\x03\x55\x1D\x0F\x04\x04\x03\x02\x01\x86\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xC6\x4F\xA2\x3D\x06\x63\x84\x09\x9C\xCE\x62\xE4\x04\xAC\x8D\x5C\xB5\xE9\xB6\x1B\x30\x36\x06\x03\x55\x1D\x1F\x04\x2F\x30\x2D\x30\x2B\xA0\x29\xA0\x27\x86\x25\x68\x74\x74\x70\x3A\x2F\x2F\x63\x72\x6C\x2E\x78\x72\x61\x6D\x70\x73\x65\x63\x75\x72\x69\x74\x79\x2E\x63\x6F\x6D\x2F\x58\x47\x43\x41\x2E\x63\x72\x6C\x30\x10\x06\x09\x2B\x06\x01\x04\x01\x82\x37\x15\x01\x04\x03\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x91\x15\x39\x03\x01\x1B\x67\xFB\x4A\x1C\xF9\x0A\x60\x5B\xA1\xDA\x4D\x97\x62\xF9\x24\x53\x27\xD7\x82\x64\x4E\x90\x2E\xC3\x49\x1B\x2B\x9A\xDC\xFC\xA8\x78\x67\x35\xF1\x1D\xF0\x11\xBD\xB7\x48\xE3\x10\xF6\x0D\xDF\x3F\xD2\xC9\xB6\xAA\x55\xA4\x48\xBA\x02\xDB\xDE\x59\x2E\x15\x5B\x3B\x9D\x16\x7D\x47\xD7\x37\xEA\x5F\x4D\x76\x12\x36\xBB\x1F\xD7\xA1\x81\x04\x46\x20\xA3\x2C\x6D\xA9\x9E\x01\x7E\x3F\x29\xCE\x00\x93\xDF\xFD\xC9\x92\x73\x89\x89\x64\x9E\xE7\x2B\xE4\x1C\x91\x2C\xD2\xB9\xCE\x7D\xCE\x6F\x31\x99\xD3\xE6\xBE\xD2\x1E\x90\xF0\x09\x14\x79\x5C\x23\xAB\x4D\xD2\xDA\x21\x1F\x4D\x99\x79\x9D\xE1\xCF\x27\x9F\x10\x9B\x1C\x88\x0D\xB0\x8A\x64\x41\x31\xB8\x0E\x6C\x90\x24\xA4\x9B\x5C\x71\x8F\xBA\xBB\x7E\x1C\x1B\xDB\x6A\x80\x0F\x21\xBC\xE9\xDB\xA6\xB7\x40\xF4\xB2\x8B\xA9\xB1\xE4\xEF\x9A\x1A\xD0\x3D\x69\x99\xEE\xA8\x28\xA3\xE1\x3C\xB3\xF0\xB2\x11\x9C\xCF\x7C\x40\xE6\xDD\xE7\x43\x7D\xA2\xD8\x3A\xB5\xA9\x8D\xF2\x34\x99\xC4\xD4\x10\xE1\x06\xFD\x09\x84\x10\x3B\xEE\xC4\x4C\xF4\xEC\x27\x7C\x42\xC2\x74\x7C\x82\x8A\x09\xC9\xB4\x03\x25\xBC", ["OU=Go Daddy Class 2 Certification Authority,O=The Go Daddy Group\, Inc.,C=US"] = "\x30\x82\x04\x00\x30\x82\x02\xE8\xA0\x03\x02\x01\x02\x02\x01\x00\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x63\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x21\x30\x1F\x06\x03\x55\x04\x0A\x13\x18\x54\x68\x65\x20\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x47\x72\x6F\x75\x70\x2C\x20\x49\x6E\x63\x2E\x31\x31\x30\x2F\x06\x03\x55\x04\x0B\x13\x28\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x34\x30\x36\x32\x39\x31\x37\x30\x36\x32\x30\x5A\x17\x0D\x33\x34\x30\x36\x32\x39\x31\x37\x30\x36\x32\x30\x5A\x30\x63\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x21\x30\x1F\x06\x03\x55\x04\x0A\x13\x18\x54\x68\x65\x20\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x47\x72\x6F\x75\x70\x2C\x20\x49\x6E\x63\x2E\x31\x31\x30\x2F\x06\x03\x55\x04\x0B\x13\x28\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x01\x20\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0D\x00\x30\x82\x01\x08\x02\x82\x01\x01\x00\xDE\x9D\xD7\xEA\x57\x18\x49\xA1\x5B\xEB\xD7\x5F\x48\x86\xEA\xBE\xDD\xFF\xE4\xEF\x67\x1C\xF4\x65\x68\xB3\x57\x71\xA0\x5E\x77\xBB\xED\x9B\x49\xE9\x70\x80\x3D\x56\x18\x63\x08\x6F\xDA\xF2\xCC\xD0\x3F\x7F\x02\x54\x22\x54\x10\xD8\xB2\x81\xD4\xC0\x75\x3D\x4B\x7F\xC7\x77\xC3\x3E\x78\xAB\x1A\x03\xB5\x20\x6B\x2F\x6A\x2B\xB1\xC5\x88\x7E\xC4\xBB\x1E\xB0\xC1\xD8\x45\x27\x6F\xAA\x37\x58\xF7\x87\x26\xD7\xD8\x2D\xF6\xA9\x17\xB7\x1F\x72\x36\x4E\xA6\x17\x3F\x65\x98\x92\xDB\x2A\x6E\x5D\xA2\xFE\x88\xE0\x0B\xDE\x7F\xE5\x8D\x15\xE1\xEB\xCB\x3A\xD5\xE2\x12\xA2\x13\x2D\xD8\x8E\xAF\x5F\x12\x3D\xA0\x08\x05\x08\xB6\x5C\xA5\x65\x38\x04\x45\x99\x1E\xA3\x60\x60\x74\xC5\x41\xA5\x72\x62\x1B\x62\xC5\x1F\x6F\x5F\x1A\x42\xBE\x02\x51\x65\xA8\xAE\x23\x18\x6A\xFC\x78\x03\xA9\x4D\x7F\x80\xC3\xFA\xAB\x5A\xFC\xA1\x40\xA4\xCA\x19\x16\xFE\xB2\xC8\xEF\x5E\x73\x0D\xEE\x77\xBD\x9A\xF6\x79\x98\xBC\xB1\x07\x67\xA2\x15\x0D\xDD\xA0\x58\xC6\x44\x7B\x0A\x3E\x62\x28\x5F\xBA\x41\x07\x53\x58\xCF\x11\x7E\x38\x74\xC5\xF8\xFF\xB5\x69\x90\x8F\x84\x74\xEA\x97\x1B\xAF\x02\x01\x03\xA3\x81\xC0\x30\x81\xBD\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xD2\xC4\xB0\xD2\x91\xD4\x4C\x11\x71\xB3\x61\xCB\x3D\xA1\xFE\xDD\xA8\x6A\xD4\xE3\x30\x81\x8D\x06\x03\x55\x1D\x23\x04\x81\x85\x30\x81\x82\x80\x14\xD2\xC4\xB0\xD2\x91\xD4\x4C\x11\x71\xB3\x61\xCB\x3D\xA1\xFE\xDD\xA8\x6A\xD4\xE3\xA1\x67\xA4\x65\x30\x63\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x21\x30\x1F\x06\x03\x55\x04\x0A\x13\x18\x54\x68\x65\x20\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x47\x72\x6F\x75\x70\x2C\x20\x49\x6E\x63\x2E\x31\x31\x30\x2F\x06\x03\x55\x04\x0B\x13\x28\x47\x6F\x20\x44\x61\x64\x64\x79\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x82\x01\x00\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x32\x4B\xF3\xB2\xCA\x3E\x91\xFC\x12\xC6\xA1\x07\x8C\x8E\x77\xA0\x33\x06\x14\x5C\x90\x1E\x18\xF7\x08\xA6\x3D\x0A\x19\xF9\x87\x80\x11\x6E\x69\xE4\x96\x17\x30\xFF\x34\x91\x63\x72\x38\xEE\xCC\x1C\x01\xA3\x1D\x94\x28\xA4\x31\xF6\x7A\xC4\x54\xD7\xF6\xE5\x31\x58\x03\xA2\xCC\xCE\x62\xDB\x94\x45\x73\xB5\xBF\x45\xC9\x24\xB5\xD5\x82\x02\xAD\x23\x79\x69\x8D\xB8\xB6\x4D\xCE\xCF\x4C\xCA\x33\x23\xE8\x1C\x88\xAA\x9D\x8B\x41\x6E\x16\xC9\x20\xE5\x89\x9E\xCD\x3B\xDA\x70\xF7\x7E\x99\x26\x20\x14\x54\x25\xAB\x6E\x73\x85\xE6\x9B\x21\x9D\x0A\x6C\x82\x0E\xA8\xF8\xC2\x0C\xFA\x10\x1E\x6C\x96\xEF\x87\x0D\xC4\x0F\x61\x8B\xAD\xEE\x83\x2B\x95\xF8\x8E\x92\x84\x72\x39\xEB\x20\xEA\x83\xED\x83\xCD\x97\x6E\x08\xBC\xEB\x4E\x26\xB6\x73\x2B\xE4\xD3\xF6\x4C\xFE\x26\x71\xE2\x61\x11\x74\x4A\xFF\x57\x1A\x87\x0F\x75\x48\x2E\xCF\x51\x69\x17\xA0\x02\x12\x61\x95\xD5\xD1\x40\xB2\x10\x4C\xEE\xC4\xAC\x10\x43\xA6\xA5\x9E\x0A\xD5\x95\x62\x9A\x0D\xCF\x88\x82\xC5\x32\x0C\xE4\x2B\x9F\x45\xE6\x0D\x9F\x28\x9C\xB1\xB9\x2A\x5A\x57\xAD\x37\x0F\xAF\x1D\x7F\xDB\xBD\x9F", ["OU=Starfield Class 2 Certification Authority,O=Starfield Technologies\, Inc.,C=US"] = "\x30\x82\x04\x0F\x30\x82\x02\xF7\xA0\x03\x02\x01\x02\x02\x01\x00\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x68\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x25\x30\x23\x06\x03\x55\x04\x0A\x13\x1C\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x54\x65\x63\x68\x6E\x6F\x6C\x6F\x67\x69\x65\x73\x2C\x20\x49\x6E\x63\x2E\x31\x32\x30\x30\x06\x03\x55\x04\x0B\x13\x29\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x34\x30\x36\x32\x39\x31\x37\x33\x39\x31\x36\x5A\x17\x0D\x33\x34\x30\x36\x32\x39\x31\x37\x33\x39\x31\x36\x5A\x30\x68\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x25\x30\x23\x06\x03\x55\x04\x0A\x13\x1C\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x54\x65\x63\x68\x6E\x6F\x6C\x6F\x67\x69\x65\x73\x2C\x20\x49\x6E\x63\x2E\x31\x32\x30\x30\x06\x03\x55\x04\x0B\x13\x29\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x01\x20\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0D\x00\x30\x82\x01\x08\x02\x82\x01\x01\x00\xB7\x32\xC8\xFE\xE9\x71\xA6\x04\x85\xAD\x0C\x11\x64\xDF\xCE\x4D\xEF\xC8\x03\x18\x87\x3F\xA1\xAB\xFB\x3C\xA6\x9F\xF0\xC3\xA1\xDA\xD4\xD8\x6E\x2B\x53\x90\xFB\x24\xA4\x3E\x84\xF0\x9E\xE8\x5F\xEC\xE5\x27\x44\xF5\x28\xA6\x3F\x7B\xDE\xE0\x2A\xF0\xC8\xAF\x53\x2F\x9E\xCA\x05\x01\x93\x1E\x8F\x66\x1C\x39\xA7\x4D\xFA\x5A\xB6\x73\x04\x25\x66\xEB\x77\x7F\xE7\x59\xC6\x4A\x99\x25\x14\x54\xEB\x26\xC7\xF3\x7F\x19\xD5\x30\x70\x8F\xAF\xB0\x46\x2A\xFF\xAD\xEB\x29\xED\xD7\x9F\xAA\x04\x87\xA3\xD4\xF9\x89\xA5\x34\x5F\xDB\x43\x91\x82\x36\xD9\x66\x3C\xB1\xB8\xB9\x82\xFD\x9C\x3A\x3E\x10\xC8\x3B\xEF\x06\x65\x66\x7A\x9B\x19\x18\x3D\xFF\x71\x51\x3C\x30\x2E\x5F\xBE\x3D\x77\x73\xB2\x5D\x06\x6C\xC3\x23\x56\x9A\x2B\x85\x26\x92\x1C\xA7\x02\xB3\xE4\x3F\x0D\xAF\x08\x79\x82\xB8\x36\x3D\xEA\x9C\xD3\x35\xB3\xBC\x69\xCA\xF5\xCC\x9D\xE8\xFD\x64\x8D\x17\x80\x33\x6E\x5E\x4A\x5D\x99\xC9\x1E\x87\xB4\x9D\x1A\xC0\xD5\x6E\x13\x35\x23\x5E\xDF\x9B\x5F\x3D\xEF\xD6\xF7\x76\xC2\xEA\x3E\xBB\x78\x0D\x1C\x42\x67\x6B\x04\xD8\xF8\xD6\xDA\x6F\x8B\xF2\x44\xA0\x01\xAB\x02\x01\x03\xA3\x81\xC5\x30\x81\xC2\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xBF\x5F\xB7\xD1\xCE\xDD\x1F\x86\xF4\x5B\x55\xAC\xDC\xD7\x10\xC2\x0E\xA9\x88\xE7\x30\x81\x92\x06\x03\x55\x1D\x23\x04\x81\x8A\x30\x81\x87\x80\x14\xBF\x5F\xB7\xD1\xCE\xDD\x1F\x86\xF4\x5B\x55\xAC\xDC\xD7\x10\xC2\x0E\xA9\x88\xE7\xA1\x6C\xA4\x6A\x30\x68\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x25\x30\x23\x06\x03\x55\x04\x0A\x13\x1C\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x54\x65\x63\x68\x6E\x6F\x6C\x6F\x67\x69\x65\x73\x2C\x20\x49\x6E\x63\x2E\x31\x32\x30\x30\x06\x03\x55\x04\x0B\x13\x29\x53\x74\x61\x72\x66\x69\x65\x6C\x64\x20\x43\x6C\x61\x73\x73\x20\x32\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x82\x01\x00\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x05\x9D\x3F\x88\x9D\xD1\xC9\x1A\x55\xA1\xAC\x69\xF3\xF3\x59\xDA\x9B\x01\x87\x1A\x4F\x57\xA9\xA1\x79\x09\x2A\xDB\xF7\x2F\xB2\x1E\xCC\xC7\x5E\x6A\xD8\x83\x87\xA1\x97\xEF\x49\x35\x3E\x77\x06\x41\x58\x62\xBF\x8E\x58\xB8\x0A\x67\x3F\xEC\xB3\xDD\x21\x66\x1F\xC9\x54\xFA\x72\xCC\x3D\x4C\x40\xD8\x81\xAF\x77\x9E\x83\x7A\xBB\xA2\xC7\xF5\x34\x17\x8E\xD9\x11\x40\xF4\xFC\x2C\x2A\x4D\x15\x7F\xA7\x62\x5D\x2E\x25\xD3\x00\x0B\x20\x1A\x1D\x68\xF9\x17\xB8\xF4\xBD\x8B\xED\x28\x59\xDD\x4D\x16\x8B\x17\x83\xC8\xB2\x65\xC7\x2D\x7A\xA5\xAA\xBC\x53\x86\x6D\xDD\x57\xA4\xCA\xF8\x20\x41\x0B\x68\xF0\xF4\xFB\x74\xBE\x56\x5D\x7A\x79\xF5\xF9\x1D\x85\xE3\x2D\x95\xBE\xF5\x71\x90\x43\xCC\x8D\x1F\x9A\x00\x0A\x87\x29\xE9\x55\x22\x58\x00\x23\xEA\xE3\x12\x43\x29\x5B\x47\x08\xDD\x8C\x41\x6A\x65\x06\xA8\xE5\x21\xAA\x41\xB4\x95\x21\x95\xB9\x7D\xD1\x34\xAB\x13\xD6\xAD\xBC\xDC\xE2\x3D\x39\xCD\xBD\x3E\x75\x70\xA1\x18\x59\x03\xC9\x22\xB4\x8F\x9C\xD5\x5E\x2A\xD7\xA5\xB6\xD4\x0A\x6D\xF8\xB7\x40\x11\x46\x9A\x1F\x79\x0E\x62\xBF\x0F\x97\xEC\xE0\x2F\x1F\x17\x94", ["CN=StartCom Certification Authority,OU=Secure Digital Certificate Signing,O=StartCom Ltd.,C=IL"] = "\x30\x82\x07\xC9\x30\x82\x05\xB1\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x7D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x49\x4C\x31\x16\x30\x14\x06\x03\x55\x04\x0A\x13\x0D\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x4C\x74\x64\x2E\x31\x2B\x30\x29\x06\x03\x55\x04\x0B\x13\x22\x53\x65\x63\x75\x72\x65\x20\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x69\x67\x6E\x69\x6E\x67\x31\x29\x30\x27\x06\x03\x55\x04\x03\x13\x20\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x36\x30\x39\x31\x37\x31\x39\x34\x36\x33\x36\x5A\x17\x0D\x33\x36\x30\x39\x31\x37\x31\x39\x34\x36\x33\x36\x5A\x30\x7D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x49\x4C\x31\x16\x30\x14\x06\x03\x55\x04\x0A\x13\x0D\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x4C\x74\x64\x2E\x31\x2B\x30\x29\x06\x03\x55\x04\x0B\x13\x22\x53\x65\x63\x75\x72\x65\x20\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x69\x67\x6E\x69\x6E\x67\x31\x29\x30\x27\x06\x03\x55\x04\x03\x13\x20\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xC1\x88\xDB\x09\xBC\x6C\x46\x7C\x78\x9F\x95\x7B\xB5\x33\x90\xF2\x72\x62\xD6\xC1\x36\x20\x22\x24\x5E\xCE\xE9\x77\xF2\x43\x0A\xA2\x06\x64\xA4\xCC\x8E\x36\xF8\x38\xE6\x23\xF0\x6E\x6D\xB1\x3C\xDD\x72\xA3\x85\x1C\xA1\xD3\x3D\xB4\x33\x2B\xD3\x2F\xAF\xFE\xEA\xB0\x41\x59\x67\xB6\xC4\x06\x7D\x0A\x9E\x74\x85\xD6\x79\x4C\x80\x37\x7A\xDF\x39\x05\x52\x59\xF7\xF4\x1B\x46\x43\xA4\xD2\x85\x85\xD2\xC3\x71\xF3\x75\x62\x34\xBA\x2C\x8A\x7F\x1E\x8F\xEE\xED\x34\xD0\x11\xC7\x96\xCD\x52\x3D\xBA\x33\xD6\xDD\x4D\xDE\x0B\x3B\x4A\x4B\x9F\xC2\x26\x2F\xFA\xB5\x16\x1C\x72\x35\x77\xCA\x3C\x5D\xE6\xCA\xE1\x26\x8B\x1A\x36\x76\x5C\x01\xDB\x74\x14\x25\xFE\xED\xB5\xA0\x88\x0F\xDD\x78\xCA\x2D\x1F\x07\x97\x30\x01\x2D\x72\x79\xFA\x46\xD6\x13\x2A\xA8\xB9\xA6\xAB\x83\x49\x1D\xE5\xF2\xEF\xDD\xE4\x01\x8E\x18\x0A\x8F\x63\x53\x16\x85\x62\xA9\x0E\x19\x3A\xCC\xB5\x66\xA6\xC2\x6B\x74\x07\xE4\x2B\xE1\x76\x3E\xB4\x6D\xD8\xF6\x44\xE1\x73\x62\x1F\x3B\xC4\xBE\xA0\x53\x56\x25\x6C\x51\x09\xF7\xAA\xAB\xCA\xBF\x76\xFD\x6D\x9B\xF3\x9D\xDB\xBF\x3D\x66\xBC\x0C\x56\xAA\xAF\x98\x48\x95\x3A\x4B\xDF\xA7\x58\x50\xD9\x38\x75\xA9\x5B\xEA\x43\x0C\x02\xFF\x99\xEB\xE8\x6C\x4D\x70\x5B\x29\x65\x9C\xDD\xAA\x5D\xCC\xAF\x01\x31\xEC\x0C\xEB\xD2\x8D\xE8\xEA\x9C\x7B\xE6\x6E\xF7\x27\x66\x0C\x1A\x48\xD7\x6E\x42\xE3\x3F\xDE\x21\x3E\x7B\xE1\x0D\x70\xFB\x63\xAA\xA8\x6C\x1A\x54\xB4\x5C\x25\x7A\xC9\xA2\xC9\x8B\x16\xA6\xBB\x2C\x7E\x17\x5E\x05\x4D\x58\x6E\x12\x1D\x01\xEE\x12\x10\x0D\xC6\x32\x7F\x18\xFF\xFC\xF4\xFA\xCD\x6E\x91\xE8\x36\x49\xBE\x1A\x48\x69\x8B\xC2\x96\x4D\x1A\x12\xB2\x69\x17\xC1\x0A\x90\xD6\xFA\x79\x22\x48\xBF\xBA\x7B\x69\xF8\x70\xC7\xFA\x7A\x37\xD8\xD8\x0D\xD2\x76\x4F\x57\xFF\x90\xB7\xE3\x91\xD2\xDD\xEF\xC2\x60\xB7\x67\x3A\xDD\xFE\xAA\x9C\xF0\xD4\x8B\x7F\x72\x22\xCE\xC6\x9F\x97\xB6\xF8\xAF\x8A\xA0\x10\xA8\xD9\xFB\x18\xC6\xB6\xB5\x5C\x52\x3C\x89\xB6\x19\x2A\x73\x01\x0A\x0F\x03\xB3\x12\x60\xF2\x7A\x2F\x81\xDB\xA3\x6E\xFF\x26\x30\x97\xF5\x8B\xDD\x89\x57\xB6\xAD\x3D\xB3\xAF\x2B\xC5\xB7\x76\x02\xF0\xA5\xD6\x2B\x9A\x86\x14\x2A\x72\xF6\xE3\x33\x8C\x5D\x09\x4B\x13\xDF\xBB\x8C\x74\x13\x52\x4B\x02\x03\x01\x00\x01\xA3\x82\x02\x52\x30\x82\x02\x4E\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x0B\x06\x03\x55\x1D\x0F\x04\x04\x03\x02\x01\xAE\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x4E\x0B\xEF\x1A\xA4\x40\x5B\xA5\x17\x69\x87\x30\xCA\x34\x68\x43\xD0\x41\xAE\xF2\x30\x64\x06\x03\x55\x1D\x1F\x04\x5D\x30\x5B\x30\x2C\xA0\x2A\xA0\x28\x86\x26\x68\x74\x74\x70\x3A\x2F\x2F\x63\x65\x72\x74\x2E\x73\x74\x61\x72\x74\x63\x6F\x6D\x2E\x6F\x72\x67\x2F\x73\x66\x73\x63\x61\x2D\x63\x72\x6C\x2E\x63\x72\x6C\x30\x2B\xA0\x29\xA0\x27\x86\x25\x68\x74\x74\x70\x3A\x2F\x2F\x63\x72\x6C\x2E\x73\x74\x61\x72\x74\x63\x6F\x6D\x2E\x6F\x72\x67\x2F\x73\x66\x73\x63\x61\x2D\x63\x72\x6C\x2E\x63\x72\x6C\x30\x82\x01\x5D\x06\x03\x55\x1D\x20\x04\x82\x01\x54\x30\x82\x01\x50\x30\x82\x01\x4C\x06\x0B\x2B\x06\x01\x04\x01\x81\xB5\x37\x01\x01\x01\x30\x82\x01\x3B\x30\x2F\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x23\x68\x74\x74\x70\x3A\x2F\x2F\x63\x65\x72\x74\x2E\x73\x74\x61\x72\x74\x63\x6F\x6D\x2E\x6F\x72\x67\x2F\x70\x6F\x6C\x69\x63\x79\x2E\x70\x64\x66\x30\x35\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x29\x68\x74\x74\x70\x3A\x2F\x2F\x63\x65\x72\x74\x2E\x73\x74\x61\x72\x74\x63\x6F\x6D\x2E\x6F\x72\x67\x2F\x69\x6E\x74\x65\x72\x6D\x65\x64\x69\x61\x74\x65\x2E\x70\x64\x66\x30\x81\xD0\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x02\x30\x81\xC3\x30\x27\x16\x20\x53\x74\x61\x72\x74\x20\x43\x6F\x6D\x6D\x65\x72\x63\x69\x61\x6C\x20\x28\x53\x74\x61\x72\x74\x43\x6F\x6D\x29\x20\x4C\x74\x64\x2E\x30\x03\x02\x01\x01\x1A\x81\x97\x4C\x69\x6D\x69\x74\x65\x64\x20\x4C\x69\x61\x62\x69\x6C\x69\x74\x79\x2C\x20\x72\x65\x61\x64\x20\x74\x68\x65\x20\x73\x65\x63\x74\x69\x6F\x6E\x20\x2A\x4C\x65\x67\x61\x6C\x20\x4C\x69\x6D\x69\x74\x61\x74\x69\x6F\x6E\x73\x2A\x20\x6F\x66\x20\x74\x68\x65\x20\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x20\x50\x6F\x6C\x69\x63\x79\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x61\x74\x20\x68\x74\x74\x70\x3A\x2F\x2F\x63\x65\x72\x74\x2E\x73\x74\x61\x72\x74\x63\x6F\x6D\x2E\x6F\x72\x67\x2F\x70\x6F\x6C\x69\x63\x79\x2E\x70\x64\x66\x30\x11\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x01\x04\x04\x03\x02\x00\x07\x30\x38\x06\x09\x60\x86\x48\x01\x86\xF8\x42\x01\x0D\x04\x2B\x16\x29\x53\x74\x61\x72\x74\x43\x6F\x6D\x20\x46\x72\x65\x65\x20\x53\x53\x4C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\x16\x6C\x99\xF4\x66\x0C\x34\xF5\xD0\x85\x5E\x7D\x0A\xEC\xDA\x10\x4E\x38\x1C\x5E\xDF\xA6\x25\x05\x4B\x91\x32\xC1\xE8\x3B\xF1\x3D\xDD\x44\x09\x5B\x07\x49\x8A\x29\xCB\x66\x02\xB7\xB1\x9A\xF7\x25\x98\x09\x3C\x8E\x1B\xE1\xDD\x36\x87\x2B\x4B\xBB\x68\xD3\x39\x66\x3D\xA0\x26\xC7\xF2\x39\x91\x1D\x51\xAB\x82\x7B\x7E\xD5\xCE\x5A\xE4\xE2\x03\x57\x70\x69\x97\x08\xF9\x5E\x58\xA6\x0A\xDF\x8C\x06\x9A\x45\x16\x16\x38\x0A\x5E\x57\xF6\x62\xC7\x7A\x02\x05\xE6\xBC\x1E\xB5\xF2\x9E\xF4\xA9\x29\x83\xF8\xB2\x14\xE3\x6E\x28\x87\x44\xC3\x90\x1A\xDE\x38\xA9\x3C\xAC\x43\x4D\x64\x45\xCE\xDD\x28\xA9\x5C\xF2\x73\x7B\x04\xF8\x17\xE8\xAB\xB1\xF3\x2E\x5C\x64\x6E\x73\x31\x3A\x12\xB8\xBC\xB3\x11\xE4\x7D\x8F\x81\x51\x9A\x3B\x8D\x89\xF4\x4D\x93\x66\x7B\x3C\x03\xED\xD3\x9A\x1D\x9A\xF3\x65\x50\xF5\xA0\xD0\x75\x9F\x2F\xAF\xF0\xEA\x82\x43\x98\xF8\x69\x9C\x89\x79\xC4\x43\x8E\x46\x72\xE3\x64\x36\x12\xAF\xF7\x25\x1E\x38\x89\x90\x77\x7E\xC3\x6B\x6A\xB9\xC3\xCB\x44\x4B\xAC\x78\x90\x8B\xE7\xC7\x2C\x1E\x4B\x11\x44\xC8\x34\x52\x27\xCD\x0A\x5D\x9F\x85\xC1\x89\xD5\x1A\x78\xF2\x95\x10\x53\x32\xDD\x80\x84\x66\x75\xD9\xB5\x68\x28\xFB\x61\x2E\xBE\x84\xA8\x38\xC0\x99\x12\x86\xA5\x1E\x67\x64\xAD\x06\x2E\x2F\xA9\x70\x85\xC7\x96\x0F\x7C\x89\x65\xF5\x8E\x43\x54\x0E\xAB\xDD\xA5\x80\x39\x94\x60\xC0\x34\xC9\x96\x70\x2C\xA3\x12\xF5\x1F\x48\x7B\xBD\x1C\x7E\x6B\xB7\x9D\x90\xF4\x22\x3B\xAE\xF8\xFC\x2A\xCA\xFA\x82\x52\xA0\xEF\xAF\x4B\x55\x93\xEB\xC1\xB5\xF0\x22\x8B\xAC\x34\x4E\x26\x22\x04\xA1\x87\x2C\x75\x4A\xB7\xE5\x7D\x13\xD7\xB8\x0C\x64\xC0\x36\xD2\xC9\x2F\x86\x12\x8C\x23\x09\xC1\x1B\x82\x3B\x73\x49\xA3\x6A\x57\x87\x94\xE5\xD6\x78\xC5\x99\x43\x63\xE3\x4D\xE0\x77\x2D\xE1\x65\x99\x72\x69\x04\x1A\x47\x09\xE6\x0F\x01\x56\x24\xFB\x1F\xBF\x0E\x79\xA9\x58\x2E\xB9\xC4\x09\x01\x7E\x95\xBA\x6D\x00\x06\x3E\xB2\xEA\x4A\x10\x39\xD8\xD0\x2B\xF5\xBF\xEC\x75\xBF\x97\x02\xC5\x09\x1B\x08\xDC\x55\x37\xE2\x81\xFB\x37\x84\x43\x62\x20\xCA\xE7\x56\x4B\x65\xEA\xFE\x6C\xC1\x24\x93\x24\xA1\x34\xEB\x05\xFF\x9A\x22\xAE\x9B\x7D\x3F\xF1\x65\x51\x0A\xA6\x30\x6A\xB3\xF4\x88\x1C\x80\x0D\xFC\x72\x8A\xE8\x83\x5E", ["O=Government Root Certification Authority,C=TW"] = "\x30\x82\x05\x72\x30\x82\x03\x5A\xA0\x03\x02\x01\x02\x02\x10\x1F\x9D\x59\x5A\xD7\x2F\xC2\x06\x44\xA5\x80\x08\x69\xE3\x5E\xF6\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x3F\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x57\x31\x30\x30\x2E\x06\x03\x55\x04\x0A\x0C\x27\x47\x6F\x76\x65\x72\x6E\x6D\x65\x6E\x74\x20\x52\x6F\x6F\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x32\x31\x32\x30\x35\x31\x33\x32\x33\x33\x33\x5A\x17\x0D\x33\x32\x31\x32\x30\x35\x31\x33\x32\x33\x33\x33\x5A\x30\x3F\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x57\x31\x30\x30\x2E\x06\x03\x55\x04\x0A\x0C\x27\x47\x6F\x76\x65\x72\x6E\x6D\x65\x6E\x74\x20\x52\x6F\x6F\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\x9A\x25\xB8\xEC\xCC\xA2\x75\xA8\x7B\xF7\xCE\x5B\x59\x8A\xC9\xD1\x86\x12\x08\x54\xEC\x9C\xF2\xE7\x46\xF6\x88\xF3\x7C\xE9\xA5\xDF\x4C\x47\x36\xA4\x1B\x01\x1C\x7F\x1E\x57\x8A\x8D\xC3\xC5\xD1\x21\xE3\xDA\x24\x3F\x48\x2B\xFB\x9F\x2E\xA1\x94\xE7\x2C\x1C\x93\xD1\xBF\x1B\x01\x87\x53\x99\xCE\xA7\xF5\x0A\x21\x76\x77\xFF\xA9\xB7\xC6\x73\x94\x4F\x46\xF7\x10\x49\x37\xFA\xA8\x59\x49\x5D\x6A\x81\x07\x56\xF2\x8A\xF9\x06\xD0\xF7\x70\x22\x4D\xB4\xB7\x41\xB9\x32\xB8\xB1\xF0\xB1\xC3\x9C\x3F\x70\xFD\x53\xDD\x81\xAA\xD8\x63\x78\xF6\xD8\x53\x6E\xA1\xAC\x6A\x84\x24\x72\x54\x86\xC6\xD2\xB2\xCA\x1C\x0E\x79\x81\xD6\xB5\x70\x62\x08\x01\x2E\x4E\x4F\x0E\xD5\x11\xAF\xA9\xAF\xE5\x9A\xBF\xDC\xCC\x87\x6D\x26\xE4\xC9\x57\xA2\xFB\x96\xF9\xCC\xE1\x3F\x53\x8C\x6C\x4C\x7E\x9B\x53\x08\x0B\x6C\x17\xFB\x67\xC8\xC2\xAD\xB1\xCD\x80\xB4\x97\xDC\x76\x01\x16\x15\xE9\x6A\xD7\xA4\xE1\x78\x47\xCE\x86\xD5\xFB\x31\xF3\xFA\x31\xBE\x34\xAA\x28\xFB\x70\x4C\x1D\x49\xC7\xAF\x2C\x9D\x6D\x66\xA6\xB6\x8D\x64\x7E\xB5\x20\x6A\x9D\x3B\x81\xB6\x8F\x40\x00\x67\x4B\x89\x86\xB8\xCC\x65\xFE\x15\x53\xE9\x04\xC1\xD6\x5F\x1D\x44\xD7\x0A\x2F\x27\x9A\x46\x7D\xA1\x0D\x75\xAD\x54\x86\x15\xDC\x49\x3B\xF1\x96\xCE\x0F\x9B\xA0\xEC\xA3\x7A\x5D\xBE\xD5\x2A\x75\x42\xE5\x7B\xDE\xA5\xB6\xAA\xAF\x28\xAC\xAC\x90\xAC\x38\xB7\xD5\x68\x35\x26\x7A\xDC\xF7\x3B\xF3\xFD\x45\x9B\xD1\xBB\x43\x78\x6E\x6F\xF1\x42\x54\x6A\x98\xF0\x0D\xAD\x97\xE9\x52\x5E\xE9\xD5\x6A\x72\xDE\x6A\xF7\x1B\x60\x14\xF4\xA5\xE4\xB6\x71\x67\xAA\x1F\xEA\xE2\x4D\xC1\x42\x40\xFE\x67\x46\x17\x38\x2F\x47\x3F\x71\x9C\xAE\xE5\x21\xCA\x61\x2D\x6D\x07\xA8\x84\x7C\x2D\xEE\x51\x25\xF1\x63\x90\x9E\xFD\xE1\x57\x88\x6B\xEF\x8A\x23\x6D\xB1\xE6\xBD\x3F\xAD\xD1\x3D\x96\x0B\x85\x8D\xCD\x6B\x27\xBB\xB7\x05\x9B\xEC\xBB\x91\xA9\x0A\x07\x12\x02\x97\x4E\x20\x90\xF0\xFF\x0D\x1E\xE2\x41\x3B\xD3\x40\x3A\xE7\x8D\x5D\xDA\x66\xE4\x02\xB0\x07\x52\x98\x5C\x0E\x8E\x33\x9C\xC2\xA6\x95\xFB\x55\x19\x6E\x4C\x8E\xAE\x4B\x0F\xBD\xC1\x38\x4D\x5E\x8F\x84\x1D\x66\xCD\xC5\x60\x96\xB4\x52\x5A\x05\x89\x8E\x95\x7A\x98\xC1\x91\x3C\x95\x23\xB2\x0E\xF4\x79\xB4\xC9\x7C\xC1\x4A\x21\x02\x03\x01\x00\x01\xA3\x6A\x30\x68\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xCC\xCC\xEF\xCC\x29\x60\xA4\x3B\xB1\x92\xB6\x3C\xFA\x32\x62\x8F\xAC\x25\x15\x3B\x30\x0C\x06\x03\x55\x1D\x13\x04\x05\x30\x03\x01\x01\xFF\x30\x39\x06\x04\x67\x2A\x07\x00\x04\x31\x30\x2F\x30\x2D\x02\x01\x00\x30\x09\x06\x05\x2B\x0E\x03\x02\x1A\x05\x00\x30\x07\x06\x05\x67\x2A\x03\x00\x00\x04\x14\x03\x9B\xF0\x22\x13\xFF\x95\x28\x36\xD3\xDC\x9E\xC0\x32\xFB\x31\x3A\x8A\x51\x65\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\x40\x80\x4A\xFA\x26\xC9\xCE\x5E\x30\xDD\x4F\x86\x74\x76\x58\xF5\xAE\xB3\x83\x33\x78\xA4\x7A\x74\x17\x19\x4E\xE9\x52\xB5\xB9\xE0\x0A\x74\x62\xAA\x68\xCA\x78\xA0\x4C\x9A\x8E\x2C\x23\x2E\xD5\x6A\x12\x24\xBF\xD4\x68\xD3\x8A\xD0\xD8\x9C\x9F\xB4\x1F\x0C\xDE\x38\x7E\x57\x38\xFC\x8D\xE2\x4F\x5E\x0C\x9F\xAB\x3B\xD2\xFF\x75\x97\xCB\xA4\xE3\x67\x08\xFF\xE5\xC0\x16\xB5\x48\x01\x7D\xE9\xF9\x0A\xFF\x1B\xE5\x6A\x69\xBF\x78\x21\xA8\xC2\xA7\x23\xA9\x86\xAB\x76\x56\xE8\x0E\x0C\xF6\x13\xDD\x2A\x66\x8A\x64\x49\x3D\x1A\x18\x87\x90\x04\x9F\x42\x52\xB7\x4F\xCB\xFE\x47\x41\x76\x35\xEF\xFF\x00\x76\x36\x45\x32\x9B\xC6\x46\x85\x5D\xE2\x24\xB0\x1E\xE3\x48\x96\x98\x57\x47\x94\x55\x7A\x0F\x41\xB1\x44\x24\xF3\xC1\xFE\x1A\x6B\xBF\x88\xFD\xC1\xA6\xDA\x93\x60\x5E\x81\x4A\x99\x20\x9C\x48\x66\x19\xB5\x00\x79\x54\x0F\xB8\x2C\x2F\x4B\xBC\xA9\x5D\x5B\x60\x7F\x8C\x87\xA5\xE0\x52\x63\x2A\xBE\xD8\x3B\x85\x40\x15\xFE\x1E\xB6\x65\x3F\xC5\x4B\xDA\x7E\xB5\x7A\x35\x29\xA3\x2E\x7A\x98\x60\x22\xA3\xF4\x7D\x27\x4E\x2D\xEA\xB4\x74\x3C\xE9\x0F\xA4\x33\x0F\x10\x11\xBC\x13\x01\xD6\xE5\x0E\xD3\xBF\xB5\x12\xA2\xE1\x45\x23\xC0\xCC\x08\x6E\x61\xB7\x89\xAB\x83\xE3\x24\x1E\xE6\x5D\x07\xE7\x1F\x20\x3E\xCF\x67\xC8\xE7\xAC\x30\x6D\x27\x4B\x68\x6E\x4B\x2A\x5C\x02\x08\x34\xDB\xF8\x76\xE4\x67\xA3\x26\x9C\x3F\xA2\x32\xC2\x4A\xC5\x81\x18\x31\x10\x56\xAA\x84\xEF\x2D\x0A\xFF\xB8\x1F\x77\xD2\xBF\xA5\x58\xA0\x62\xE4\xD7\x4B\x91\x75\x8D\x89\x80\x98\x7E\x6D\xCB\x53\x4E\x5E\xAF\xF6\xB2\x97\x85\x97\xB9\xDA\x55\x06\xB9\x24\xEE\xD7\xC6\x38\x1E\x63\x1B\x12\x3B\x95\xE1\x58\xAC\xF2\xDF\x84\xD5\x5F\x99\x2F\x0D\x55\x5B\xE6\x38\xDB\x2E\x3F\x72\xE9\x48\x85\xCB\xBB\x29\x13\x8F\x1E\x38\x55\xB9\xF3\xB2\xC4\x30\x99\x23\x4E\x5D\xF2\x48\xA1\x12\x0C\xDC\x12\x90\x09\x90\x54\x91\x03\x3C\x47\xE5\xD5\xC9\x65\xE0\xB7\x4B\x7D\xEC\x47\xD3\xB3\x0B\x3E\xAD\x9E\xD0\x74\x00\x0E\xEB\xBD\x51\xAD\xC0\xDE\x2C\xC0\xC3\x6A\xFE\xEF\xDC\x0B\xA7\xFA\x46\xDF\x60\xDB\x9C\xA6\x59\x50\x75\x23\x69\x73\x93\xB2\xF9\xFC\x02\xD3\x47\xE6\x71\xCE\x10\x02\xEE\x27\x8C\x84\xFF\xAC\x45\x0D\x13\x5C\x83\x32\xE0\x25\xA5\x86\x2C\x7C\xF4\x12", - ["emailAddress=ca@firmaprofesional.com,CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,L=C/ Muntaner 244 Barcelona,C=ES"] = "\x30\x82\x04\x57\x30\x82\x03\x3F\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\x9D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x53\x31\x22\x30\x20\x06\x03\x55\x04\x07\x13\x19\x43\x2F\x20\x4D\x75\x6E\x74\x61\x6E\x65\x72\x20\x32\x34\x34\x20\x42\x61\x72\x63\x65\x6C\x6F\x6E\x61\x31\x42\x30\x40\x06\x03\x55\x04\x03\x13\x39\x41\x75\x74\x6F\x72\x69\x64\x61\x64\x20\x64\x65\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x63\x69\x6F\x6E\x20\x46\x69\x72\x6D\x61\x70\x72\x6F\x66\x65\x73\x69\x6F\x6E\x61\x6C\x20\x43\x49\x46\x20\x41\x36\x32\x36\x33\x34\x30\x36\x38\x31\x26\x30\x24\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x17\x63\x61\x40\x66\x69\x72\x6D\x61\x70\x72\x6F\x66\x65\x73\x69\x6F\x6E\x61\x6C\x2E\x63\x6F\x6D\x30\x1E\x17\x0D\x30\x31\x31\x30\x32\x34\x32\x32\x30\x30\x30\x30\x5A\x17\x0D\x31\x33\x31\x30\x32\x34\x32\x32\x30\x30\x30\x30\x5A\x30\x81\x9D\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x53\x31\x22\x30\x20\x06\x03\x55\x04\x07\x13\x19\x43\x2F\x20\x4D\x75\x6E\x74\x61\x6E\x65\x72\x20\x32\x34\x34\x20\x42\x61\x72\x63\x65\x6C\x6F\x6E\x61\x31\x42\x30\x40\x06\x03\x55\x04\x03\x13\x39\x41\x75\x74\x6F\x72\x69\x64\x61\x64\x20\x64\x65\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x63\x69\x6F\x6E\x20\x46\x69\x72\x6D\x61\x70\x72\x6F\x66\x65\x73\x69\x6F\x6E\x61\x6C\x20\x43\x49\x46\x20\x41\x36\x32\x36\x33\x34\x30\x36\x38\x31\x26\x30\x24\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01\x16\x17\x63\x61\x40\x66\x69\x72\x6D\x61\x70\x72\x6F\x66\x65\x73\x69\x6F\x6E\x61\x6C\x2E\x63\x6F\x6D\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xE7\x23\x03\x6F\x6F\x23\xA5\x5E\x78\xCE\x95\x2C\xED\x94\x1E\x6E\x0A\x9E\x01\xC7\xEA\x30\xD1\x2C\x9D\xDD\x37\xE8\x9B\x98\x79\x56\xD3\xFC\x73\xDF\xD0\x8A\xDE\x55\x8F\x51\xF9\x5A\xEA\xDE\xB5\x70\xC4\xED\xA4\xED\xFF\xA3\x0D\x6E\x0F\x64\x50\x31\xAF\x01\x27\x58\xAE\xFE\x6C\xA7\x4A\x2F\x17\x2D\xD3\x73\xD5\x13\x1C\x8F\x59\xA5\x34\x2C\x1D\x54\x04\x45\xCD\x68\xB8\xA0\xC0\x03\xA5\xCF\x85\x42\x47\x95\x28\x5B\xCF\xEF\x80\x6C\xE0\x90\x97\x8A\x01\x3C\x1D\xF3\x87\x10\x30\x26\x48\x7D\xD7\xFC\xE9\x9D\x91\x71\xFF\x41\x9A\xA9\x40\xB5\x37\x9C\x29\x20\x4F\x1F\x52\xE3\xA0\x7D\x13\x6D\x54\xB7\x0A\xDE\xE9\x6A\x4E\x07\xAC\xAC\x19\x5F\xDC\x7E\x62\x74\xF6\xB2\x05\x00\xBA\x85\xA0\xFD\x1D\x38\x6E\xCB\x5A\xBB\x86\xBC\x94\x67\x33\x35\x83\x2C\x1F\x23\xCD\xF8\xC8\x91\x71\xCC\x97\x8B\xEF\xAE\x0F\xDC\x29\x03\x1B\xC0\x39\xEB\x70\xED\xC1\x6E\x0E\xD8\x67\x0B\x89\xA9\xBC\x35\xE4\xEF\xB6\x34\xB4\xA5\xB6\xC4\x2D\xA5\xBE\xD0\xC3\x94\x24\x48\xDB\xDF\x96\xD3\x00\xB5\x66\x1A\x8B\x66\x05\x0F\xDD\x3F\x3F\xCB\x3F\xAA\x5E\x9A\x4A\xF8\xB4\x4A\xEF\x95\x37\x1B\x02\x03\x01\x00\x01\xA3\x81\x9F\x30\x81\x9C\x30\x2A\x06\x03\x55\x1D\x11\x04\x23\x30\x21\x86\x1F\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x66\x69\x72\x6D\x61\x70\x72\x6F\x66\x65\x73\x69\x6F\x6E\x61\x6C\x2E\x63\x6F\x6D\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x01\x30\x2B\x06\x03\x55\x1D\x10\x04\x24\x30\x22\x80\x0F\x32\x30\x30\x31\x31\x30\x32\x34\x32\x32\x30\x30\x30\x30\x5A\x81\x0F\x32\x30\x31\x33\x31\x30\x32\x34\x32\x32\x30\x30\x30\x30\x5A\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x33\x0B\xA0\x66\xD1\xEA\xDA\xCE\xDE\x62\x93\x04\x28\x52\xB5\x14\x7F\x38\x68\xB7\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\x47\x73\xFE\x8D\x27\x54\xF0\xF5\xD4\x77\x9C\x27\x79\x57\x57\xB7\x15\x56\xEC\xC7\xD8\x58\xB7\x01\x02\xF4\x33\xED\x93\x50\x88\x9E\x7C\x46\xB1\xBD\x3F\x14\x6F\xF1\xB3\x47\x48\x8B\x8C\x97\x06\xD7\xEA\x7E\xA3\x5C\x2A\xBB\x4D\x2F\x47\xE2\xF8\x39\x06\xC9\x9C\x2E\x31\x1A\x03\x78\xF4\xBC\x38\xC6\x22\x8B\x33\x31\xF0\x16\x04\x04\x7D\xF9\x76\xE4\x4B\xD7\xC0\xE6\x83\xEC\x59\xCC\x3F\xDE\xFF\x4F\x6B\xB7\x67\x7E\xA6\x86\x81\x32\x23\x03\x9D\xC8\xF7\x5F\xC1\x4A\x60\xA5\x92\xA9\xB1\xA4\xA0\x60\xC3\x78\x87\xB3\x22\xF3\x2A\xEB\x5B\xA9\xED\x05\xAB\x37\x0F\xB1\xE2\xD3\x95\x76\x63\x56\x74\x8C\x58\x72\x1B\x37\xE5\x64\xA1\xBE\x4D\x0C\x93\x98\x0C\x97\xF6\x87\x6D\xB3\x3F\xE7\xCB\x80\xA6\xED\x88\xC7\x5F\x50\x62\x02\xE8\x99\x74\x16\xD0\xE6\xB4\x39\xF1\x27\xCB\xC8\x40\xD6\xE3\x86\x10\xA9\x23\x12\x92\xE0\x69\x41\x63\xA7\xAF\x25\x0B\xC0\xC5\x92\xCB\x1E\x98\xA3\x5A\xBA\xC5\x33\x0F\xA0\x97\x01\xDD\x7F\xE0\x7B\xD6\x06\x54\xCF\xA1\xE2\x4D\x38\xEB\x4B\x50\xB5\xCB\x26\xF4\xCA\xDA\x70\x4A\x6A\xA1\xE2\x79\xAA\xE1\xA7\x33\xF6\xFD\x4A\x1F\xF6\xD9\x60", - ["CN=Wells Fargo Root Certificate Authority,OU=Wells Fargo Certification Authority,O=Wells Fargo,C=US"] = "\x30\x82\x03\xE5\x30\x82\x02\xCD\xA0\x03\x02\x01\x02\x02\x04\x39\xE4\x97\x9E\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x31\x2C\x30\x2A\x06\x03\x55\x04\x0B\x13\x23\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x2F\x30\x2D\x06\x03\x55\x04\x03\x13\x26\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x20\x52\x6F\x6F\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x30\x30\x31\x30\x31\x31\x31\x36\x34\x31\x32\x38\x5A\x17\x0D\x32\x31\x30\x31\x31\x34\x31\x36\x34\x31\x32\x38\x5A\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x13\x0B\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x31\x2C\x30\x2A\x06\x03\x55\x04\x0B\x13\x23\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x31\x2F\x30\x2D\x06\x03\x55\x04\x03\x13\x26\x57\x65\x6C\x6C\x73\x20\x46\x61\x72\x67\x6F\x20\x52\x6F\x6F\x74\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xD5\xA8\x33\x3B\x26\xF9\x34\xFF\xCD\x9B\x7E\xE5\x04\x47\xCE\x00\xE2\x7D\x77\xE7\x31\xC2\x2E\x27\xA5\x4D\x68\xB9\x31\xBA\x8D\x43\x59\x97\xC7\x73\xAA\x7F\x3D\x5C\x40\x9E\x05\xE5\xA1\xE2\x89\xD9\x4C\xB8\x3F\x9B\xF9\x0C\xB4\xC8\x62\x19\x2C\x45\xAE\x91\x1E\x73\x71\x41\xC4\x4B\x13\xFD\x70\xC2\x25\xAC\x22\xF5\x75\x0B\xB7\x53\xE4\xA5\x2B\xDD\xCE\xBD\x1C\x3A\x7A\xC3\xF7\x13\x8F\x26\x54\x9C\x16\x6B\x6B\xAF\xFB\xD8\x96\xB1\x60\x9A\x48\xE0\x25\x22\x24\x79\x34\xCE\x0E\x26\x00\x0B\x4E\xAB\xFD\x8B\xCE\x82\xD7\x2F\x08\x70\x68\xC1\xA8\x0A\xF9\x74\x4F\x07\xAB\xA4\xF9\xE2\x83\x7E\x27\x73\x74\x3E\xB8\xF9\x38\x42\xFC\xA5\xA8\x5B\x48\x23\xB3\xEB\xE3\x25\xB2\x80\xAE\x96\xD4\x0A\x9C\xC2\x78\x9A\xC6\x68\x18\xAE\x37\x62\x37\x5E\x51\x75\xA8\x58\x63\xC0\x51\xEE\x40\x78\x7E\xA8\xAF\x1A\xA0\xE1\xB0\x78\x9D\x50\x8C\x7B\xE7\xB3\xFC\x8E\x23\xB0\xDB\x65\x00\x70\x84\x01\x08\x00\x14\x6E\x54\x86\x9A\xBA\xCC\xF9\x37\x10\xF6\xE0\xDE\x84\x2D\x9D\xA4\x85\x37\xD3\x87\xE3\x15\xD0\xC1\x17\x90\x7E\x19\x21\x6A\x12\xA9\x76\xFD\x12\x02\xE9\x4F\x21\x5E\x17\x02\x03\x01\x00\x01\xA3\x61\x30\x5F\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x4C\x06\x03\x55\x1D\x20\x04\x45\x30\x43\x30\x41\x06\x0B\x60\x86\x48\x01\x86\xFB\x7B\x87\x07\x01\x0B\x30\x32\x30\x30\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x24\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x65\x6C\x6C\x73\x66\x61\x72\x67\x6F\x2E\x63\x6F\x6D\x2F\x63\x65\x72\x74\x70\x6F\x6C\x69\x63\x79\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\xD2\x27\xDD\x9C\x0A\x77\x2B\xBB\x22\xF2\x02\xB5\x4A\x4A\x91\xF9\xD1\x2D\xBE\xE4\xBB\x1A\x68\xEF\x0E\xA4\x00\xE9\xEE\xE7\xEF\xEE\xF6\xF9\xE5\x74\xA4\xC2\xD8\x52\x58\xC4\x74\xFB\xCE\x6B\xB5\x3B\x29\x79\x18\x5A\xEF\x9B\xED\x1F\x6B\x36\xEE\x48\x25\x25\x14\xB6\x56\xA2\x10\xE8\xEE\xA7\x7F\xD0\x3F\xA3\xD0\xC3\x5D\x26\xEE\x07\xCC\xC3\xC1\x24\x21\x87\x1E\xDF\x2A\x12\x53\x6F\x41\x16\xE7\xED\xAE\x94\xFA\x8C\x72\xFA\x13\x47\xF0\x3C\x7E\xAE\x7D\x11\x3A\x13\xEC\xED\xFA\x6F\x72\x64\x7B\x9D\x7D\x7F\x26\xFD\x7A\xFB\x25\xAD\xEA\x3E\x29\x7F\x4C\xE3\x00\x57\x32\xB0\xB3\xE9\xED\x53\x17\xD9\x8B\xB2\x14\x0E\x30\xE8\xE5\xD5\x13\xC6\x64\xAF\xC4\x00\xD5\xD8\x58\x24\xFC\xF5\x8F\xEC\xF1\xC7\x7D\xA5\xDB\x0F\x27\xD1\xC6\xF2\x40\x88\xE6\x1F\xF6\x61\xA8\xF4\x42\xC8\xB9\x37\xD3\xA9\xBE\x2C\x56\x78\xC2\x72\x9B\x59\x5D\x35\x40\x8A\xE8\x4E\x63\x1A\xB6\xE9\x20\x6A\x51\xE2\xCE\xA4\x90\xDF\x76\x70\x99\x5C\x70\x43\x4D\xB7\xB6\xA7\x19\x64\x4E\x92\xB7\xC5\x91\x3C\x7F\x48\x16\x65\x7B\x16\xFD\xCB\xFC\xFB\xD9\xD5\xD6\x4F\x21\x65\x3B\x4A\x7F\x47\xA3\xFB", ["CN=Swisscom Root CA 1,OU=Digital Certificate Services,O=Swisscom,C=ch"] = "\x30\x82\x05\xD9\x30\x82\x03\xC1\xA0\x03\x02\x01\x02\x02\x10\x5C\x0B\x85\x5C\x0B\xE7\x59\x41\xDF\x57\xCC\x3F\x7F\x9D\xA8\x36\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x64\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x63\x68\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x53\x77\x69\x73\x73\x63\x6F\x6D\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x31\x1B\x30\x19\x06\x03\x55\x04\x03\x13\x12\x53\x77\x69\x73\x73\x63\x6F\x6D\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x31\x30\x1E\x17\x0D\x30\x35\x30\x38\x31\x38\x31\x32\x30\x36\x32\x30\x5A\x17\x0D\x32\x35\x30\x38\x31\x38\x32\x32\x30\x36\x32\x30\x5A\x30\x64\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x63\x68\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x53\x77\x69\x73\x73\x63\x6F\x6D\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x31\x1B\x30\x19\x06\x03\x55\x04\x03\x13\x12\x53\x77\x69\x73\x73\x63\x6F\x6D\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x31\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xD0\xB9\xB0\xA8\x0C\xD9\xBB\x3F\x21\xF8\x1B\xD5\x33\x93\x80\x16\x65\x20\x75\xB2\x3D\x9B\x60\x6D\x46\xC8\x8C\x31\x6F\x17\xC3\xFA\x9A\x6C\x56\xED\x3C\xC5\x91\x57\xC3\xCD\xAB\x96\x49\x90\x2A\x19\x4B\x1E\xA3\x6D\x57\xDD\xF1\x2B\x62\x28\x75\x45\x5E\xAA\xD6\x5B\xFA\x0B\x25\xD8\xA1\x16\xF9\x1C\xC4\x2E\xE6\x95\x2A\x67\xCC\xD0\x29\x6E\x3C\x85\x34\x38\x61\x49\xB1\x00\x9F\xD6\x3A\x71\x5F\x4D\x6D\xCE\x5F\xB9\xA9\xE4\x89\x7F\x6A\x52\xFA\xCA\x9B\xF2\xDC\xA9\xF9\x9D\x99\x47\x3F\x4E\x29\x5F\xB4\xA6\x8D\x5D\x7B\x0B\x99\x11\x03\x03\xFE\xE7\xDB\xDB\xA3\xFF\x1D\xA5\xCD\x90\x1E\x01\x1F\x35\xB0\x7F\x00\xDB\x90\x6F\xC6\x7E\x7B\xD1\xEE\x7A\x7A\xA7\xAA\x0C\x57\x6F\xA4\x6D\xC5\x13\x3B\xB0\xA5\xD9\xED\x32\x1C\xB4\x5E\x67\x8B\x54\xDC\x73\x87\xE5\xD3\x17\x7C\x66\x50\x72\x5D\xD4\x1A\x58\xC1\xD9\xCF\xD8\x89\x02\x6F\xA7\x49\xB4\x36\x5D\xD0\xA4\xDE\x07\x2C\xB6\x75\xB7\x28\x91\xD6\x97\xBE\x28\xF5\x98\x1E\xEA\x5B\x26\xC9\xBD\xB0\x97\x73\xDA\xAE\x91\x26\xEB\x68\xC1\xF9\x39\x15\xD6\x67\x4B\x0A\x6D\x4F\xCB\xCF\xB0\xE4\x42\x71\x8C\x53\x79\xE7\xEE\xE1\xDB\x1D\xA0\x6E\x1D\x8C\x1A\x77\x35\x5C\x16\x1E\x2B\x53\x1F\x34\x8B\xD1\x6C\xFC\xF2\x67\x07\x7A\xF5\xAD\xED\xD6\x9A\xAB\xA1\xB1\x4B\xE1\xCC\x37\x5F\xFD\x7F\xCD\x4D\xAE\xB8\x1F\x9C\x43\xF9\x2A\x58\x55\x43\x45\xBC\x96\xCD\x70\x0E\xFC\xC9\xE3\x66\xBA\x4E\x8D\x3B\x81\xCB\x15\x64\x7B\xB9\x94\xE8\x5D\x33\x52\x85\x71\x2E\x4F\x8E\xA2\x06\x11\x51\xC9\xE3\xCB\xA1\x6E\x31\x08\x64\x0C\xC2\xD2\x3C\xF5\x36\xE8\xD7\xD0\x0E\x78\x23\x20\x91\xC9\x24\x2A\x65\x29\x5B\x22\xF7\x21\xCE\x83\x5E\xA4\xF3\xDE\x4B\xD3\x68\x8F\x46\x75\x5C\x83\x09\x6E\x29\x6B\xC4\x70\x8C\xF5\x9D\xD7\x20\x2F\xFF\x46\xD2\x2B\x38\xC2\x2F\x75\x1C\x3D\x7E\xDA\xA5\xEF\x1E\x60\x85\x69\x42\xD3\xCC\xF8\x63\xFE\x1E\x43\x39\x85\xA6\xB6\x63\x41\x10\xB3\x73\x1E\xBC\xD3\xFA\xCA\x7D\x16\x47\xE2\xA7\xD5\xD0\xA3\x8A\x0A\x08\x96\x62\x56\x6E\x34\xDB\xD9\x02\xB9\x30\x75\xE3\x04\xD2\xE7\x8F\xC2\xB0\x11\x40\x0A\xAC\xD5\x71\x02\x62\x8B\x31\xBE\xDD\xC6\x23\x58\x31\x42\x43\x2D\x74\xF9\xC6\x9E\xA6\x8A\x0F\xE9\xFE\xBF\x83\xE6\x43\x57\x24\xBA\xEF\x46\x34\xAA\xD7\x12\x01\x38\xED\x02\x03\x01\x00\x01\xA3\x81\x86\x30\x81\x83\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x86\x30\x1D\x06\x03\x55\x1D\x21\x04\x16\x30\x14\x30\x12\x06\x07\x60\x85\x74\x01\x53\x00\x01\x06\x07\x60\x85\x74\x01\x53\x00\x01\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x07\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x03\x25\x2F\xDE\x6F\x82\x01\x3A\x5C\x2C\xDC\x2B\xA1\x69\xB5\x67\xD4\x8C\xD3\xFD\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x03\x25\x2F\xDE\x6F\x82\x01\x3A\x5C\x2C\xDC\x2B\xA1\x69\xB5\x67\xD4\x8C\xD3\xFD\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\x35\x10\xCB\xEC\xA6\x04\x0D\x0D\x0F\xCD\xC0\xDB\xAB\xA8\xF2\x88\x97\x0C\xDF\x93\x2F\x4D\x7C\x40\x56\x31\x7A\xEB\xA4\x0F\x60\xCD\x7A\xF3\xBE\xC3\x27\x8E\x03\x3E\xA4\xDD\x12\xEF\x7E\x1E\x74\x06\x3C\x3F\x31\xF2\x1C\x7B\x91\x31\x21\xB4\xF0\xD0\x6C\x97\xD4\xE9\x97\xB2\x24\x56\x1E\x56\xC3\x35\xBD\x88\x05\x0F\x5B\x10\x1A\x64\xE1\xC7\x82\x30\xF9\x32\xAD\x9E\x50\x2C\xE7\x78\x05\xD0\x31\xB1\x5A\x98\x8A\x75\x4E\x90\x5C\x6A\x14\x2A\xE0\x52\x47\x82\x60\xE6\x1E\xDA\x81\xB1\xFB\x14\x0B\x5A\xF1\x9F\xD2\x95\xBA\x3E\xD0\x1B\xD6\x15\x1D\xA3\xBE\x86\xD5\xDB\x0F\xC0\x49\x64\xBB\x2E\x50\x19\x4B\xD2\x24\xF8\xDD\x1E\x07\x56\xD0\x38\xA0\x95\x70\x20\x76\x8C\xD7\xDD\x1E\xDE\x9F\x71\xC4\x23\xEF\x83\x13\x5C\xA3\x24\x15\x4D\x29\x40\x3C\x6A\xC4\xA9\xD8\xB7\xA6\x44\xA5\x0D\xF4\xE0\x9D\x77\x1E\x40\x70\x26\xFC\xDA\xD9\x36\xE4\x79\xE4\xB5\x3F\xBC\x9B\x65\xBE\xBB\x11\x96\xCF\xDB\xC6\x28\x39\x3A\x08\xCE\x47\x5B\x53\x5A\xC5\x99\xFE\x5D\xA9\xDD\xEF\x4C\xD4\xC6\xA5\xAD\x02\xE6\x8C\x07\x12\x1E\x6F\x03\xD1\x6F\xA0\xA3\xF3\x29\xBD\x12\xC7\x50\xA2\xB0\x7F\x88\xA9\x99\x77\x9A\xB1\xC0\xA5\x39\x2E\x5C\x7C\x69\xE2\x2C\xB0\xEA\x37\x6A\xA4\xE1\x5A\xE1\xF5\x50\xE5\x83\xEF\xA5\xBB\x2A\x88\xE7\x8C\xDB\xFD\x6D\x5E\x97\x19\xA8\x7E\x66\x75\x6B\x71\xEA\xBF\xB1\xC7\x6F\xA0\xF4\x8E\xA4\xEC\x34\x51\x5B\x8C\x26\x03\x70\xA1\x77\xD5\x01\x12\x57\x00\x35\xDB\x23\xDE\x0E\x8A\x28\x99\xFD\xB1\x10\x6F\x4B\xFF\x38\x2D\x60\x4E\x2C\x9C\xEB\x67\xB5\xAD\x49\xEE\x4B\x1F\xAC\xAF\xFB\x0D\x90\x5A\x66\x60\x70\x5D\xAA\xCD\x78\xD4\x24\xEE\xC8\x41\xA0\x93\x01\x92\x9C\x6A\x9E\xFC\xB9\x24\xC5\xB3\x15\x82\x7E\xBE\xAE\x95\x2B\xEB\xB1\xC0\xDA\xE3\x01\x60\x0B\x5E\x69\xAC\x84\x56\x61\xBE\x71\x17\xFE\x1D\x13\x0F\xFE\xC6\x87\x45\xE9\xFE\x32\xA0\x1A\x0D\x13\xA4\x94\x55\x71\xA5\x16\x8B\xBA\xCA\x89\xB0\xB2\xC7\xFC\x8F\xD8\x54\xB5\x93\x62\x9D\xCE\xCF\x59\xFB\x3D\x18\xCE\x2A\xCB\x35\x15\x82\x5D\xFF\x54\x22\x5B\x71\x52\xFB\xB7\xC9\xFE\x60\x9B\x00\x41\x64\xF0\xAA\x2A\xEC\xB6\x42\x43\xCE\x89\x66\x81\xC8\x8B\x9F\x39\x54\x03\x25\xD3\x16\x35\x8E\x84\xD0\x5F\xFA\x30\x1A\xF5\x9A\x6C\xF4\x0E\x53\xF9\x3A\x5B\xD1\x1C", ["CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US"] = "\x30\x82\x03\xB7\x30\x82\x02\x9F\xA0\x03\x02\x01\x02\x02\x10\x0C\xE7\xE0\xE5\x17\xD8\x46\xFE\x8F\xE5\x60\xFC\x1B\xF0\x30\x39\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x65\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0A\x13\x0C\x44\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6E\x63\x31\x19\x30\x17\x06\x03\x55\x04\x0B\x13\x10\x77\x77\x77\x2E\x64\x69\x67\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x31\x24\x30\x22\x06\x03\x55\x04\x03\x13\x1B\x44\x69\x67\x69\x43\x65\x72\x74\x20\x41\x73\x73\x75\x72\x65\x64\x20\x49\x44\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x1E\x17\x0D\x30\x36\x31\x31\x31\x30\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x33\x31\x31\x31\x31\x30\x30\x30\x30\x30\x30\x30\x5A\x30\x65\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0A\x13\x0C\x44\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6E\x63\x31\x19\x30\x17\x06\x03\x55\x04\x0B\x13\x10\x77\x77\x77\x2E\x64\x69\x67\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x31\x24\x30\x22\x06\x03\x55\x04\x03\x13\x1B\x44\x69\x67\x69\x43\x65\x72\x74\x20\x41\x73\x73\x75\x72\x65\x64\x20\x49\x44\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xAD\x0E\x15\xCE\xE4\x43\x80\x5C\xB1\x87\xF3\xB7\x60\xF9\x71\x12\xA5\xAE\xDC\x26\x94\x88\xAA\xF4\xCE\xF5\x20\x39\x28\x58\x60\x0C\xF8\x80\xDA\xA9\x15\x95\x32\x61\x3C\xB5\xB1\x28\x84\x8A\x8A\xDC\x9F\x0A\x0C\x83\x17\x7A\x8F\x90\xAC\x8A\xE7\x79\x53\x5C\x31\x84\x2A\xF6\x0F\x98\x32\x36\x76\xCC\xDE\xDD\x3C\xA8\xA2\xEF\x6A\xFB\x21\xF2\x52\x61\xDF\x9F\x20\xD7\x1F\xE2\xB1\xD9\xFE\x18\x64\xD2\x12\x5B\x5F\xF9\x58\x18\x35\xBC\x47\xCD\xA1\x36\xF9\x6B\x7F\xD4\xB0\x38\x3E\xC1\x1B\xC3\x8C\x33\xD9\xD8\x2F\x18\xFE\x28\x0F\xB3\xA7\x83\xD6\xC3\x6E\x44\xC0\x61\x35\x96\x16\xFE\x59\x9C\x8B\x76\x6D\xD7\xF1\xA2\x4B\x0D\x2B\xFF\x0B\x72\xDA\x9E\x60\xD0\x8E\x90\x35\xC6\x78\x55\x87\x20\xA1\xCF\xE5\x6D\x0A\xC8\x49\x7C\x31\x98\x33\x6C\x22\xE9\x87\xD0\x32\x5A\xA2\xBA\x13\x82\x11\xED\x39\x17\x9D\x99\x3A\x72\xA1\xE6\xFA\xA4\xD9\xD5\x17\x31\x75\xAE\x85\x7D\x22\xAE\x3F\x01\x46\x86\xF6\x28\x79\xC8\xB1\xDA\xE4\x57\x17\xC4\x7E\x1C\x0E\xB0\xB4\x92\xA6\x56\xB3\xBD\xB2\x97\xED\xAA\xA7\xF0\xB7\xC5\xA8\x3F\x95\x16\xD0\xFF\xA1\x96\xEB\x08\x5F\x18\x77\x4F\x02\x03\x01\x00\x01\xA3\x63\x30\x61\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x86\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x45\xEB\xA2\xAF\xF4\x92\xCB\x82\x31\x2D\x51\x8B\xA7\xA7\x21\x9D\xF3\x6D\xC8\x0F\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x45\xEB\xA2\xAF\xF4\x92\xCB\x82\x31\x2D\x51\x8B\xA7\xA7\x21\x9D\xF3\x6D\xC8\x0F\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\xA2\x0E\xBC\xDF\xE2\xED\xF0\xE3\x72\x73\x7A\x64\x94\xBF\xF7\x72\x66\xD8\x32\xE4\x42\x75\x62\xAE\x87\xEB\xF2\xD5\xD9\xDE\x56\xB3\x9F\xCC\xCE\x14\x28\xB9\x0D\x97\x60\x5C\x12\x4C\x58\xE4\xD3\x3D\x83\x49\x45\x58\x97\x35\x69\x1A\xA8\x47\xEA\x56\xC6\x79\xAB\x12\xD8\x67\x81\x84\xDF\x7F\x09\x3C\x94\xE6\xB8\x26\x2C\x20\xBD\x3D\xB3\x28\x89\xF7\x5F\xFF\x22\xE2\x97\x84\x1F\xE9\x65\xEF\x87\xE0\xDF\xC1\x67\x49\xB3\x5D\xEB\xB2\x09\x2A\xEB\x26\xED\x78\xBE\x7D\x3F\x2B\xF3\xB7\x26\x35\x6D\x5F\x89\x01\xB6\x49\x5B\x9F\x01\x05\x9B\xAB\x3D\x25\xC1\xCC\xB6\x7F\xC2\xF1\x6F\x86\xC6\xFA\x64\x68\xEB\x81\x2D\x94\xEB\x42\xB7\xFA\x8C\x1E\xDD\x62\xF1\xBE\x50\x67\xB7\x6C\xBD\xF3\xF1\x1F\x6B\x0C\x36\x07\x16\x7F\x37\x7C\xA9\x5B\x6D\x7A\xF1\x12\x46\x60\x83\xD7\x27\x04\xBE\x4B\xCE\x97\xBE\xC3\x67\x2A\x68\x11\xDF\x80\xE7\x0C\x33\x66\xBF\x13\x0D\x14\x6E\xF3\x7F\x1F\x63\x10\x1E\xFA\x8D\x1B\x25\x6D\x6C\x8F\xA5\xB7\x61\x01\xB1\xD2\xA3\x26\xA1\x10\x71\x9D\xAD\xE2\xC3\xF9\xC3\x99\x51\xB7\x2B\x07\x08\xCE\x2E\xE6\x50\xB2\xA7\xFA\x0A\x45\x2F\xA2\xF0\xF2", ["CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US"] = "\x30\x82\x03\xAF\x30\x82\x02\x97\xA0\x03\x02\x01\x02\x02\x10\x08\x3B\xE0\x56\x90\x42\x46\xB1\xA1\x75\x6A\xC9\x59\x91\xC7\x4A\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x61\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0A\x13\x0C\x44\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6E\x63\x31\x19\x30\x17\x06\x03\x55\x04\x0B\x13\x10\x77\x77\x77\x2E\x64\x69\x67\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x31\x20\x30\x1E\x06\x03\x55\x04\x03\x13\x17\x44\x69\x67\x69\x43\x65\x72\x74\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x1E\x17\x0D\x30\x36\x31\x31\x31\x30\x30\x30\x30\x30\x30\x30\x5A\x17\x0D\x33\x31\x31\x31\x31\x30\x30\x30\x30\x30\x30\x30\x5A\x30\x61\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0A\x13\x0C\x44\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6E\x63\x31\x19\x30\x17\x06\x03\x55\x04\x0B\x13\x10\x77\x77\x77\x2E\x64\x69\x67\x69\x63\x65\x72\x74\x2E\x63\x6F\x6D\x31\x20\x30\x1E\x06\x03\x55\x04\x03\x13\x17\x44\x69\x67\x69\x43\x65\x72\x74\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xE2\x3B\xE1\x11\x72\xDE\xA8\xA4\xD3\xA3\x57\xAA\x50\xA2\x8F\x0B\x77\x90\xC9\xA2\xA5\xEE\x12\xCE\x96\x5B\x01\x09\x20\xCC\x01\x93\xA7\x4E\x30\xB7\x53\xF7\x43\xC4\x69\x00\x57\x9D\xE2\x8D\x22\xDD\x87\x06\x40\x00\x81\x09\xCE\xCE\x1B\x83\xBF\xDF\xCD\x3B\x71\x46\xE2\xD6\x66\xC7\x05\xB3\x76\x27\x16\x8F\x7B\x9E\x1E\x95\x7D\xEE\xB7\x48\xA3\x08\xDA\xD6\xAF\x7A\x0C\x39\x06\x65\x7F\x4A\x5D\x1F\xBC\x17\xF8\xAB\xBE\xEE\x28\xD7\x74\x7F\x7A\x78\x99\x59\x85\x68\x6E\x5C\x23\x32\x4B\xBF\x4E\xC0\xE8\x5A\x6D\xE3\x70\xBF\x77\x10\xBF\xFC\x01\xF6\x85\xD9\xA8\x44\x10\x58\x32\xA9\x75\x18\xD5\xD1\xA2\xBE\x47\xE2\x27\x6A\xF4\x9A\x33\xF8\x49\x08\x60\x8B\xD4\x5F\xB4\x3A\x84\xBF\xA1\xAA\x4A\x4C\x7D\x3E\xCF\x4F\x5F\x6C\x76\x5E\xA0\x4B\x37\x91\x9E\xDC\x22\xE6\x6D\xCE\x14\x1A\x8E\x6A\xCB\xFE\xCD\xB3\x14\x64\x17\xC7\x5B\x29\x9E\x32\xBF\xF2\xEE\xFA\xD3\x0B\x42\xD4\xAB\xB7\x41\x32\xDA\x0C\xD4\xEF\xF8\x81\xD5\xBB\x8D\x58\x3F\xB5\x1B\xE8\x49\x28\xA2\x70\xDA\x31\x04\xDD\xF7\xB2\x16\xF2\x4C\x0A\x4E\x07\xA8\xED\x4A\x3D\x5E\xB5\x7F\xA3\x90\xC3\xAF\x27\x02\x03\x01\x00\x01\xA3\x63\x30\x61\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x86\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x03\xDE\x50\x35\x56\xD1\x4C\xBB\x66\xF0\xA3\xE2\x1B\x1B\xC3\x97\xB2\x3D\xD1\x55\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x03\xDE\x50\x35\x56\xD1\x4C\xBB\x66\xF0\xA3\xE2\x1B\x1B\xC3\x97\xB2\x3D\xD1\x55\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00\xCB\x9C\x37\xAA\x48\x13\x12\x0A\xFA\xDD\x44\x9C\x4F\x52\xB0\xF4\xDF\xAE\x04\xF5\x79\x79\x08\xA3\x24\x18\xFC\x4B\x2B\x84\xC0\x2D\xB9\xD5\xC7\xFE\xF4\xC1\x1F\x58\xCB\xB8\x6D\x9C\x7A\x74\xE7\x98\x29\xAB\x11\xB5\xE3\x70\xA0\xA1\xCD\x4C\x88\x99\x93\x8C\x91\x70\xE2\xAB\x0F\x1C\xBE\x93\xA9\xFF\x63\xD5\xE4\x07\x60\xD3\xA3\xBF\x9D\x5B\x09\xF1\xD5\x8E\xE3\x53\xF4\x8E\x63\xFA\x3F\xA7\xDB\xB4\x66\xDF\x62\x66\xD6\xD1\x6E\x41\x8D\xF2\x2D\xB5\xEA\x77\x4A\x9F\x9D\x58\xE2\x2B\x59\xC0\x40\x23\xED\x2D\x28\x82\x45\x3E\x79\x54\x92\x26\x98\xE0\x80\x48\xA8\x37\xEF\xF0\xD6\x79\x60\x16\xDE\xAC\xE8\x0E\xCD\x6E\xAC\x44\x17\x38\x2F\x49\xDA\xE1\x45\x3E\x2A\xB9\x36\x53\xCF\x3A\x50\x06\xF7\x2E\xE8\xC4\x57\x49\x6C\x61\x21\x18\xD5\x04\xAD\x78\x3C\x2C\x3A\x80\x6B\xA7\xEB\xAF\x15\x14\xE9\xD8\x89\xC1\xB9\x38\x6C\xE2\x91\x6C\x8A\xFF\x64\xB9\x77\x25\x57\x30\xC0\x1B\x24\xA3\xE1\xDC\xE9\xDF\x47\x7C\xB5\xB4\x24\x08\x05\x30\xEC\x2D\xBD\x0B\xBF\x45\xBF\x50\xB9\xA9\xF3\xEB\x98\x01\x12\xAD\xC8\x88\xC6\x98\x34\x5F\x8D\x0A\x3C\xC6\xE9\xD5\x95\x95\x6D\xDE", @@ -158,4 +149,10 @@ redef root_certs += { ["CN=Swisscom Root EV CA 2,OU=Digital Certificate Services,O=Swisscom,C=ch"] = "\x30\x82\x05\xE0\x30\x82\x03\xC8\xA0\x03\x02\x01\x02\x02\x11\x00\xF2\xFA\x64\xE2\x74\x63\xD3\x8D\xFD\x10\x1D\x04\x1F\x76\xCA\x58\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x67\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x63\x68\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x53\x77\x69\x73\x73\x63\x6F\x6D\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x31\x1E\x30\x1C\x06\x03\x55\x04\x03\x13\x15\x53\x77\x69\x73\x73\x63\x6F\x6D\x20\x52\x6F\x6F\x74\x20\x45\x56\x20\x43\x41\x20\x32\x30\x1E\x17\x0D\x31\x31\x30\x36\x32\x34\x30\x39\x34\x35\x30\x38\x5A\x17\x0D\x33\x31\x30\x36\x32\x35\x30\x38\x34\x35\x30\x38\x5A\x30\x67\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x63\x68\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x53\x77\x69\x73\x73\x63\x6F\x6D\x31\x25\x30\x23\x06\x03\x55\x04\x0B\x13\x1C\x44\x69\x67\x69\x74\x61\x6C\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x31\x1E\x30\x1C\x06\x03\x55\x04\x03\x13\x15\x53\x77\x69\x73\x73\x63\x6F\x6D\x20\x52\x6F\x6F\x74\x20\x45\x56\x20\x43\x41\x20\x32\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xC4\xF7\x1D\x2F\x57\xEA\x57\x6C\xF7\x70\x5D\x63\xB0\x71\x52\x09\x60\x44\x28\x33\xA3\x7A\x4E\x0A\xFA\xD8\xEA\x6C\x8B\x51\x16\x1A\x55\xAE\x54\x26\xC4\xCC\x45\x07\x41\x4F\x10\x79\x7F\x71\xD2\x7A\x4E\x3F\x38\x4E\xB3\x00\xC6\x95\xCA\x5B\xCD\xC1\x2A\x83\xD7\x27\x1F\x31\x0E\x23\x16\xB7\x25\xCB\x1C\xB4\xB9\x80\x32\x5E\x1A\x9D\x93\xF1\xE8\x3C\x60\x2C\xA7\x5E\x57\x19\x58\x51\x5E\xBC\x2C\x56\x0B\xB8\xD8\xEF\x8B\x82\xB4\x3C\xB8\xC2\x24\xA8\x13\xC7\xA0\x21\x36\x1B\x7A\x57\x29\x28\xA7\x2E\xBF\x71\x25\x90\xF3\x44\x83\x69\x50\xA4\xE4\xE1\x1B\x62\x19\x94\x09\xA3\xF3\xC3\xBC\xEF\xF4\xBD\xEC\xDB\x13\x9D\xCF\x9D\x48\x09\x52\x67\xC0\x37\x29\x11\x1E\xFB\xD2\x11\xA7\x85\x18\x74\x79\xE4\x4F\x85\x14\xEB\x52\x37\xE2\xB1\x45\xD8\xCC\x0D\x43\x7F\xAE\x13\xD2\x6B\x2B\x3F\xA7\xC2\xE2\xA8\x6D\x76\x5B\x43\x9F\xBE\xB4\x9D\xB3\x26\x86\x3B\x1F\x7F\xE5\xF2\xE8\x66\x28\x16\x25\xD0\x4B\x97\x38\xA7\xE4\xCF\x09\xD1\x36\xC3\x0B\xBE\xDA\x3B\x44\x58\x8D\xBE\xF1\x9E\x09\x6B\x3E\xF3\x32\xC7\x2B\x87\xC6\xEC\x5E\x9C\xF6\x87\x65\xAD\x33\x29\xC4\x2F\x89\xD9\xB9\xCB\xC9\x03\x9D\xFB\x6C\x94\x51\x97\x10\x1B\x86\x0B\x1A\x1B\x3F\xF6\x02\x7E\x7B\xD4\xC5\x51\x64\x28\x9D\xF5\xD3\xAC\x83\x81\x88\xD3\x74\xB4\x59\x9D\xC1\xEB\x61\x33\x5A\x45\xD1\xCB\x39\xD0\x06\x6A\x53\x60\x1D\xAF\xF6\xFB\x69\xBC\x6A\xDC\x01\xCF\xBD\xF9\x8F\xD9\xBD\x5B\xC1\x3A\x5F\x8E\xDA\x0F\x4B\xA9\x9B\x9D\x2A\x28\x6B\x1A\x0A\x7C\x3C\xAB\x22\x0B\xE5\x77\x2D\x71\xF6\x82\x35\x81\xAE\xF8\x7B\x81\xE6\xEA\xFE\xAC\xF4\x1A\x9B\x74\x5C\xE8\x8F\x24\xF6\x5D\x9D\x46\xC4\x2C\xD2\x1E\x2B\x21\x6A\x83\x27\x67\x55\x4A\xA4\xE3\xC8\x32\x97\x66\x90\x72\xDA\xE3\xD4\x64\x2E\x5F\xE3\xA1\x6A\xF6\x60\xD4\xE7\x35\xCD\xCA\xC4\x68\x8D\xD7\x71\xC8\xD3\x24\x33\x73\xB1\x6C\xF9\x6A\xE1\x28\xDB\x5F\xC6\x3D\xE8\xBE\x55\xE6\x37\x1B\xED\x24\xD9\x0F\x19\x8F\x5F\x63\x18\x58\x50\x81\x51\x65\x6F\xF2\x9F\x7E\x6A\x04\xE7\x34\x24\x71\xBA\x76\x4B\x58\x1E\x19\xBD\x15\x60\x45\xAA\x0C\x12\x40\x01\x9D\x10\xE2\xC7\x38\x07\x72\x0A\x65\xC0\xB6\xBB\x25\x29\xDA\x16\x9E\x8B\x35\x8B\x61\xED\xE5\x71\x57\x83\xB5\x3C\x71\x9F\xE3\x4F\xBF\x7E\x1E\x81\x9F\x41\x97\x02\x03\x01\x00\x01\xA3\x81\x86\x30\x81\x83\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x86\x30\x1D\x06\x03\x55\x1D\x21\x04\x16\x30\x14\x30\x12\x06\x07\x60\x85\x74\x01\x53\x02\x02\x06\x07\x60\x85\x74\x01\x53\x02\x02\x30\x12\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x08\x30\x06\x01\x01\xFF\x02\x01\x03\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x45\xD9\xA5\x81\x6E\x3D\x88\x4D\x8D\x71\xD2\x46\xC1\x6E\x45\x1E\xF3\xC4\x80\x9D\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x45\xD9\xA5\x81\x6E\x3D\x88\x4D\x8D\x71\xD2\x46\xC1\x6E\x45\x1E\xF3\xC4\x80\x9D\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x02\x01\x00\x94\x3A\x73\x06\x9F\x52\x4B\x30\x5C\xD4\xFE\xB1\x5C\x25\xF9\xD7\x8E\x6F\xF5\x87\x64\x9F\xED\x14\x8E\xB8\x04\x8E\x28\x4B\x8F\xAA\x7B\x8E\x39\xB4\xD9\x58\xF6\x7B\xA1\x35\x0A\xA1\x9D\x8A\xF7\x63\xE5\xEB\xBD\x39\x82\xD4\xE3\x7A\x2D\x6F\xDF\x13\x3C\xBA\xFE\x7E\x56\x98\x0B\xF3\x54\x9F\xCD\x44\x4E\x6E\x3C\xE1\x3E\x15\xBF\x06\x26\x9D\xE4\xF0\x90\xB6\xD4\xC2\x9E\x30\x2E\x1F\xEF\xC7\x7A\xC4\x50\xC7\xEA\x7B\xDA\x50\xCB\x7A\x26\xCB\x00\xB4\x5A\xAB\xB5\x93\x1F\x80\x89\x84\x04\x95\x8D\x8D\x7F\x09\x93\xBF\xD4\xA8\xA8\xE4\x63\x6D\xD9\x64\xE4\xB8\x29\x5A\x08\xBF\x50\xE1\x84\x0F\x55\x7B\x5F\x08\x22\x1B\xF5\xBD\x99\x1E\x14\xF6\xCE\xF4\x58\x10\x82\xB3\x0A\x3D\x19\xC1\xBF\x5B\xAB\xAA\x99\xD8\xF2\x31\xBD\xE5\x38\x66\xDC\x58\x05\xC7\xED\x63\x1A\x2E\x0A\x97\x7C\x87\x93\x2B\xB2\x8A\xE3\xF1\xEC\x18\xE5\x75\xB6\x29\x87\xE7\xDC\x8B\x1A\x7E\xB4\xD8\xC9\xD3\x8A\x17\x6C\x7D\x29\x44\xBE\x8A\xAA\xF5\x7E\x3A\x2E\x68\x31\x93\xB9\x6A\xDA\x9A\xE0\xDB\xE9\x2E\xA5\x84\xCD\x1C\x0A\xB8\x4A\x08\xF9\x9C\xF1\x61\x26\x98\x93\xB7\x7B\x66\xEC\x91\x5E\xDD\x51\x3F\xDB\x73\x0F\xAD\x04\x58\x09\xDD\x04\x02\x95\x0A\x3E\xD3\x76\xDF\xA6\x10\x1E\x80\x3D\xE8\xCD\xA4\x64\xD1\x33\xC7\x92\xC7\xE2\x4E\x44\xE3\x09\xC9\x4E\xC2\x5D\x87\x0E\x12\x9E\xBF\x0F\xC9\x05\x10\xDE\x7A\xA3\xB1\x3C\xF2\x3F\xA5\xAA\x27\x79\xAD\x31\x7D\x1F\xFD\xFC\x19\x69\xC5\xDD\xB9\x3F\x7C\xCD\xC6\xB4\xC2\x30\x1E\x7E\x6E\x92\xD7\x7F\x61\x76\x5A\x8F\xEB\x95\x4D\xBC\x11\x6E\x21\x7C\x59\x37\x99\xD0\x06\xBC\xF9\x06\x6D\x32\x16\xA5\xD9\x69\xA8\xE1\xDC\x3C\x80\x1E\x60\x51\xDC\xD7\x54\x21\x1E\xCA\x62\x77\x4F\xFA\xD8\x8F\xB3\x2B\x3A\x0D\x78\x72\xC9\x68\x41\x5A\x47\x4A\xC2\xA3\xEB\x1A\xD7\x0A\xAB\x3C\x32\x55\xC8\x0A\x11\x9C\xDF\x74\xD6\xF0\x40\x15\x1D\xC8\xB9\x8F\xB5\x36\xC5\xAF\xF8\x22\xB8\xCA\x1D\xF3\xD6\xB6\x19\x0F\x9F\x61\x65\x6A\xEA\x74\xC8\x7C\x8F\xC3\x4F\x5D\x65\x82\x1F\xD9\x0D\x89\xDA\x75\x72\xFB\xEF\xF1\x47\x67\x13\xB3\xC8\xD1\x19\x88\x27\x26\x9A\x99\x79\x7F\x1E\xE4\x2C\x3F\x7B\xEE\xF1\xDE\x4D\x8B\x96\x97\xC3\xD5\x3F\x7C\x1B\x23\xED\xA4\xB3\x1D\x16\x72\x43\x4B\x20\xE1\x59\x7E\xC2\xE8\xAD\x26\xBF\xA2\xF7", ["CN=CA Disig Root R1,O=Disig a.s.,L=Bratislava,C=SK"] = "\x30\x82\x05\x69\x30\x82\x03\x51\xA0\x03\x02\x01\x02\x02\x09\x00\xC3\x03\x9A\xEE\x50\x90\x6E\x28\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x52\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x4B\x31\x13\x30\x11\x06\x03\x55\x04\x07\x13\x0A\x42\x72\x61\x74\x69\x73\x6C\x61\x76\x61\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x44\x69\x73\x69\x67\x20\x61\x2E\x73\x2E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x43\x41\x20\x44\x69\x73\x69\x67\x20\x52\x6F\x6F\x74\x20\x52\x31\x30\x1E\x17\x0D\x31\x32\x30\x37\x31\x39\x30\x39\x30\x36\x35\x36\x5A\x17\x0D\x34\x32\x30\x37\x31\x39\x30\x39\x30\x36\x35\x36\x5A\x30\x52\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x4B\x31\x13\x30\x11\x06\x03\x55\x04\x07\x13\x0A\x42\x72\x61\x74\x69\x73\x6C\x61\x76\x61\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x44\x69\x73\x69\x67\x20\x61\x2E\x73\x2E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x43\x41\x20\x44\x69\x73\x69\x67\x20\x52\x6F\x6F\x74\x20\x52\x31\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xAA\xC3\x78\xF7\xDC\x98\xA3\xA7\x5A\x5E\x77\x18\xB2\xDD\x04\x64\x0F\x63\xFD\x9B\x96\x09\x80\xD5\xE8\xAA\xA5\xE2\x9C\x26\x94\x3A\xE8\x99\x73\x8C\x9D\xDF\xD7\xDF\x83\xF3\x78\x4F\x40\xE1\x7F\xD2\xA7\xD2\xE5\xCA\x13\x93\xE7\xED\xC6\x77\x5F\x36\xB5\x94\xAF\xE8\x38\x8E\xDB\x9B\xE5\x7C\xBB\xCC\x8D\xEB\x75\x73\xE1\x24\xCD\xE6\xA7\x2D\x19\x2E\xD8\xD6\x8A\x6B\x14\xEB\x08\x62\x0A\xD8\xDC\xB3\x00\x4D\xC3\x23\x7C\x5F\x43\x08\x23\x32\x12\xDC\xED\x0C\xAD\xC0\x7D\x0F\xA5\x7A\x42\xD9\x5A\x70\xD9\xBF\xA7\xD7\x01\x1C\xF6\x9B\xAB\x8E\xB7\x4A\x86\x78\xA0\x1E\x56\x31\xAE\xEF\x82\x0A\x80\x41\xF7\x1B\xC9\xAE\xAB\x32\x26\xD4\x2C\x6B\xED\x7D\x6B\xE4\xE2\x5E\x22\x0A\x45\xCB\x84\x31\x4D\xAC\xFE\xDB\xD1\x47\xBA\xF9\x60\x97\x39\xB1\x65\xC7\xDE\xFB\x99\xE4\x0A\x22\xB1\x2D\x4D\xE5\x48\x26\x69\xAB\xE2\xAA\xF3\xFB\xFC\x92\x29\x32\xE9\xB3\x3E\x4D\x1F\x27\xA1\xCD\x8E\xB9\x17\xFB\x25\x3E\xC9\x6E\xF3\x77\xDA\x0D\x12\xF6\x5D\xC7\xBB\x36\x10\xD5\x54\xD6\xF3\xE0\xE2\x47\x48\xE6\xDE\x14\xDA\x61\x52\xAF\x26\xB4\xF5\x71\x4F\xC9\xD7\xD2\x06\xDF\x63\xCA\xFF\x21\xE8\x59\x06\xE0\x08\xD5\x84\x15\x53\xF7\x43\xE5\x7C\xC5\xA0\x89\x98\x6B\x73\xC6\x68\xCE\x65\xDE\xBD\x7F\x05\xF7\xB1\xEE\xF6\x57\xA1\x60\x95\xC5\xCC\xEA\x93\x3A\xBE\x99\xAE\x9B\x02\xA3\xAD\xC9\x16\xB5\xCE\xDD\x5E\x99\x78\x7E\x1A\x39\x7E\xB2\xC0\x05\xA4\xC0\x82\xA5\xA3\x47\x9E\x8C\xEA\x5C\xB6\xBC\x67\xDB\xE6\x2A\x4D\xD2\x04\xDC\xA3\xAE\x45\xF7\xBC\x8B\x9C\x1C\xA7\xD6\xD5\x03\xDC\x08\xCB\x2E\x16\xCA\x5C\x40\x33\xE8\x67\xC3\x2E\xE7\xA6\x44\xEA\x11\x45\x1C\x35\x65\x2D\x1E\x45\x61\x24\x1B\x82\x2E\xA5\x9D\x33\x5D\x65\xF8\x41\xF9\x2E\xCB\x94\x3F\x1F\xA3\x0C\x31\x24\x44\xED\xC7\x5E\xAD\x50\xBA\xC6\x41\x9B\xAC\xF0\x17\x65\xC0\xF8\x5D\x6F\x5B\xA0\x0A\x34\x3C\xEE\xD7\xEA\x88\x9F\x98\xF9\xAF\x4E\x24\xFA\x97\xB2\x64\x76\xDA\xAB\xF4\xED\xE3\xC3\x60\xEF\xD5\xF9\x02\xC8\x2D\x9F\x83\xAF\x67\x69\x06\xA7\x31\x55\xD5\xCF\x4B\x6F\xFF\x04\x05\xC7\x58\xAC\x5F\x16\x1B\xE5\xD2\xA3\xEB\x31\xDB\x1F\x33\x15\x4D\xD0\xF2\xA5\x53\xF5\xCB\xE1\x3D\x4E\x68\x2D\xD8\x12\xDD\xAA\xF2\xE6\x4D\x9B\x49\xE5\xC5\x28\xA1\xBA\xB0\x5A\xC6\xA0\xB5\x02\x03\x01\x00\x01\xA3\x42\x30\x40\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x89\x0A\xB4\x38\x93\x1A\xE6\xAB\xEE\x9B\x91\x18\xF9\xF5\x3C\x3E\x35\xD0\xD3\x82\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\x32\x8B\xF6\x9D\x4A\xC9\xBE\x14\xE5\x8C\xAC\x38\xCA\x3A\x09\xD4\x1B\xCE\x86\xB3\xDD\xEB\xD4\xBA\x28\xBE\x12\xAE\x45\x2C\x04\x74\xAC\x13\x51\xC5\x58\x18\x66\x4D\x82\xDA\xD5\xDC\x93\xC0\x27\xE1\xBE\x7C\x9F\x52\x9E\x12\x56\xF6\xD5\x9C\xA9\xF4\x75\x9C\xFA\x37\x12\x8F\x1C\x93\xEC\x57\xFE\x07\x0F\xAB\xD5\x12\xF7\x0F\xAE\x61\x5E\x56\x80\x49\xF5\xFC\x30\xF5\x9B\x4F\x1F\x41\x2F\x1C\x84\xD3\x89\xC7\xE2\xDA\x02\x76\xED\x09\xCF\x6C\xC1\xB8\x1C\x83\x1C\x16\xFA\x94\xCD\x7D\xA0\xC8\x18\xD2\xC8\x9D\x6E\xF5\xBD\x69\xD4\x6D\x3D\x35\xE8\x1E\xA2\x4F\x60\xD7\x07\x29\xFC\xB2\xA3\xA4\x9D\x6E\x15\x92\x56\x19\x4C\x0A\xB0\xE9\x7C\xD2\x19\x4D\x42\x46\xEC\xBD\xFD\xF6\x57\x5B\xDD\x98\x7E\xA4\x4D\xCC\x72\x03\x83\x58\x5D\xEF\x93\x3A\x41\x7A\x63\xAA\x7C\x3A\xA8\xF5\xAC\xA4\xD1\xDD\xA2\x2D\xB6\x2A\xFC\x9F\x01\x8E\xE2\x10\xB1\xC4\xCA\xE4\x67\xDB\x55\x25\x19\x3F\xFD\xE8\x36\x7E\xB3\xE1\xE1\x81\xAF\x11\x16\x8B\x50\x97\x60\x19\x82\x00\xC0\x6B\x4D\x73\xB8\xD1\x13\x07\x3E\xEA\xB6\x31\x4F\xF0\x42\x9A\x6D\xE2\x11\x74\xE5\x94\xAC\x8D\x84\x95\x3C\x21\xAF\xC5\xDA\x47\xC8\xDF\x39\x62\x62\xCB\x5B\x50\x0B\xD7\x81\x40\x05\x9C\x9B\xED\xBA\xB6\x8B\x1E\x04\x6F\x96\x20\x39\xED\xA4\x7D\x29\xDB\x48\xCE\x82\xDC\xD4\x02\x8D\x1D\x04\x31\x5A\xC7\x4B\xF0\x6C\x61\x52\xD7\xB4\x51\xC2\x81\x6C\xCD\xE1\xFB\xA7\xA1\xD2\x92\x76\xCF\xB1\x0F\x37\x58\xA4\xF2\x52\x71\x67\x3F\x0C\x88\x78\x80\x89\xC1\xC8\xB5\x1F\x92\x63\xBE\xA7\x7A\x8A\x56\x2C\x1A\xA8\xA6\x9C\xB5\x5D\xB3\x63\xD0\x13\x20\xA1\xEB\x91\x6C\xD0\x8D\x7D\xAF\xDF\x0B\xE4\x17\xB9\x86\x9E\x38\xB1\x94\x0C\x58\x8C\xE0\x55\xAA\x3B\x63\x6D\x9A\x89\x60\xB8\x64\x2A\x92\xC6\x37\xF4\x7E\x43\x43\xB7\x73\xE8\x01\xE7\x7F\x97\x0F\xD7\xF2\x7B\x19\xFD\x1A\xD7\x8F\xC9\xFA\x85\x6B\x7A\x9D\x9E\x89\xB6\xA6\x28\x99\x93\x88\x40\xF7\x3E\xCD\x51\xA3\xCA\xEA\xEF\x79\x47\x21\xB5\xFE\x32\xE2\xC7\xC3\x51\x6F\xBE\x80\x74\xF0\xA4\xC3\x3A\xF2\x4F\xE9\x5F\xDF\x19\x0A\xF2\x3B\x13\x43\xAC\x31\xA4\xB3\xE7\xEB\xFC\x18\xD6\x01\xA9\xF3\x2A\x8F\x36\x0E\xEB\xB4\xB1\xBC\xB7\x4C\xC9\x6B\xBF\xA1\xF3\xD9\xF4\xED\xE2\xF0\xE3\xED\x64\x9E\x3D\x2F\x96\x52\x4F\x80\x53\x8B", ["CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK"] = "\x30\x82\x05\x69\x30\x82\x03\x51\xA0\x03\x02\x01\x02\x02\x09\x00\x92\xB8\x88\xDB\xB0\x8A\xC1\x63\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x52\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x4B\x31\x13\x30\x11\x06\x03\x55\x04\x07\x13\x0A\x42\x72\x61\x74\x69\x73\x6C\x61\x76\x61\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x44\x69\x73\x69\x67\x20\x61\x2E\x73\x2E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x43\x41\x20\x44\x69\x73\x69\x67\x20\x52\x6F\x6F\x74\x20\x52\x32\x30\x1E\x17\x0D\x31\x32\x30\x37\x31\x39\x30\x39\x31\x35\x33\x30\x5A\x17\x0D\x34\x32\x30\x37\x31\x39\x30\x39\x31\x35\x33\x30\x5A\x30\x52\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x4B\x31\x13\x30\x11\x06\x03\x55\x04\x07\x13\x0A\x42\x72\x61\x74\x69\x73\x6C\x61\x76\x61\x31\x13\x30\x11\x06\x03\x55\x04\x0A\x13\x0A\x44\x69\x73\x69\x67\x20\x61\x2E\x73\x2E\x31\x19\x30\x17\x06\x03\x55\x04\x03\x13\x10\x43\x41\x20\x44\x69\x73\x69\x67\x20\x52\x6F\x6F\x74\x20\x52\x32\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xA2\xA3\xC4\x00\x09\xD6\x85\x5D\x2D\x6D\x14\xF6\xC2\xC3\x73\x9E\x35\xC2\x71\x55\x7E\x81\xFB\xAB\x46\x50\xE0\xC1\x7C\x49\x78\xE6\xAB\x79\x58\x3C\xDA\xFF\x7C\x1C\x9F\xD8\x97\x02\x78\x3E\x6B\x41\x04\xE9\x41\xBD\xBE\x03\x2C\x45\xF6\x2F\x64\xD4\xAB\x5D\xA3\x47\x3D\x64\x9B\xE9\x68\x9A\xC6\xCC\x1B\x3F\xBA\xBE\xB2\x8B\x34\x02\x2E\x98\x55\x19\xFC\x8C\x6F\xAA\x5F\xDA\x4C\xCE\x4D\x03\x21\xA3\xD8\xD2\x34\x93\x56\x96\xCB\x4C\x0C\x00\x16\x3C\x5F\x1A\xCD\xC8\xC7\x6C\xA6\xAD\xD3\x31\xA7\xBC\xE8\xE5\xE1\x66\xD6\xD2\xFB\x03\xB4\x41\x65\xC9\x10\xAE\x0E\x05\x63\xC6\x80\x6A\x69\x30\xFD\xD2\xEE\x90\xEF\x0D\x27\xDF\x9F\x95\x73\xF4\xE1\x25\xDA\x6C\x16\xDE\x41\x38\x34\xEA\x8B\xFC\xD1\xE8\x04\x14\x61\x2D\x41\x7E\xAC\xC7\x77\x4E\xCB\x51\x54\xFB\x5E\x92\x18\x1B\x04\x5A\x68\xC6\xC9\xC4\xFA\xB7\x13\xA0\x98\xB7\x11\x2B\xB7\xD6\x57\xCC\x7C\x9E\x17\xD1\xCB\x25\xFE\x86\x4E\x24\x2E\x56\x0C\x78\x4D\x9E\x01\x12\xA6\x2B\xA7\x01\x65\x6E\x7C\x62\x1D\x84\x84\xDF\xEA\xC0\x6B\xB5\xA5\x2A\x95\x83\xC3\x53\x11\x0C\x73\x1D\x0B\xB2\x46\x90\xD1\x42\x3A\xCE\x40\x6E\x95\xAD\xFF\xC6\x94\xAD\x6E\x97\x84\x8E\x7D\x6F\x9E\x8A\x80\x0D\x49\x6D\x73\xE2\x7B\x92\x1E\xC3\xF3\xC1\xF3\xEB\x2E\x05\x6F\xD9\x1B\xCF\x37\x76\x04\xC8\xB4\x5A\xE4\x17\xA7\xCB\xDD\x76\x1F\xD0\x19\x76\xE8\x2C\x05\xB3\xD6\x9C\x34\xD8\x96\xDC\x61\x87\x91\x05\xE4\x44\x08\x33\xC1\xDA\xB9\x08\x65\xD4\xAE\xB2\x36\x0D\xEB\xBA\x38\xBA\x0C\xE5\x9B\x9E\xEB\x8D\x66\xDD\x99\xCF\xD6\x89\x41\xF6\x04\x92\x8A\x29\x29\x6D\x6B\x3A\x1C\xE7\x75\x7D\x02\x71\x0E\xF3\xC0\xE7\xBD\xCB\x19\xDD\x9D\x60\xB2\xC2\x66\x60\xB6\xB1\x04\xEE\xC9\xE6\x86\xB9\x9A\x66\x40\xA8\xE7\x11\xED\x81\x45\x03\x8B\xF6\x67\x59\xE8\xC1\x06\x11\xBD\xDD\xCF\x80\x02\x4F\x65\x40\x78\x5C\x47\x50\xC8\x9B\xE6\x1F\x81\x7B\xE4\x44\xA8\x5B\x85\x9A\xE2\xDE\x5A\xD5\xC7\xF9\x3A\x44\x66\x4B\xE4\x32\x54\x7C\xE4\x6C\x9C\xB3\x0E\x3D\x17\xA2\xB2\x34\x12\xD6\x7E\xB2\xA8\x49\xBB\xD1\x7A\x28\x40\xBE\xA2\x16\x1F\xDF\xE4\x37\x1F\x11\x73\xFB\x90\x0A\x65\x43\xA2\x0D\x7C\xF8\x06\x01\x55\x33\x7D\xB0\x0D\xB8\xF4\xF5\xAE\xA5\x42\x57\x7C\x36\x11\x8C\x7B\x5E\xC4\x03\x9D\x8C\x79\x9D\x02\x03\x01\x00\x01\xA3\x42\x30\x40\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xB5\x99\xF8\xAF\xB0\x94\xF5\xE3\x20\xD6\x0A\xAD\xCE\x4E\x56\xA4\x2E\x6E\x42\xED\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x02\x01\x00\x26\x06\x5E\x70\xE7\x65\x33\xC8\x82\x6E\xD9\x9C\x17\x3A\x1B\x7A\x66\xB2\x01\xF6\x78\x3B\x69\x5E\x2F\xEA\xFF\x4E\xF9\x28\xC3\x98\x2A\x61\x4C\xB4\x24\x12\x8A\x7D\x6D\x11\x14\xF7\x9C\xB5\xCA\xE6\xBC\x9E\x27\x8E\x4C\x19\xC8\xA9\xBD\x7A\xC0\xD7\x36\x0E\x6D\x85\x72\x6E\xA8\xC6\xA2\x6D\xF6\xFA\x73\x63\x7F\xBC\x6E\x79\x08\x1C\x9D\x8A\x9F\x1A\x8A\x53\xA6\xD8\xBB\xD9\x35\x55\xB1\x11\xC5\xA9\x03\xB3\x56\x3B\xB9\x84\x93\x22\x5E\x7E\xC1\xF6\x12\x52\x8B\xEA\x2C\x67\xBC\xFE\x36\x4C\xF5\xB8\xCF\xD1\xB3\x49\x92\x3B\xD3\x29\x0E\x99\x1B\x96\xF7\x61\xB8\x3B\xC4\x2B\xB6\x78\x6C\xB4\x23\x6F\xF0\xFD\xD3\xB2\x5E\x75\x1F\x99\x95\xA8\xAC\xF6\xDA\xE1\xC5\x31\x7B\xFB\xD1\x46\xB3\xD2\xBC\x67\xB4\x62\x54\xBA\x09\xF7\x63\xB0\x93\xA2\x9A\xF9\xE9\x52\x2E\x8B\x60\x12\xAB\xFC\xF5\x60\x56\xEF\x10\x5C\x8B\xC4\x1A\x42\xDC\x83\x5B\x64\x0E\xCB\xB5\xBC\xD6\x4F\xC1\x7C\x3C\x6E\x8D\x13\x6D\xFB\x7B\xEB\x30\xD0\xDC\x4D\xAF\xC5\xD5\xB6\xA5\x4C\x5B\x71\xC9\xE8\x31\xBE\xE8\x38\x06\x48\xA1\x1A\xE2\xEA\xD2\xDE\x12\x39\x58\x1A\xFF\x80\x0E\x82\x75\xE6\xB7\xC9\x07\x6C\x0E\xEF\xFF\x38\xF1\x98\x71\xC4\xB7\x7F\x0E\x15\xD0\x25\x69\xBD\x22\x9D\x2B\xED\x05\xF6\x46\x47\xAC\xED\xC0\xF0\xD4\x3B\xE2\xEC\xEE\x96\x5B\x90\x13\x4E\x1E\x56\x3A\xEB\xB0\xEF\x96\xBB\x96\x23\x11\xBA\xF2\x43\x86\x74\x64\x95\xC8\x28\x75\xDF\x1D\x35\xBA\xD2\x37\x83\x38\x53\x38\x36\x3B\xCF\x6C\xE9\xF9\x6B\x0E\xD0\xFB\x04\xE8\x4F\x77\xD7\x65\x01\x78\x86\x0C\x7A\x3E\x21\x62\xF1\x7F\x63\x71\x0C\xC9\x9F\x44\xDB\xA8\x27\xA2\x75\xBE\x6E\x81\x3E\xD7\xC0\xEB\x1B\x98\x0F\x70\x5C\x34\xB2\x8A\xCC\xC0\x85\x18\xEB\x6E\x7A\xB3\xF7\x5A\xA1\x07\xBF\xA9\x42\x92\xF3\x60\x22\x97\xE4\x14\xA1\x07\x9B\x4E\x76\xC0\x8E\x7D\xFD\xA4\x25\xC7\x47\xED\xFF\x1F\x73\xAC\xCC\xC3\xA5\xE9\x6F\x0A\x8E\x9B\x65\xC2\x50\x85\xB5\xA3\xA0\x53\x12\xCC\x55\x87\x61\xF3\x81\xAE\x10\x46\x61\xBD\x44\x21\xB8\xC2\x3D\x74\xCF\x7E\x24\x35\xFA\x1C\x07\x0E\x9B\x3D\x22\xCA\xEF\x31\x2F\x8C\xAC\x12\xBD\xEF\x40\x28\xFC\x29\x67\x9F\xB2\x13\x4F\x66\x24\xC4\x53\x19\xE9\x1E\x29\x15\xEF\xE6\x6D\xB0\x7F\x2D\x67\xFD\xF3\x6C\x1B\x75\x46\xA3\xE5\x4A\x17\xE9\xA4\xD7\x0B", + ["C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1"] = "\x30\x82\x07\xD3\x30\x82\x05\xBB\xA0\x03\x02\x01\x02\x02\x08\x5E\xC3\xB7\xA6\x43\x7F\xA4\xE0\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x42\x31\x12\x30\x10\x06\x03\x55\x04\x03\x0C\x09\x41\x43\x43\x56\x52\x41\x49\x5A\x31\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x0C\x07\x50\x4B\x49\x41\x43\x43\x56\x31\x0D\x30\x0B\x06\x03\x55\x04\x0A\x0C\x04\x41\x43\x43\x56\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x53\x30\x1E\x17\x0D\x31\x31\x30\x35\x30\x35\x30\x39\x33\x37\x33\x37\x5A\x17\x0D\x33\x30\x31\x32\x33\x31\x30\x39\x33\x37\x33\x37\x5A\x30\x42\x31\x12\x30\x10\x06\x03\x55\x04\x03\x0C\x09\x41\x43\x43\x56\x52\x41\x49\x5A\x31\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x0C\x07\x50\x4B\x49\x41\x43\x43\x56\x31\x0D\x30\x0B\x06\x03\x55\x04\x0A\x0C\x04\x41\x43\x43\x56\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x45\x53\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\x9B\xA9\xAB\xBF\x61\x4A\x97\xAF\x2F\x97\x66\x9A\x74\x5F\xD0\xD9\x96\xFD\xCF\xE2\xE4\x66\xEF\x1F\x1F\x47\x33\xC2\x44\xA3\xDF\x9A\xDE\x1F\xB5\x54\xDD\x15\x7C\x69\x35\x11\x6F\xBB\xC8\x0C\x8E\x6A\x18\x1E\xD8\x8F\xD9\x16\xBC\x10\x48\x36\x5C\xF0\x63\xB3\x90\x5A\x5C\x24\x37\xD7\xA3\xD6\xCB\x09\x71\xB9\xF1\x01\x72\x84\xB0\x7D\xDB\x4D\x80\xCD\xFC\xD3\x6F\xC9\xF8\xDA\xB6\x0E\x82\xD2\x45\x85\xA8\x1B\x68\xA8\x3D\xE8\xF4\x44\x6C\xBD\xA1\xC2\xCB\x03\xBE\x8C\x3E\x13\x00\x84\xDF\x4A\x48\xC0\xE3\x22\x0A\xE8\xE9\x37\xA7\x18\x4C\xB1\x09\x0D\x23\x56\x7F\x04\x4D\xD9\x17\x84\x18\xA5\xC8\xDA\x40\x94\x73\xEB\xCE\x0E\x57\x3C\x03\x81\x3A\x9D\x0A\xA1\x57\x43\x69\xAC\x57\x6D\x79\x90\x78\xE5\xB5\xB4\x3B\xD8\xBC\x4C\x8D\x28\xA1\xA7\xA3\xA7\xBA\x02\x4E\x25\xD1\x2A\xAE\xED\xAE\x03\x22\xB8\x6B\x20\x0F\x30\x28\x54\x95\x7F\xE0\xEE\xCE\x0A\x66\x9D\xD1\x40\x2D\x6E\x22\xAF\x9D\x1A\xC1\x05\x19\xD2\x6F\xC0\xF2\x9F\xF8\x7B\xB3\x02\x42\xFB\x50\xA9\x1D\x2D\x93\x0F\x23\xAB\xC6\xC1\x0F\x92\xFF\xD0\xA2\x15\xF5\x53\x09\x71\x1C\xFF\x45\x13\x84\xE6\x26\x5E\xF8\xE0\x88\x1C\x0A\xFC\x16\xB6\xA8\x73\x06\xB8\xF0\x63\x84\x02\xA0\xC6\x5A\xEC\xE7\x74\xDF\x70\xAE\xA3\x83\x25\xEA\xD6\xC7\x97\x87\x93\xA7\xC6\x8A\x8A\x33\x97\x60\x37\x10\x3E\x97\x3E\x6E\x29\x15\xD6\xA1\x0F\xD1\x88\x2C\x12\x9F\x6F\xAA\xA4\xC6\x42\xEB\x41\xA2\xE3\x95\x43\xD3\x01\x85\x6D\x8E\xBB\x3B\xF3\x23\x36\xC7\xFE\x3B\xE0\xA1\x25\x07\x48\xAB\xC9\x89\x74\xFF\x08\x8F\x80\xBF\xC0\x96\x65\xF3\xEE\xEC\x4B\x68\xBD\x9D\x88\xC3\x31\xB3\x40\xF1\xE8\xCF\xF6\x38\xBB\x9C\xE4\xD1\x7F\xD4\xE5\x58\x9B\x7C\xFA\xD4\xF3\x0E\x9B\x75\x91\xE4\xBA\x52\x2E\x19\x7E\xD1\xF5\xCD\x5A\x19\xFC\xBA\x06\xF6\xFB\x52\xA8\x4B\x99\x04\xDD\xF8\xF9\xB4\x8B\x50\xA3\x4E\x62\x89\xF0\x87\x24\xFA\x83\x42\xC1\x87\xFA\xD5\x2D\x29\x2A\x5A\x71\x7A\x64\x6A\xD7\x27\x60\x63\x0D\xDB\xCE\x49\xF5\x8D\x1F\x90\x89\x32\x17\xF8\x73\x43\xB8\xD2\x5A\x93\x86\x61\xD6\xE1\x75\x0A\xEA\x79\x66\x76\x88\x4F\x71\xEB\x04\x25\xD6\x0A\x5A\x7A\x93\xE5\xB9\x4B\x17\x40\x0F\xB1\xB6\xB9\xF5\xDE\x4F\xDC\xE0\xB3\xAC\x3B\x11\x70\x60\x84\x4A\x43\x6E\x99\x20\xC0\x29\x71\x0A\xC0\x65\x02\x03\x01\x00\x01\xA3\x82\x02\xCB\x30\x82\x02\xC7\x30\x7D\x06\x08\x2B\x06\x01\x05\x05\x07\x01\x01\x04\x71\x30\x6F\x30\x4C\x06\x08\x2B\x06\x01\x05\x05\x07\x30\x02\x86\x40\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x61\x63\x63\x76\x2E\x65\x73\x2F\x66\x69\x6C\x65\x61\x64\x6D\x69\x6E\x2F\x41\x72\x63\x68\x69\x76\x6F\x73\x2F\x63\x65\x72\x74\x69\x66\x69\x63\x61\x64\x6F\x73\x2F\x72\x61\x69\x7A\x61\x63\x63\x76\x31\x2E\x63\x72\x74\x30\x1F\x06\x08\x2B\x06\x01\x05\x05\x07\x30\x01\x86\x13\x68\x74\x74\x70\x3A\x2F\x2F\x6F\x63\x73\x70\x2E\x61\x63\x63\x76\x2E\x65\x73\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xD2\x87\xB4\xE3\xDF\x37\x27\x93\x55\xF6\x56\xEA\x81\xE5\x36\xCC\x8C\x1E\x3F\xBD\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\xD2\x87\xB4\xE3\xDF\x37\x27\x93\x55\xF6\x56\xEA\x81\xE5\x36\xCC\x8C\x1E\x3F\xBD\x30\x82\x01\x73\x06\x03\x55\x1D\x20\x04\x82\x01\x6A\x30\x82\x01\x66\x30\x82\x01\x62\x06\x04\x55\x1D\x20\x00\x30\x82\x01\x58\x30\x82\x01\x22\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x02\x30\x82\x01\x14\x1E\x82\x01\x10\x00\x41\x00\x75\x00\x74\x00\x6F\x00\x72\x00\x69\x00\x64\x00\x61\x00\x64\x00\x20\x00\x64\x00\x65\x00\x20\x00\x43\x00\x65\x00\x72\x00\x74\x00\x69\x00\x66\x00\x69\x00\x63\x00\x61\x00\x63\x00\x69\x00\xF3\x00\x6E\x00\x20\x00\x52\x00\x61\x00\xED\x00\x7A\x00\x20\x00\x64\x00\x65\x00\x20\x00\x6C\x00\x61\x00\x20\x00\x41\x00\x43\x00\x43\x00\x56\x00\x20\x00\x28\x00\x41\x00\x67\x00\x65\x00\x6E\x00\x63\x00\x69\x00\x61\x00\x20\x00\x64\x00\x65\x00\x20\x00\x54\x00\x65\x00\x63\x00\x6E\x00\x6F\x00\x6C\x00\x6F\x00\x67\x00\xED\x00\x61\x00\x20\x00\x79\x00\x20\x00\x43\x00\x65\x00\x72\x00\x74\x00\x69\x00\x66\x00\x69\x00\x63\x00\x61\x00\x63\x00\x69\x00\xF3\x00\x6E\x00\x20\x00\x45\x00\x6C\x00\x65\x00\x63\x00\x74\x00\x72\x00\xF3\x00\x6E\x00\x69\x00\x63\x00\x61\x00\x2C\x00\x20\x00\x43\x00\x49\x00\x46\x00\x20\x00\x51\x00\x34\x00\x36\x00\x30\x00\x31\x00\x31\x00\x35\x00\x36\x00\x45\x00\x29\x00\x2E\x00\x20\x00\x43\x00\x50\x00\x53\x00\x20\x00\x65\x00\x6E\x00\x20\x00\x68\x00\x74\x00\x74\x00\x70\x00\x3A\x00\x2F\x00\x2F\x00\x77\x00\x77\x00\x77\x00\x2E\x00\x61\x00\x63\x00\x63\x00\x76\x00\x2E\x00\x65\x00\x73\x30\x30\x06\x08\x2B\x06\x01\x05\x05\x07\x02\x01\x16\x24\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x61\x63\x63\x76\x2E\x65\x73\x2F\x6C\x65\x67\x69\x73\x6C\x61\x63\x69\x6F\x6E\x5F\x63\x2E\x68\x74\x6D\x30\x55\x06\x03\x55\x1D\x1F\x04\x4E\x30\x4C\x30\x4A\xA0\x48\xA0\x46\x86\x44\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x61\x63\x63\x76\x2E\x65\x73\x2F\x66\x69\x6C\x65\x61\x64\x6D\x69\x6E\x2F\x41\x72\x63\x68\x69\x76\x6F\x73\x2F\x63\x65\x72\x74\x69\x66\x69\x63\x61\x64\x6F\x73\x2F\x72\x61\x69\x7A\x61\x63\x63\x76\x31\x5F\x64\x65\x72\x2E\x63\x72\x6C\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x17\x06\x03\x55\x1D\x11\x04\x10\x30\x0E\x81\x0C\x61\x63\x63\x76\x40\x61\x63\x63\x76\x2E\x65\x73\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\x97\x31\x02\x9F\xE7\xFD\x43\x67\x48\x44\x14\xE4\x29\x87\xED\x4C\x28\x66\xD0\x8F\x35\xDA\x4D\x61\xB7\x4A\x97\x4D\xB5\xDB\x90\xE0\x05\x2E\x0E\xC6\x79\xD0\xF2\x97\x69\x0F\xBD\x04\x47\xD9\xBE\xDB\xB5\x29\xDA\x9B\xD9\xAE\xA9\x99\xD5\xD3\x3C\x30\x93\xF5\x8D\xA1\xA8\xFC\x06\x8D\x44\xF4\xCA\x16\x95\x7C\x33\xDC\x62\x8B\xA8\x37\xF8\x27\xD8\x09\x2D\x1B\xEF\xC8\x14\x27\x20\xA9\x64\x44\xFF\x2E\xD6\x75\xAA\x6C\x4D\x60\x40\x19\x49\x43\x54\x63\xDA\xE2\xCC\xBA\x66\xE5\x4F\x44\x7A\x5B\xD9\x6A\x81\x2B\x40\xD5\x7F\xF9\x01\x27\x58\x2C\xC8\xED\x48\x91\x7C\x3F\xA6\x00\xCF\xC4\x29\x73\x11\x36\xDE\x86\x19\x3E\x9D\xEE\x19\x8A\x1B\xD5\xB0\xED\x8E\x3D\x9C\x2A\xC0\x0D\xD8\x3D\x66\xE3\x3C\x0D\xBD\xD5\x94\x5C\xE2\xE2\xA7\x35\x1B\x04\x00\xF6\x3F\x5A\x8D\xEA\x43\xBD\x5F\x89\x1D\xA9\xC1\xB0\xCC\x99\xE2\x4D\x00\x0A\xDA\xC9\x27\x5B\xE7\x13\x90\x5C\xE4\xF5\x33\xA2\x55\x6D\xDC\xE0\x09\x4D\x2F\xB1\x26\x5B\x27\x75\x00\x09\xC4\x62\x77\x29\x08\x5F\x9E\x59\xAC\xB6\x7E\xAD\x9F\x54\x30\x22\x03\xC1\x1E\x71\x64\xFE\xF9\x38\x0A\x96\x18\xDD\x02\x14\xAC\x23\xCB\x06\x1C\x1E\xA4\x7D\x8D\x0D\xDE\x27\x41\xE8\xAD\xDA\x15\xB7\xB0\x23\xDD\x2B\xA8\xD3\xDA\x25\x87\xED\xE8\x55\x44\x4D\x88\xF4\x36\x7E\x84\x9A\x78\xAC\xF7\x0E\x56\x49\x0E\xD6\x33\x25\xD6\x84\x50\x42\x6C\x20\x12\x1D\x2A\xD5\xBE\xBC\xF2\x70\x81\xA4\x70\x60\xBE\x05\xB5\x9B\x9E\x04\x44\xBE\x61\x23\xAC\xE9\xA5\x24\x8C\x11\x80\x94\x5A\xA2\xA2\xB9\x49\xD2\xC1\xDC\xD1\xA7\xED\x31\x11\x2C\x9E\x19\xA6\xEE\xE1\x55\xE1\xC0\xEA\xCF\x0D\x84\xE4\x17\xB7\xA2\x7C\xA5\xDE\x55\x25\x06\xEE\xCC\xC0\x87\x5C\x40\xDA\xCC\x95\x3F\x55\xE0\x35\xC7\xB8\x84\xBE\xB4\x5D\xCD\x7A\x83\x01\x72\xEE\x87\xE6\x5F\x1D\xAE\xB5\x85\xC6\x26\xDF\xE6\xC1\x9A\xE9\x1E\x02\x47\x9F\x2A\xA8\x6D\xA9\x5B\xCF\xEC\x45\x77\x7F\x98\x27\x9A\x32\x5D\x2A\xE3\x84\xEE\xC5\x98\x66\x2F\x96\x20\x1D\xDD\xD8\xC3\x27\xD7\xB0\xF9\xFE\xD9\x7D\xCD\xD0\x9F\x8F\x0B\x14\x58\x51\x9F\x2F\x8B\xC3\x38\x2D\xDE\xE8\x8F\xD6\x8D\x87\xA4\xF5\x56\x43\x16\x99\x2C\xF4\xA4\x56\xB4\x34\xB8\x61\x37\xC9\xC2\x58\x80\x1B\xA0\x97\xA1\xFC\x59\x8D\xE9\x11\xF6\xD1\x0F\x4B\x55\x34\x46\x2A\x8B\x86\x3B", + ["CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW"] = "\x30\x82\x05\x41\x30\x82\x03\x29\xA0\x03\x02\x01\x02\x02\x02\x0C\xBE\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x51\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x57\x31\x12\x30\x10\x06\x03\x55\x04\x0A\x13\x09\x54\x41\x49\x57\x41\x4E\x2D\x43\x41\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x13\x07\x52\x6F\x6F\x74\x20\x43\x41\x31\x1C\x30\x1A\x06\x03\x55\x04\x03\x13\x13\x54\x57\x43\x41\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x1E\x17\x0D\x31\x32\x30\x36\x32\x37\x30\x36\x32\x38\x33\x33\x5A\x17\x0D\x33\x30\x31\x32\x33\x31\x31\x35\x35\x39\x35\x39\x5A\x30\x51\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x57\x31\x12\x30\x10\x06\x03\x55\x04\x0A\x13\x09\x54\x41\x49\x57\x41\x4E\x2D\x43\x41\x31\x10\x30\x0E\x06\x03\x55\x04\x0B\x13\x07\x52\x6F\x6F\x74\x20\x43\x41\x31\x1C\x30\x1A\x06\x03\x55\x04\x03\x13\x13\x54\x57\x43\x41\x20\x47\x6C\x6F\x62\x61\x6C\x20\x52\x6F\x6F\x74\x20\x43\x41\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xB0\x05\xDB\xC8\xEB\x8C\xC4\x6E\x8A\x21\xEF\x8E\x4D\x9C\x71\x0A\x1F\x52\x70\xED\x6D\x82\x9C\x97\xC5\xD7\x4C\x4E\x45\x49\xCB\x40\x42\xB5\x12\x34\x6C\x19\xC2\x74\xA4\x31\x5F\x85\x02\x97\xEC\x43\x33\x0A\x53\xD2\x9C\x8C\x8E\xB7\xB8\x79\xDB\x2B\xD5\x6A\xF2\x8E\x66\xC4\xEE\x2B\x01\x07\x92\xD4\xB3\xD0\x02\xDF\x50\xF6\x55\xAF\x66\x0E\xCB\xE0\x47\x60\x2F\x2B\x32\x39\x35\x52\x3A\x28\x83\xF8\x7B\x16\xC6\x18\xB8\x62\xD6\x47\x25\x91\xCE\xF0\x19\x12\x4D\xAD\x63\xF5\xD3\x3F\x75\x5F\x29\xF0\xA1\x30\x1C\x2A\xA0\x98\xA6\x15\xBD\xEE\xFD\x19\x36\xF0\xE2\x91\x43\x8F\xFA\xCA\xD6\x10\x27\x49\x4C\xEF\xDD\xC1\xF1\x85\x70\x9B\xCA\xEA\xA8\x5A\x43\xFC\x6D\x86\x6F\x73\xE9\x37\x45\xA9\xF0\x36\xC7\xCC\x88\x75\x1E\xBB\x6C\x06\xFF\x9B\x6B\x3E\x17\xEC\x61\xAA\x71\x7C\xC6\x1D\xA2\xF7\x49\xE9\x15\xB5\x3C\xD6\xA1\x61\xF5\x11\xF7\x05\x6F\x1D\xFD\x11\xBE\xD0\x30\x07\xC2\x29\xB0\x09\x4E\x26\xDC\xE3\xA2\xA8\x91\x6A\x1F\xC2\x91\x45\x88\x5C\xE5\x98\xB8\x71\xA5\x15\x19\xC9\x7C\x75\x11\xCC\x70\x74\x4F\x2D\x9B\x1D\x91\x44\xFD\x56\x28\xA0\xFE\xBB\x86\x6A\xC8\xFA\x5C\x0B\x58\xDC\xC6\x4B\x76\xC8\xAB\x22\xD9\x73\x0F\xA5\xF4\x5A\x02\x89\x3F\x4F\x9E\x22\x82\xEE\xA2\x74\x53\x2A\x3D\x53\x27\x69\x1D\x6C\x8E\x32\x2C\x64\x00\x26\x63\x61\x36\x4E\xA3\x46\xB7\x3F\x7D\xB3\x2D\xAC\x6D\x90\xA2\x95\xA2\xCE\xCF\xDA\x82\xE7\x07\x34\x19\x96\xE9\xB8\x21\xAA\x29\x7E\xA6\x38\xBE\x8E\x29\x4A\x21\x66\x79\x1F\xB3\xC3\xB5\x09\x67\xDE\xD6\xD4\x07\x46\xF3\x2A\xDA\xE6\x22\x37\x60\xCB\x81\xB6\x0F\xA0\x0F\xE9\xC8\x95\x7F\xBF\x55\x91\x05\x7A\xCF\x3D\x15\xC0\x6F\xDE\x09\x94\x01\x83\xD7\x34\x1B\xCC\x40\xA5\xF0\xB8\x9B\x67\xD5\x98\x91\x3B\xA7\x84\x78\x95\x26\xA4\x5A\x08\xF8\x2B\x74\xB4\x00\x04\x3C\xDF\xB8\x14\x8E\xE8\xDF\xA9\x8D\x6C\x67\x92\x33\x1D\xC0\xB7\xD2\xEC\x92\xC8\xBE\x09\xBF\x2C\x29\x05\x6F\x02\x6B\x9E\xEF\xBC\xBF\x2A\xBC\x5B\xC0\x50\x8F\x41\x70\x71\x87\xB2\x4D\xB7\x04\xA9\x84\xA3\x32\xAF\xAE\xEE\x6B\x17\x8B\xB2\xB1\xFE\x6C\xE1\x90\x8C\x88\xA8\x97\x48\xCE\xC8\x4D\xCB\xF3\x06\xCF\x5F\x6A\x0A\x42\xB1\x1E\x1E\x77\x2F\x8E\xA0\xE6\x92\x0E\x06\xFC\x05\x22\xD2\x26\xE1\x31\x51\x7D\x32\xDC\x0F\x02\x03\x01\x00\x01\xA3\x23\x30\x21\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x02\x01\x00\x5F\x34\x81\x76\xEF\x96\x1D\xD5\xE5\xB5\xD9\x02\x63\x84\x16\xC1\xAE\xA0\x70\x51\xA7\xF7\x4C\x47\x35\xC8\x0B\xD7\x28\x3D\x89\x71\xD9\xAA\x33\x41\xEA\x14\x1B\x6C\x21\x00\xC0\x6C\x42\x19\x7E\x9F\x69\x5B\x20\x42\xDF\xA2\xD2\xDA\xC4\x7C\x97\x4B\x8D\xB0\xE8\xAC\xC8\xEE\xA5\x69\x04\x99\x0A\x92\xA6\xAB\x27\x2E\x1A\x4D\x81\xBF\x84\xD4\x70\x1E\xAD\x47\xFE\xFD\x4A\x9D\x33\xE0\xF2\xB9\xC4\x45\x08\x21\x0A\xDA\x69\x69\x73\x72\x0D\xBE\x34\xFE\x94\x8B\xAD\xC3\x1E\x35\xD7\xA2\x83\xEF\xE5\x38\xC7\xA5\x85\x1F\xAB\xCF\x34\xEC\x3F\x28\xFE\x0C\xF1\x57\x86\x4E\xC9\x55\xF7\x1C\xD4\xD8\xA5\x7D\x06\x7A\x6F\xD5\xDF\x10\xDF\x81\x4E\x21\x65\xB1\xB6\xE1\x17\x79\x95\x45\x06\xCE\x5F\xCC\xDC\x46\x89\x63\x68\x44\x8D\x93\xF4\x64\x70\xA0\x3D\x9D\x28\x05\xC3\x39\x70\xB8\x62\x7B\x20\xFD\xE4\xDB\xE9\x08\xA1\xB8\x9E\x3D\x09\xC7\x4F\xFB\x2C\xF8\x93\x76\x41\xDE\x52\xE0\xE1\x57\xD2\x9D\x03\xBC\x77\x9E\xFE\x9E\x29\x5E\xF7\xC1\x51\x60\x1F\xDE\xDA\x0B\xB2\x2D\x75\xB7\x43\x48\x93\xE7\xF6\x79\xC6\x84\x5D\x80\x59\x60\x94\xFC\x78\x98\x8F\x3C\x93\x51\xED\x40\x90\x07\xDF\x64\x63\x24\xCB\x4E\x71\x05\xA1\xD7\x94\x1A\x88\x32\xF1\x22\x74\x22\xAE\xA5\xA6\xD8\x12\x69\x4C\x60\xA3\x02\xEE\x2B\xEC\xD4\x63\x92\x0B\x5E\xBE\x2F\x76\x6B\xA3\xB6\x26\xBC\x8F\x03\xD8\x0A\xF2\x4C\x64\x46\xBD\x39\x62\xE5\x96\xEB\x34\x63\x11\x28\xCC\x95\xF1\xAD\xEF\xEF\xDC\x80\x58\x48\xE9\x4B\xB8\xEA\x65\xAC\xE9\xFC\x80\xB5\xB5\xC8\x45\xF9\xAC\xC1\x9F\xD9\xB9\xEA\x62\x88\x8E\xC4\xF1\x4B\x83\x12\xAD\xE6\x8B\x84\xD6\x9E\xC2\xEB\x83\x18\x9F\x6A\xBB\x1B\x24\x60\x33\x70\xCC\xEC\xF7\x32\xF3\x5C\xD9\x79\x7D\xEF\x9E\xA4\xFE\xC9\x23\xC3\x24\xEE\x15\x92\xB1\x3D\x91\x4F\x26\x86\xBD\x66\x73\x24\x13\xEA\xA4\xAE\x63\xC1\xAD\x7D\x84\x03\x3C\x10\x78\x86\x1B\x79\xE3\xC4\xF3\xF2\x04\x95\x20\xAE\x23\x82\xC4\xB3\x3A\x00\x62\xBF\xE6\x36\x24\xE1\x57\xBA\xC7\x1E\x90\x75\xD5\x5F\x3F\x95\x61\x2B\xC1\x3B\xCD\xE5\xB3\x68\x61\xD0\x46\x26\xA9\x21\x52\x69\x2D\xEB\x2E\xC7\xEB\x77\xCE\xA6\x3A\xB5\x03\x33\x4F\x76\xD1\xE7\x5C\x54\x01\x5D\xCB\x78\xF4\xC9\x0C\xBF\xCF\x12\x8E\x17\x2D\x23\x68\x94\xE7\xAB\xFE\xA9\xB2\x2B\x06\xD0\x04\xCD", + ["CN=TeliaSonera Root CA v1,O=TeliaSonera"] = "\x30\x82\x05\x38\x30\x82\x03\x20\xA0\x03\x02\x01\x02\x02\x11\x00\x95\xBE\x16\xA0\xF7\x2E\x46\xF1\x7B\x39\x82\x72\xFA\x8B\xCD\x96\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30\x37\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x0C\x0B\x54\x65\x6C\x69\x61\x53\x6F\x6E\x65\x72\x61\x31\x1F\x30\x1D\x06\x03\x55\x04\x03\x0C\x16\x54\x65\x6C\x69\x61\x53\x6F\x6E\x65\x72\x61\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x76\x31\x30\x1E\x17\x0D\x30\x37\x31\x30\x31\x38\x31\x32\x30\x30\x35\x30\x5A\x17\x0D\x33\x32\x31\x30\x31\x38\x31\x32\x30\x30\x35\x30\x5A\x30\x37\x31\x14\x30\x12\x06\x03\x55\x04\x0A\x0C\x0B\x54\x65\x6C\x69\x61\x53\x6F\x6E\x65\x72\x61\x31\x1F\x30\x1D\x06\x03\x55\x04\x03\x0C\x16\x54\x65\x6C\x69\x61\x53\x6F\x6E\x65\x72\x61\x20\x52\x6F\x6F\x74\x20\x43\x41\x20\x76\x31\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xC2\xBE\xEB\x27\xF0\x21\xA3\xF3\x69\x26\x55\x7E\x9D\xC5\x55\x16\x91\x5C\xFD\xEF\x21\xBF\x53\x80\x7A\x2D\xD2\x91\x8C\x63\x31\xF0\xEC\x24\xF0\xC3\xA5\xD2\x72\x7C\x10\x6D\xF4\x37\xB7\xE5\xE6\x7C\x79\xEA\x8C\xB5\x82\x8B\xAE\x48\xB6\xAC\x00\xDC\x65\x75\xEC\x2A\x4D\x5F\xC1\x87\xF5\x20\x65\x2B\x81\xA8\x47\x3E\x89\x23\x95\x30\x16\x90\x7F\xE8\x57\x07\x48\xE7\x19\xAE\xBF\x45\x67\xB1\x37\x1B\x06\x2A\xFE\xDE\xF9\xAC\x7D\x83\xFB\x5E\xBA\xE4\x8F\x97\x67\xBE\x4B\x8E\x8D\x64\x07\x57\x38\x55\x69\x34\x36\x3D\x13\x48\xEF\x4F\xE2\xD3\x66\x1E\xA4\xCF\x1A\xB7\x5E\x36\x33\xD4\xB4\x06\xBD\x18\x01\xFD\x77\x84\x50\x00\x45\xF5\x8C\x5D\xE8\x23\xBC\x7E\xFE\x35\xE1\xED\x50\x7B\xA9\x30\x8D\x19\xD3\x09\x8E\x68\x67\x5D\xBF\x3C\x97\x18\x53\xBB\x29\x62\xC5\xCA\x5E\x72\xC1\xC7\x96\xD4\xDB\x2D\xA0\xB4\x1F\x69\x03\xEC\xEA\xE2\x50\xF1\x0C\x3C\xF0\xAC\xF3\x53\x2D\xF0\x1C\xF5\xED\x6C\x39\x39\x73\x80\x16\xC8\x52\xB0\x23\xCD\xE0\x3E\xDC\xDD\x3C\x47\xA0\xBB\x35\x8A\xE2\x98\x68\x8B\xBE\xE5\xBF\x72\xEE\xD2\xFA\xA5\xED\x12\xED\xFC\x98\x18\xA9\x26\x76\xDC\x28\x4B\x10\x20\x1C\xD3\x7F\x16\x77\x2D\xED\x6F\x80\xF7\x49\xBB\x53\x05\xBB\x5D\x68\xC7\xD4\xC8\x75\x16\x3F\x89\x5A\x8B\xF7\x17\x47\xD4\x4C\xF1\xD2\x89\x79\x3E\x4D\x3D\x98\xA8\x61\xDE\x3A\x1E\xD2\xF8\x5E\x03\xE0\xC1\xC9\x1C\x8C\xD3\x8D\x4D\xD3\x95\x36\xB3\x37\x5F\x63\x63\x9B\x33\x14\xF0\x2D\x26\x6B\x53\x7C\x89\x8C\x32\xC2\x6E\xEC\x3D\x21\x00\x39\xC9\xA1\x68\xE2\x50\x83\x2E\xB0\x3A\x2B\xF3\x36\xA0\xAC\x2F\xE4\x6F\x61\xC2\x51\x09\x39\x3E\x8B\x53\xB9\xBB\x67\xDA\xDC\x53\xB9\x76\x59\x36\x9D\x43\xE5\x20\xE0\x3D\x32\x60\x85\x22\x51\xB7\xC7\x33\xBB\xDD\x15\x2F\xA4\x78\xA6\x07\x7B\x81\x46\x36\x04\x86\xDD\x79\x35\xC7\x95\x2C\x3B\xB0\xA3\x17\x35\xE5\x73\x1F\xB4\x5C\x59\xEF\xDA\xEA\x10\x65\x7B\x7A\xD0\x7F\x9F\xB3\xB4\x2A\x37\x3B\x70\x8B\x9B\x5B\xB9\x2B\xB7\xEC\xB2\x51\x12\x97\x53\x29\x5A\xD4\xF0\x12\x10\xDC\x4F\x02\xBB\x12\x92\x2F\x62\xD4\x3F\x69\x43\x7C\x0D\xD6\xFC\x58\x75\x01\x88\x9D\x58\x16\x4B\xDE\xBA\x90\xFF\x47\x01\x89\x06\x6A\xF6\x5F\xB2\x90\x6A\xB3\x02\xA6\x02\x88\xBF\xB3\x47\x7E\x2A\xD9\xD5\xFA\x68\x78\x35\x4D\x02\x03\x01\x00\x01\xA3\x3F\x30\x3D\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0B\x06\x03\x55\x1D\x0F\x04\x04\x03\x02\x01\x06\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xF0\x8F\x59\x38\x00\xB3\xF5\x8F\x9A\x96\x0C\xD5\xEB\xFA\x7B\xAA\x17\xE8\x13\x12\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x03\x82\x02\x01\x00\xBE\xE4\x5C\x62\x4E\x24\xF4\x0C\x08\xFF\xF0\xD3\x0C\x68\xE4\x93\x49\x22\x3F\x44\x27\x6F\xBB\x6D\xDE\x83\x66\xCE\xA8\xCC\x0D\xFC\xF5\x9A\x06\xE5\x77\x14\x91\xEB\x9D\x41\x7B\x99\x2A\x84\xE5\xFF\xFC\x21\xC1\x5D\xF0\xE4\x1F\x57\xB7\x75\xA9\xA1\x5F\x02\x26\xFF\xD7\xC7\xF7\x4E\xDE\x4F\xF8\xF7\x1C\x46\xC0\x7A\x4F\x40\x2C\x22\x35\xF0\x19\xB1\xD0\x6B\x67\x2C\xB0\xA8\xE0\xC0\x40\x37\x35\xF6\x84\x5C\x5C\xE3\xAF\x42\x78\xFE\xA7\xC9\x0D\x50\xEA\x0D\x84\x76\xF6\x51\xEF\x83\x53\xC6\x7A\xFF\x0E\x56\x49\x2E\x8F\x7A\xD6\x0C\xE6\x27\x54\xE3\x4D\x0A\x60\x72\x62\xCD\x91\x07\xD6\xA5\xBF\xC8\x99\x6B\xED\xC4\x19\xE6\xAB\x4C\x11\x38\xC5\x6F\x31\xE2\x6E\x49\xC8\x3F\x76\x80\x26\x03\x26\x29\xE0\x36\xF6\xF6\x20\x53\xE3\x17\x70\x34\x17\x9D\x63\x68\x1E\x6B\xEC\xC3\x4D\x86\xB8\x13\x30\x2F\x5D\x46\x0D\x47\x43\xD5\x1B\xAA\x59\x0E\xB9\x5C\x8D\x06\x48\xAD\x74\x87\x5F\xC7\xFC\x31\x54\x41\x13\xE2\xC7\x21\x0E\x9E\xE0\x1E\x0D\xE1\xC0\x7B\x43\x85\x90\xC5\x8A\x58\xC6\x65\x0A\x78\x57\xF2\xC6\x23\x0F\x01\xD9\x20\x4B\xDE\x0F\xFB\x92\x85\x75\x2A\x5C\x73\x8D\x6D\x7B\x25\x91\xCA\xEE\x45\xAE\x06\x4B\x00\xCC\xD3\xB1\x59\x50\xDA\x3A\x88\x3B\x29\x43\x46\x5E\x97\x2B\x54\xCE\x53\x6F\x8D\x4A\xE7\x96\xFA\xBF\x71\x0E\x42\x8B\x7C\xFD\x28\xA0\xD0\x48\xCA\xDA\xC4\x81\x4C\xBB\xA2\x73\x93\x26\xC8\xEB\x0C\xD6\x26\x88\xB6\xC0\x24\xCF\xBB\xBD\x5B\xEB\x75\x7D\xE9\x08\x8E\x86\x33\x2C\x79\x77\x09\x69\xA5\x89\xFC\xB3\x70\x90\x87\x76\x8F\xD3\x22\xBB\x42\xCE\xBD\x73\x0B\x20\x26\x2A\xD0\x9B\x3D\x70\x1E\x24\x6C\xCD\x87\x76\xA9\x17\x96\xB7\xCF\x0D\x92\xFB\x8E\x18\xA9\x98\x49\xD1\x9E\xFE\x60\x44\x72\x21\xB9\x19\xED\xC2\xF5\x31\xF1\x39\x48\x88\x90\x24\x75\x54\x16\xAD\xCE\xF4\xF8\x69\x14\x64\x39\xFB\xA3\xB8\xBA\x70\x40\xC7\x27\x1C\xBF\xC4\x56\x53\xFA\x63\x65\xD0\xF3\x1C\x0E\x16\xF5\x6B\x86\x58\x4D\x18\xD4\xE4\x0D\x8E\xA5\x9D\x5B\x91\xDC\x76\x24\x50\x3F\xC6\x2A\xFB\xD9\xB7\x9C\xB5\xD6\xE6\xD0\xD9\xE8\x19\x8B\x15\x71\x48\xAD\xB7\xEA\xD8\x59\x88\xD4\x90\xBF\x16\xB3\xD9\xE9\xAC\x59\x61\x54\xC8\x1C\xBA\xCA\xC1\xCA\xE1\xB9\x20\x4C\x8F\x3A\x93\x89\xA5\xA0\xCC\xBF\xD3\xF6\x75\xA4\x75\x96\x6D\x56", + ["CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu\C4\9Fra EBG Bili\C5\9Fim Teknolojileri ve Hizmetleri A.\C5\9E.,L=Ankara,C=TR"] = "\x30\x82\x06\x4B\x30\x82\x04\x33\xA0\x03\x02\x01\x02\x02\x08\x6A\x68\x3E\x9C\x51\x9B\xCB\x53\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x81\xB2\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x52\x31\x0F\x30\x0D\x06\x03\x55\x04\x07\x0C\x06\x41\x6E\x6B\x61\x72\x61\x31\x40\x30\x3E\x06\x03\x55\x04\x0A\x0C\x37\x45\x2D\x54\x75\xC4\x9F\x72\x61\x20\x45\x42\x47\x20\x42\x69\x6C\x69\xC5\x9F\x69\x6D\x20\x54\x65\x6B\x6E\x6F\x6C\x6F\x6A\x69\x6C\x65\x72\x69\x20\x76\x65\x20\x48\x69\x7A\x6D\x65\x74\x6C\x65\x72\x69\x20\x41\x2E\xC5\x9E\x2E\x31\x26\x30\x24\x06\x03\x55\x04\x0B\x0C\x1D\x45\x2D\x54\x75\x67\x72\x61\x20\x53\x65\x72\x74\x69\x66\x69\x6B\x61\x73\x79\x6F\x6E\x20\x4D\x65\x72\x6B\x65\x7A\x69\x31\x28\x30\x26\x06\x03\x55\x04\x03\x0C\x1F\x45\x2D\x54\x75\x67\x72\x61\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x1E\x17\x0D\x31\x33\x30\x33\x30\x35\x31\x32\x30\x39\x34\x38\x5A\x17\x0D\x32\x33\x30\x33\x30\x33\x31\x32\x30\x39\x34\x38\x5A\x30\x81\xB2\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x54\x52\x31\x0F\x30\x0D\x06\x03\x55\x04\x07\x0C\x06\x41\x6E\x6B\x61\x72\x61\x31\x40\x30\x3E\x06\x03\x55\x04\x0A\x0C\x37\x45\x2D\x54\x75\xC4\x9F\x72\x61\x20\x45\x42\x47\x20\x42\x69\x6C\x69\xC5\x9F\x69\x6D\x20\x54\x65\x6B\x6E\x6F\x6C\x6F\x6A\x69\x6C\x65\x72\x69\x20\x76\x65\x20\x48\x69\x7A\x6D\x65\x74\x6C\x65\x72\x69\x20\x41\x2E\xC5\x9E\x2E\x31\x26\x30\x24\x06\x03\x55\x04\x0B\x0C\x1D\x45\x2D\x54\x75\x67\x72\x61\x20\x53\x65\x72\x74\x69\x66\x69\x6B\x61\x73\x79\x6F\x6E\x20\x4D\x65\x72\x6B\x65\x7A\x69\x31\x28\x30\x26\x06\x03\x55\x04\x03\x0C\x1F\x45\x2D\x54\x75\x67\x72\x61\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x41\x75\x74\x68\x6F\x72\x69\x74\x79\x30\x82\x02\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x02\x0F\x00\x30\x82\x02\x0A\x02\x82\x02\x01\x00\xE2\xF5\x3F\x93\x05\x51\x1E\x85\x62\x54\x5E\x7A\x0B\xF5\x18\x07\x83\xAE\x7E\xAF\x7C\xF7\xD4\x8A\x6B\xA5\x63\x43\x39\xB9\x4B\xF7\xC3\xC6\x64\x89\x3D\x94\x2E\x54\x80\x52\x39\x39\x07\x4B\x4B\xDD\x85\x07\x76\x87\xCC\xBF\x2F\x95\x4C\xCC\x7D\xA7\x3D\xBC\x47\x0F\x98\x70\xF8\x8C\x85\x1E\x74\x8E\x92\x6D\x1B\x40\xD1\x99\x0D\xBB\x75\x6E\xC8\xA9\x6B\x9A\xC0\x84\x31\xAF\xCA\x43\xCB\xEB\x2B\x34\xE8\x8F\x97\x6B\x01\x9B\xD5\x0E\x4A\x08\xAA\x5B\x92\x74\x85\x43\xD3\x80\xAE\xA1\x88\x5B\xAE\xB3\xEA\x5E\xCB\x16\x9A\x77\x44\xC8\xA1\xF6\x54\x68\xCE\xDE\x8F\x97\x2B\xBA\x5B\x40\x02\x0C\x64\x17\xC0\xB5\x93\xCD\xE1\xF1\x13\x66\xCE\x0C\x79\xEF\xD1\x91\x28\xAB\x5F\xA0\x12\x52\x30\x73\x19\x8E\x8F\xE1\x8C\x07\xA2\xC3\xBB\x4A\xF0\xEA\x1F\x15\xA8\xEE\x25\xCC\xA4\x46\xF8\x1B\x22\xEF\xB3\x0E\x43\xBA\x2C\x24\xB8\xC5\x2C\x5C\xD4\x1C\xF8\x5D\x64\xBD\xC3\x93\x5E\x28\xA7\x3F\x27\xF1\x8E\x1E\xD3\x2A\x50\x05\xA3\x55\xD9\xCB\xE7\x39\x53\xC0\x98\x9E\x8C\x54\x62\x8B\x26\xB0\xF7\x7D\x8D\x7C\xE4\xC6\x9E\x66\x42\x55\x82\x47\xE7\xB2\x58\x8D\x66\xF7\x07\x7C\x2E\x36\xE6\x50\x1C\x3F\xDB\x43\x24\xC5\xBF\x86\x47\x79\xB3\x79\x1C\xF7\x5A\xF4\x13\xEC\x6C\xF8\x3F\xE2\x59\x1F\x95\xEE\x42\x3E\xB9\xAD\xA8\x32\x85\x49\x97\x46\xFE\x4B\x31\x8F\x5A\xCB\xAD\x74\x47\x1F\xE9\x91\xB7\xDF\x28\x04\x22\xA0\xD4\x0F\x5D\xE2\x79\x4F\xEA\x6C\x85\x86\xBD\xA8\xA6\xCE\xE4\xFA\xC3\xE1\xB3\xAE\xDE\x3C\x51\xEE\xCB\x13\x7C\x01\x7F\x84\x0E\x5D\x51\x94\x9E\x13\x0C\xB6\x2E\xA5\x4C\xF9\x39\x70\x36\x6F\x96\xCA\x2E\x0C\x44\x55\xC5\xCA\xFA\x5D\x02\xA3\xDF\xD6\x64\x8C\x5A\xB3\x01\x0A\xA9\xB5\x0A\x47\x17\xFF\xEF\x91\x40\x2A\x8E\xA1\x46\x3A\x31\x98\xE5\x11\xFC\xCC\xBB\x49\x56\x8A\xFC\xB9\xD0\x61\x9A\x6F\x65\x6C\xE6\xC3\xCB\x3E\x75\x49\xFE\x8F\xA7\xE2\x89\xC5\x67\xD7\x9D\x46\x13\x4E\x31\x76\x3B\x24\xB3\x9E\x11\x65\x86\xAB\x7F\xEF\x1D\xD4\xF8\xBC\xE7\xAC\x5A\x5C\xB7\x5A\x47\x5C\x55\xCE\x55\xB4\x22\x71\x5B\x5B\x0B\xF0\xCF\xDC\xA0\x61\x64\xEA\xA9\xD7\x68\x0A\x63\xA7\xE0\x0D\x3F\xA0\xAF\xD3\xAA\xD2\x7E\xEF\x51\xA0\xE6\x51\x2B\x55\x92\x15\x17\x53\xCB\xB7\x66\x0E\x66\x4C\xF8\xF9\x75\x4C\x90\xE7\x12\x70\xC7\x45\x02\x03\x01\x00\x01\xA3\x63\x30\x61\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\x2E\xE3\xDB\xB2\x49\xD0\x9C\x54\x79\x5C\xFA\x27\x2A\xFE\xCC\x4E\xD2\xE8\x4E\x54\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\x2E\xE3\xDB\xB2\x49\xD0\x9C\x54\x79\x5C\xFA\x27\x2A\xFE\xCC\x4E\xD2\xE8\x4E\x54\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x02\x01\x00\x05\x37\x3A\xF4\x4D\xB7\x45\xE2\x45\x75\x24\x8F\xB6\x77\x52\xE8\x1C\xD8\x10\x93\x65\xF3\xF2\x59\x06\xA4\x3E\x1E\x29\xEC\x5D\xD1\xD0\xAB\x7C\xE0\x0A\x90\x48\x78\xED\x4E\x98\x03\x99\xFE\x28\x60\x91\x1D\x30\x1D\xB8\x63\x7C\xA8\xE6\x35\xB5\xFA\xD3\x61\x76\xE6\xD6\x07\x4B\xCA\x69\x9A\xB2\x84\x7A\x77\x93\x45\x17\x15\x9F\x24\xD0\x98\x13\x12\xFF\xBB\xA0\x2E\xFD\x4E\x4C\x87\xF8\xCE\x5C\xAA\x98\x1B\x05\xE0\x00\x46\x4A\x82\x80\xA5\x33\x8B\x28\xDC\xED\x38\xD3\xDF\xE5\x3E\xE9\xFE\xFB\x59\xDD\x61\x84\x4F\xD2\x54\x96\x13\x61\x13\x3E\x8F\x80\x69\xBE\x93\x47\xB5\x35\x43\xD2\x5A\xBB\x3D\x5C\xEF\xB3\x42\x47\xCD\x3B\x55\x13\x06\xB0\x09\xDB\xFD\x63\xF6\x3A\x88\x0A\x99\x6F\x7E\xE1\xCE\x1B\x53\x6A\x44\x66\x23\x51\x08\x7B\xBC\x5B\x52\xA2\xFD\x06\x37\x38\x40\x61\x8F\x4A\x96\xB8\x90\x37\xF8\x66\xC7\x78\x90\x00\x15\x2E\x8B\xAD\x51\x35\x53\x07\xA8\x6B\x68\xAE\xF9\x4E\x3C\x07\x26\xCD\x08\x05\x70\xCC\x39\x3F\x76\xBD\xA5\xD3\x67\x26\x01\x86\xA6\x53\xD2\x60\x3B\x7C\x43\x7F\x55\x8A\xBC\x95\x1A\xC1\x28\x39\x4C\x1F\x43\xD2\x91\xF4\x72\x59\x8A\xB9\x56\xFC\x3F\xB4\x9D\xDA\x70\x9C\x76\x5A\x8C\x43\x50\xEE\x8E\x30\x72\x4D\xDF\xFF\x49\xF7\xC6\xA9\x67\xD9\x6D\xAC\x02\x11\xE2\x3A\x16\x25\xA7\x58\x08\xCB\x6F\x53\x41\x9C\x48\x38\x47\x68\x33\xD1\xD7\xC7\x8F\xD4\x74\x21\xD4\xC3\x05\x90\x7A\xFF\xCE\x96\x88\xB1\x15\x29\x5D\x23\xAB\xD0\x60\xA1\x12\x4F\xDE\xF4\x17\xCD\x32\xE5\xC9\xBF\xC8\x43\xAD\xFD\x2E\x8E\xF1\xAF\xE2\xF4\x98\xFA\x12\x1F\x20\xD8\xC0\xA7\x0C\x85\xC5\x90\xF4\x3B\x2D\x96\x26\xB1\x2C\xBE\x4C\xAB\xEB\xB1\xD2\x8A\xC9\xDB\x78\x13\x0F\x1E\x09\x9D\x6D\x8F\x00\x9F\x02\xDA\xC1\xFA\x1F\x7A\x7A\x09\xC4\x4A\xE6\x88\x2A\x97\x9F\x89\x8B\xFD\x37\x5F\x5F\x3A\xCE\x38\x59\x86\x4B\xAF\x71\x0B\xB4\xD8\xF2\x70\x4F\x9F\x32\x13\xE3\xB0\xA7\x57\xE5\xDA\xDA\x43\xCB\x84\x34\xF2\x28\xC4\xEA\x6D\xF4\x2A\xEF\xC1\x6B\x76\xDA\xFB\x7E\xBB\x85\x3C\xD2\x53\xC2\x4D\xBE\x71\xE1\x45\xD1\xFD\x23\x67\x0D\x13\x75\xFB\xCF\x65\x67\x22\x9D\xAE\xB0\x09\xD1\x09\xFF\x1D\x34\xBF\xFE\x23\x97\x37\xD2\x39\xFA\x3D\x0D\x06\x0B\xB4\xDB\x3B\xA3\xAB\x6F\x5C\x1D\xB6\x7E\xE8\xB3\x82\x34\xED\x06\x5C\x24", + ["CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE"] = "\x30\x82\x03\xC3\x30\x82\x02\xAB\xA0\x03\x02\x01\x02\x02\x01\x01\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x44\x45\x31\x2B\x30\x29\x06\x03\x55\x04\x0A\x0C\x22\x54\x2D\x53\x79\x73\x74\x65\x6D\x73\x20\x45\x6E\x74\x65\x72\x70\x72\x69\x73\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x47\x6D\x62\x48\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x0C\x16\x54\x2D\x53\x79\x73\x74\x65\x6D\x73\x20\x54\x72\x75\x73\x74\x20\x43\x65\x6E\x74\x65\x72\x31\x25\x30\x23\x06\x03\x55\x04\x03\x0C\x1C\x54\x2D\x54\x65\x6C\x65\x53\x65\x63\x20\x47\x6C\x6F\x62\x61\x6C\x52\x6F\x6F\x74\x20\x43\x6C\x61\x73\x73\x20\x32\x30\x1E\x17\x0D\x30\x38\x31\x30\x30\x31\x31\x30\x34\x30\x31\x34\x5A\x17\x0D\x33\x33\x31\x30\x30\x31\x32\x33\x35\x39\x35\x39\x5A\x30\x81\x82\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x44\x45\x31\x2B\x30\x29\x06\x03\x55\x04\x0A\x0C\x22\x54\x2D\x53\x79\x73\x74\x65\x6D\x73\x20\x45\x6E\x74\x65\x72\x70\x72\x69\x73\x65\x20\x53\x65\x72\x76\x69\x63\x65\x73\x20\x47\x6D\x62\x48\x31\x1F\x30\x1D\x06\x03\x55\x04\x0B\x0C\x16\x54\x2D\x53\x79\x73\x74\x65\x6D\x73\x20\x54\x72\x75\x73\x74\x20\x43\x65\x6E\x74\x65\x72\x31\x25\x30\x23\x06\x03\x55\x04\x03\x0C\x1C\x54\x2D\x54\x65\x6C\x65\x53\x65\x63\x20\x47\x6C\x6F\x62\x61\x6C\x52\x6F\x6F\x74\x20\x43\x6C\x61\x73\x73\x20\x32\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\xAA\x5F\xDA\x1B\x5F\xE8\x73\x91\xE5\xDA\x5C\xF4\xA2\xE6\x47\xE5\xF3\x68\x55\x60\x05\x1D\x02\xA4\xB3\x9B\x59\xF3\x1E\x8A\xAF\x34\xAD\xFC\x0D\xC2\xD9\x48\x19\xEE\x69\x8F\xC9\x20\xFC\x21\xAA\x07\x19\xED\xB0\x5C\xAC\x65\xC7\x5F\xED\x02\x7C\x7B\x7C\x2D\x1B\xD6\xBA\xB9\x80\xC2\x18\x82\x16\x84\xFA\x66\xB0\x08\xC6\x54\x23\x81\xE4\xCD\xB9\x49\x3F\xF6\x4F\x6E\x37\x48\x28\x38\x0F\xC5\xBE\xE7\x68\x70\xFD\x39\x97\x4D\xD2\xC7\x98\x91\x50\xAA\xC4\x44\xB3\x23\x7D\x39\x47\xE9\x52\x62\xD6\x12\x93\x5E\xB7\x31\x96\x42\x05\xFB\x76\xA7\x1E\xA3\xF5\xC2\xFC\xE9\x7A\xC5\x6C\xA9\x71\x4F\xEA\xCB\x78\xBC\x60\xAF\xC7\xDE\xF4\xD9\xCB\xBE\x7E\x33\xA5\x6E\x94\x83\xF0\x34\xFA\x21\xAB\xEA\x8E\x72\xA0\x3F\xA4\xDE\x30\x5B\xEF\x86\x4D\x6A\x95\x5B\x43\x44\xA8\x10\x15\x1C\xE5\x01\x57\xC5\x98\xF1\xE6\x06\x28\x91\xAA\x20\xC5\xB7\x53\x26\x51\x43\xB2\x0B\x11\x95\x58\xE1\xC0\x0F\x76\xD9\xC0\x8D\x7C\x81\xF3\x72\x70\x9E\x6F\xFE\x1A\x8E\xD9\x5F\x35\xC6\xB2\x6F\x34\x7C\xBE\x48\x4F\xE2\x5A\x39\xD7\xD8\x9D\x78\x9E\x9F\x86\x3E\x03\x5E\x19\x8B\x44\xA2\xD5\xC7\x02\x03\x01\x00\x01\xA3\x42\x30\x40\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x06\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xBF\x59\x20\x36\x00\x79\xA0\xA0\x22\x6B\x8C\xD5\xF2\x61\xD2\xB8\x2C\xCB\x82\x4A\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x01\x01\x00\x31\x03\xA2\x61\x0B\x1F\x74\xE8\x72\x36\xC6\x6D\xF9\x4D\x9E\xFA\x22\xA8\xE1\x81\x56\xCF\xCD\xBB\x9F\xEA\xAB\x91\x19\x38\xAF\xAA\x7C\x15\x4D\xF3\xB6\xA3\x8D\xA5\xF4\x8E\xF6\x44\xA9\xA7\xE8\x21\x95\xAD\x3E\x00\x62\x16\x88\xF0\x02\xBA\xFC\x61\x23\xE6\x33\x9B\x30\x7A\x6B\x36\x62\x7B\xAD\x04\x23\x84\x58\x65\xE2\xDB\x2B\x8A\xE7\x25\x53\x37\x62\x53\x5F\xBC\xDA\x01\x62\x29\xA2\xA6\x27\x71\xE6\x3A\x22\x7E\xC1\x6F\x1D\x95\x70\x20\x4A\x07\x34\xDF\xEA\xFF\x15\x80\xE5\xBA\xD7\x7A\xD8\x5B\x75\x7C\x05\x7A\x29\x47\x7E\x40\xA8\x31\x13\x77\xCD\x40\x3B\xB4\x51\x47\x7A\x2E\x11\xE3\x47\x11\xDE\x9D\x66\xD0\x8B\xD5\x54\x66\xFA\x83\x55\xEA\x7C\xC2\x29\x89\x1B\xE9\x6F\xB3\xCE\xE2\x05\x84\xC9\x2F\x3E\x78\x85\x62\x6E\xC9\x5F\xC1\x78\x63\x74\x58\xC0\x48\x18\x0C\x99\x39\xEB\xA4\xCC\x1A\xB5\x79\x5A\x8D\x15\x9C\xD8\x14\x0D\xF6\x7A\x07\x57\xC7\x22\x83\x05\x2D\x3C\x9B\x25\x26\x3D\x18\xB3\xA9\x43\x7C\xC8\xC8\xAB\x64\x8F\x0E\xA3\xBF\x9C\x1B\x9D\x30\xDB\xDA\xD0\x19\x2E\xAA\x3C\xF1\xFB\x33\x80\x76\xE4\xCD\xAD\x19\x4F\x05\x27\x8E\x13\xA1\x6E\xC2", + ["C=DE,O=Atos,CN=Atos TrustedRoot 2011"] = "\x30\x82\x03\x77\x30\x82\x02\x5F\xA0\x03\x02\x01\x02\x02\x08\x5C\x33\xCB\x62\x2C\x5F\xB3\x32\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x30\x3C\x31\x1E\x30\x1C\x06\x03\x55\x04\x03\x0C\x15\x41\x74\x6F\x73\x20\x54\x72\x75\x73\x74\x65\x64\x52\x6F\x6F\x74\x20\x32\x30\x31\x31\x31\x0D\x30\x0B\x06\x03\x55\x04\x0A\x0C\x04\x41\x74\x6F\x73\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x44\x45\x30\x1E\x17\x0D\x31\x31\x30\x37\x30\x37\x31\x34\x35\x38\x33\x30\x5A\x17\x0D\x33\x30\x31\x32\x33\x31\x32\x33\x35\x39\x35\x39\x5A\x30\x3C\x31\x1E\x30\x1C\x06\x03\x55\x04\x03\x0C\x15\x41\x74\x6F\x73\x20\x54\x72\x75\x73\x74\x65\x64\x52\x6F\x6F\x74\x20\x32\x30\x31\x31\x31\x0D\x30\x0B\x06\x03\x55\x04\x0A\x0C\x04\x41\x74\x6F\x73\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x44\x45\x30\x82\x01\x22\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00\x03\x82\x01\x0F\x00\x30\x82\x01\x0A\x02\x82\x01\x01\x00\x95\x85\x3B\x97\x6F\x2A\x3B\x2E\x3B\xCF\xA6\xF3\x29\x35\xBE\xCF\x18\xAC\x3E\xAA\xD9\xF8\x4D\xA0\x3E\x1A\x47\xB9\xBC\x9A\xDF\xF2\xFE\xCC\x3E\x47\xE8\x7A\x96\xC2\x24\x8E\x35\xF4\xA9\x0C\xFC\x82\xFD\x6D\xC1\x72\x62\x27\xBD\xEA\x6B\xEB\xE7\x8A\xCC\x54\x3E\x90\x50\xCF\x80\xD4\x95\xFB\xE8\xB5\x82\xD4\x14\xC5\xB6\xA9\x55\x25\x57\xDB\xB1\x50\xF6\xB0\x60\x64\x59\x7A\x69\xCF\x03\xB7\x6F\x0D\xBE\xCA\x3E\x6F\x74\x72\xEA\xAA\x30\x2A\x73\x62\xBE\x49\x91\x61\xC8\x11\xFE\x0E\x03\x2A\xF7\x6A\x20\xDC\x02\x15\x0D\x5E\x15\x6A\xFC\xE3\x82\xC1\xB5\xC5\x9D\x64\x09\x6C\xA3\x59\x98\x07\x27\xC7\x1B\x96\x2B\x61\x74\x71\x6C\x43\xF1\xF7\x35\x89\x10\xE0\x9E\xEC\x55\xA1\x37\x22\xA2\x87\x04\x05\x2C\x47\x7D\xB4\x1C\xB9\x62\x29\x66\x28\xCA\xB7\xE1\x93\xF5\xA4\x94\x03\x99\xB9\x70\x85\xB5\xE6\x48\xEA\x8D\x50\xFC\xD9\xDE\xCC\x6F\x07\x0E\xDD\x0B\x72\x9D\x80\x30\x16\x07\x95\x3F\x28\x0E\xFD\xC5\x75\x4F\x53\xD6\x74\x9A\xB4\x24\x2E\x8E\x02\x91\xCF\x76\xC5\x9B\x1E\x55\x74\x9C\x78\x21\xB1\xF0\x2D\xF1\x0B\x9F\xC2\xD5\x96\x18\x1F\xF0\x54\x22\x7A\x8C\x07\x02\x03\x01\x00\x01\xA3\x7D\x30\x7B\x30\x1D\x06\x03\x55\x1D\x0E\x04\x16\x04\x14\xA7\xA5\x06\xB1\x2C\xA6\x09\x60\xEE\xD1\x97\xE9\x70\xAE\xBC\x3B\x19\x6C\xDB\x21\x30\x0F\x06\x03\x55\x1D\x13\x01\x01\xFF\x04\x05\x30\x03\x01\x01\xFF\x30\x1F\x06\x03\x55\x1D\x23\x04\x18\x30\x16\x80\x14\xA7\xA5\x06\xB1\x2C\xA6\x09\x60\xEE\xD1\x97\xE9\x70\xAE\xBC\x3B\x19\x6C\xDB\x21\x30\x18\x06\x03\x55\x1D\x20\x04\x11\x30\x0F\x30\x0D\x06\x0B\x2B\x06\x01\x04\x01\xB0\x2D\x03\x04\x01\x01\x30\x0E\x06\x03\x55\x1D\x0F\x01\x01\xFF\x04\x04\x03\x02\x01\x86\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0B\x05\x00\x03\x82\x01\x01\x00\x26\x77\x34\xDB\x94\x48\x86\x2A\x41\x9D\x2C\x3E\x06\x90\x60\xC4\x8C\xAC\x0B\x54\xB8\x1F\xB9\x7B\xD3\x07\x39\xE4\xFA\x3E\x7B\xB2\x3D\x4E\xED\x9F\x23\xBD\x97\xF3\x6B\x5C\xEF\xEE\xFD\x40\xA6\xDF\xA1\x93\xA1\x0A\x86\xAC\xEF\x20\xD0\x79\x01\xBD\x78\xF7\x19\xD8\x24\x31\x34\x04\x01\xA6\xBA\x15\x9A\xC3\x27\xDC\xD8\x4F\x0F\xCC\x18\x63\xFF\x99\x0F\x0E\x91\x6B\x75\x16\xE1\x21\xFC\xD8\x26\xC7\x47\xB7\xA6\xCF\x58\x72\x71\x7E\xBA\xE1\x4D\x95\x47\x3B\xC9\xAF\x6D\xA1\xB4\xC1\xEC\x89\xF6\xB4\x0F\x38\xB5\xE2\x64\xDC\x25\xCF\xA6\xDB\xEB\x9A\x5C\x99\xA1\xC5\x08\xDE\xFD\xE6\xDA\xD5\xD6\x5A\x45\x0C\xC4\xB7\xC2\xB5\x14\xEF\xB4\x11\xFF\x0E\x15\xB5\xF5\xF5\xDB\xC6\xBD\xEB\x5A\xA7\xF0\x56\x22\xA9\x3C\x65\x54\xC6\x15\xA8\xBD\x86\x9E\xCD\x83\x96\x68\x7A\x71\x81\x89\xE1\x0B\xE1\xEA\x11\x1B\x68\x08\xCC\x69\x9E\xEC\x9E\x41\x9E\x44\x32\x26\x7A\xE2\x87\x0A\x71\x3D\xEB\xE4\x5A\xA4\xD2\xDB\xC5\xCD\xC6\xDE\x60\x7F\xB9\xF3\x4F\x44\x92\xEF\x2A\xB7\x18\x3E\xA7\x19\xD9\x0B\x7D\xB1\x37\x41\x42\xB0\xBA\x60\x1D\xF2\xFE\x09\x11\xB0\xF0\x87\x7B\xA7\x9D", }; From 2be0cb210ad437992507203e7802c8012d981f34 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Fri, 28 Feb 2014 15:26:35 -0800 Subject: [PATCH 025/182] Updating CHANGES and VERSION. --- CHANGES | 4 ++++ NEWS | 2 ++ VERSION | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 3b5c29cdc8..f2ec3ef3a5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +2.2-194 | 2014-02-28 14:50:53 -0800 + + * Remove packet sorter. Addresses BIT-700. (Bernhard Amann) + 2.2-192 | 2014-02-28 09:46:43 -0800 * Update Mozilla root bundle. (Bernhard Amann) diff --git a/NEWS b/NEWS index 9b87de3e41..54ee916d5b 100644 --- a/NEWS +++ b/NEWS @@ -47,6 +47,8 @@ Changed Functionality TODO: Update if we add a detector for filtered traces. +- We have removed the packet sorter component. + Bro 2.2 ======= diff --git a/VERSION b/VERSION index df4bb3a595..c133a83bd4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2-192 +2.2-194 From ffd219e3b0739ebc0c55158d54cb16642a253ac3 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Fri, 28 Feb 2014 15:28:20 -0800 Subject: [PATCH 026/182] Updating submodule(s). [nomail] --- aux/broctl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aux/broctl b/aux/broctl index 5e1a917880..07349a4593 160000 --- a/aux/broctl +++ b/aux/broctl @@ -1 +1 @@ -Subproject commit 5e1a917880143ec824ffbe1ffaa6fc176c47b611 +Subproject commit 07349a459372d72b333bbc50e5f70584520c0bb3 From f2f817c8b15bf104904390d6abd38a0e5c33f53e Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Fri, 28 Feb 2014 15:36:58 -0800 Subject: [PATCH 027/182] Forgot to remove test code when merging. --- CHANGES | 4 ++++ VERSION | 2 +- src/PktSrc.cc | 6 ------ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index f2ec3ef3a5..4cb4ad82c0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +2.2-197 | 2014-02-28 15:36:58 -0800 + + * Remove test code. (Robin Sommer) + 2.2-194 | 2014-02-28 14:50:53 -0800 * Remove packet sorter. Addresses BIT-700. (Bernhard Amann) diff --git a/VERSION b/VERSION index c133a83bd4..90e2bd5d51 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2-194 +2.2-197 diff --git a/src/PktSrc.cc b/src/PktSrc.cc index 528f10f92c..b5ac3a5d69 100644 --- a/src/PktSrc.cc +++ b/src/PktSrc.cc @@ -220,12 +220,6 @@ void PktSrc::Process() break; } - case DLT_IEEE802_11: - { - printf("Here\n"); - exit(0); - } - case DLT_EN10MB: { // Get protocol being carried from the ethernet frame. From 338d521003c66531b53dfe84755e2b3479d88d32 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Sun, 2 Mar 2014 13:52:32 -0800 Subject: [PATCH 028/182] Fixing removal of support analyzers, plus some tweaking and cleanup of CONNECT code. Removal of support analyzers was broken. The code now actually doesn't delete them immediately anymore but instead just flags them as disabled. They'll be destroyed with the parent analyzer later. Also includes a new leak tests exercising the CONNECT code. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch topic/robin/http-connect # Changes to be committed: # modified: scripts/base/protocols/http/main.bro # modified: scripts/base/protocols/ssl/consts.bro # modified: src/analyzer/Analyzer.cc # modified: src/analyzer/Analyzer.h # modified: src/analyzer/protocol/http/HTTP.cc # new file: testing/btest/core/leaks/http-connect.bro # modified: testing/btest/scripts/base/protocols/http/http-connect.bro # # Untracked files: # .tags # changes.txt # conn.log # debug.log # diff # mpls-in-vlan.patch # newfile.pcap # packet_filter.log # reporter.log # src/PktSrc.cc.orig # weird.log # --- scripts/base/protocols/http/main.bro | 2 +- scripts/base/protocols/ssl/consts.bro | 1 + src/analyzer/Analyzer.cc | 114 ++++++++++-------- src/analyzer/Analyzer.h | 29 ++++- src/analyzer/protocol/http/HTTP.cc | 26 ++-- testing/btest/core/leaks/http-connect.bro | 14 +++ .../base/protocols/http/http-connect.bro | 7 +- 7 files changed, 128 insertions(+), 65 deletions(-) create mode 100644 testing/btest/core/leaks/http-connect.bro diff --git a/scripts/base/protocols/http/main.bro b/scripts/base/protocols/http/main.bro index 27257be2d6..ed20bc6586 100644 --- a/scripts/base/protocols/http/main.bro +++ b/scripts/base/protocols/http/main.bro @@ -218,7 +218,7 @@ event http_reply(c: connection, version: string, code: count, reason: string) &p c$http$info_code = code; c$http$info_msg = reason; } - + if ( c$http?$method && c$http$method == "CONNECT" && code == 200 ) { # Copy this conn_id and set the orig_p to zero because in the case of CONNECT proxies there will diff --git a/scripts/base/protocols/ssl/consts.bro b/scripts/base/protocols/ssl/consts.bro index 55289a7419..b81aebfbbb 100644 --- a/scripts/base/protocols/ssl/consts.bro +++ b/scripts/base/protocols/ssl/consts.bro @@ -86,6 +86,7 @@ export { [13172] = "next_protocol_negotiation", [13175] = "origin_bound_certificates", [13180] = "encrypted_client_certificates", + [30031] = "channel_id", [65281] = "renegotiation_info" } &default=function(i: count):string { return fmt("unknown-%d", i); }; diff --git a/src/analyzer/Analyzer.cc b/src/analyzer/Analyzer.cc index 03734f1a22..63462c0049 100644 --- a/src/analyzer/Analyzer.cc +++ b/src/analyzer/Analyzer.cc @@ -209,11 +209,11 @@ void Analyzer::NextPacket(int len, const u_char* data, bool is_orig, int seq, if ( skip ) return; - // If we have support analyzers, we pass it to them. - if ( is_orig && orig_supporters ) - orig_supporters->NextPacket(len, data, is_orig, seq, ip, caplen); - else if ( ! is_orig && resp_supporters ) - resp_supporters->NextPacket(len, data, is_orig, seq, ip, caplen); + SupportAnalyzer* next_sibling = FirstSupportAnalyzer(is_orig); + + if ( next_sibling ) + next_sibling->NextPacket(len, data, is_orig, seq, ip, caplen); + else { try @@ -232,11 +232,11 @@ void Analyzer::NextStream(int len, const u_char* data, bool is_orig) if ( skip ) return; - // If we have support analyzers, we pass it to them. - if ( is_orig && orig_supporters ) - orig_supporters->NextStream(len, data, is_orig); - else if ( ! is_orig && resp_supporters ) - resp_supporters->NextStream(len, data, is_orig); + SupportAnalyzer* next_sibling = FirstSupportAnalyzer(is_orig); + + if ( next_sibling ) + next_sibling->NextStream(len, data, is_orig); + else { try @@ -255,11 +255,11 @@ void Analyzer::NextUndelivered(int seq, int len, bool is_orig) if ( skip ) return; - // If we have support analyzers, we pass it to them. - if ( is_orig && orig_supporters ) - orig_supporters->NextUndelivered(seq, len, is_orig); - else if ( ! is_orig && resp_supporters ) - resp_supporters->NextUndelivered(seq, len, is_orig); + SupportAnalyzer* next_sibling = FirstSupportAnalyzer(is_orig); + + if ( next_sibling ) + next_sibling->NextUndelivered(seq, len, is_orig); + else { try @@ -278,11 +278,10 @@ void Analyzer::NextEndOfData(bool is_orig) if ( skip ) return; - // If we have support analyzers, we pass it to them. - if ( is_orig && orig_supporters ) - orig_supporters->NextEndOfData(is_orig); - else if ( ! is_orig && resp_supporters ) - resp_supporters->NextEndOfData(is_orig); + SupportAnalyzer* next_sibling = FirstSupportAnalyzer(is_orig); + + if ( next_sibling ) + next_sibling->NextEndOfData(is_orig); else EndOfData(is_orig); } @@ -558,31 +557,17 @@ void Analyzer::AddSupportAnalyzer(SupportAnalyzer* analyzer) void Analyzer::RemoveSupportAnalyzer(SupportAnalyzer* analyzer) { - SupportAnalyzer** head = - analyzer->IsOrig() ? &orig_supporters : &resp_supporters; - - SupportAnalyzer* prev = 0; - SupportAnalyzer* s; - for ( s = *head; s && s != analyzer; prev = s, s = s->sibling ) - ; - - if ( ! s ) - return; - - if ( prev ) - prev->sibling = s->sibling; - else - *head = s->sibling; - - DBG_LOG(DBG_ANALYZER, "%s removed support %s", + DBG_LOG(DBG_ANALYZER, "%s disabled %s support analyzer %s", fmt_analyzer(this).c_str(), analyzer->IsOrig() ? "originator" : "responder", fmt_analyzer(analyzer).c_str()); - if ( ! analyzer->finished ) - analyzer->Done(); - - delete analyzer; + // We mark the analyzer as being removed here, which will prevent it + // from being used further. However, we don't actually delete it + // before the parent gets destroyed. While we woulc do that, it's a + // bit tricky to do at the right time and it doesn't seem worth the + // trouble. + analyzer->removing = true; return; } @@ -596,6 +581,19 @@ bool Analyzer::HasSupportAnalyzer(Tag tag, bool orig) return false; } +SupportAnalyzer* Analyzer::FirstSupportAnalyzer(bool orig) + { + SupportAnalyzer* sa = orig ? orig_supporters : resp_supporters; + + if ( ! sa ) + return 0; + + if ( ! sa->Removing() ) + return sa; + + return sa->Sibling(true); + } + void Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig, int seq, const IP_Hdr* ip, int caplen) { @@ -782,16 +780,32 @@ void Analyzer::Weird(const char* name, const char* addl) conn->Weird(name, addl); } +SupportAnalyzer* SupportAnalyzer::Sibling(bool only_active) const + { + if ( ! only_active ) + return sibling; + + SupportAnalyzer* next = sibling; + while ( next && next->Removing() ) + next = next->sibling; + + return next; + } + void SupportAnalyzer::ForwardPacket(int len, const u_char* data, bool is_orig, int seq, const IP_Hdr* ip, int caplen) { // We do not call parent's method, as we're replacing the functionality. + if ( GetOutputHandler() ) GetOutputHandler()->DeliverPacket(len, data, is_orig, seq, ip, caplen); - else if ( sibling ) + + SupportAnalyzer* next_sibling = Sibling(true); + + if ( next_sibling ) // Pass to next in chain. - sibling->NextPacket(len, data, is_orig, seq, ip, caplen); + next_sibling->NextPacket(len, data, is_orig, seq, ip, caplen); else // Finished with preprocessing - now it's the parent's turn. Parent()->DeliverPacket(len, data, is_orig, seq, ip, caplen); @@ -800,12 +814,15 @@ void SupportAnalyzer::ForwardPacket(int len, const u_char* data, bool is_orig, void SupportAnalyzer::ForwardStream(int len, const u_char* data, bool is_orig) { // We do not call parent's method, as we're replacing the functionality. + if ( GetOutputHandler() ) GetOutputHandler()->DeliverStream(len, data, is_orig); - else if ( sibling ) + SupportAnalyzer* next_sibling = Sibling(true); + + if ( next_sibling ) // Pass to next in chain. - sibling->NextStream(len, data, is_orig); + next_sibling->NextStream(len, data, is_orig); else // Finished with preprocessing - now it's the parent's turn. Parent()->DeliverStream(len, data, is_orig); @@ -814,12 +831,15 @@ void SupportAnalyzer::ForwardStream(int len, const u_char* data, bool is_orig) void SupportAnalyzer::ForwardUndelivered(int seq, int len, bool is_orig) { // We do not call parent's method, as we're replacing the functionality. + if ( GetOutputHandler() ) GetOutputHandler()->Undelivered(seq, len, is_orig); - else if ( sibling ) + SupportAnalyzer* next_sibling = Sibling(true); + + if ( next_sibling ) // Pass to next in chain. - sibling->NextUndelivered(seq, len, is_orig); + next_sibling->NextUndelivered(seq, len, is_orig); else // Finished with preprocessing - now it's the parent's turn. Parent()->Undelivered(seq, len, is_orig); diff --git a/src/analyzer/Analyzer.h b/src/analyzer/Analyzer.h index f7ca07ca51..578020082b 100644 --- a/src/analyzer/Analyzer.h +++ b/src/analyzer/Analyzer.h @@ -587,7 +587,7 @@ protected: void RemoveTimer(Timer* t); /** - * Returnsn true if the analyzer has associated an SupportAnalyzer of a given type. + * Returns true if the analyzer has associated an SupportAnalyzer of a given type. * * @param tag The type to check for. * @@ -595,6 +595,14 @@ protected: */ bool HasSupportAnalyzer(Tag tag, bool orig); + /** + * Returns the first still active support analyzer for the given + * direction, or null if none. + * + * @param orig True if asking about the originator side. + */ + SupportAnalyzer* FirstSupportAnalyzer(bool orig); + /** * Adds a a new child analyzer with the option whether to intialize * it. This is an internal method. @@ -616,6 +624,12 @@ protected: */ void AppendNewChildren(); + /** + * Returns true if the analyzer has been flagged for removal and + * shouldn't be used otherwise anymore. + */ + bool Removing() const { return removing; } + private: // Internal method to eventually delete a child analyzer that's // already Done(). @@ -718,6 +732,14 @@ public: */ bool IsOrig() const { return orig; } + /** + * Returns the analyzer's next sibling, or null if none. + * + * only_active: If true, this will skip siblings that are still link + * but flagged for removal. + */ + SupportAnalyzer* Sibling(bool only_active = false) const; + /** * Passes packet input to the next sibling SupportAnalyzer if any, or * on to the associated main analyzer if none. If however there's an @@ -749,11 +771,6 @@ public: */ virtual void ForwardUndelivered(int seq, int len, bool orig); - /** - * Returns the analyzer next sibling, or null if none. - */ - SupportAnalyzer* Sibling() const { return sibling; } - protected: friend class Analyzer; diff --git a/src/analyzer/protocol/http/HTTP.cc b/src/analyzer/protocol/http/HTTP.cc index 93dbfbcb2e..0d49bb037f 100644 --- a/src/analyzer/protocol/http/HTTP.cc +++ b/src/analyzer/protocol/http/HTTP.cc @@ -950,7 +950,7 @@ void HTTP_Analyzer::DeliverStream(int len, const u_char* data, bool is_orig) if ( pia ) { - // There will be a PIA instance if this connection has been identified + // There will be a PIA instance if this connection has been identified // as a connect proxy. ForwardStream(len, data, is_orig); return; @@ -1066,14 +1066,10 @@ void HTTP_Analyzer::DeliverStream(int len, const u_char* data, bool is_orig) HTTP_Reply(); - InitHTTPMessage(content_line, - reply_message, is_orig, - ExpectReplyMessageBody(), - len); - if ( connect_request && reply_code == 200 ) { pia = new pia::PIA_TCP(Conn()); + if ( AddChildAnalyzer(pia) ) { pia->FirstPacket(true, 0); @@ -1084,13 +1080,22 @@ void HTTP_Analyzer::DeliverStream(int len, const u_char* data, bool is_orig) // need to be removed. RemoveSupportAnalyzer(content_line_orig); RemoveSupportAnalyzer(content_line_resp); + + return; } + else { + // Shouldn't really happen. + delete pia; pia = 0; } } + InitHTTPMessage(content_line, + reply_message, is_orig, + ExpectReplyMessageBody(), + len); } else { @@ -1422,6 +1427,12 @@ void HTTP_Analyzer::HTTP_Request() { ProtocolConfirmation(); + const char* method = (const char*) request_method->AsString()->Bytes(); + int method_len = request_method->AsString()->Len(); + + if ( strcasecmp_n(method_len, method, "CONNECT") == 0 ) + connect_request = true; + if ( http_request ) { val_list* vl = new val_list; @@ -1436,9 +1447,6 @@ void HTTP_Analyzer::HTTP_Request() // DEBUG_MSG("%.6f http_request\n", network_time); ConnectionEvent(http_request, vl); } - - if ( strcasecmp_n(request_method->AsString()->Len(), (const char*) (request_method->AsString()->Bytes()), "CONNECT") == 0 ) - connect_request = true; } void HTTP_Analyzer::HTTP_Reply() diff --git a/testing/btest/core/leaks/http-connect.bro b/testing/btest/core/leaks/http-connect.bro new file mode 100644 index 0000000000..e9a47d00a2 --- /dev/null +++ b/testing/btest/core/leaks/http-connect.bro @@ -0,0 +1,14 @@ +# Needs perftools support. +# +# @TEST-GROUP: leaks +# +# @TEST-REQUIRES: bro --help 2>&1 | grep -q mem-leaks +# +# @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -b -m -r $TRACES/http/connect-with-smtp.trace %INPUT +# @TEST-EXEC: btest-bg-wait 15 + +@load base/protocols/conn +@load base/protocols/http +@load base/protocols/smtp +@load base/protocols/tunnels +@load base/frameworks/dpd diff --git a/testing/btest/scripts/base/protocols/http/http-connect.bro b/testing/btest/scripts/base/protocols/http/http-connect.bro index d8157e2c49..7073d88ac2 100644 --- a/testing/btest/scripts/base/protocols/http/http-connect.bro +++ b/testing/btest/scripts/base/protocols/http/http-connect.bro @@ -6,6 +6,9 @@ # @TEST-EXEC: btest-diff smtp.log # @TEST-EXEC: btest-diff tunnel.log -# The base analysis scripts are loaded by default. -#@load base/protocols/http +@load base/protocols/conn +@load base/protocols/http +@load base/protocols/smtp +@load base/protocols/tunnels +@load base/frameworks/dpd From ac9c44afd872d0ac837871723f2b8ae0a7042415 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Sun, 2 Mar 2014 13:57:10 -0800 Subject: [PATCH 029/182] Updating submodule(s). [nomail] --- aux/broctl | 2 +- src/3rdparty | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aux/broctl b/aux/broctl index 66793ec3c6..07349a4593 160000 --- a/aux/broctl +++ b/aux/broctl @@ -1 +1 @@ -Subproject commit 66793ec3c602439e235bee705b654aefb7ac8dec +Subproject commit 07349a459372d72b333bbc50e5f70584520c0bb3 diff --git a/src/3rdparty b/src/3rdparty index 42a4c9694a..e96d95a130 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 42a4c9694a2b2677b050fbb7cbae26bc5ec4605a +Subproject commit e96d95a130a572b611fe70b3c3ede2b4727aaa22 From d0f8edb2a4affa843918afc568a4b040d308560a Mon Sep 17 00:00:00 2001 From: Seth Hall Date: Tue, 11 Feb 2014 15:30:22 -0500 Subject: [PATCH 030/182] Expanding the HTTP methods used in the signature to detect HTTP traffic. --- scripts/base/protocols/http/dpd.sig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/base/protocols/http/dpd.sig b/scripts/base/protocols/http/dpd.sig index 13470f4e95..3e264f0bb3 100644 --- a/scripts/base/protocols/http/dpd.sig +++ b/scripts/base/protocols/http/dpd.sig @@ -1,6 +1,8 @@ +# List of HTTP headers pulled from: +# http://annevankesteren.nl/2007/10/http-methods signature dpd_http_client { ip-proto == tcp - payload /^[[:space:]]*(GET|HEAD|POST)[[:space:]]*/ + payload /^[[:space:]]*(OPTIONS|GET|HEAD|POST|PUT|DELETE|TRACE|CONNECT|PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK|VERSION-CONTROL|REPORT|CHECKOUT|CHECKIN|UNCHECKOUT|MKWORKSPACE|UPDATE|LABEL|MERGE|BASELINE-CONTROL|MKACTIVITY|ORDERPATCH|ACL|PATCH|SEARCH|BCOPY|BDELETE|BMOVE|BPROPFIND|BPROPPATCH|NOTIFY|POLL|SUBSCRIBE|UNSUBSCRIBE|X-MS-ENUMATTS|RPC_OUT_DATA|RPC_IN_DATA)[[:space:]]*/ tcp-state originator } @@ -11,3 +13,5 @@ signature dpd_http_server { requires-reverse-signature dpd_http_client enable "http" } + + From 0f4c7080cc81e9bc66168d6612b80b3af7b54514 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Mon, 3 Mar 2014 07:09:38 -0800 Subject: [PATCH 031/182] HTTP fix for output handlers. Had broken that with the CONNECT change. --- src/analyzer/Analyzer.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/analyzer/Analyzer.cc b/src/analyzer/Analyzer.cc index 63462c0049..b280cbb6f8 100644 --- a/src/analyzer/Analyzer.cc +++ b/src/analyzer/Analyzer.cc @@ -798,8 +798,11 @@ void SupportAnalyzer::ForwardPacket(int len, const u_char* data, bool is_orig, // We do not call parent's method, as we're replacing the functionality. if ( GetOutputHandler() ) + { GetOutputHandler()->DeliverPacket(len, data, is_orig, seq, ip, caplen); + return; + } SupportAnalyzer* next_sibling = Sibling(true); @@ -816,7 +819,10 @@ void SupportAnalyzer::ForwardStream(int len, const u_char* data, bool is_orig) // We do not call parent's method, as we're replacing the functionality. if ( GetOutputHandler() ) + { GetOutputHandler()->DeliverStream(len, data, is_orig); + return; + } SupportAnalyzer* next_sibling = Sibling(true); @@ -833,7 +839,10 @@ void SupportAnalyzer::ForwardUndelivered(int seq, int len, bool is_orig) // We do not call parent's method, as we're replacing the functionality. if ( GetOutputHandler() ) + { GetOutputHandler()->Undelivered(seq, len, is_orig); + return; + } SupportAnalyzer* next_sibling = Sibling(true); From a1f2ab34ac6781d1eb1eb6ca94bb48cbc8312a4a Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Mon, 3 Mar 2014 10:49:28 -0800 Subject: [PATCH 032/182] Add verify functionality, including the ability to get the validated chain. This means that it is now possible to get information about the root-certificates that were used to secure a connection. Intermediate commit before changing the script interface again. addresses BIT-953, BIT-760 --- scripts/base/files/x509/main.bro | 11 +- scripts/base/init-bare.bro | 18 +- src/Type.h | 13 ++ src/file_analysis/analyzer/x509/X509.cc | 55 +++--- src/file_analysis/analyzer/x509/X509.h | 11 +- src/file_analysis/analyzer/x509/events.bif | 8 +- src/file_analysis/analyzer/x509/functions.bif | 171 ++++++++++++++++++ src/file_analysis/analyzer/x509/types.bif | 2 +- 8 files changed, 249 insertions(+), 40 deletions(-) create mode 100644 src/file_analysis/analyzer/x509/functions.bif diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro index d19327f07c..7f7ff3064a 100644 --- a/scripts/base/files/x509/main.bro +++ b/scripts/base/files/x509/main.bro @@ -5,24 +5,27 @@ module X509; export { redef enum Log::ID += { LOG }; + + redef record Files::Info += { + }; } -event x509_cert(f: fa_file, cert: X509::Certificate) +event x509_cert(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) { print cert; } -event x509_extension(f: fa_file, cert: X509::Certificate, ext: X509::Extension) +event x509_extension(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::Extension) { print ext; } -event x509_ext_basic_constraints(f: fa_file, cert: X509::Certificate, ext: X509::BasicConstraints) +event x509_ext_basic_constraints(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::BasicConstraints) { print ext; } -event x509_ext_subject_alternative_name(f: fa_file, cert: X509::Certificate, ext: X509::SubjectAlternativeName) +event x509_ext_subject_alternative_name(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: string_vec) { print ext; } diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index e4c1803fcb..12b056a541 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -46,6 +46,13 @@ type index_vec: vector of count; ## directly and then remove this alias. type string_vec: vector of string; +## A vector of x509 opaques. +## +## .. todo:: We need this type definition only for declaring builtin functions +## via ``bifcl``. We should extend ``bifcl`` to understand composite types +## directly and then remove this alias. +type x509_opaque_vector: vector of opaque of x509; + ## A vector of addresses. ## ## .. todo:: We need this type definition only for declaring builtin functions @@ -2744,7 +2751,6 @@ export { module X509; export { type X509::Certificate: record { - certificate: opaque of x509; ##< OpenSSL certificate reference version: count; ##< Version number. serial: string; ##< Serial number. subject: string; ##< Subject. @@ -2774,8 +2780,14 @@ export { path_len: count &optional; }; - type X509::SubjectAlternativeName: record { - names: vector of string; + ## Result of an X509 certificate chain verification + type X509::Result: record { + ## OpenSSL result code + result: count; + ## Result as string + result_string: string; + ## References to the final certificate chain, if verification successful. End-host certificate is first. + chain_certs: vector of opaque of x509 &optional; }; } diff --git a/src/Type.h b/src/Type.h index 742b933ec1..323938d4c5 100644 --- a/src/Type.h +++ b/src/Type.h @@ -73,6 +73,7 @@ class EnumType; class Serializer; class VectorType; class TypeType; +class OpaqueType; const int DOES_NOT_MATCH_INDEX = 0; const int MATCHES_INDEX_SCALAR = 1; @@ -204,6 +205,18 @@ public: return (VectorType*) this; } + OpaqueType* AsOpaqueType() + { + CHECK_TYPE_TAG(TYPE_OPAQUE, "BroType::AsOpaqueType"); + return (OpaqueType*) this; + } + + const OpaqueType* AsOpaqueType() const + { + CHECK_TYPE_TAG(TYPE_OPAQUE, "BroType::AsOpaqueType"); + return (OpaqueType*) this; + } + VectorType* AsVectorType() { CHECK_TYPE_TAG(TYPE_VECTOR, "BroType::AsVectorType"); diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 684f4f54ba..a254188585 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -49,7 +49,17 @@ bool file_analysis::X509::EndOfFile() return false; } - RecordVal* cert_record = ParseCertificate(ssl_cert); // cert_record takes ownership of ssl_cert + X509Val* cert_val = new X509Val(ssl_cert); // cert_val takes ownership of ssl_cert + + RecordVal* cert_record = ParseCertificate(cert_val); // parse basic information into record + + // and send the record on to scriptland + val_list* vl = new val_list(); + vl->append(GetFile()->GetVal()->Ref()); + vl->append(cert_val->Ref()); + vl->append(cert_record->Ref()); // we Ref it here, because we want to keep a copy around for now... + + mgr.QueueEvent(x509_cert, vl); // after parsing the certificate - parse the extensions... @@ -60,7 +70,7 @@ bool file_analysis::X509::EndOfFile() if ( !ex ) continue; - ParseExtension(ex, cert_record); + ParseExtension(ex, cert_record, cert_val); } // X509_free(ssl_cert); We do _not_ free the certificate here. It is refcounted @@ -69,34 +79,36 @@ bool file_analysis::X509::EndOfFile() // The certificate will be freed when the last X509Val is Unref'd. Unref(cert_record); // Unref the RecordVal that we kept around from ParseCertificate + Unref(cert_val); // Same for cert_val return false; } -RecordVal* file_analysis::X509::ParseCertificate(::X509* ssl_cert) +RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val) { + ::X509* ssl_cert = cert_val->GetCertificate(); + char buf[256]; // we need a buffer for some of the openssl functions memset(buf, 0, 256); RecordVal* pX509Cert = new RecordVal(BifType::Record::X509::Certificate); BIO *bio = BIO_new(BIO_s_mem()); - pX509Cert->Assign(0, new X509Val(ssl_cert)); // take ownership for cleanup - pX509Cert->Assign(1, new Val((uint64) X509_get_version(ssl_cert), TYPE_COUNT)); + pX509Cert->Assign(0, new Val((uint64) X509_get_version(ssl_cert), TYPE_COUNT)); i2a_ASN1_INTEGER(bio, X509_get_serialNumber(ssl_cert)); int len = BIO_read(bio, &(*buf), sizeof buf); - pX509Cert->Assign(2, new StringVal(len, buf)); + pX509Cert->Assign(1, new StringVal(len, buf)); X509_NAME_print_ex(bio, X509_get_subject_name(ssl_cert), 0, XN_FLAG_RFC2253); len = BIO_gets(bio, &(*buf), sizeof buf); - pX509Cert->Assign(3, new StringVal(len, buf)); + pX509Cert->Assign(2, new StringVal(len, buf)); X509_NAME_print_ex(bio, X509_get_issuer_name(ssl_cert), 0, XN_FLAG_RFC2253); len = BIO_gets(bio, &(*buf), sizeof buf); - pX509Cert->Assign(4, new StringVal(len, buf)); + pX509Cert->Assign(3, new StringVal(len, buf)); BIO_free(bio); - pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notBefore(ssl_cert)), TYPE_TIME)); - pX509Cert->Assign(6, new Val(get_time_from_asn1(X509_get_notAfter(ssl_cert)), TYPE_TIME)); + pX509Cert->Assign(4, new Val(get_time_from_asn1(X509_get_notBefore(ssl_cert)), TYPE_TIME)); + pX509Cert->Assign(5, new Val(get_time_from_asn1(X509_get_notAfter(ssl_cert)), TYPE_TIME)); // we only read 255 bytes because byte 256 is always 0. // if the string is longer than 255, that will be our null-termination, @@ -141,16 +153,11 @@ RecordVal* file_analysis::X509::ParseCertificate(::X509* ssl_cert) pX509Cert->Assign(9, new Val(length, TYPE_COUNT)); } - val_list* vl = new val_list(); - vl->append(GetFile()->GetVal()->Ref()); - vl->append(pX509Cert->Ref()); // we Ref it here, because we want to keep a copy around for now... - - mgr.QueueEvent(x509_cert, vl); return pX509Cert; } -void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r) +void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val) { char name[256]; char oid[256]; @@ -196,6 +203,7 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r) // but I am not sure if there is a better way to do it... val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(cert_val->Ref()); vl->append(r->Ref()); vl->append(pX509Ext); @@ -203,12 +211,12 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r) // look if we have a specialized handler for this event... if ( OBJ_obj2nid(ext_asn) == NID_basic_constraints ) - ParseBasicConstraints(ex, r); + ParseBasicConstraints(ex, r, cert_val); else if ( OBJ_obj2nid(ext_asn) == NID_subject_alt_name ) - ParseSAN(ex, r); + ParseSAN(ex, r, cert_val); } -void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r) +void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_basic_constraints); @@ -226,6 +234,7 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r } val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(cert_val->Ref()); vl->append(r->Ref()); vl->append(pBasicConstraint); @@ -234,7 +243,7 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r } } -void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r) +void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r, X509Val* cert_val) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_subject_alt_name); @@ -273,13 +282,11 @@ void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r) } } - RecordVal* pSan = new RecordVal(BifType::Record::X509::SubjectAlternativeName); - pSan->Assign(0, names); - val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); + vl->append(cert_val->Ref()); vl->append(r->Ref()); - vl->append(pSan); + vl->append(names); mgr.QueueEvent(x509_ext_basic_constraints, vl); } diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h index f64aa3eb58..b535ebe256 100644 --- a/src/file_analysis/analyzer/x509/X509.h +++ b/src/file_analysis/analyzer/x509/X509.h @@ -12,12 +12,16 @@ namespace file_analysis { +class X509Val; + class X509 : public file_analysis::Analyzer { public: //~X509(); static file_analysis::Analyzer* Instantiate(RecordVal* args, File* file) { return new X509(args, file); } + + static RecordVal* ParseCertificate(X509Val* cert_val); virtual bool DeliverStream(const u_char* data, uint64 len); virtual bool Undelivered(uint64 offset, uint64 len); @@ -31,10 +35,9 @@ private: static StringVal* key_curve(EVP_PKEY *key); static unsigned int key_length(EVP_PKEY *key); - RecordVal* ParseCertificate(::X509* ssl_cert); - void ParseExtension(X509_EXTENSION* ex, RecordVal* r); - void ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r); - void ParseSAN(X509_EXTENSION* ex, RecordVal* r); + void ParseExtension(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); + void ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); + void ParseSAN(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); std::string cert_data; }; diff --git a/src/file_analysis/analyzer/x509/events.bif b/src/file_analysis/analyzer/x509/events.bif index 2787746e0c..b78f819e90 100644 --- a/src/file_analysis/analyzer/x509/events.bif +++ b/src/file_analysis/analyzer/x509/events.bif @@ -1,4 +1,4 @@ -event x509_cert%(f: fa_file, cert: X509::Certificate%); -event x509_extension%(f: fa_file, cert: X509::Certificate, ext: X509::Extension%); -event x509_ext_basic_constraints%(f: fa_file, cert: X509::Certificate, ext: X509::BasicConstraints%); -event x509_ext_subject_alternative_name%(f: fa_file, cert: X509::Certificate, ext: X509::SubjectAlternativeName%); +event x509_cert%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate%); +event x509_extension%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::Extension%); +event x509_ext_basic_constraints%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::BasicConstraints%); +event x509_ext_subject_alternative_name%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, names: string_vec%); diff --git a/src/file_analysis/analyzer/x509/functions.bif b/src/file_analysis/analyzer/x509/functions.bif new file mode 100644 index 0000000000..7af8883aef --- /dev/null +++ b/src/file_analysis/analyzer/x509/functions.bif @@ -0,0 +1,171 @@ +%%{ +#include "file_analysis/analyzer/x509/X509.h" +#include "types.bif.h" + +#include +#include +#include + +// This is the indexed map of X509 certificate stores. +static map x509_stores; + +// ### NOTE: while d2i_X509 does not take a const u_char** pointer, +// here we assume d2i_X509 does not write to , so it is safe to +// convert data to a non-const pointer. Could some X509 guru verify +// this? + +X509* d2i_X509_(X509** px, const u_char** in, int len) + { +#ifdef OPENSSL_D2I_X509_USES_CONST_CHAR + return d2i_X509(px, in, len); +#else + return d2i_X509(px, (u_char**)in, len); +#endif + } + +%%} + +## Parses a certificate into an X509::Certificate structure +## +## cert: The x509 certificicate opaque +## +## Returns: A X509::Certificate structure +## +## .. bro:see:: x509_verify +function x509_parse%(cert: opaque of x509%): X509::Certificate + %{ + assert(cert); + file_analysis::X509Val* h = (file_analysis::X509Val*) cert; + + return file_analysis::X509::ParseCertificate(h); + %} + +## Verifies a certificate. +## +## cert_val: The X.509 certificate in DER format. +## +## cert_stack: Specifies a certificate chain that is being used to validate +## the given certificate against the root store given in *root_certs* +## +## root_certs: A list of root certificates to validate the certificate chain +## +## Returns: A record of type X509::Result containing the result code of the verify +## operation. In case of success also returns the full certificate chain. +## +## .. bro:see:: x509_parse +function x509_verify%(cert_val: opaque of x509, cert_stack: x509_opaque_vector, root_certs: table_string_of_string%): X509::Result + %{ + X509_STORE* ctx = 0; + int i = 0; + + // If this certificate store was built previously, just reuse the old one. + if ( x509_stores.count(root_certs) > 0 ) + ctx = x509_stores[root_certs]; + + if ( ! ctx ) // lookup to see if we have this one built already! + { + ctx = X509_STORE_new(); + TableVal* root_certs2 = root_certs->AsTableVal(); + ListVal* idxs = root_certs2->ConvertToPureList(); + + // Build the validation store + for ( i = 0; i < idxs->Length(); ++i ) + { + Val* key = idxs->Index(i); + StringVal *sv = root_certs2->Lookup(key)->AsStringVal(); + const uint8* data = sv->Bytes(); + X509* x = d2i_X509_(NULL, &data, sv->Len()); + if ( ! x ) + { + builtin_error(fmt("Root CA error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); + return new Val((uint64) ERR_get_error(), TYPE_COUNT); + } + X509_STORE_add_cert(ctx, x); + } + delete idxs; + + // Save the newly constructed certificate store into the cacheing map. + x509_stores[root_certs] = ctx; + } + + assert(cert_val); + file_analysis::X509Val* cert_handle = (file_analysis::X509Val*) cert_val; + + X509* cert = cert_handle->GetCertificate(); + if ( ! cert ) + { + builtin_error(fmt("No certificate in opaque")); + return new Val(-1, TYPE_COUNT); + } + + STACK_OF(X509)* untrusted_certs = sk_X509_new_null(); + if ( ! untrusted_certs ) + { + builtin_error(fmt("Untrusted certificate stack initialization error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); + return new Val((uint64) ERR_get_error(), TYPE_COUNT); + } + + VectorVal *cert_stack_vec = cert_stack->AsVectorVal(); + for ( i = 0; i < (int) cert_stack_vec->Size(); ++i ) + { + Val *sv = cert_stack_vec->Lookup(i); + // Fixme: check type + X509* x = ((file_analysis::X509Val*) sv)->GetCertificate(); + if ( ! x ) + { + sk_X509_pop(untrusted_certs); + builtin_error(fmt("No certificate in opaque in stack")); + return new Val(-1, TYPE_COUNT); + } + sk_X509_push(untrusted_certs, x); + } + + X509_STORE_CTX csc; + X509_STORE_CTX_init(&csc, ctx, cert, untrusted_certs); + X509_STORE_CTX_set_time(&csc, 0, (time_t) network_time); + + int result = X509_verify_cert(&csc); + + VectorVal* chainVector = 0; + if ( result == 1 ) // we have a valid chain. try to get it... + { + STACK_OF(X509)* chain = X509_STORE_CTX_get1_chain(&csc); // get1 = deep copy + + if (!chain) + { + reporter->Error("Encountered valid chain that could not be resolved"); + goto x509_verify_chainerror; + } + + int num_certs = sk_X509_num(chain); + chainVector = new VectorVal(new VectorType(base_type(TYPE_OPAQUE))); + + for ( int i = 0; i < num_certs; i++ ) + { + X509* currcert = sk_X509_value(chain, i); + if ( !currcert ) + { + reporter->InternalError("OpenSSL returned null certificate"); + goto x509_verify_chainerror; + } + + chainVector->Assign(i, new file_analysis::X509Val(currcert)); // X509Val takes ownership + } + } + +x509_verify_chainerror: + + X509_STORE_CTX_cleanup(&csc); + + if ( untrusted_certs ) + sk_X509_pop(untrusted_certs); + + RecordVal* rrecord = new RecordVal(BifType::Record::X509::Result); + + rrecord->Assign(0, new Val((uint64) csc.error, TYPE_COUNT)); + rrecord->Assign(1, new StringVal(X509_verify_cert_error_string(csc.error))); + if ( chainVector ) + rrecord->Assign(2, chainVector); + + return rrecord; + %} diff --git a/src/file_analysis/analyzer/x509/types.bif b/src/file_analysis/analyzer/x509/types.bif index 49a915c7fc..6b3049883e 100644 --- a/src/file_analysis/analyzer/x509/types.bif +++ b/src/file_analysis/analyzer/x509/types.bif @@ -1,5 +1,5 @@ type X509::Certificate: record; type X509::Extension: record; type X509::BasicConstraints: record; -type X509::SubjectAlternativeName: record; +type X509::Result: record; From 110d9fbd6a79020a77b6f84b7f3289835e023c33 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Mon, 3 Mar 2014 17:07:50 -0800 Subject: [PATCH 033/182] X509 file analyzer nearly done. Verification and most other policy scripts work fine now. Todo: * update all baselines * fix the circular reference to the fa_file structure I introduced :) Sadly this does not seem to be entirely straightforward. addresses BIT-953, BIT-760 --- scripts/base/files/x509/README | 1 + scripts/base/files/x509/main.bro | 77 +++++++++++---- scripts/base/init-bare.bro | 4 +- scripts/base/init-default.bro | 4 +- scripts/base/protocols/ssl/files.bro | 76 +++++++++++++-- scripts/base/protocols/ssl/main.bro | 32 +------ .../policy/frameworks/intel/seen/__load__.bro | 3 +- scripts/policy/frameworks/intel/seen/ssl.bro | 21 ----- .../frameworks/intel/seen/where-locations.bro | 3 +- scripts/policy/frameworks/intel/seen/x509.bro | 16 ++++ scripts/policy/protocols/ssl/cert-hash.bro | 22 ----- .../policy/protocols/ssl/expiring-certs.bro | 22 ++--- .../protocols/ssl/extract-certs-pem.bro | 31 ++---- scripts/policy/protocols/ssl/known-certs.bro | 20 ++-- scripts/policy/protocols/ssl/notary.bro | 9 +- .../policy/protocols/ssl/validate-certs.bro | 29 +++--- src/file_analysis/analyzer/x509/X509.cc | 22 ++--- src/file_analysis/analyzer/x509/X509.h | 6 +- src/file_analysis/analyzer/x509/events.bif | 8 +- src/file_analysis/analyzer/x509/functions.bif | 94 +++++++++++++++---- 20 files changed, 303 insertions(+), 197 deletions(-) create mode 100644 scripts/base/files/x509/README create mode 100644 scripts/policy/frameworks/intel/seen/x509.bro delete mode 100644 scripts/policy/protocols/ssl/cert-hash.bro diff --git a/scripts/base/files/x509/README b/scripts/base/files/x509/README new file mode 100644 index 0000000000..8b50366cd2 --- /dev/null +++ b/scripts/base/files/x509/README @@ -0,0 +1 @@ +Support for X509 certificates with the file analysis framework. diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro index 7f7ff3064a..2238cf0c8b 100644 --- a/scripts/base/files/x509/main.bro +++ b/scripts/base/files/x509/main.bro @@ -1,32 +1,77 @@ - @load base/frameworks/files +@load base/files/hash module X509; export { redef enum Log::ID += { LOG }; - redef record Files::Info += { + type Info: record { + ## current timestamp + ts: time &log &default=network_time(); + + ## file id of this certificate + id: string &log; + + ## Basic information about the certificate + certificate: X509::Certificate &log; + + ## The opaque wrapping the certificate. Mainly used + ## for the verify operations + handle: opaque of x509; + + ## All extensions that were encountered in the certificate + extensions: vector of X509::Extension &default=vector(); + + ## Subject alternative name extension of the certificate + san: string_vec &optional &log; + + ## Basic constraints extension of the certificate + basic_constraints: X509::BasicConstraints &optional &log; }; + + ## Event for accessing logged records. + global log_x509: event(rec: Info); } -event x509_cert(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) +event bro_init() &priority=5 { - print cert; + Log::create_stream(X509::LOG, [$columns=Info, $ev=log_x509]); } -event x509_extension(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::Extension) -{ -print ext; -} +redef record fa_file += { + ## Information about X509 certificates. This is used to keep + ## certificate information until all events have been received. + x509: X509::Info &optional; +}; -event x509_ext_basic_constraints(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::BasicConstraints) -{ -print ext; -} +event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) &priority=5 + { + f$x509 = [$id=f$id, $certificate=cert, $handle=cert_ref]; + } -event x509_ext_subject_alternative_name(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: string_vec) -{ -print ext; -} +event x509_extension(f: fa_file, ext: X509::Extension) &priority=5 + { + if ( f?$x509 ) + f$x509$extensions[|f$x509$extensions|] = ext; + } +event x509_ext_basic_constraints(f: fa_file, ext: X509::BasicConstraints) &priority=5 + { + if ( f?$x509 ) + f$x509$basic_constraints = ext; + } + +event x509_ext_subject_alternative_name(f: fa_file, names: string_vec) &priority=5 + { + if ( f?$x509 ) + f$x509$san = names; + } + +event file_state_remove(f: fa_file) + { + if ( f?$x509 ) + { + Log::write(LOG, f$x509); + } + } diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index 12b056a541..f59355895d 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -2765,7 +2765,7 @@ export { curve: string &optional; ##< curve, if EC-certificate #ca: bool &optional; ##< indicates the CA value in the X509v3 BasicConstraints extension #path_len: count &optional; ##< indicates the path_length value in the X509v3 BasicConstraints extension - }; + } &log; type X509::Extension: record { name: string; ##< long name of extension. oid if name not known @@ -2778,7 +2778,7 @@ export { type X509::BasicConstraints: record { ca: bool; ##< CA flag set? path_len: count &optional; - }; + } &log; ## Result of an X509 certificate chain verification type X509::Result: record { diff --git a/scripts/base/init-default.bro b/scripts/base/init-default.bro index b4dca043c0..91f1157811 100644 --- a/scripts/base/init-default.bro +++ b/scripts/base/init-default.bro @@ -38,6 +38,9 @@ @load base/frameworks/sumstats @load base/frameworks/tunnels +# needed for the SSL protocol +@load base/files/x509 + @load base/protocols/conn @load base/protocols/dhcp @load base/protocols/dnp3 @@ -57,7 +60,6 @@ @load base/files/hash @load base/files/extract @load base/files/unified2 -@load base/files/x509 @load base/misc/find-checksum-offloading @load base/misc/find-filtered-trace diff --git a/scripts/base/protocols/ssl/files.bro b/scripts/base/protocols/ssl/files.bro index 7582a428ae..a8e755e953 100644 --- a/scripts/base/protocols/ssl/files.bro +++ b/scripts/base/protocols/ssl/files.bro @@ -6,9 +6,33 @@ module SSL; export { redef record Info += { - ## An ordered vector of file unique IDs which contains - ## all the certificates sent over the connection - fuids: vector of string &log &default=string_vec(); + ## Chain of certificates offered by the server to validate its + ## complete signing chain. + cert_chain: vector of fa_file &optional; + + ## An ordered vector of all certicate file unique IDs for the + ## certificates offered by the server. + cert_chain_fuids: vector of string &optional &log; + + ## Chain of certificates offered by the client to validate its + ## complete signing chain. + client_cert_chain: vector of fa_file &optional; + + ## An ordered vector of all certicate file unique IDs for the + ## certificates offered by the client. + client_cert_chain_fuids: vector of string &optional &log; + + ## Subject of the X.509 certificate offered by the server. + subject: string &log &optional; + ## Subject of the signer of the X.509 certificate offered by the + ## server. + issuer: string &log &optional; + + ## Subject of the X.509 certificate offered by the client. + client_subject: string &log &optional; + ## Subject of the signer of the X.509 certificate offered by the + ## client. + client_issuer: string &log &optional; }; ## Default file handle provider for SSL. @@ -20,7 +44,7 @@ export { function get_file_handle(c: connection, is_orig: bool): string { - return cat(Analyzer::ANALYZER_SMTP, c$start_time); + return cat(Analyzer::ANALYZER_SSL, c$start_time); } function describe_file(f: fa_file): string @@ -29,6 +53,8 @@ function describe_file(f: fa_file): string if ( f$source != "SSL" ) return ""; + # Fixme! + return ""; } @@ -41,8 +67,46 @@ event bro_init() &priority=5 event file_over_new_connection(f: fa_file, c: connection, is_orig: bool) &priority=5 { - if ( c?$ssl ) - c$ssl$fuids[|c$ssl$fuids|] = f$id; + if ( ! c?$ssl ) + return; + + if ( ! c$ssl?$cert_chain ) + { + c$ssl$cert_chain = vector(); + c$ssl$client_cert_chain = vector(); + c$ssl$cert_chain_fuids = string_vec(); + c$ssl$client_cert_chain_fuids = string_vec(); + } + + if ( is_orig ) + { + c$ssl$client_cert_chain[|c$ssl$client_cert_chain|] = f; + c$ssl$client_cert_chain_fuids[|c$ssl$client_cert_chain_fuids|] = f$id; + } + else + { + c$ssl$cert_chain[|c$ssl$cert_chain|] = f; + c$ssl$cert_chain_fuids[|c$ssl$cert_chain_fuids|] = f$id; + } Files::add_analyzer(f, Files::ANALYZER_X509); + # always calculate hashes for certificates + Files::add_analyzer(f, Files::ANALYZER_MD5); + Files::add_analyzer(f, Files::ANALYZER_SHA1); + } + +event ssl_established(c: connection) &priority=6 + { + # update subject and issuer information + if ( c$ssl?$cert_chain && |c$ssl$cert_chain| > 0 ) + { + c$ssl$subject = c$ssl$cert_chain[0]$x509$certificate$subject; + c$ssl$issuer = c$ssl$cert_chain[0]$x509$certificate$issuer; + } + + if ( c$ssl?$client_cert_chain && |c$ssl$client_cert_chain| > 0 ) + { + c$ssl$client_subject = c$ssl$client_cert_chain[0]$x509$certificate$subject; + c$ssl$client_issuer = c$ssl$client_cert_chain[0]$x509$certificate$issuer; + } } diff --git a/scripts/base/protocols/ssl/main.bro b/scripts/base/protocols/ssl/main.bro index be62cf419d..e803077d19 100644 --- a/scripts/base/protocols/ssl/main.bro +++ b/scripts/base/protocols/ssl/main.bro @@ -24,36 +24,9 @@ export { server_name: string &log &optional; ## Session ID offered by the client for session resumption. session_id: string &log &optional; - ## Subject of the X.509 certificate offered by the server. - subject: string &log &optional; - ## Subject of the signer of the X.509 certificate offered by the - ## server. - issuer_subject: string &log &optional; - ## NotValidBefore field value from the server certificate. - not_valid_before: time &log &optional; - ## NotValidAfter field value from the server certificate. - not_valid_after: time &log &optional; ## Last alert that was seen during the connection. last_alert: string &log &optional; - ## Subject of the X.509 certificate offered by the client. - client_subject: string &log &optional; - ## Subject of the signer of the X.509 certificate offered by the - ## client. - client_issuer_subject: string &log &optional; - - ## Full binary server certificate stored in DER format. - cert: string &optional; - ## Chain of certificates offered by the server to validate its - ## complete signing chain. - cert_chain: vector of string &optional; - - ## Full binary client certificate stored in DER format. - client_cert: string &optional; - ## Chain of certificates offered by the client to validate its - ## complete signing chain. - client_cert_chain: vector of string &optional; - ## The analyzer ID used for the analyzer instance attached ## to each connection. It is not used for logging since it's a ## meaningless arbitrary number. @@ -108,8 +81,7 @@ event bro_init() &priority=5 function set_session(c: connection) { if ( ! c?$ssl ) - c$ssl = [$ts=network_time(), $uid=c$uid, $id=c$id, $cert_chain=vector(), - $client_cert_chain=vector()]; + c$ssl = [$ts=network_time(), $uid=c$uid, $id=c$id]; } function delay_log(info: Info, token: string) @@ -185,7 +157,7 @@ event ssl_alert(c: connection, is_orig: bool, level: count, desc: count) &priori c$ssl$last_alert = alert_descriptions[desc]; } -event ssl_established(c: connection) &priority=5 +event ssl_established(c: connection) &priority=7 { set_session(c); } diff --git a/scripts/policy/frameworks/intel/seen/__load__.bro b/scripts/policy/frameworks/intel/seen/__load__.bro index 01034d95e2..807bf0fcb2 100644 --- a/scripts/policy/frameworks/intel/seen/__load__.bro +++ b/scripts/policy/frameworks/intel/seen/__load__.bro @@ -6,4 +6,5 @@ @load ./http-url @load ./ssl @load ./smtp -@load ./smtp-url-extraction \ No newline at end of file +@load ./smtp-url-extraction +@load ./x509 diff --git a/scripts/policy/frameworks/intel/seen/ssl.bro b/scripts/policy/frameworks/intel/seen/ssl.bro index e404c39e5b..c41dbbdbe1 100644 --- a/scripts/policy/frameworks/intel/seen/ssl.bro +++ b/scripts/policy/frameworks/intel/seen/ssl.bro @@ -2,27 +2,6 @@ @load base/protocols/ssl @load ./where-locations -event x509_certificate(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string) - { - if ( chain_idx == 0 ) - { - if ( /emailAddress=/ in cert$subject ) - { - local email = sub(cert$subject, /^.*emailAddress=/, ""); - email = sub(email, /,.*$/, ""); - Intel::seen([$indicator=email, - $indicator_type=Intel::EMAIL, - $conn=c, - $where=(is_orig ? SSL::IN_CLIENT_CERT : SSL::IN_SERVER_CERT)]); - } - - Intel::seen([$indicator=sha1_hash(der_cert), - $indicator_type=Intel::CERT_HASH, - $conn=c, - $where=(is_orig ? SSL::IN_CLIENT_CERT : SSL::IN_SERVER_CERT)]); - } - } - event ssl_extension(c: connection, is_orig: bool, code: count, val: string) { if ( is_orig && SSL::extensions[code] == "server_name" && diff --git a/scripts/policy/frameworks/intel/seen/where-locations.bro b/scripts/policy/frameworks/intel/seen/where-locations.bro index 0387814ea7..b9b4325bc1 100644 --- a/scripts/policy/frameworks/intel/seen/where-locations.bro +++ b/scripts/policy/frameworks/intel/seen/where-locations.bro @@ -21,9 +21,8 @@ export { SMTP::IN_REPLY_TO, SMTP::IN_X_ORIGINATING_IP_HEADER, SMTP::IN_MESSAGE, - SSL::IN_SERVER_CERT, - SSL::IN_CLIENT_CERT, SSL::IN_SERVER_NAME, SMTP::IN_HEADER, + X509::IN_CERT, }; } diff --git a/scripts/policy/frameworks/intel/seen/x509.bro b/scripts/policy/frameworks/intel/seen/x509.bro new file mode 100644 index 0000000000..de6c0ab495 --- /dev/null +++ b/scripts/policy/frameworks/intel/seen/x509.bro @@ -0,0 +1,16 @@ +@load base/frameworks/intel +@load base/files/x509 +@load ./where-locations + +event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) + { + if ( /emailAddress=/ in cert$subject ) + { + local email = sub(cert$subject, /^.*emailAddress=/, ""); + email = sub(email, /,.*$/, ""); + Intel::seen([$indicator=email, + $indicator_type=Intel::EMAIL, + $f=f, + $where=X509::IN_CERT]); + } + } diff --git a/scripts/policy/protocols/ssl/cert-hash.bro b/scripts/policy/protocols/ssl/cert-hash.bro deleted file mode 100644 index 32a165a946..0000000000 --- a/scripts/policy/protocols/ssl/cert-hash.bro +++ /dev/null @@ -1,22 +0,0 @@ -##! Calculate MD5 sums for server DER formatted certificates. - -@load base/protocols/ssl - -module SSL; - -export { - redef record Info += { - ## MD5 sum of the raw server certificate. - cert_hash: string &log &optional; - }; -} - -event x509_certificate(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string) &priority=4 - { - # We aren't tracking client certificates yet and we are also only tracking - # the primary cert. Watch that this came from an SSL analyzed session too. - if ( is_orig || chain_idx != 0 || ! c?$ssl ) - return; - - c$ssl$cert_hash = md5_hash(der_cert); - } \ No newline at end of file diff --git a/scripts/policy/protocols/ssl/expiring-certs.bro b/scripts/policy/protocols/ssl/expiring-certs.bro index be6526877b..fc48ad9f2b 100644 --- a/scripts/policy/protocols/ssl/expiring-certs.bro +++ b/scripts/policy/protocols/ssl/expiring-certs.bro @@ -3,10 +3,7 @@ ##! certificate. @load base/protocols/ssl -@load base/frameworks/notice -@load base/utils/directions-and-hosts - -@load protocols/ssl/cert-hash +@load base/files/x509 module SSL; @@ -35,30 +32,31 @@ export { const notify_when_cert_expiring_in = 30days &redef; } -event x509_certificate(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string) &priority=3 +event ssl_established(c: connection) &priority=3 { - # If this isn't the host cert or we aren't interested in the server, just return. - if ( is_orig || - chain_idx != 0 || - ! c$ssl?$cert_hash || + # If there are no certificates or we are not interested in the server, just return. + if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| == 0 || ! addr_matches_host(c$id$resp_h, notify_certs_expiration) ) return; + + local hash = c$ssl$cert_chain[0]$info$md5; + local cert = c$ssl$cert_chain[0]$x509$certificate; if ( cert$not_valid_before > network_time() ) NOTICE([$note=Certificate_Not_Valid_Yet, $conn=c, $suppress_for=1day, $msg=fmt("Certificate %s isn't valid until %T", cert$subject, cert$not_valid_before), - $identifier=cat(c$id$resp_h, c$id$resp_p, c$ssl$cert_hash)]); + $identifier=cat(c$id$resp_h, c$id$resp_p, hash)]); else if ( cert$not_valid_after < network_time() ) NOTICE([$note=Certificate_Expired, $conn=c, $suppress_for=1day, $msg=fmt("Certificate %s expired at %T", cert$subject, cert$not_valid_after), - $identifier=cat(c$id$resp_h, c$id$resp_p, c$ssl$cert_hash)]); + $identifier=cat(c$id$resp_h, c$id$resp_p, hash)]); else if ( cert$not_valid_after - notify_when_cert_expiring_in < network_time() ) NOTICE([$note=Certificate_Expires_Soon, $msg=fmt("Certificate %s is going to expire at %T", cert$subject, cert$not_valid_after), $conn=c, $suppress_for=1day, - $identifier=cat(c$id$resp_h, c$id$resp_p, c$ssl$cert_hash)]); + $identifier=cat(c$id$resp_h, c$id$resp_p, hash)]); } diff --git a/scripts/policy/protocols/ssl/extract-certs-pem.bro b/scripts/policy/protocols/ssl/extract-certs-pem.bro index 32293ebef3..247d58fea2 100644 --- a/scripts/policy/protocols/ssl/extract-certs-pem.bro +++ b/scripts/policy/protocols/ssl/extract-certs-pem.bro @@ -10,8 +10,7 @@ ##! @load base/protocols/ssl -@load base/utils/directions-and-hosts -@load protocols/ssl/cert-hash +@load base/files/x509 module SSL; @@ -23,41 +22,31 @@ export { } # This is an internally maintained variable to prevent relogging of -# certificates that have already been seen. It is indexed on an md5 sum of +# certificates that have already been seen. It is indexed on an sha1 sum of # the certificate. global extracted_certs: set[string] = set() &read_expire=1hr &redef; event ssl_established(c: connection) &priority=5 { - if ( ! c$ssl?$cert ) + if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| == 0 ) return; if ( ! addr_matches_host(c$id$resp_h, extract_certs_pem) ) return; - if ( c$ssl$cert_hash in extracted_certs ) + local hash = c$ssl$cert_chain[0]$info$sha1; + local cert = c$ssl$cert_chain[0]$x509$handle; + + if ( hash in extracted_certs ) # If we already extracted this cert, don't do it again. return; - add extracted_certs[c$ssl$cert_hash]; + add extracted_certs[hash]; local filename = Site::is_local_addr(c$id$resp_h) ? "certs-local.pem" : "certs-remote.pem"; local outfile = open_for_append(filename); + enable_raw_output(outfile); - print outfile, "-----BEGIN CERTIFICATE-----"; + print outfile, x509_get_certificate_string(cert, T); - # Encode to base64 and format to fit 50 lines. Otherwise openssl won't like it later. - local lines = split_all(encode_base64(c$ssl$cert), /.{50}/); - local i = 1; - for ( line in lines ) - { - if ( |lines[i]| > 0 ) - { - print outfile, lines[i]; - } - i+=1; - } - - print outfile, "-----END CERTIFICATE-----"; - print outfile, ""; close(outfile); } diff --git a/scripts/policy/protocols/ssl/known-certs.bro b/scripts/policy/protocols/ssl/known-certs.bro index 478074f55a..e1bf59e72d 100644 --- a/scripts/policy/protocols/ssl/known-certs.bro +++ b/scripts/policy/protocols/ssl/known-certs.bro @@ -3,7 +3,7 @@ @load base/utils/directions-and-hosts @load base/protocols/ssl -@load protocols/ssl/cert-hash +@load base/files/x509 module Known; @@ -31,9 +31,9 @@ export { const cert_tracking = LOCAL_HOSTS &redef; ## The set of all known certificates to store for preventing duplicate - ## logging. It can also be used from other scripts to + ## logging. It can also be used from other scripts to ## inspect if a certificate has been seen in use. The string value - ## in the set is for storing the DER formatted certificate's MD5 hash. + ## in the set is for storing the DER formatted certificate' SHA1 hash. global certs: set[addr, string] &create_expire=1day &synchronized &redef; ## Event that can be handled to access the loggable record as it is sent @@ -46,16 +46,18 @@ event bro_init() &priority=5 Log::create_stream(Known::CERTS_LOG, [$columns=CertsInfo, $ev=log_known_certs]); } -event x509_certificate(c: connection, is_orig: bool, cert: X509, chain_idx: count, chain_len: count, der_cert: string) &priority=3 +event ssl_established(c: connection) &priority=3 { - # Make sure this is the server cert and we have a hash for it. - if ( is_orig || chain_idx != 0 || ! c$ssl?$cert_hash ) + if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| < 1 ) return; - + + local hash = c$ssl$cert_chain[0]$info$sha1; + local cert = c$ssl$cert_chain[0]$x509$certificate; + local host = c$id$resp_h; - if ( [host, c$ssl$cert_hash] !in certs && addr_matches_host(host, cert_tracking) ) + if ( [host, hash] !in certs && addr_matches_host(host, cert_tracking) ) { - add certs[host, c$ssl$cert_hash]; + add certs[host, hash]; Log::write(Known::CERTS_LOG, [$ts=network_time(), $host=host, $port_num=c$id$resp_p, $subject=cert$subject, $issuer_subject=cert$issuer, diff --git a/scripts/policy/protocols/ssl/notary.bro b/scripts/policy/protocols/ssl/notary.bro index 29cd655860..424959df2f 100644 --- a/scripts/policy/protocols/ssl/notary.bro +++ b/scripts/policy/protocols/ssl/notary.bro @@ -16,7 +16,6 @@ export { } redef record SSL::Info += { - sha1: string &log &optional; notary: Response &log &optional; }; @@ -38,14 +37,12 @@ function clear_waitlist(digest: string) } } -event x509_certificate(c: connection, is_orig: bool, cert: X509, - chain_idx: count, chain_len: count, der_cert: string) +event ssl_established(c: connection) &priority=3 { - if ( is_orig || chain_idx != 0 || ! c?$ssl ) + if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| == 0 ) return; - local digest = sha1_hash(der_cert); - c$ssl$sha1 = digest; + local digest = c$ssl$cert_chain[0]$info$sha1; if ( digest in notary_cache ) { diff --git a/scripts/policy/protocols/ssl/validate-certs.bro b/scripts/policy/protocols/ssl/validate-certs.bro index 886c28b6ac..de22e2d30d 100644 --- a/scripts/policy/protocols/ssl/validate-certs.bro +++ b/scripts/policy/protocols/ssl/validate-certs.bro @@ -2,7 +2,6 @@ @load base/frameworks/notice @load base/protocols/ssl -@load protocols/ssl/cert-hash module SSL; @@ -19,9 +18,9 @@ export { validation_status: string &log &optional; }; - ## MD5 hash values for recently validated certs along with the + ## MD5 hash values for recently validated chains along with the ## validation status message are kept in this table to avoid constant - ## validation every time the same certificate is seen. + ## validation every time the same certificate chain is seen. global recently_validated_certs: table[string] of string = table() &read_expire=5mins &synchronized &redef; } @@ -29,18 +28,26 @@ export { event ssl_established(c: connection) &priority=3 { # If there aren't any certs we can't very well do certificate validation. - if ( ! c$ssl?$cert || ! c$ssl?$cert_chain ) + if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| == 0 ) return; - - if ( c$ssl?$cert_hash && c$ssl$cert_hash in recently_validated_certs ) + + local chain_id = join_string_vec(c$ssl$cert_chain_fuids, "."); + + local chain: vector of opaque of x509 = vector(); + for ( i in c$ssl$cert_chain ) { - c$ssl$validation_status = recently_validated_certs[c$ssl$cert_hash]; + chain[i] = c$ssl$cert_chain[i]$x509$handle; + } + + if ( chain_id in recently_validated_certs ) + { + c$ssl$validation_status = recently_validated_certs[chain_id]; } else { - local result = x509_verify(c$ssl$cert, c$ssl$cert_chain, root_certs); - c$ssl$validation_status = x509_err2str(result); - recently_validated_certs[c$ssl$cert_hash] = c$ssl$validation_status; + local result = x509_verify(chain, root_certs); + c$ssl$validation_status = result$result_string; + recently_validated_certs[chain_id] = result$result_string; } if ( c$ssl$validation_status != "ok" ) @@ -48,7 +55,7 @@ event ssl_established(c: connection) &priority=3 local message = fmt("SSL certificate validation failed with (%s)", c$ssl$validation_status); NOTICE([$note=Invalid_Server_Cert, $msg=message, $sub=c$ssl$subject, $conn=c, - $identifier=cat(c$id$resp_h,c$id$resp_p,c$ssl$validation_status,c$ssl$cert_hash)]); + $identifier=cat(c$id$resp_h,c$id$resp_p,c$ssl$validation_status)]); } } diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index a254188585..96e0964eff 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -59,7 +59,7 @@ bool file_analysis::X509::EndOfFile() vl->append(cert_val->Ref()); vl->append(cert_record->Ref()); // we Ref it here, because we want to keep a copy around for now... - mgr.QueueEvent(x509_cert, vl); + mgr.QueueEvent(x509_certificate, vl); // after parsing the certificate - parse the extensions... @@ -70,7 +70,7 @@ bool file_analysis::X509::EndOfFile() if ( !ex ) continue; - ParseExtension(ex, cert_record, cert_val); + ParseExtension(ex); } // X509_free(ssl_cert); We do _not_ free the certificate here. It is refcounted @@ -157,7 +157,7 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val) return pX509Cert; } -void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val) +void file_analysis::X509::ParseExtension(X509_EXTENSION* ex) { char name[256]; char oid[256]; @@ -203,20 +203,18 @@ void file_analysis::X509::ParseExtension(X509_EXTENSION* ex, RecordVal* r, X509V // but I am not sure if there is a better way to do it... val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); - vl->append(cert_val->Ref()); - vl->append(r->Ref()); vl->append(pX509Ext); mgr.QueueEvent(x509_extension, vl); // look if we have a specialized handler for this event... if ( OBJ_obj2nid(ext_asn) == NID_basic_constraints ) - ParseBasicConstraints(ex, r, cert_val); + ParseBasicConstraints(ex); else if ( OBJ_obj2nid(ext_asn) == NID_subject_alt_name ) - ParseSAN(ex, r, cert_val); + ParseSAN(ex); } -void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val) +void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_basic_constraints); @@ -234,8 +232,6 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r } val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); - vl->append(cert_val->Ref()); - vl->append(r->Ref()); vl->append(pBasicConstraint); mgr.QueueEvent(x509_ext_basic_constraints, vl); @@ -243,7 +239,7 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r } } -void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r, X509Val* cert_val) +void file_analysis::X509::ParseSAN(X509_EXTENSION* ext) { assert(OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_subject_alt_name); @@ -284,11 +280,9 @@ void file_analysis::X509::ParseSAN(X509_EXTENSION* ext, RecordVal* r, X509Val* c val_list* vl = new val_list(); vl->append(GetFile()->GetVal()->Ref()); - vl->append(cert_val->Ref()); - vl->append(r->Ref()); vl->append(names); - mgr.QueueEvent(x509_ext_basic_constraints, vl); + mgr.QueueEvent(x509_ext_subject_alternative_name, vl); } StringVal* file_analysis::X509::key_curve(EVP_PKEY *key) diff --git a/src/file_analysis/analyzer/x509/X509.h b/src/file_analysis/analyzer/x509/X509.h index b535ebe256..6008383468 100644 --- a/src/file_analysis/analyzer/x509/X509.h +++ b/src/file_analysis/analyzer/x509/X509.h @@ -35,9 +35,9 @@ private: static StringVal* key_curve(EVP_PKEY *key); static unsigned int key_length(EVP_PKEY *key); - void ParseExtension(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); - void ParseBasicConstraints(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); - void ParseSAN(X509_EXTENSION* ex, RecordVal* r, X509Val* cert_val); + void ParseExtension(X509_EXTENSION* ex); + void ParseBasicConstraints(X509_EXTENSION* ex); + void ParseSAN(X509_EXTENSION* ex); std::string cert_data; }; diff --git a/src/file_analysis/analyzer/x509/events.bif b/src/file_analysis/analyzer/x509/events.bif index b78f819e90..2cfc5882a4 100644 --- a/src/file_analysis/analyzer/x509/events.bif +++ b/src/file_analysis/analyzer/x509/events.bif @@ -1,4 +1,4 @@ -event x509_cert%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate%); -event x509_extension%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::Extension%); -event x509_ext_basic_constraints%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, ext: X509::BasicConstraints%); -event x509_ext_subject_alternative_name%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate, names: string_vec%); +event x509_certificate%(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate%); +event x509_extension%(f: fa_file, ext: X509::Extension%); +event x509_ext_basic_constraints%(f: fa_file, ext: X509::BasicConstraints%); +event x509_ext_subject_alternative_name%(f: fa_file, names: string_vec%); diff --git a/src/file_analysis/analyzer/x509/functions.bif b/src/file_analysis/analyzer/x509/functions.bif index 7af8883aef..36c261d216 100644 --- a/src/file_analysis/analyzer/x509/functions.bif +++ b/src/file_analysis/analyzer/x509/functions.bif @@ -23,11 +23,22 @@ X509* d2i_X509_(X509** px, const u_char** in, int len) #endif } +// construct an error record +RecordVal* x509_error_record(uint64_t num, const char* reason) + { + RecordVal* rrecord = new RecordVal(BifType::Record::X509::Result); + + rrecord->Assign(0, new Val(num, TYPE_COUNT)); + rrecord->Assign(1, new StringVal(reason)); + + return rrecord; + } + %%} ## Parses a certificate into an X509::Certificate structure ## -## cert: The x509 certificicate opaque +## cert: The X509 certificicate opaque handle ## ## Returns: A X509::Certificate structure ## @@ -40,12 +51,50 @@ function x509_parse%(cert: opaque of x509%): X509::Certificate return file_analysis::X509::ParseCertificate(h); %} +## Returns the string form of a certificate +## +## cert: The X509 certificate opaque handle +## +## pem: A boolean that specifies if the certificate is returned +## in pem-form (true), or as the raw ASN1 encoded binary +## (false). +## +## Returns: X509 certificate as a string + +function x509_get_certificate_string%(cert: opaque of x509, pem: bool &default=F%): string + %{ + assert(cert); + file_analysis::X509Val* h = (file_analysis::X509Val*) cert; + + BIO *bio = BIO_new(BIO_s_mem()); + + if ( pem ) + { + PEM_write_bio_X509(bio, h->GetCertificate()); + } + else + { + i2d_X509_bio(bio, h->GetCertificate()); + } + + BIO_flush(bio); + int length = BIO_pending(bio); + // use OPENSS_malloc here. Otherwhise, interesting problems will happen + char *buffer = (char*) OPENSSL_malloc(length); + BIO_read(bio, (void*) buffer, length); + StringVal* ext_val = new StringVal(length, buffer); + OPENSSL_free(buffer); + BIO_free_all(bio); + + return ext_val; + %} + + ## Verifies a certificate. ## -## cert_val: The X.509 certificate in DER format. -## -## cert_stack: Specifies a certificate chain that is being used to validate -## the given certificate against the root store given in *root_certs* +## certs: Specifies a certificate chain that is being used to validate +## the given certificate against the root store given in *root_certs*. +## The host certificate has to be at index 0. ## ## root_certs: A list of root certificates to validate the certificate chain ## @@ -53,10 +102,27 @@ function x509_parse%(cert: opaque of x509%): X509::Certificate ## operation. In case of success also returns the full certificate chain. ## ## .. bro:see:: x509_parse -function x509_verify%(cert_val: opaque of x509, cert_stack: x509_opaque_vector, root_certs: table_string_of_string%): X509::Result +function x509_verify%(certs: x509_opaque_vector, root_certs: table_string_of_string%): X509::Result %{ X509_STORE* ctx = 0; int i = 0; + + VectorVal *certs_vec = certs->AsVectorVal(); + if ( certs_vec->Size() < 1 ) + { + reporter->Error("No certificates given in vector"); + return x509_error_record(-1, "no certificates"); + } + + // host certificate + unsigned int index = 0; // to prevent overloading to 0pointer + Val *sv = certs_vec->Lookup(index); + if ( !sv ) + { + builtin_error("undefined value in certificate vector"); + return x509_error_record(-1, "undefined value in certificate vector"); + } + file_analysis::X509Val* cert_handle = (file_analysis::X509Val*) sv; // If this certificate store was built previously, just reuse the old one. if ( x509_stores.count(root_certs) > 0 ) @@ -78,7 +144,7 @@ function x509_verify%(cert_val: opaque of x509, cert_stack: x509_opaque_vector, if ( ! x ) { builtin_error(fmt("Root CA error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); + return x509_error_record((uint64) ERR_get_error(), ERR_error_string(ERR_peek_last_error(),NULL)); } X509_STORE_add_cert(ctx, x); } @@ -88,34 +154,30 @@ function x509_verify%(cert_val: opaque of x509, cert_stack: x509_opaque_vector, x509_stores[root_certs] = ctx; } - assert(cert_val); - file_analysis::X509Val* cert_handle = (file_analysis::X509Val*) cert_val; - X509* cert = cert_handle->GetCertificate(); if ( ! cert ) { builtin_error(fmt("No certificate in opaque")); - return new Val(-1, TYPE_COUNT); + return x509_error_record(-1, "No certificate in opaque"); } STACK_OF(X509)* untrusted_certs = sk_X509_new_null(); if ( ! untrusted_certs ) { builtin_error(fmt("Untrusted certificate stack initialization error: %s", ERR_error_string(ERR_peek_last_error(),NULL))); - return new Val((uint64) ERR_get_error(), TYPE_COUNT); + return x509_error_record((uint64) ERR_get_error(), ERR_error_string(ERR_peek_last_error(),NULL)); } - VectorVal *cert_stack_vec = cert_stack->AsVectorVal(); - for ( i = 0; i < (int) cert_stack_vec->Size(); ++i ) + for ( i = 1; i < (int) certs_vec->Size(); ++i ) // start at 1 - 0 is host cert { - Val *sv = cert_stack_vec->Lookup(i); + Val *sv = certs_vec->Lookup(i); // Fixme: check type X509* x = ((file_analysis::X509Val*) sv)->GetCertificate(); if ( ! x ) { sk_X509_pop(untrusted_certs); builtin_error(fmt("No certificate in opaque in stack")); - return new Val(-1, TYPE_COUNT); + return x509_error_record(-1, "No certificate in opaque"); } sk_X509_push(untrusted_certs, x); } From 7eb6b5133e803411d7c97aee02456efb55ac5f18 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 4 Mar 2014 05:29:04 -0800 Subject: [PATCH 034/182] Fix circular reference problem and a few other small things. SSL::Info now holds a reference to Files::Info instead of the fa_files record. Everything should work now, if everyone thinks that the interface is ok I will update the test baselines in a bit. addresses BIT-953, BIT-760 --- scripts/base/files/x509/main.bro | 26 +++++++++---------- scripts/base/protocols/ssl/files.bro | 9 ++++--- .../policy/protocols/ssl/expiring-certs.bro | 2 +- .../protocols/ssl/extract-certs-pem.bro | 2 +- scripts/policy/protocols/ssl/known-certs.bro | 2 +- scripts/policy/protocols/ssl/notary.bro | 2 +- scripts/test-all-policy.bro | 2 +- src/file_analysis/analyzer/x509/X509.cc | 2 +- 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/scripts/base/files/x509/main.bro b/scripts/base/files/x509/main.bro index 2238cf0c8b..b20c6c715e 100644 --- a/scripts/base/files/x509/main.bro +++ b/scripts/base/files/x509/main.bro @@ -39,7 +39,7 @@ event bro_init() &priority=5 Log::create_stream(X509::LOG, [$columns=Info, $ev=log_x509]); } -redef record fa_file += { +redef record Files::Info += { ## Information about X509 certificates. This is used to keep ## certificate information until all events have been received. x509: X509::Info &optional; @@ -47,31 +47,31 @@ redef record fa_file += { event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) &priority=5 { - f$x509 = [$id=f$id, $certificate=cert, $handle=cert_ref]; + f$info$x509 = [$id=f$id, $certificate=cert, $handle=cert_ref]; } event x509_extension(f: fa_file, ext: X509::Extension) &priority=5 { - if ( f?$x509 ) - f$x509$extensions[|f$x509$extensions|] = ext; + if ( f$info?$x509 ) + f$info$x509$extensions[|f$info$x509$extensions|] = ext; } event x509_ext_basic_constraints(f: fa_file, ext: X509::BasicConstraints) &priority=5 { - if ( f?$x509 ) - f$x509$basic_constraints = ext; + if ( f$info?$x509 ) + f$info$x509$basic_constraints = ext; } event x509_ext_subject_alternative_name(f: fa_file, names: string_vec) &priority=5 { - if ( f?$x509 ) - f$x509$san = names; + if ( f$info?$x509 ) + f$info$x509$san = names; } -event file_state_remove(f: fa_file) +event file_state_remove(f: fa_file) &priority=5 { - if ( f?$x509 ) - { - Log::write(LOG, f$x509); - } + if ( ! f$info?$x509 ) + return; + + Log::write(LOG, f$info$x509); } diff --git a/scripts/base/protocols/ssl/files.bro b/scripts/base/protocols/ssl/files.bro index a8e755e953..a10a3f5f76 100644 --- a/scripts/base/protocols/ssl/files.bro +++ b/scripts/base/protocols/ssl/files.bro @@ -1,6 +1,7 @@ @load ./main @load base/utils/conn-ids @load base/frameworks/files +@load base/files/x509 module SSL; @@ -8,7 +9,7 @@ export { redef record Info += { ## Chain of certificates offered by the server to validate its ## complete signing chain. - cert_chain: vector of fa_file &optional; + cert_chain: vector of Files::Info &optional; ## An ordered vector of all certicate file unique IDs for the ## certificates offered by the server. @@ -16,7 +17,7 @@ export { ## Chain of certificates offered by the client to validate its ## complete signing chain. - client_cert_chain: vector of fa_file &optional; + client_cert_chain: vector of Files::Info &optional; ## An ordered vector of all certicate file unique IDs for the ## certificates offered by the client. @@ -80,12 +81,12 @@ event file_over_new_connection(f: fa_file, c: connection, is_orig: bool) &priori if ( is_orig ) { - c$ssl$client_cert_chain[|c$ssl$client_cert_chain|] = f; + c$ssl$client_cert_chain[|c$ssl$client_cert_chain|] = f$info; c$ssl$client_cert_chain_fuids[|c$ssl$client_cert_chain_fuids|] = f$id; } else { - c$ssl$cert_chain[|c$ssl$cert_chain|] = f; + c$ssl$cert_chain[|c$ssl$cert_chain|] = f$info; c$ssl$cert_chain_fuids[|c$ssl$cert_chain_fuids|] = f$id; } diff --git a/scripts/policy/protocols/ssl/expiring-certs.bro b/scripts/policy/protocols/ssl/expiring-certs.bro index fc48ad9f2b..a76dc542f4 100644 --- a/scripts/policy/protocols/ssl/expiring-certs.bro +++ b/scripts/policy/protocols/ssl/expiring-certs.bro @@ -39,7 +39,7 @@ event ssl_established(c: connection) &priority=3 ! addr_matches_host(c$id$resp_h, notify_certs_expiration) ) return; - local hash = c$ssl$cert_chain[0]$info$md5; + local hash = c$ssl$cert_chain[0]$md5; local cert = c$ssl$cert_chain[0]$x509$certificate; if ( cert$not_valid_before > network_time() ) diff --git a/scripts/policy/protocols/ssl/extract-certs-pem.bro b/scripts/policy/protocols/ssl/extract-certs-pem.bro index 247d58fea2..1cfccb6556 100644 --- a/scripts/policy/protocols/ssl/extract-certs-pem.bro +++ b/scripts/policy/protocols/ssl/extract-certs-pem.bro @@ -34,7 +34,7 @@ event ssl_established(c: connection) &priority=5 if ( ! addr_matches_host(c$id$resp_h, extract_certs_pem) ) return; - local hash = c$ssl$cert_chain[0]$info$sha1; + local hash = c$ssl$cert_chain[0]$sha1; local cert = c$ssl$cert_chain[0]$x509$handle; if ( hash in extracted_certs ) diff --git a/scripts/policy/protocols/ssl/known-certs.bro b/scripts/policy/protocols/ssl/known-certs.bro index e1bf59e72d..e0e76eb526 100644 --- a/scripts/policy/protocols/ssl/known-certs.bro +++ b/scripts/policy/protocols/ssl/known-certs.bro @@ -51,7 +51,7 @@ event ssl_established(c: connection) &priority=3 if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| < 1 ) return; - local hash = c$ssl$cert_chain[0]$info$sha1; + local hash = c$ssl$cert_chain[0]$sha1; local cert = c$ssl$cert_chain[0]$x509$certificate; local host = c$id$resp_h; diff --git a/scripts/policy/protocols/ssl/notary.bro b/scripts/policy/protocols/ssl/notary.bro index 424959df2f..3646a4d43e 100644 --- a/scripts/policy/protocols/ssl/notary.bro +++ b/scripts/policy/protocols/ssl/notary.bro @@ -42,7 +42,7 @@ event ssl_established(c: connection) &priority=3 if ( ! c$ssl?$cert_chain || |c$ssl$cert_chain| == 0 ) return; - local digest = c$ssl$cert_chain[0]$info$sha1; + local digest = c$ssl$cert_chain[0]$sha1; if ( digest in notary_cache ) { diff --git a/scripts/test-all-policy.bro b/scripts/test-all-policy.bro index 3a0bd17614..a29d2d3030 100644 --- a/scripts/test-all-policy.bro +++ b/scripts/test-all-policy.bro @@ -26,6 +26,7 @@ @load frameworks/intel/seen/smtp.bro @load frameworks/intel/seen/ssl.bro @load frameworks/intel/seen/where-locations.bro +@load frameworks/intel/seen/x509.bro @load frameworks/files/detect-MHR.bro @load frameworks/files/hash-all-files.bro @load frameworks/packet-filter/shunt.bro @@ -82,7 +83,6 @@ @load protocols/ssh/geo-data.bro @load protocols/ssh/interesting-hostnames.bro @load protocols/ssh/software.bro -@load protocols/ssl/cert-hash.bro @load protocols/ssl/expiring-certs.bro @load protocols/ssl/extract-certs-pem.bro @load protocols/ssl/known-certs.bro diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 96e0964eff..4109781193 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -480,7 +480,7 @@ X509Val::~X509Val() bool X509Val::DoSerialize(SerialInfo* info) const { - DO_SERIALIZE(SER_X509_VAL, X509Val); + DO_SERIALIZE(SER_X509_VAL, OpaqueVal); unsigned char *buf = NULL; From b22ca5d0a3caf0f4501739abe4d111eec5e29253 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 4 Mar 2014 11:12:06 -0600 Subject: [PATCH 035/182] Replace libmagic w/ Bro signatures for file MIME type identification. Notable changes: - libmagic is no longer used at all. All MIME type detection is done through new Bro signatures, and there's no longer a means to get verbose file type descriptions (e.g. "PNG image data, 1435 x 170"). The majority of the default file magic signatures are derived from the default magic database of libmagic ~5.17. - File magic signatures consist of two new constructs in the signature rule parsing grammar: "file-magic" gives a regular expression to match against, and "file-mime" gives the MIME type string of content that matches the magic and an optional strength value for the match. - Modified signature/rule syntax for identifiers: they can no longer start with a '-', which made for ambiguous syntax when doing negative strength values in "file-mime". Also brought syntax for Bro script identifiers in line with reality (they can't start with numbers or include '-' at all). - A new Built-In Function, "file_magic", can be used to get all file magic matches and their corresponding strength against a given chunk of data - The second parameter of the "identify_data" Built-In Function can no longer be used to get verbose file type descriptions, though it can still be used to get the strongest matching file magic signature. - The "file_transferred" event's "descr" parameter no longer contains verbose file type descriptions. - The BROMAGIC environment variable no longer changes any behavior in Bro as magic databases are no longer used/installed. - Reverted back to minimum requirement of CMake 2.6.3 from 2.8.0 (it's back to being the same requirement as the Bro v2.2 release). The bump was to accomodate building libmagic as an external project, which is no longer needed. Addresses BIT-1143. --- .gitmodules | 3 - CMakeLists.txt | 39 +- doc/CMakeLists.txt | 3 - doc/frameworks/signatures.rst | 42 +- doc/install/install.rst | 2 +- magic | 1 - scripts/base/frameworks/files/__load__.bro | 1 + .../base/frameworks/files/magic/__load__.bro | 2 + .../base/frameworks/files/magic/general.sig | 11 + .../base/frameworks/files/magic/libmagic.sig | 4199 +++++++++++++++++ scripts/base/init-bare.bro | 17 + scripts/base/init-default.bro | 1 - src/CMakeLists.txt | 3 - src/NetVar.cc | 4 + src/NetVar.h | 2 + src/Rule.cc | 2 +- src/Rule.h | 2 +- src/RuleAction.cc | 5 + src/RuleAction.h | 25 + src/RuleMatcher.cc | 139 + src/RuleMatcher.h | 65 + src/analyzer/protocol/file/File.cc | 14 +- src/analyzer/protocol/file/events.bif | 11 +- src/bro.bif | 66 +- src/file_analysis/File.cc | 20 +- src/file_analysis/File.h | 5 +- src/main.cc | 8 - src/rule-parse.y | 22 +- src/rule-scan.l | 10 +- src/util-config.h.in | 1 - src/util.cc | 49 - src/util.h | 7 - testing/btest/Baseline/bifs.identify_data/out | 2 - .../canonified_loaded_scripts.log | 5 +- .../canonified_loaded_scripts.log | 5 +- .../btest-doc.sphinx.file_extraction#1 | 2 +- .../btest-doc.sphinx.mimestats#1 | 8 +- .../out | 2 +- .../c.out | 2 +- testing/btest/bifs/identify_data.bro | 2 - 40 files changed, 4636 insertions(+), 173 deletions(-) delete mode 160000 magic create mode 100644 scripts/base/frameworks/files/magic/__load__.bro create mode 100644 scripts/base/frameworks/files/magic/general.sig create mode 100644 scripts/base/frameworks/files/magic/libmagic.sig diff --git a/.gitmodules b/.gitmodules index 87826d2ef6..4998cc6b80 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,9 +16,6 @@ [submodule "cmake"] path = cmake url = git://git.bro.org/cmake -[submodule "magic"] - path = magic - url = git://git.bro.org/bromagic [submodule "src/3rdparty"] path = src/3rdparty url = git://git.bro.org/bro-3rdparty diff --git a/CMakeLists.txt b/CMakeLists.txt index f773381ae8..0dbbae133b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ project(Bro C CXX) -cmake_minimum_required(VERSION 2.8.0 FATAL_ERROR) +cmake_minimum_required(VERSION 2.6.3 FATAL_ERROR) include(cmake/CommonCMakeConfig.cmake) ######################################################################## @@ -16,17 +16,12 @@ endif () get_filename_component(BRO_SCRIPT_INSTALL_PATH ${BRO_SCRIPT_INSTALL_PATH} ABSOLUTE) -set(BRO_MAGIC_INSTALL_PATH ${BRO_ROOT_DIR}/share/bro/magic) -set(BRO_MAGIC_SOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/magic/database) - configure_file(bro-path-dev.in ${CMAKE_CURRENT_BINARY_DIR}/bro-path-dev) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/bro-path-dev.sh "export BROPATH=`${CMAKE_CURRENT_BINARY_DIR}/bro-path-dev`\n" - "export BROMAGIC=\"${BRO_MAGIC_SOURCE_PATH}\"\n" "export PATH=\"${CMAKE_CURRENT_BINARY_DIR}/src\":$PATH\n") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/bro-path-dev.csh "setenv BROPATH `${CMAKE_CURRENT_BINARY_DIR}/bro-path-dev`\n" - "setenv BROMAGIC \"${BRO_MAGIC_SOURCE_PATH}\"\n" "setenv PATH \"${CMAKE_CURRENT_BINARY_DIR}/src\":$PATH\n") file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" VERSION LIMIT_COUNT 1) @@ -39,32 +34,6 @@ set(VERSION_MAJ_MIN "${VERSION_MAJOR}.${VERSION_MINOR}") ######################################################################## ## Dependency Configuration -include(ExternalProject) - -# LOG_* options to ExternalProject_Add appear in CMake 2.8.3. If -# available, using them hides external project configure/build output. -if("${CMAKE_VERSION}" VERSION_GREATER 2.8.2) - set(EXTERNAL_PROJECT_LOG_OPTIONS - LOG_DOWNLOAD 1 LOG_UPDATE 1 LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1) -else() - set(EXTERNAL_PROJECT_LOG_OPTIONS) -endif() - -set(LIBMAGIC_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libmagic-prefix) -set(LIBMAGIC_INCLUDE_DIR ${LIBMAGIC_PREFIX}/include) -set(LIBMAGIC_LIB_DIR ${LIBMAGIC_PREFIX}/lib) -set(LIBMAGIC_LIBRARY ${LIBMAGIC_LIB_DIR}/libmagic.a) -ExternalProject_Add(libmagic - PREFIX ${LIBMAGIC_PREFIX} - URL ${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/file-5.17.tar.gz - CONFIGURE_COMMAND ./configure --enable-static --disable-shared - --prefix=${LIBMAGIC_PREFIX} - --includedir=${LIBMAGIC_INCLUDE_DIR} - --libdir=${LIBMAGIC_LIB_DIR} - BUILD_IN_SOURCE 1 - ${EXTERNAL_PROJECT_LOG_OPTIONS} -) - include(FindRequiredPackage) # Check cache value first to avoid displaying "Found sed" messages everytime @@ -103,7 +72,6 @@ include_directories(BEFORE ${OpenSSL_INCLUDE_DIR} ${BIND_INCLUDE_DIR} ${BinPAC_INCLUDE_DIR} - ${LIBMAGIC_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ) @@ -182,7 +150,6 @@ set(brodeps ${PCAP_LIBRARY} ${OpenSSL_LIBRARIES} ${BIND_LIBRARY} - ${LIBMAGIC_LIBRARY} ${ZLIB_LIBRARY} ${OPTLIBS} ) @@ -220,10 +187,6 @@ CheckOptionalBuildSources(aux/broctl Broctl INSTALL_BROCTL) CheckOptionalBuildSources(aux/bro-aux Bro-Aux INSTALL_AUX_TOOLS) CheckOptionalBuildSources(aux/broccoli Broccoli INSTALL_BROCCOLI) -install(DIRECTORY ./magic/database/ - DESTINATION ${BRO_MAGIC_INSTALL_PATH} -) - ######################################################################## ## Packaging Setup diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 9498556edc..414cf56b0c 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -14,8 +14,6 @@ if (NOT ${retval} EQUAL 0) message(FATAL_ERROR "Problem setting BROPATH") endif () -set(BROMAGIC ${BRO_MAGIC_SOURCE_PATH}) - # Configure the Sphinx config file (expand variables CMake might know about). configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in ${CMAKE_CURRENT_BINARY_DIR}/conf.py @@ -34,7 +32,6 @@ add_custom_target(sphinxdoc ${CMAKE_CURRENT_SOURCE_DIR}/ ${SPHINX_INPUT_DIR} # Use Bro/Broxygen to dynamically generate reST for all Bro scripts. COMMAND BROPATH=${BROPATH} - BROMAGIC=${BROMAGIC} ${CMAKE_BINARY_DIR}/src/bro -X ${CMAKE_CURRENT_BINARY_DIR}/broxygen.conf broxygen >/dev/null diff --git a/doc/frameworks/signatures.rst b/doc/frameworks/signatures.rst index 884dcb8a47..1443f76ba1 100644 --- a/doc/frameworks/signatures.rst +++ b/doc/frameworks/signatures.rst @@ -64,8 +64,8 @@ expect that signature file in the same directory as the Bro script. The default extension of the file name is ``.sig``, and Bro appends that automatically when necessary. -Signature language -================== +Signature Language for Network Traffic +====================================== Let's look at the format of a signature more closely. Each individual signature has the format ``signature { }``. ```` @@ -286,6 +286,44 @@ two actions defined: connection (``"http"``, ``"ftp"``, etc.). This is used by Bro's dynamic protocol detection to activate analyzers on the fly. +Signature Language for File Content +=================================== + +The signature framework can also be used to identify MIME types of files +irrespective of the network protocol/connection over which the file is +transferred. A special type of signature can be written for this +purpose and will be used automatically by the :doc:`Files Framework +` or by Bro scripts that use the :bro:see:`file_magic` +built-in function. + +Conditions +---------- + +File signatures use a single type of content condition in the form of a +regular expression: + +``file-magic //`` + +This is analogous to the ``payload`` content condition for the network +traffic signature language described above. The difference is that +``payload`` signatures are applied to payloads of network connections, +but ``file-magic`` can be applied to any arbitrary data, it does not +have to be tied to a network protocol/connection. + +Actions +------- + +Upon matching a chunk of data, file signatures use the following action +to get information about that data's MIME type: + +``file-mime [, ]`` + +The arguments include the MIME type string associated with the file +magic regular expression and an optional "strength" as a signed integer. +Since multiple file magic signatures may match against a given chunk of +data, the strength value may be used to help choose a "winner". Higher +values are considered stronger. + Things to keep in mind when writing signatures ============================================== diff --git a/doc/install/install.rst b/doc/install/install.rst index 7400d640fe..058bb369eb 100644 --- a/doc/install/install.rst +++ b/doc/install/install.rst @@ -35,7 +35,7 @@ before you begin: To build Bro from source, the following additional dependencies are required: - * CMake 2.8.0 or greater (http://www.cmake.org) + * CMake 2.6.3 or greater (http://www.cmake.org) * Make * C/C++ compiler * SWIG (http://www.swig.org) diff --git a/magic b/magic deleted file mode 160000 index 99c6b89230..0000000000 --- a/magic +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 99c6b89230e2b9b0e781c42b0b9412d2ab4e14b2 diff --git a/scripts/base/frameworks/files/__load__.bro b/scripts/base/frameworks/files/__load__.bro index 783797e17b..2177d81e25 100644 --- a/scripts/base/frameworks/files/__load__.bro +++ b/scripts/base/frameworks/files/__load__.bro @@ -1 +1,2 @@ @load ./main.bro +@load ./magic diff --git a/scripts/base/frameworks/files/magic/__load__.bro b/scripts/base/frameworks/files/magic/__load__.bro new file mode 100644 index 0000000000..4a2de0926d --- /dev/null +++ b/scripts/base/frameworks/files/magic/__load__.bro @@ -0,0 +1,2 @@ +@load-sigs ./general +@load-sigs ./libmagic diff --git a/scripts/base/frameworks/files/magic/general.sig b/scripts/base/frameworks/files/magic/general.sig new file mode 100644 index 0000000000..595bcc2f62 --- /dev/null +++ b/scripts/base/frameworks/files/magic/general.sig @@ -0,0 +1,11 @@ +# General purpose file magic signatures. + +signature file-plaintext { + file-magic /([[:print:][:space:]]+)/ + file-mime "text/plain", -20 +} + +signature file-binary { + file-magic /(.*)([^[:print:][:space:]]+)/ + file-mime "binary", -10 +} diff --git a/scripts/base/frameworks/files/magic/libmagic.sig b/scripts/base/frameworks/files/magic/libmagic.sig new file mode 100644 index 0000000000..25f5ba8c0f --- /dev/null +++ b/scripts/base/frameworks/files/magic/libmagic.sig @@ -0,0 +1,4199 @@ +# These signatures were semi-automatically generated from libmagic's +# (~ v5.17) magic database rules that have an associated mime type. +# After generating, they were all manually reviewed and occassionally +# needed minor modifications by hand or just ommited depending on +# the complexity of the original magic rules. +# +# The instrumented version of the `file` command used to generate these +# is located at: https://github.com/jsiwek/file/tree/bro-signatures. + +# >2080 string,=Foglio di lavoro Microsoft Exce (len=31), ["%s"], swap_endian=0 +signature file-magic-auto0 { + file-mime "application/vnd.ms-excel", 340 + file-magic /(.{2080})(Foglio di lavoro Microsoft Exce)/ +} + +# >2 string,=---BEGIN PGP PUBLIC KEY BLOCK- (len=30), ["PGP public key block"], swap_endian=0 +signature file-magic-auto1 { + file-mime "application/pgp-keys", 330 + file-magic /(.{2})(\x2d\x2d\x2dBEGIN PGP PUBLIC KEY BLOCK\x2d)/ +} + +# >2080 string,=Microsoft Excel 5.0 Worksheet (len=29), ["%s"], swap_endian=0 +signature file-magic-auto2 { + file-mime "application/vnd.ms-excel", 320 + file-magic /(.{2080})(Microsoft Excel 5\x2e0 Worksheet)/ +} + +# >11 string,=must be converted with BinHex (len=29), ["BinHex binary text"], swap_endian=0 +signature file-magic-auto3 { + file-mime "application/mac-binhex40", 320 + file-magic /(.{11})(must be converted with BinHex)/ +} + +# >2080 string,=Microsoft Word 6.0 Document (len=27), ["%s"], swap_endian=0 +signature file-magic-auto4 { + file-mime "application/msword", 300 + file-magic /(.{2080})(Microsoft Word 6\x2e0 Document)/ +} + +# >2080 string,=Documento Microsoft Word 6 (len=26), ["Spanish Microsoft Word 6 document data"], swap_endian=0 +signature file-magic-auto5 { + file-mime "application/msword", 290 + file-magic /(.{2080})(Documento Microsoft Word 6)/ +} + +# >0 string,=-----BEGIN PGP SIGNATURE- (len=25), ["PGP signature"], swap_endian=0 +signature file-magic-auto6 { + file-mime "application/pgp-signature", 280 + file-magic /(\x2d\x2d\x2d\x2d\x2dBEGIN PGP SIGNATURE\x2d)/ +} + +# >10 string,=# This is a shell archive (len=25), ["shell archive text"], swap_endian=0 +signature file-magic-auto7 { + file-mime "application/octet-stream", 280 + file-magic /(.{10})(\x23 This is a shell archive)/ +} + +# >0 string,=-----BEGIN PGP MESSAGE- (len=23), ["PGP message"], swap_endian=0 +signature file-magic-auto8 { + file-mime "application/pgp", 260 + file-magic /(\x2d\x2d\x2d\x2d\x2dBEGIN PGP MESSAGE\x2d)/ +} + +# >0 string,=0 string,=>24 regex,=[0-9.]+ (len=7), [", version %s"], swap_endian=0 +signature file-magic-auto10 { + file-mime "text/x-php", 37 + file-magic /(\x3c\x3fphp \x2f\x2a Smarty version)(.{1})([0-9.]+)/ +} + +# >0 string/w,=0 string/wt,=#! /usr/local/bin/nawk (len=22), ["new awk script text executable"], swap_endian=0 +signature file-magic-auto12 { + file-mime "text/x-nawk", 250 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fnawk)/ +} + +# >0 string/wt,=#! /usr/local/bin/gawk (len=22), ["GNU awk script text executable"], swap_endian=0 +signature file-magic-auto13 { + file-mime "text/x-gawk", 250 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fgawk)/ +} + +# >0 string/wt,=#! /usr/local/bin/bash (len=22), ["Bourne-Again shell script text executable"], swap_endian=0 +signature file-magic-auto14 { + file-mime "text/x-shellscript", 250 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fbash)/ +} + +# >0 string/wt,=#! /usr/local/bin/tcsh (len=22), ["Tenex C shell script text executable"], swap_endian=0 +signature file-magic-auto15 { + file-mime "text/x-shellscript", 250 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2ftcsh)/ +} + +# >0 string/wt,=#! /usr/local/bin/zsh (len=21), ["Paul Falstad's zsh script text executable"], swap_endian=0 +signature file-magic-auto16 { + file-mime "text/x-shellscript", 240 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fzsh)/ +} + +# >0 string/wt,=#! /usr/local/bin/ash (len=21), ["Neil Brown's ash script text executable"], swap_endian=0 +signature file-magic-auto17 { + file-mime "text/x-shellscript", 240 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fash)/ +} + +# >0 string/wt,=#! /usr/local/bin/ae (len=20), ["Neil Brown's ae script text executable"], swap_endian=0 +signature file-magic-auto18 { + file-mime "text/x-shellscript", 230 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fae)/ +} + +# >0 string,=# PaCkAgE DaTaStReAm (len=20), ["pkg Datastream (SVR4)"], swap_endian=0 +signature file-magic-auto19 { + file-mime "application/x-svr4-package", 230 + file-magic /(\x23 PaCkAgE DaTaStReAm)/ +} + +# >0 string,=Creative Voice File (len=19), ["Creative Labs voice data"], swap_endian=0 +signature file-magic-auto20 { + file-mime "audio/x-unknown", 220 + file-magic /(Creative Voice File)/ +} + +# >0 string/t,=[KDE Desktop Entry] (len=19), ["KDE desktop entry"], swap_endian=0 +signature file-magic-auto21 { + file-mime "application/x-kdelnk", 220 + file-magic /(\x5bKDE Desktop Entry\x5d)/ +} + +# >512 string,=R\000o\000o\000t\000 \000E\000n\000t\000r\000y (len=19), ["Microsoft Word Document"], swap_endian=0 +signature file-magic-auto22 { + file-mime "application/msword", 220 + file-magic /(.{512})(R\x00o\x00o\x00t\x00 \x00E\x00n\x00t\x00r\x00y)/ +} + +# >0 string,=!\n__________E (len=19), ["MIPS archive"], swap_endian=0 +signature file-magic-auto23 { + file-mime "application/x-archive", 220 + file-magic /(\x21\x3carch\x3e\x0a\x5f\x5f\x5f\x5f\x5f\x5f\x5f\x5f\x5f\x5fE)/ +} + +# >0 string/wt,=#! /usr/local/tcsh (len=18), ["Tenex C shell script text executable"], swap_endian=0 +signature file-magic-auto24 { + file-mime "text/x-shellscript", 210 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2ftcsh)/ +} + +# >0 string/wt,=#! /usr/local/bash (len=18), ["Bourne-Again shell script text executable"], swap_endian=0 +signature file-magic-auto25 { + file-mime "text/x-shellscript", 210 + file-magic /(\x23\x21 ?\x2fusr\x2flocal\x2fbash)/ +} + +# >0 string/t,=# KDE Config File (len=17), ["KDE config file"], swap_endian=0 +signature file-magic-auto26 { + file-mime "application/x-kdelnk", 200 + file-magic /(\x23 KDE Config File)/ +} + +# >0 string,=RF64\377\377\377\377WAVEds64 (len=16), ["MBWF/RF64 audio"], swap_endian=0 +signature file-magic-auto27 { + file-mime "audio/x-wav", 190 + file-magic /(RF64\xff\xff\xff\xffWAVEds64)/ +} + +# >0 string,=riff.\221\317\021\245\326(\333\004\301\000\000 (len=16), ["Sony Wave64 RIFF data"], swap_endian=0 +# >>24 string,=wave\363\254\323\021\214\321\000\300O\216\333\212 (len=16), [", WAVE 64 audio"], swap_endian=0 +signature file-magic-auto28 { + file-mime "audio/x-w64", 190 + file-magic /(riff\x2e\x91\xcf\x11\xa5\xd6\x28\xdb\x04\xc1\x00\x00)(.{8})(wave\xf3\xac\xd3\x11\x8c\xd1\x00\xc0O\x8e\xdb\x8a)/ +} + +# >0 string/wt,=#! /usr/bin/nawk (len=16), ["new awk script text executable"], swap_endian=0 +signature file-magic-auto29 { + file-mime "text/x-nawk", 190 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2fnawk)/ +} + +# >0 string/wt,=#! /usr/bin/tcsh (len=16), ["Tenex C shell script text executable"], swap_endian=0 +signature file-magic-auto30 { + file-mime "text/x-shellscript", 190 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2ftcsh)/ +} + +# >0 string/wt,=#! /usr/bin/gawk (len=16), ["GNU awk script text executable"], swap_endian=0 +signature file-magic-auto31 { + file-mime "text/x-gawk", 190 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2fgawk)/ +} + +# >369 string,=MICROSOFT PIFEX\000 (len=16), ["Windows Program Information File"], swap_endian=0 +signature file-magic-auto32 { + file-mime "application/x-dosexec", 190 + file-magic /(.{369})(MICROSOFT PIFEX\x00)/ +} + +# >0 string/wt,=#! /usr/bin/bash (len=16), ["Bourne-Again shell script text executable"], swap_endian=0 +signature file-magic-auto33 { + file-mime "text/x-shellscript", 190 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2fbash)/ +} + +# >0 string/w,=#VRML V1.0 ascii (len=16), ["VRML 1 file"], swap_endian=0 +signature file-magic-auto34 { + file-mime "model/vrml", 190 + file-magic /(\x23VRML ?V1\x2e0 ?ascii)/ +} + +# >0 string,=0 string,=Extended Module: (len=16), ["Fasttracker II module sound data"], swap_endian=0 +signature file-magic-auto36 { + file-mime "audio/x-mod", 190 + file-magic /(Extended Module\x3a)/ +} + +# >0 string/t,=0 string/t,=0 string,=0 string/t,=>20 search/wc/1000,=0 string/t,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/Wctb/4096,=0 string/t,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/Wctb/4096,=0 string/t,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/4096,=0 string,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/4096,=0 string,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/4096,=0 string/t,=>15 string,>\000 (len=1), [""], swap_endian=0 +# >>>19 search/Wctb/4096,=0 string/c,=BEGIN:VCALENDAR (len=15), ["vCalendar calendar file"], swap_endian=0 +signature file-magic-auto47 { + file-mime "text/calendar", 180 + file-magic /(BEGIN\x3aVCALENDAR)/ +} + +# >4 string,=Standard Jet DB (len=15), ["Microsoft Access Database"], swap_endian=0 +signature file-magic-auto48 { + file-mime "application/x-msaccess", 180 + file-magic /(.{4})(Standard Jet DB)/ +} + +# >4 string,=Standard ACE DB (len=15), ["Microsoft Access Database"], swap_endian=0 +signature file-magic-auto49 { + file-mime "application/x-msaccess", 180 + file-magic /(.{4})(Standard ACE DB)/ +} + +# >0 string/w,=#VRML V2.0 utf8 (len=15), ["ISO/IEC 14772 VRML 97 file"], swap_endian=0 +signature file-magic-auto50 { + file-mime "model/vrml", 180 + file-magic /(\x23VRML ?V2\x2e0 ?utf8)/ +} + +# >0 string/wt,=#! /usr/bin/awk (len=15), ["awk script text executable"], swap_endian=0 +signature file-magic-auto51 { + file-mime "text/x-awk", 180 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2fawk)/ +} + +# >0 string/wt,=#! /usr/bin/zsh (len=15), ["Paul Falstad's zsh script text executable"], swap_endian=0 +signature file-magic-auto52 { + file-mime "text/x-shellscript", 180 + file-magic /(\x23\x21 ?\x2fusr\x2fbin\x2fzsh)/ +} + +# >0 string,=MAS_UTrack_V00 (len=14), [""], swap_endian=0 +# >>14 string,>/0 (len=2), ["ultratracker V1.%.1s module sound data"], swap_endian=0 +signature file-magic-auto53 { + file-mime "audio/x-mod", 20 + file-magic /(MAS\x5fUTrack\x5fV00)(\x2f0)/ +} + +# >0 string,=!\ndebian (len=14), [""], swap_endian=0 +signature file-magic-auto54 { + file-mime "application/x-debian-package", 171 + file-magic /(\x21\x3carch\x3e\x0adebian)/ +} + +# >0 string,=II\032\000\000\000HEAPCCDR (len=14), ["Canon CIFF raw image data"], swap_endian=0 +signature file-magic-auto55 { + file-mime "image/x-canon-crw", 170 + file-magic /(II\x1a\x00\x00\x00HEAPCCDR)/ +} + +# >0 string/t,=Relay-Version: (len=14), ["old news text"], swap_endian=0 +signature file-magic-auto56 { + file-mime "message/rfc822", 170 + file-magic /(Relay\x2dVersion\x3a)/ +} + +# >0 string,=ToKyO CaBiNeT\n (len=14), ["Tokyo Cabinet"], swap_endian=0 +# >>32 byte&,=0x00, [", Hash"], swap_endian=0 +signature file-magic-auto57 { + file-mime "application/x-tokyocabinet-hash", 40 + file-magic /(ToKyO CaBiNeT\x0a)(.{18})([\x00])/ +} + +# >0 string,=ToKyO CaBiNeT\n (len=14), ["Tokyo Cabinet"], swap_endian=0 +# >>32 byte&,=0x01, [", B+ tree"], swap_endian=0 +signature file-magic-auto58 { + file-mime "application/x-tokyocabinet-btree", 40 + file-magic /(ToKyO CaBiNeT\x0a)(.{18})([\x01])/ +} + +# >0 string,=ToKyO CaBiNeT\n (len=14), ["Tokyo Cabinet"], swap_endian=0 +# >>32 byte&,=0x02, [", Fixed-length"], swap_endian=0 +signature file-magic-auto59 { + file-mime "application/x-tokyocabinet-fixed", 40 + file-magic /(ToKyO CaBiNeT\x0a)(.{18})([\x02])/ +} + +# >0 string,=ToKyO CaBiNeT\n (len=14), ["Tokyo Cabinet"], swap_endian=0 +# >>32 byte&,=0x03, [", Table"], swap_endian=0 +signature file-magic-auto60 { + file-mime "application/x-tokyocabinet-table", 40 + file-magic /(ToKyO CaBiNeT\x0a)(.{18})([\x03])/ +} + +# >39 string,=0 string/t,=[BitmapInfo2] (len=13), ["Polar Monitor Bitmap text"], swap_endian=0 +signature file-magic-auto62 { + file-mime "image/x-polar-monitor-bitmap", 160 + file-magic /(\x5bBitmapInfo2\x5d)/ +} + +# >0 string,=SplineFontDB: (len=13), ["Spline Font Database "], swap_endian=0 +signature file-magic-auto63 { + file-mime "application/vnd.font-fontforge-sfd", 160 + file-magic /(SplineFontDB\x3a)/ +} + +# >0 string/ct,=delivered-to: (len=13), ["SMTP mail text"], swap_endian=0 +signature file-magic-auto64 { + file-mime "message/rfc822", 160 + file-magic /([dD][eE][lL][iI][vV][eE][rR][eE][dD]\x2d[tT][oO]\x3a)/ +} + +# >0 string/ct,=return-path: (len=12), ["SMTP mail text"], swap_endian=0 +signature file-magic-auto65 { + file-mime "message/rfc822", 150 + file-magic /([rR][eE][tT][uU][rR][nN]\x2d[pP][aA][tT][hH]\x3a)/ +} + +# >0 string,=\000\000\000\fjP \r\n\207\n (len=12), ["JPEG 2000"], swap_endian=0 +# >>20 string,=jp2 (len=4), ["Part 1 (JP2)"], swap_endian=0 +signature file-magic-auto66 { + file-mime "image/jp2", 70 + file-magic /(\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a)(.{8})(jp2 )/ +} + +# >0 string,=\000\000\000\fjP \r\n\207\n (len=12), ["JPEG 2000"], swap_endian=0 +# >>20 string,=jpx (len=4), ["Part 2 (JPX)"], swap_endian=0 +signature file-magic-auto67 { + file-mime "image/jpx", 70 + file-magic /(\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a)(.{8})(jpx )/ +} + +# >0 string,=\000\000\000\fjP \r\n\207\n (len=12), ["JPEG 2000"], swap_endian=0 +# >>20 string,=jpm (len=4), ["Part 6 (JPM)"], swap_endian=0 +signature file-magic-auto68 { + file-mime "image/jpm", 70 + file-magic /(\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a)(.{8})(jpm )/ +} + +# >0 string,=\000\000\000\fjP \r\n\207\n (len=12), ["JPEG 2000"], swap_endian=0 +# >>20 string,=mjp2 (len=4), ["Part 3 (MJ2)"], swap_endian=0 +signature file-magic-auto69 { + file-mime "video/mj2", 70 + file-magic /(\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a)(.{8})(mjp2)/ +} + +# >0 string/w,=0 string/wt,=#! /bin/tcsh (len=12), ["Tenex C shell script text executable"], swap_endian=0 +signature file-magic-auto71 { + file-mime "text/x-shellscript", 150 + file-magic /(\x23\x21 ?\x2fbin\x2ftcsh)/ +} + +# >0 string/wt,=#! /bin/nawk (len=12), ["new awk script text executable"], swap_endian=0 +signature file-magic-auto72 { + file-mime "text/x-nawk", 150 + file-magic /(\x23\x21 ?\x2fbin\x2fnawk)/ +} + +# >0 string/wt,=#! /bin/gawk (len=12), ["GNU awk script text executable"], swap_endian=0 +signature file-magic-auto73 { + file-mime "text/x-gawk", 150 + file-magic /(\x23\x21 ?\x2fbin\x2fgawk)/ +} + +# >0 string/wt,=#! /bin/bash (len=12), ["Bourne-Again shell script text executable"], swap_endian=0 +signature file-magic-auto74 { + file-mime "text/x-shellscript", 150 + file-magic /(\x23\x21 ?\x2fbin\x2fbash)/ +} + +# >0 string/wt,=#! /bin/awk (len=11), ["awk script text executable"], swap_endian=0 +signature file-magic-auto75 { + file-mime "text/x-awk", 140 + file-magic /(\x23\x21 ?\x2fbin\x2fawk)/ +} + +# >0 string,=filedesc:// (len=11), ["Internet Archive File"], swap_endian=0 +signature file-magic-auto76 { + file-mime "application/x-ia-arc", 140 + file-magic /(filedesc\x3a\x2f\x2f)/ +} + +# >38 string,=Spreadsheet (len=11), ["sc spreadsheet file"], swap_endian=0 +signature file-magic-auto77 { + file-mime "application/x-sc", 140 + file-magic /(.{38})(Spreadsheet)/ +} + +# >0 string,=d8:announce (len=11), ["BitTorrent file"], swap_endian=0 +signature file-magic-auto78 { + file-mime "application/x-bittorrent", 140 + file-magic /(d8\x3aannounce)/ +} + +# >0 string/wt,=#! /bin/csh (len=11), ["C shell script text executable"], swap_endian=0 +signature file-magic-auto79 { + file-mime "text/x-shellscript", 140 + file-magic /(\x23\x21 ?\x2fbin\x2fcsh)/ +} + +# >0 string/wt,=#! /bin/ksh (len=11), ["Korn shell script text executable"], swap_endian=0 +signature file-magic-auto80 { + file-mime "text/x-shellscript", 140 + file-magic /(\x23\x21 ?\x2fbin\x2fksh)/ +} + +# >0 string/wt,=#! /bin/zsh (len=11), ["Paul Falstad's zsh script text executable"], swap_endian=0 +signature file-magic-auto81 { + file-mime "text/x-shellscript", 140 + file-magic /(\x23\x21 ?\x2fbin\x2fzsh)/ +} + +# >0 string/c,=BEGIN:VCARD (len=11), ["vCard visiting card"], swap_endian=0 +signature file-magic-auto82 { + file-mime "text/x-vcard", 140 + file-magic /(BEGIN\x3aVCARD)/ +} + +# >0 string,=HEADER (len=10), [""], swap_endian=0 +# >>&0 regex/1,=^.{40} (len=6), [""], swap_endian=0 +# >>>&0 regex/1,=[0-9]{2}-[A-Z]{3}-[0-9]{2} {3} (len=30), [""], swap_endian=0 +# >>>>&0 regex/s/1,=[A-Z0-9]{4}.{14}$ (len=17), [""], swap_endian=0 +# >>>>>&0 regex/1,=[A-Z0-9]{4} (len=11), ["Protein Data Bank data, ID Code %s"], swap_endian=0 +signature file-magic-auto83 { + file-mime "chemical/x-pdb", 41 + file-magic /(HEADER )(^.{40})([0-9]{2}-[A-Z]{3}-[0-9]{2} {3})([A-Z0-9]{4}.{14}$)([A-Z0-9]{4})/ +} + +# >0 string/t,=Forward to (len=10), ["mail forwarding text"], swap_endian=0 +signature file-magic-auto84 { + file-mime "message/rfc822", 130 + file-magic /(Forward to)/ +} + +# >0 string/wt,=#! /bin/sh (len=10), ["POSIX shell script text executable"], swap_endian=0 +signature file-magic-auto85 { + file-mime "text/x-shellscript", 130 + file-magic /(\x23\x21 ?\x2fbin\x2fsh)/ +} + +# >0 string,=II*\000\020\000\000\000CR (len=10), ["Canon CR2 raw image data"], swap_endian=0 +signature file-magic-auto86 { + file-mime "image/x-canon-cr2", 130 + file-magic /(II\x2a\x00\x10\x00\x00\x00CR)/ +} + +# >0 string,=0 search/4096,=--- (len=4), [""], swap_endian=0 +# >>&0 search/1024,=\n (len=1), [""], swap_endian=0 +# >>>&0 search/1,=+++ (len=4), [""], swap_endian=0 +# >>>>&0 search/1024,=\n (len=1), [""], swap_endian=0 +# >>>>>&0 search/1,=@@ (len=2), ["unified diff output text"], swap_endian=0 +signature file-magic-auto88 { + file-mime "text/x-diff", 40 + file-magic /(.*)(\x2d\x2d\x2d )(.*)(\x0a)(.*)(\x2b\x2b\x2b )(.*)(\x0a)(.*)(\x40\x40)/ +} + +# >0 string/t,=Received: (len=9), ["RFC 822 mail text"], swap_endian=0 +signature file-magic-auto89 { + file-mime "message/rfc822", 120 + file-magic /(Received\x3a)/ +} + +# >0 string,=2112 string,=MSWordDoc (len=9), ["Microsoft Word document data"], swap_endian=0 +signature file-magic-auto91 { + file-mime "application/msword", 120 + file-magic /(.{2112})(MSWordDoc)/ +} + +# >0 string/t,=N#! rnews (len=9), ["mailed, batched news text"], swap_endian=0 +signature file-magic-auto92 { + file-mime "message/rfc822", 120 + file-magic /(N\x23\x21 rnews)/ +} + +# >0 string/b,=WordPro\r\373 (len=9), ["Lotus WordPro"], swap_endian=0 +signature file-magic-auto93 { + file-mime "application/vnd.lotus-wordpro", 120 + file-magic /(WordPro\x0d\xfb)/ +} + +# >0 string,=LPKSHHRH (len=8), [""], swap_endian=0 +# >>16 ubyte&000000fc,=0x00, [""], swap_endian=0 +# >>>24 ubequad&,>0 (0x0000000000000000), [""], swap_endian=0 +# >>>>32 ubequad&,>0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>40 ubequad&,>0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>>48 ubequad&,>0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>>>56 ubequad&,>0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>>>>64 ubequad&,>0 (0x0000000000000000), ["Journal file"], swap_endian=0 +signature file-magic-auto94 { + file-mime "application/octet-stream", 80 + file-magic /(LPKSHHRH)(.{8})([\x00\x01\x02\x03])(.{7})([^\x00]{8})([^\x00]{8})([^\x00]{8})([^\x00]{8})([^\x00]{8})([^\x00]{8})/ +} + +# >0 string,=AT&TFORM (len=8), [""], swap_endian=0 +# >>12 string,=DJVM (len=4), ["DjVu multiple page document"], swap_endian=0 +signature file-magic-auto95 { + file-mime "image/vnd.djvu", 70 + file-magic /(AT\x26TFORM)(.{4})(DJVM)/ +} + +# >0 string,=AT&TFORM (len=8), [""], swap_endian=0 +# >>12 string,=DJVU (len=4), ["DjVu image or single page document"], swap_endian=0 +signature file-magic-auto96 { + file-mime "image/vnd.djvu", 70 + file-magic /(AT\x26TFORM)(.{4})(DJVU)/ +} + +# >0 string,=AT&TFORM (len=8), [""], swap_endian=0 +# >>12 string,=DJVI (len=4), ["DjVu shared document"], swap_endian=0 +signature file-magic-auto97 { + file-mime "image/vnd.djvu", 70 + file-magic /(AT\x26TFORM)(.{4})(DJVI)/ +} + +# >0 string,=AT&TFORM (len=8), [""], swap_endian=0 +# >>12 string,=THUM (len=4), ["DjVu page thumbnails"], swap_endian=0 +signature file-magic-auto98 { + file-mime "image/vnd.djvu", 70 + file-magic /(AT\x26TFORM)(.{4})(THUM)/ +} + +# >0 string/t,=#! rnews (len=8), ["batched news text"], swap_endian=0 +signature file-magic-auto99 { + file-mime "message/rfc822", 110 + file-magic /(\x23\x21 rnews)/ +} + +# >0 string/b,=MSCF\000\000\000\000 (len=8), ["Microsoft Cabinet archive data"], swap_endian=0 +signature file-magic-auto100 { + file-mime "application/vnd.ms-cab-compressed", 110 + file-magic /(MSCF\x00\x00\x00\x00)/ +} + +# >0 string/b,=\320\317\021\340\241\261\032\341 (len=8), ["Microsoft Office Document"], swap_endian=0 +signature file-magic-auto101 { + file-mime "application/msword", 110 + file-magic /(\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1)/ +} + +# >21 string/c,=!SCREAM! (len=8), ["Screamtracker 2 module sound data"], swap_endian=0 +signature file-magic-auto102 { + file-mime "audio/x-mod", 110 + file-magic /(.{21})(\x21SCREAM\x21)/ +} + +# >21 string,=BMOD2STM (len=8), ["Screamtracker 2 module sound data"], swap_endian=0 +signature file-magic-auto103 { + file-mime "audio/x-mod", 110 + file-magic /(.{21})(BMOD2STM)/ +} + +# >0 string/b,=ITOLITLS (len=8), ["Microsoft Reader eBook Data"], swap_endian=0 +# >>8 lelong&,x, [", version %u"], swap_endian=0 +signature file-magic-auto104 { + file-mime "application/x-ms-reader", 1 + file-magic /(ITOLITLS)(.{4})/ +} + +# >4096 string,=\211HDF\r\n\032\n (len=8), ["Hierarchical Data Format (version 5) with 4k user block"], swap_endian=0 +signature file-magic-auto105 { + file-mime "application/x-hdf", 110 + file-magic /(.{4096})(\x89HDF\x0d\x0a\x1a\x0a)/ +} + +# >2048 string,=\211HDF\r\n\032\n (len=8), ["Hierarchical Data Format (version 5) with 2k user block"], swap_endian=0 +signature file-magic-auto106 { + file-mime "application/x-hdf", 110 + file-magic /(.{2048})(\x89HDF\x0d\x0a\x1a\x0a)/ +} + +# >1024 string,=\211HDF\r\n\032\n (len=8), ["Hierarchical Data Format (version 5) with 1k user block"], swap_endian=0 +signature file-magic-auto107 { + file-mime "application/x-hdf", 110 + file-magic /(.{1024})(\x89HDF\x0d\x0a\x1a\x0a)/ +} + +# >512 string,=\211HDF\r\n\032\n (len=8), ["Hierarchical Data Format (version 5) with 512 bytes user block"], swap_endian=0 +signature file-magic-auto108 { + file-mime "application/x-hdf", 110 + file-magic /(.{512})(\x89HDF\x0d\x0a\x1a\x0a)/ +} + +# >0 string,=\211HDF\r\n\032\n (len=8), ["Hierarchical Data Format (version 5) data"], swap_endian=0 +signature file-magic-auto109 { + file-mime "application/x-hdf", 110 + file-magic /(\x89HDF\x0d\x0a\x1a\x0a)/ +} + +# >0 string,=\211PNG\r\n\032\n (len=8), ["PNG image data"], swap_endian=0 +signature file-magic-auto110 { + file-mime "image/png", 110 + file-magic /(\x89PNG\x0d\x0a\x1a\x0a)/ +} + +# >36 string,=acspSUNW (len=8), ["Sun KCMS ICC Profile"], swap_endian=0 +signature file-magic-auto111 { + file-mime "application/vnd.iccprofile", 110 + file-magic /(.{36})(acspSUNW)/ +} + +# >36 string,=acspSGI (len=8), ["SGI ICC Profile"], swap_endian=0 +signature file-magic-auto112 { + file-mime "application/vnd.iccprofile", 110 + file-magic /(.{36})(acspSGI )/ +} + +# >36 string,=acspMSFT (len=8), ["Microsoft ICM Color Profile"], swap_endian=0 +signature file-magic-auto113 { + file-mime "application/vnd.iccprofile", 110 + file-magic /(.{36})(acspMSFT)/ +} + +# >36 string,=acspAPPL (len=8), ["ColorSync ICC Profile"], swap_endian=0 +signature file-magic-auto114 { + file-mime "application/vnd.iccprofile", 110 + file-magic /(.{36})(acspAPPL)/ +} + +# >0 string,=gimp xcf (len=8), ["GIMP XCF image data,"], swap_endian=0 +signature file-magic-auto115 { + file-mime "image/x-xcf", 110 + file-magic /(gimp xcf)/ +} + +# >512 string,=R\000o\000o\000t\000 (len=8), ["Hangul (Korean) Word Processor File 2000"], swap_endian=0 +signature file-magic-auto116 { + file-mime "application/x-hwp", 110 + file-magic /(.{512})(R\x00o\x00o\x00t\x00)/ +} + +# >257 string,=ustar \000 (len=8), ["GNU tar archive"], swap_endian=0 +signature file-magic-auto117 { + file-mime "application/x-tar", 110 + file-magic /(.{257})(ustar \x00)/ +} + +# >0 string,=0 string,=PK\a\bPK\003\004 (len=8), ["Zip multi-volume archive data, at least PKZIP v2.50 to extract"], swap_endian=0 +signature file-magic-auto119 { + file-mime "application/zip", 110 + file-magic /(PK\x07\x08PK\x03\x04)/ +} + +# >0 string/b,=\t\004\006\000\000\000\020\000 (len=8), ["Microsoft Excel Worksheet"], swap_endian=0 +signature file-magic-auto120 { + file-mime "application/vnd.ms-excel", 110 + file-magic /(\x09\x04\x06\x00\x00\x00\x10\x00)/ +} + +# >0 string/b,=WordPro\000 (len=8), ["Lotus WordPro"], swap_endian=0 +signature file-magic-auto121 { + file-mime "application/vnd.lotus-wordpro", 110 + file-magic /(WordPro\x00)/ +} + +# >0 string/t,=Article (len=7), ["saved news text"], swap_endian=0 +signature file-magic-auto122 { + file-mime "message/news", 100 + file-magic /(Article)/ +} + +# >0 string,=\037\213 (len=2), ["gzip compressed data"], swap_endian=0 +signature file-magic-auto123 { + file-mime "application/x-gzip", 100 + file-magic /(\x1f\x8b)/ +} + +# >0 string/t,=Pipe to (len=7), ["mail piping text"], swap_endian=0 +signature file-magic-auto124 { + file-mime "message/rfc822", 100 + file-magic /(Pipe to)/ +} + +# >0 string,=.RMF\000\000\000 (len=7), ["RealMedia file"], swap_endian=0 +signature file-magic-auto125 { + file-mime "application/vnd.rn-realmedia", 100 + file-magic /(\x2eRMF\x00\x00\x00)/ +} + +# >0 string,=StuffIt (len=7), ["StuffIt Archive"], swap_endian=0 +signature file-magic-auto126 { + file-mime "application/x-stuffit", 100 + file-magic /(StuffIt)/ +} + +# >0 string,=! (len=7), ["current ar archive"], swap_endian=0 +signature file-magic-auto127 { + file-mime "application/x-archive", 100 + file-magic /(\x21\x3carch\x3e)/ +} + +# >0 string,=P5 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto128 { + file-mime "image/x-portable-greymap", 42 + file-magic /(P5)(.{1})([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >0 string,=P6 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto129 { + file-mime "image/x-portable-pixmap", 42 + file-magic /(P6)(.{1})([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >0 string,=P4 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto130 { + file-mime "image/x-portable-bitmap", 42 + file-magic /(P4)(.{1})([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >257 string,=ustar\000 (len=6), ["POSIX tar archive"], swap_endian=0 +signature file-magic-auto131 { + file-mime "application/x-tar", 90 + file-magic /(.{257})(ustar\x00)/ +} + +# >0 string,=AC1.40 (len=6), ["DWG AutoDesk AutoCAD Release 1.40"], swap_endian=0 +signature file-magic-auto132 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1\x2e40)/ +} + +# >0 string,=AC1.50 (len=6), ["DWG AutoDesk AutoCAD Release 2.05"], swap_endian=0 +signature file-magic-auto133 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1\x2e50)/ +} + +# >0 string,=AC2.10 (len=6), ["DWG AutoDesk AutoCAD Release 2.10"], swap_endian=0 +signature file-magic-auto134 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC2\x2e10)/ +} + +# >0 string,=AC2.21 (len=6), ["DWG AutoDesk AutoCAD Release 2.21"], swap_endian=0 +signature file-magic-auto135 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC2\x2e21)/ +} + +# >0 string,=AC2.22 (len=6), ["DWG AutoDesk AutoCAD Release 2.22"], swap_endian=0 +signature file-magic-auto136 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC2\x2e22)/ +} + +# >0 string,=AC1001 (len=6), ["DWG AutoDesk AutoCAD Release 2.22"], swap_endian=0 +signature file-magic-auto137 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1001)/ +} + +# >0 string,=AC1002 (len=6), ["DWG AutoDesk AutoCAD Release 2.50"], swap_endian=0 +signature file-magic-auto138 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1002)/ +} + +# >0 string,=AC1003 (len=6), ["DWG AutoDesk AutoCAD Release 2.60"], swap_endian=0 +signature file-magic-auto139 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1003)/ +} + +# >0 string,=AC1004 (len=6), ["DWG AutoDesk AutoCAD Release 9"], swap_endian=0 +signature file-magic-auto140 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1004)/ +} + +# >0 string,=AC1006 (len=6), ["DWG AutoDesk AutoCAD Release 10"], swap_endian=0 +signature file-magic-auto141 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1006)/ +} + +# >0 string,=AC1009 (len=6), ["DWG AutoDesk AutoCAD Release 11/12"], swap_endian=0 +signature file-magic-auto142 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1009)/ +} + +# >0 string,=AC1012 (len=6), ["DWG AutoDesk AutoCAD Release 13"], swap_endian=0 +signature file-magic-auto143 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1012)/ +} + +# >0 string,=AC1014 (len=6), ["DWG AutoDesk AutoCAD Release 14"], swap_endian=0 +signature file-magic-auto144 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1014)/ +} + +# >0 string,=AC1015 (len=6), ["DWG AutoDesk AutoCAD 2000/2002"], swap_endian=0 +signature file-magic-auto145 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1015)/ +} + +# >0 string,=AC1018 (len=6), ["DWG AutoDesk AutoCAD 2004/2005/2006"], swap_endian=0 +signature file-magic-auto146 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1018)/ +} + +# >0 string,=AC1021 (len=6), ["DWG AutoDesk AutoCAD 2007/2008/2009"], swap_endian=0 +signature file-magic-auto147 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1021)/ +} + +# >0 string,=AC1024 (len=6), ["DWG AutoDesk AutoCAD 2010/2011/2012"], swap_endian=0 +signature file-magic-auto148 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1024)/ +} + +# >0 string,=AC1027 (len=6), ["DWG AutoDesk AutoCAD 2013/2014"], swap_endian=0 +signature file-magic-auto149 { + file-mime "image/vnd.dwg", 90 + file-magic /(AC1027)/ +} + +# >0 string,=7z\274\257'\034 (len=6), ["7-zip archive data,"], swap_endian=0 +# >>7 byte&,x, [".%d"], swap_endian=0 +signature file-magic-auto150 { + file-mime "application/x-7z-compressed", 1 + file-magic /(7z\xbc\xaf\x27\x1c)(.{1})(.{1})/ +} + +# >0 ustring,=\3757zXZ\000 (len=6), ["XZ compressed data"], swap_endian=0 +signature file-magic-auto151 { + file-mime "application/x-xz", 90 + file-magic /(\xfd7zXZ\x00)/ +} + +# >0 string,=0 string,=GIF94z (len=6), ["ZIF image (GIF+deflate alpha)"], swap_endian=0 +signature file-magic-auto153 { + file-mime "image/x-unknown", 90 + file-magic /(GIF94z)/ +} + +# >0 string,=FGF95a (len=6), ["FGF image (GIF+deflate beta)"], swap_endian=0 +signature file-magic-auto154 { + file-mime "image/x-unknown", 90 + file-magic /(FGF95a)/ +} + +# >0 string/t,=# xmcd (len=6), ["xmcd database file for kscd"], swap_endian=0 +signature file-magic-auto155 { + file-mime "text/x-xmcd", 90 + file-magic /(\x23 xmcd)/ +} + +# >0 string/b,=\333\245-\000\000\000 (len=6), ["Microsoft Office Document"], swap_endian=0 +signature file-magic-auto156 { + file-mime "application/msword", 90 + file-magic /(\xdb\xa5\x2d\x00\x00\x00)/ +} + +# >2 string,=MMXPR3 (len=6), ["Motorola Quark Express Document (English)"], swap_endian=0 +signature file-magic-auto157 { + file-mime "application/x-quark-xpress-3", 90 + file-magic /(.{2})(MMXPR3)/ +} + +# >0 search/1,=P1 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto158 { + file-mime "image/x-portable-bitmap", 42 + file-magic /(.*)(P1)([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >0 search/1,=P3 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto159 { + file-mime "image/x-portable-pixmap", 42 + file-magic /(.*)(P3)([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >0 search/1,=P2 (len=2), [""], swap_endian=0 +# >>3 regex,=[0-9]{1,50} (len=12), [", size = %sx"], swap_endian=0 +# >>>3 regex,= [0-9]{1,50} (len=12), ["%s"], swap_endian=0 +signature file-magic-auto160 { + file-mime "image/x-portable-greymap", 42 + file-magic /(.*)(P2)([0-9]{1,50} )( [0-9]{1,50})/ +} + +# >0 string/t,=>20 search/400,= xmlns= (len=7), [""], swap_endian=0 +# >>>&0 regex,=['"]http://earth.google.com/kml (len=31), ["Google KML document"], swap_endian=0 +signature file-magic-auto161 { + file-mime "application/vnd.google-earth.kml+xml", 61 + file-magic /(\x3c\x3fxml)(.{15})(.*)( xmlns\x3d)(['"]http:\x2f\x2fearth.google.com\x2fkml)/ +} + +# >0 string/t,=>20 search/400,= xmlns= (len=7), [""], swap_endian=0 +# >>>&0 regex,=['"]http://www.opengis.net/kml (len=30), ["OpenGIS KML document"], swap_endian=0 +signature file-magic-auto162 { + file-mime "application/vnd.google-earth.kml+xml", 60 + file-magic /(\x3c\x3fxml)(.{15})(.*)( xmlns\x3d)(['"]http:\x2f\x2fwww.opengis.net\x2fkml)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>30 regex,=[Content_Types].xml|_rels/.rels (len=31), [""], swap_endian=0 +# >>>18 (lelong,+49), search/2000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>&26 search/1000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>>&26 string,=word/ (len=5), ["Microsoft Word 2007+"], swap_endian=0 +signature file-magic-auto163 { + file-mime "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 80 + file-magic /(PK\x03\x04)(.{26})(\[Content_Types\].xml|_rels\x2f.rels)(.*)(PK\x03\x04)(.{26})(.*)(PK\x03\x04)(.{26})(word\x2f)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>30 regex,=[Content_Types].xml|_rels/.rels (len=31), [""], swap_endian=0 +# >>>18 (lelong,+49), search/2000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>&26 search/1000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>>&26 string,=ppt/ (len=4), ["Microsoft PowerPoint 2007+"], swap_endian=0 +signature file-magic-auto164 { + file-mime "application/vnd.openxmlformats-officedocument.presentationml.presentation", 70 + file-magic /(PK\x03\x04)(.{26})(\[Content_Types\].xml|_rels\x2f.rels)(.*)(PK\x03\x04)(.{26})(.*)(PK\x03\x04)(.{26})(ppt\x2f)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>30 regex,=[Content_Types].xml|_rels/.rels (len=31), [""], swap_endian=0 +# >>>18 (lelong,+49), search/2000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>&26 search/1000,=PK\003\004 (len=4), [""], swap_endian=0 +# >>>>>&26 string,=xl/ (len=3), ["Microsoft Excel 2007+"], swap_endian=0 +signature file-magic-auto165 { + file-mime "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 60 + file-magic /(PK\x03\x04)(.{26})(\[Content_Types\].xml|_rels\x2f.rels)(.*)(PK\x03\x04)(.{26})(.*)(PK\x03\x04)(.{26})(xl\x2f)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXB (len=8), ["RINEX Data, GEO SBAS Broadcast"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto166 { + file-mime "rinex/broadcast", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXB)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXD (len=8), ["RINEX Data, Observation (Hatanaka comp)"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto167 { + file-mime "rinex/observation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXD)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXC (len=8), ["RINEX Data, Clock"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto168 { + file-mime "rinex/clock", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXC)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXH (len=8), ["RINEX Data, GEO SBAS Navigation"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto169 { + file-mime "rinex/navigation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXH)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXG (len=8), ["RINEX Data, GLONASS Navigation"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto170 { + file-mime "rinex/navigation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXG)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXL (len=8), ["RINEX Data, Galileo Navigation"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto171 { + file-mime "rinex/navigation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXL)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXM (len=8), ["RINEX Data, Meteorological"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto172 { + file-mime "rinex/meteorological", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXM)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXN (len=8), ["RINEX Data, Navigation "], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto173 { + file-mime "rinex/navigation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXN)/ +} + +# >60 string,=RINEX (len=5), [""], swap_endian=0 +# >>80 search/256,=XXRINEXO (len=8), ["RINEX Data, Observation"], swap_endian=0 +# >>>5 string,x, [", version %6.6s"], swap_endian=0 +signature file-magic-auto174 { + file-mime "rinex/observation", 1 + file-magic /(.{60})(RINEX)(.{15})(.*)(XXRINEXO)/ +} + +# Doubt it's going to be common to have this many bytes buffered. +# >37633 string,=CD001 (len=5), ["ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)"], swap_endian=0 +#signature file-magic-auto175 { +# file-mime "application/x-iso9660-image", 80 +# file-magic /(.{37633})(CD001)/ +#} + +# >2 string,=-lhd- (len=5), ["LHa 2.x? archive data [lhd]"], swap_endian=0 +signature file-magic-auto176 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlhd\x2d)/ +} + +# >0 string,=WARC/ (len=5), ["WARC Archive"], swap_endian=0 +# >>5 string,x, ["version %.4s"], swap_endian=0 +signature file-magic-auto177 { + file-mime "application/warc", 1 + file-magic /(WARC\x2f)(.{0})/ +} + +# >0 string,=AC1.3 (len=5), ["DWG AutoDesk AutoCAD Release 1.3"], swap_endian=0 +signature file-magic-auto178 { + file-mime "image/vnd.dwg", 80 + file-magic /(AC1\x2e3)/ +} + +# >2 string,=-lh - (len=5), ["LHa 2.x? archive data [lh ]"], swap_endian=0 +signature file-magic-auto179 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh \x2d)/ +} + +# >0 string,=AC1.2 (len=5), ["DWG AutoDesk AutoCAD Release 1.2"], swap_endian=0 +signature file-magic-auto180 { + file-mime "image/vnd.dwg", 80 + file-magic /(AC1\x2e2)/ +} + +# >0 string,=MC0.0 (len=5), ["DWG AutoDesk AutoCAD Release 1.0"], swap_endian=0 +signature file-magic-auto181 { + file-mime "image/vnd.dwg", 80 + file-magic /(MC0\x2e0)/ +} + +# >2 string,=-lzs- (len=5), ["LHa/LZS archive data [lzs]"], swap_endian=0 +signature file-magic-auto182 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlzs\x2d)/ +} + +# >2 string,=-lz5- (len=5), ["LHarc 1.x archive data [lz5]"], swap_endian=0 +signature file-magic-auto183 { + file-mime "application/x-lharc", 80 + file-magic /(.{2})(\x2dlz5\x2d)/ +} + +# Doubt it's going to be common to have this many bytes buffered. +# >32769 string,=CD001 (len=5), ["#"], swap_endian=0 +#signature file-magic-auto184 { +# file-mime "application/x-iso9660-image", 80 +# file-magic /(.{32769})(CD001)/ +#} + +# >2 string,=-lh3- (len=5), ["LHa 2.x? archive data [lh3]"], swap_endian=0 +signature file-magic-auto185 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh3\x2d)/ +} + +# >2 string,=-lh2- (len=5), ["LHa 2.x? archive data [lh2]"], swap_endian=0 +signature file-magic-auto186 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh2\x2d)/ +} + +# >0 string,=\000\001\000\000\000 (len=5), ["TrueType font data"], swap_endian=0 +signature file-magic-auto187 { + file-mime "application/x-font-ttf", 80 + file-magic /(\x00\x01\x00\x00\x00)/ +} + +# >0 string/b,=PO^Q` (len=5), ["Microsoft Word 6.0 Document"], swap_endian=0 +signature file-magic-auto188 { + file-mime "application/msword", 80 + file-magic /(PO\x5eQ\x60)/ +} + +# >0 string,=%PDF- (len=5), ["PDF document"], swap_endian=0 +signature file-magic-auto189 { + file-mime "application/pdf", 80 + file-magic /(\x25PDF\x2d)/ +} + +# >2114 string,=Biff5 (len=5), ["Microsoft Excel 5.0 Worksheet"], swap_endian=0 +signature file-magic-auto190 { + file-mime "application/vnd.ms-excel", 80 + file-magic /(.{2114})(Biff5)/ +} + +# >2121 string,=Biff5 (len=5), ["Microsoft Excel 5.0 Worksheet"], swap_endian=0 +signature file-magic-auto191 { + file-mime "application/vnd.ms-excel", 80 + file-magic /(.{2121})(Biff5)/ +} + +# >0 string/t,=Path: (len=5), ["news text"], swap_endian=0 +signature file-magic-auto192 { + file-mime "message/news", 80 + file-magic /(Path\x3a)/ +} + +# >0 string/t,=Xref: (len=5), ["news text"], swap_endian=0 +signature file-magic-auto193 { + file-mime "message/news", 80 + file-magic /(Xref\x3a)/ +} + +# >0 string/t,=From: (len=5), ["news or mail text"], swap_endian=0 +signature file-magic-auto194 { + file-mime "message/rfc822", 80 + file-magic /(From\x3a)/ +} + +# >2 string,=-lh7- (len=5), ["LHa (2.x)/LHark archive data [lh7]"], swap_endian=0 +signature file-magic-auto195 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh7\x2d)/ +} + +# >0 string,={\rtf (len=5), ["Rich Text Format data,"], swap_endian=0 +signature file-magic-auto196 { + file-mime "text/rtf", 80 + file-magic /(\x7b\x5crtf)/ +} + +# >2 string,=-lh6- (len=5), ["LHa (2.x) archive data [lh6]"], swap_endian=0 +signature file-magic-auto197 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh6\x2d)/ +} + +# >2 string,=-lh5- (len=5), ["LHa (2.x) archive data [lh5]"], swap_endian=0 +signature file-magic-auto198 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh5\x2d)/ +} + +# >2 string,=-lh4- (len=5), ["LHa (2.x) archive data [lh4]"], swap_endian=0 +signature file-magic-auto199 { + file-mime "application/x-lha", 80 + file-magic /(.{2})(\x2dlh4\x2d)/ +} + +# >2 string,=-lz4- (len=5), ["LHarc 1.x archive data [lz4]"], swap_endian=0 +signature file-magic-auto200 { + file-mime "application/x-lharc", 80 + file-magic /(.{2})(\x2dlz4\x2d)/ +} + +# >2 string,=-lh1- (len=5), ["LHarc 1.x/ARX archive data [lh1]"], swap_endian=0 +signature file-magic-auto201 { + file-mime "application/x-lharc", 80 + file-magic /(.{2})(\x2dlh1\x2d)/ +} + +# >2 string,=-lh0- (len=5), ["LHarc 1.x/ARX archive data [lh0]"], swap_endian=0 +signature file-magic-auto202 { + file-mime "application/x-lharc", 80 + file-magic /(.{2})(\x2dlh0\x2d)/ +} + +# >0 string,=%FDF- (len=5), ["FDF document"], swap_endian=0 +signature file-magic-auto203 { + file-mime "application/vnd.fdf", 80 + file-magic /(\x25FDF\x2d)/ +} + +# >0 belong&,=443 (0x000001bb), [""], swap_endian=0 +signature file-magic-auto204 { + file-mime "video/mpeg", 71 + file-magic /(\x00\x00\x01\xbb)/ +} + +# The non-sequential offsets and use of bitmask and relational operators +# made this difficult to autogenerate. Can see about manually creating +# the correct character class later. +# >0 ubelong&fff8fe00,=167772160 (0x0a000000), [""], swap_endian=0 +# >>3 ubyte&,>0x00, [""], swap_endian=0 +# >>>1 ubyte&,<0x06, [""], swap_endian=0 +# >>>>1 ubyte&,!0x01, ["PCX"], swap_endian=0 +#signature file-magic-auto205 { +# file-mime "image/x-pcx", 1 +# file-magic /(.{4})(.*)([\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])(.*)([\x00\x01\x02\x03\x04\x05])(.*)([\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +#} + +# >0 belong&,=432 (0x000001b0), [""], swap_endian=0 +signature file-magic-auto206 { + file-mime "video/mp4v-es", 71 + file-magic /(\x00\x00\x01\xb0)/ +} + +# >0 belong&,=437 (0x000001b5), [""], swap_endian=0 +signature file-magic-auto207 { + file-mime "video/mp4v-es", 71 + file-magic /(\x00\x00\x01\xb5)/ +} + +# >0 string,=AWBM (len=4), [""], swap_endian=0 +# >>4 leshort&,<1981 (0x07bd), ["Award BIOS bitmap"], swap_endian=0 +signature file-magic-auto208 { + file-mime "image/x-award-bmp", 20 + file-magic /(AWBM)(.{2})/ +} + +# >0 belong&,=435 (0x000001b3), [""], swap_endian=0 +signature file-magic-auto209 { + file-mime "video/mpv", 71 + file-magic /(\x00\x00\x01\xb3)/ +} + +# Converting bitmask to character class might make the regex +# unfriendly to humans. +# >0 belong&ffffffffff5fff10,=1195376656 (0x47400010), [""], swap_endian=0 +#signature file-magic-auto210 { +# file-mime "video/mp2t", 71 +# file-magic /(.{4})/ +#} + +# >0 belong&,=1 (0x00000001), [""], swap_endian=0 +# >>4 byte&0000001f,=0x07, [""], swap_endian=0 +signature file-magic-auto211 { + file-mime "video/h264", 41 + file-magic /(\x00\x00\x00\x01)([\x07\x27\x47\x67\x87\xa7\xc7\xe7])/ +} + +# >0 belong&,=-889275714 (0xcafebabe), [""], swap_endian=0 +signature file-magic-auto212 { + file-mime "application/x-java-applet", 71 + file-magic /(\xca\xfe\xba\xbe)/ +} + +# >0 belong&ffffffffffffff00,=256 (0x00000100), [""], swap_endian=0 +# >>3 byte&,=0xba, ["MPEG sequence"], swap_endian=0 +signature file-magic-auto213 { + file-mime "video/mpeg", 40 + file-magic /(\x00\x00\x01\xba)/ +} + +# >0 belong&ffffffffffffff00,=256 (0x00000100), [""], swap_endian=0 +# >>3 byte&,=0xb0, ["MPEG sequence, v4"], swap_endian=0 +signature file-magic-auto214 { + file-mime "video/mpeg4-generic", 40 + file-magic /(\x00\x00\x01\xb0)/ +} + +# >0 belong&ffffffffffffff00,=256 (0x00000100), [""], swap_endian=0 +# >>3 byte&,=0xb5, ["MPEG sequence, v4"], swap_endian=0 +signature file-magic-auto215 { + file-mime "video/mpeg4-generic", 40 + file-magic /(\x00\x00\x01\xb5)/ +} + +# >0 belong&ffffffffffffff00,=256 (0x00000100), [""], swap_endian=0 +# >>3 byte&,=0xb3, ["MPEG sequence"], swap_endian=0 +signature file-magic-auto216 { + file-mime "video/mpeg", 40 + file-magic /(\x00\x00\x01\xb3)/ +} + +# >0 lelong&,=4 (0x00000004), [""], swap_endian=0 +# >>104 lelong&,=4 (0x00000004), ["X11 SNF font data, LSB first"], swap_endian=0 +signature file-magic-auto217 { + file-mime "application/x-font-sfn", 70 + file-magic /(\x04\x00\x00\x00)(.{100})(\x04\x00\x00\x00)/ +} + +# >0 lelong&00ffffff,=93 (0x0000005d), [""], swap_endian=0 +signature file-magic-auto218 { + file-mime "application/x-lzma", 71 + file-magic /(\x5d\x00\x00.)/ +} + +# This didn't auto-generate correctly due to non-sequential offsets and +# use of bitwise/relational comparisons. At a glance: may not be +# that common/useful, leaving for later. +# >512 ubelong&e0ffff00,=3774873344 (0xe0ffff00), [""], swap_endian=0 +# >>21 ubyte&,<0xe5, ["floppy with old FAT filesystem"], swap_endian=0 +# >>>512 ubyte&,=0xfc, ["180k"], swap_endian=0 +# >>>>2574 ubequad&,=0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>2560 ubequad&,!0 (0x0000000000000000), [""], swap_endian=0 +#signature file-magic-auto219 { +# file-mime "application/x-ima", 2 +# file-magic /(.{512})(.{4})(.*)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4])(.{490})([\xfc])(.{2061})(\x00\x00\x00\x00\x00\x00\x00\x00)(.*)(.{8})/ +#} + +# This didn't auto-generate correctly due to non-sequential offsets and +# use of bitwise/relational comparisons. At a glance: may not be +# that common/useful, leaving for later. +# >512 ubelong&e0ffff00,=3774873344 (0xe0ffff00), [""], swap_endian=0 +# >>21 ubyte&,<0xe5, ["floppy with old FAT filesystem"], swap_endian=0 +# >>>512 ubyte&,=0xfd, [""], swap_endian=0 +# >>>>2574 ubequad&,=0 (0x0000000000000000), [""], swap_endian=0 +#signature file-magic-auto220 { +# file-mime "application/x-ima", 111 +# file-magic /(.{512})(.{4})(.*)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4])(.{490})([\xfd])(.{2061})(\x00\x00\x00\x00\x00\x00\x00\x00)/ +#} + +# This didn't auto-generate correctly due to non-sequential offsets and +# use of bitwise/relational comparisons. At a glance: may not be +# that common/useful, leaving for later. +# >512 ubelong&e0ffff00,=3774873344 (0xe0ffff00), [""], swap_endian=0 +# >>21 ubyte&,<0xe5, ["floppy with old FAT filesystem"], swap_endian=0 +# >>>512 ubyte&,=0xfe, [""], swap_endian=0 +# >>>>1024 ubelong&e0ffff00,=3774873344 (0xe0ffff00), ["160k"], swap_endian=0 +# >>>>>1550 ubequad&,=0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>>1536 ubequad&,!0 (0x0000000000000000), [""], swap_endian=0 +#signature file-magic-auto221 { +# file-mime "application/x-ima", 2 +# file-magic /(.{512})(.{4})(.*)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4])(.{490})([\xfe])(.{511})(.{4})(.{522})(\x00\x00\x00\x00\x00\x00\x00\x00)(.*)(.{8})/ +#} + +# This didn't auto-generate correctly due to non-sequential offsets and +# use of bitwise/relational comparisons. At a glance: may not be +# that common/useful, leaving for later. +# >512 ubelong&e0ffff00,=3774873344 (0xe0ffff00), [""], swap_endian=0 +# >>21 ubyte&,<0xe5, ["floppy with old FAT filesystem"], swap_endian=0 +# >>>512 ubyte&,=0xff, ["320k"], swap_endian=0 +# >>>>1550 ubequad&,=0 (0x0000000000000000), [""], swap_endian=0 +# >>>>>1536 ubequad&,!0 (0x0000000000000000), [""], swap_endian=0 +#signature file-magic-auto222 { +# file-mime "application/x-ima", 2 +# file-magic /(.{512})(.{4})(.*)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4])(.{490})([\xff])(.{1037})(\x00\x00\x00\x00\x00\x00\x00\x00)(.*)(.{8})/ +#} + +# >0 string,=;ELC (len=4), [""], swap_endian=0 +# >>4 byte&,<0x20, ["Emacs/XEmacs v%d byte-compiled Lisp data"], swap_endian=0 +signature file-magic-auto223 { + file-mime "application/x-elc", 10 + file-magic /(\x3bELC)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 belong&,=440786851 (0x1a45dfa3), [""], swap_endian=0 +# >>4 search/4096,=B\202 (len=2), [""], swap_endian=0 +# >>>&1 string,=webm (len=4), ["WebM"], swap_endian=0 +signature file-magic-auto224 { + file-mime "video/webm", 70 + file-magic /(\x1a\x45\xdf\xa3)(.*)(B\x82)(.{1})(webm)/ +} + +# >0 belong&,=440786851 (0x1a45dfa3), [""], swap_endian=0 +# >>4 search/4096,=B\202 (len=2), [""], swap_endian=0 +# >>>&1 string,=matroska (len=8), ["Matroska data"], swap_endian=0 +signature file-magic-auto225 { + file-mime "video/x-matroska", 110 + file-magic /(\x1a\x45\xdf\xa3)(.*)(B\x82)(.{1})(matroska)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>4 byte&,=0x14, [""], swap_endian=0 +# >>>30 string,=doc.kml (len=7), ["Compressed Google KML Document, including resources."], swap_endian=0 +signature file-magic-auto226 { + file-mime "application/vnd.google-earth.kmz", 100 + file-magic /(PK\x03\x04)([\x14])(.{25})(doc\x2ekml)/ +} + +# The indirect offset in the last magic rule means this has little chance +# Also plenty of bitmasking/relational comparisons that weren't auto-generated. +# of working. +# >0 ulelong&804000e9,=233 (0x000000e9), [""], swap_endian=0 +# >>11 uleshort&000f001f,=0 (0x0000), [""], swap_endian=0 +# >>>11 uleshort&,<32769 (0x8001), [""], swap_endian=0 +# >>>>11 uleshort&,>31 (0x001f), [""], swap_endian=0 +# >>>>>21 ubyte&000000f0,=0xf0, [""], swap_endian=0 +# >>>>>>21 ubyte&,!0xf8, [""], swap_endian=0 +# >>>>>>>54 string,!FAT16 (len=5), [""], swap_endian=0 +# >>>>>>>>11 (leshort,&0), ulelong&00fffff0,=16777200 (0x00fffff0), [", followed by FAT"], swap_endian=0 +#signature file-magic-auto227 { +# file-mime "application/x-ima", 70 +# file-magic /(.{4})(.{7})(.{2})(.*)(.{2})(.*)(.{2})(.{8})([\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])(.*)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf9\xfa\xfb\xfc\xfd\xfe\xff])(.{32})(FAT16)(.{4})/ +#} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=text (len=4), [""], swap_endian=0 +# >>>>>77 byte&,!0x2d, ["Text"], swap_endian=0 +signature file-magic-auto228 { + file-mime "application/vnd.oasis.opendocument.text", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(text)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=text (len=4), [""], swap_endian=0 +# >>>>>77 string,=-template (len=9), ["Text Template"], swap_endian=0 +signature file-magic-auto229 { + file-mime "application/vnd.oasis.opendocument.text-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(text)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=text (len=4), [""], swap_endian=0 +# >>>>>77 string,=-web (len=4), ["HTML Document Template"], swap_endian=0 +signature file-magic-auto230 { + file-mime "application/vnd.oasis.opendocument.text-web", 70 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(text)(\x2dweb)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=text (len=4), [""], swap_endian=0 +# >>>>>77 string,=-master (len=7), ["Master Document"], swap_endian=0 +signature file-magic-auto231 { + file-mime "application/vnd.oasis.opendocument.text-master", 100 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(text)(\x2dmaster)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=graphics (len=8), [""], swap_endian=0 +# >>>>>81 byte&,!0x2d, ["Drawing"], swap_endian=0 +signature file-magic-auto232 { + file-mime "application/vnd.oasis.opendocument.graphics", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(graphics)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=graphics (len=8), [""], swap_endian=0 +# >>>>>81 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto233 { + file-mime "application/vnd.oasis.opendocument.graphics-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(graphics)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=presentation (len=12), [""], swap_endian=0 +# >>>>>85 byte&,!0x2d, ["Presentation"], swap_endian=0 +signature file-magic-auto234 { + file-mime "application/vnd.oasis.opendocument.presentation", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(presentation)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=presentation (len=12), [""], swap_endian=0 +# >>>>>85 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto235 { + file-mime "application/vnd.oasis.opendocument.presentation-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(presentation)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=spreadsheet (len=11), [""], swap_endian=0 +# >>>>>84 byte&,!0x2d, ["Spreadsheet"], swap_endian=0 +signature file-magic-auto236 { + file-mime "application/vnd.oasis.opendocument.spreadsheet", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(spreadsheet)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=spreadsheet (len=11), [""], swap_endian=0 +# >>>>>84 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto237 { + file-mime "application/vnd.oasis.opendocument.spreadsheet-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(spreadsheet)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=chart (len=5), [""], swap_endian=0 +# >>>>>78 byte&,!0x2d, ["Chart"], swap_endian=0 +signature file-magic-auto238 { + file-mime "application/vnd.oasis.opendocument.chart", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(chart)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=chart (len=5), [""], swap_endian=0 +# >>>>>78 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto239 { + file-mime "application/vnd.oasis.opendocument.chart-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(chart)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=formula (len=7), [""], swap_endian=0 +# >>>>>80 byte&,!0x2d, ["Formula"], swap_endian=0 +signature file-magic-auto240 { + file-mime "application/vnd.oasis.opendocument.formula", 1110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(formula)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=formula (len=7), [""], swap_endian=0 +# >>>>>80 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto241 { + file-mime "application/vnd.oasis.opendocument.formula-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(formula)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=database (len=8), ["Database"], swap_endian=0 +signature file-magic-auto242 { + file-mime "application/vnd.oasis.opendocument.database", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(database)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=image (len=5), [""], swap_endian=0 +# >>>>>78 byte&,!0x2d, ["Image"], swap_endian=0 +signature file-magic-auto243 { + file-mime "application/vnd.oasis.opendocument.image", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(image)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=vnd.oasis.opendocument. (len=23), ["OpenDocument"], swap_endian=0 +# >>>>73 string,=image (len=5), [""], swap_endian=0 +# >>>>>78 string,=-template (len=9), ["Template"], swap_endian=0 +signature file-magic-auto244 { + file-mime "application/vnd.oasis.opendocument.image-template", 120 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(vnd\x2eoasis\x2eopendocument\x2e)(image)(\x2dtemplate)/ +} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,=epub+zip (len=8), ["EPUB document"], swap_endian=0 +signature file-magic-auto245 { + file-mime "application/epub+zip", 110 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)(epub\x2bzip)/ +} + +# Seems redundant with other zip signature below. +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetypeapplication/ (len=24), [""], swap_endian=0 +# >>>50 string,!epub+zip (len=8), [""], swap_endian=0 +# >>>>50 string,!vnd.oasis.opendocument. (len=23), [""], swap_endian=0 +# >>>>>50 string,!vnd.sun.xml. (len=12), [""], swap_endian=0 +# >>>>>>50 string,!vnd.kde. (len=8), [""], swap_endian=0 +# >>>>>>>38 regex,=[!-OQ-~]+ (len=9), ["Zip data (MIME type "%s"?)"], swap_endian=0 +#signature file-magic-auto246 { +# file-mime "application/zip", 39 +# file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetypeapplication\x2f)/ +#} + +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 string,=\b\000\000\000mimetype (len=12), [""], swap_endian=0 +# >>>38 string,!application/ (len=12), [""], swap_endian=0 +# >>>>38 regex,=[!-OQ-~]+ (len=9), ["Zip data (MIME type "%s"?)"], swap_endian=0 +signature file-magic-auto247 { + file-mime "application/zip", 39 + file-magic /(PK\x03\x04)(.{22})(\x08\x00\x00\x00mimetype)/ +} + +# The indirect offset makes this difficult to convert. +# The (.*) may be too generous. +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 (leshort,+30), leshort&,=-13570 (0xcafe), ["Java archive data (JAR)"], swap_endian=0 +signature file-magic-auto248 { + file-mime "application/java-archive", 50 + file-magic /(PK\x03\x04)(.*)(\xfe\xca)/ +} + +# The indeirect offset and string inequality make this difficult to convert. +# >0 string,=PK\003\004 (len=4), [""], swap_endian=0 +# >>26 (leshort,+30), leshort&,!-13570 (0xcafe), [""], swap_endian=0 +# >>>26 string,!\b\000\000\000mimetype (len=12), ["Zip archive data"], swap_endian=0 +signature file-magic-auto249 { + file-mime "application/zip", 10 + file-magic /(PK\x03\x04)(.{2})/ +} + +# >0 belong&,=442 (0x000001ba), [""], swap_endian=0 +# >>4 byte&,&0x40, [""], swap_endian=0 +signature file-magic-auto250 { + file-mime "video/mp2p", 21 + file-magic /(\x00\x00\x01\xba)([\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 belong&,=442 (0x000001ba), [""], swap_endian=0 +# >>4 byte&,^0x40, [""], swap_endian=0 +signature file-magic-auto251 { + file-mime "video/mpeg", 21 + file-magic /(\x00\x00\x01\xba)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf])/ +} + +# >0 string,=MOVI (len=4), ["Silicon Graphics movie file"], swap_endian=0 +signature file-magic-auto252 { + file-mime "video/x-sgi-movie", 70 + file-magic /(MOVI)/ +} + +# >4 string,=moov (len=4), ["Apple QuickTime"], swap_endian=0 +signature file-magic-auto253 { + file-mime "video/quicktime", 70 + file-magic /(.{4})(moov)/ +} + +# >4 string,=mdat (len=4), ["Apple QuickTime movie (unoptimized)"], swap_endian=0 +signature file-magic-auto254 { + file-mime "video/quicktime", 70 + file-magic /(.{4})(mdat)/ +} + +# >4 string,=idsc (len=4), ["Apple QuickTime image (fast start)"], swap_endian=0 +signature file-magic-auto255 { + file-mime "image/x-quicktime", 70 + file-magic /(.{4})(idsc)/ +} + +# >4 string,=pckg (len=4), ["Apple QuickTime compressed archive"], swap_endian=0 +signature file-magic-auto256 { + file-mime "application/x-quicktime-player", 70 + file-magic /(.{4})(pckg)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=isom (len=4), [", MPEG v4 system, version 1"], swap_endian=0 +signature file-magic-auto257 { + file-mime "video/mp4", 70 + file-magic /(.{4})(ftyp)(isom)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=mp41 (len=4), [", MPEG v4 system, version 1"], swap_endian=0 +signature file-magic-auto258 { + file-mime "video/mp4", 70 + file-magic /(.{4})(ftyp)(mp41)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=mp42 (len=4), [", MPEG v4 system, version 2"], swap_endian=0 +signature file-magic-auto259 { + file-mime "video/mp4", 70 + file-magic /(.{4})(ftyp)(mp42)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string/W,=jp2 (len=3), [", JPEG 2000"], swap_endian=0 +signature file-magic-auto260 { + file-mime "image/jp2", 60 + file-magic /(.{4})(ftyp)(jp2)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=3ge (len=3), [", MPEG v4 system, 3GPP"], swap_endian=0 +signature file-magic-auto261 { + file-mime "video/3gpp", 60 + file-magic /(.{4})(ftyp)(3ge)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=3gg (len=3), [", MPEG v4 system, 3GPP"], swap_endian=0 +signature file-magic-auto262 { + file-mime "video/3gpp", 60 + file-magic /(.{4})(ftyp)(3gg)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=3gp (len=3), [", MPEG v4 system, 3GPP"], swap_endian=0 +signature file-magic-auto263 { + file-mime "video/3gpp", 60 + file-magic /(.{4})(ftyp)(3gp)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=3gs (len=3), [", MPEG v4 system, 3GPP"], swap_endian=0 +signature file-magic-auto264 { + file-mime "video/3gpp", 60 + file-magic /(.{4})(ftyp)(3gs)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=3g2 (len=3), [", MPEG v4 system, 3GPP2"], swap_endian=0 +signature file-magic-auto265 { + file-mime "video/3gpp2", 60 + file-magic /(.{4})(ftyp)(3g2)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=mmp4 (len=4), [", MPEG v4 system, 3GPP Mobile"], swap_endian=0 +signature file-magic-auto266 { + file-mime "video/mp4", 70 + file-magic /(.{4})(ftyp)(mmp4)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string,=avc1 (len=4), [", MPEG v4 system, 3GPP JVT AVC"], swap_endian=0 +signature file-magic-auto267 { + file-mime "video/3gpp", 70 + file-magic /(.{4})(ftyp)(avc1)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string/W,=M4A (len=3), [", MPEG v4 system, iTunes AAC-LC"], swap_endian=0 +signature file-magic-auto268 { + file-mime "audio/mp4", 60 + file-magic /(.{4})(ftyp)(M4A)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string/W,=M4V (len=3), [", MPEG v4 system, iTunes AVC-LC"], swap_endian=0 +signature file-magic-auto269 { + file-mime "video/mp4", 60 + file-magic /(.{4})(ftyp)(M4V)/ +} + +# >4 string,=ftyp (len=4), ["ISO Media"], swap_endian=0 +# >>8 string/W,=qt (len=2), [", Apple QuickTime movie"], swap_endian=0 +signature file-magic-auto270 { + file-mime "video/quicktime", 50 + file-magic /(.{4})(ftyp)(qt)/ +} + +# >0 string,=Xcur (len=4), ["Xcursor data"], swap_endian=0 +signature file-magic-auto271 { + file-mime "image/x-xcursor", 70 + file-magic /(Xcur)/ +} + +# >0 string,=ADIF (len=4), ["MPEG ADIF, AAC"], swap_endian=0 +signature file-magic-auto272 { + file-mime "audio/x-hx-aac-adif", 70 + file-magic /(ADIF)/ +} + +# >0 belong&,=807842421 (0x3026b275), ["Microsoft ASF"], swap_endian=0 +signature file-magic-auto273 { + file-mime "video/x-ms-asf", 70 + file-magic /(\x30\x26\xb2\x75)/ +} + +# >0 string,=\212MNG (len=4), ["MNG video data,"], swap_endian=0 +signature file-magic-auto274 { + file-mime "video/x-mng", 70 + file-magic /(\x8aMNG)/ +} + +# >0 string,=\213JNG (len=4), ["JNG video data,"], swap_endian=0 +signature file-magic-auto275 { + file-mime "video/x-jng", 70 + file-magic /(\x8bJNG)/ +} + +# >0 string,=MAC (len=4), ["Monkey's Audio compressed format"], swap_endian=0 +signature file-magic-auto276 { + file-mime "audio/x-ape", 70 + file-magic /(MAC )/ +} + +# >36 string,=acsp (len=4), ["ICC Profile"], swap_endian=0 +signature file-magic-auto277 { + file-mime "application/vnd.iccprofile", 70 + file-magic /(.{36})(acsp)/ +} + +# >0 string,=FORM (len=4), ["IFF data"], swap_endian=0 +# >>8 string,=AIFF (len=4), [", AIFF audio"], swap_endian=0 +signature file-magic-auto278 { + file-mime "audio/x-aiff", 70 + file-magic /(FORM)(.{4})(AIFF)/ +} + +# >0 string,=FORM (len=4), ["IFF data"], swap_endian=0 +# >>8 string,=AIFC (len=4), [", AIFF-C compressed audio"], swap_endian=0 +signature file-magic-auto279 { + file-mime "audio/x-aiff", 70 + file-magic /(FORM)(.{4})(AIFC)/ +} + +# >0 string,=FORM (len=4), ["IFF data"], swap_endian=0 +# >>8 string,=8SVX (len=4), [", 8SVX 8-bit sampled sound voice"], swap_endian=0 +signature file-magic-auto280 { + file-mime "audio/x-aiff", 70 + file-magic /(FORM)(.{4})(8SVX)/ +} + +# >0 string,=fLaC (len=4), ["FLAC audio bitstream data"], swap_endian=0 +signature file-magic-auto281 { + file-mime "audio/x-flac", 70 + file-magic /(fLaC)/ +} + +# >0 string,=IIN1 (len=4), ["NIFF image data"], swap_endian=0 +signature file-magic-auto282 { + file-mime "image/x-niff", 70 + file-magic /(IIN1)/ +} + +# >0 string,=MM\000* (len=4), ["TIFF image data, big-endian"], swap_endian=0 +signature file-magic-auto283 { + file-mime "image/tiff", 70 + file-magic /(MM\x00\x2a)/ +} + +# >0 string,=II*\000 (len=4), ["TIFF image data, little-endian"], swap_endian=0 +signature file-magic-auto284 { + file-mime "image/tiff", 70 + file-magic /(II\x2a\x00)/ +} + +# >0 string,=MM\000+ (len=4), ["Big TIFF image data, big-endian"], swap_endian=0 +signature file-magic-auto285 { + file-mime "image/tiff", 70 + file-magic /(MM\x00\x2b)/ +} + +# >0 string,=II+\000 (len=4), ["Big TIFF image data, little-endian"], swap_endian=0 +signature file-magic-auto286 { + file-mime "image/tiff", 70 + file-magic /(II\x2b\x00)/ +} + +# >0 string,=GIF8 (len=4), ["GIF image data"], swap_endian=0 +signature file-magic-auto287 { + file-mime "image/gif", 70 + file-magic /(GIF8)/ +} + +# >128 string,=DICM (len=4), ["DICOM medical imaging data"], swap_endian=0 +signature file-magic-auto288 { + file-mime "application/dicom", 70 + file-magic /(.{128})(DICM)/ +} + +# >0 string,=8BPS (len=4), ["Adobe Photoshop Image"], swap_endian=0 +signature file-magic-auto289 { + file-mime "image/vnd.adobe.photoshop", 70 + file-magic /(8BPS)/ +} + +# >0 string,=IMPM (len=4), ["Impulse Tracker module sound data -"], swap_endian=0 +signature file-magic-auto290 { + file-mime "audio/x-mod", 70 + file-magic /(IMPM)/ +} + +# >0 lelong&,=20000630 (0x01312f76), ["OpenEXR image data,"], swap_endian=0 +signature file-magic-auto291 { + file-mime "image/x-exr", 70 + file-magic /(\x76\x2f\x31\x01)/ +} + +# >0 string,=SDPX (len=4), ["DPX image data, big-endian,"], swap_endian=0 +signature file-magic-auto292 { + file-mime "image/x-dpx", 70 + file-magic /(SDPX)/ +} + +# >0 belong&,=235082497 (0x0e031301), ["Hierarchical Data Format (version 4) data"], swap_endian=0 +signature file-magic-auto293 { + file-mime "application/x-hdf", 70 + file-magic /(\x0e\x03\x13\x01)/ +} + +# >0 string,=CPC\262 (len=4), ["Cartesian Perceptual Compression image"], swap_endian=0 +signature file-magic-auto294 { + file-mime "image/x-cpi", 70 + file-magic /(CPC\xb2)/ +} + +# >0 string,=MMOR (len=4), ["Olympus ORF raw image data, big-endian"], swap_endian=0 +signature file-magic-auto295 { + file-mime "image/x-olympus-orf", 70 + file-magic /(MMOR)/ +} + +# >0 string,=IIRO (len=4), ["Olympus ORF raw image data, little-endian"], swap_endian=0 +signature file-magic-auto296 { + file-mime "image/x-olympus-orf", 70 + file-magic /(IIRO)/ +} + +# >0 string,=IIRS (len=4), ["Olympus ORF raw image data, little-endian"], swap_endian=0 +signature file-magic-auto297 { + file-mime "image/x-olympus-orf", 70 + file-magic /(IIRS)/ +} + +# >0 string,=FOVb (len=4), ["Foveon X3F raw image data"], swap_endian=0 +signature file-magic-auto298 { + file-mime "image/x-x3f", 70 + file-magic /(FOVb)/ +} + +# >0 string,=PDN3 (len=4), ["Paint.NET image data"], swap_endian=0 +signature file-magic-auto299 { + file-mime "image/x-paintnet", 70 + file-magic /(PDN3)/ +} + +# >0 ulelong&,=2712847316 (0xa1b2c3d4), ["tcpdump capture file (little-endian)"], swap_endian=0 +signature file-magic-auto300 { + file-mime "application/vnd.tcpdump.pcap", 70 + file-magic /(\xd4\xc3\xb2\xa1)/ +} + +# >0 ubelong&,=2712847316 (0xa1b2c3d4), ["tcpdump capture file (big-endian)"], swap_endian=0 +signature file-magic-auto301 { + file-mime "application/vnd.tcpdump.pcap", 70 + file-magic /(\xa1\xb2\xc3\xd4)/ +} + +# >0 belong&,=-17957139 (0xfeedfeed), ["Java KeyStore"], swap_endian=0 +signature file-magic-auto302 { + file-mime "application/x-java-keystore", 70 + file-magic /(\xfe\xed\xfe\xed)/ +} + +# >0 belong&,=-825307442 (0xcececece), ["Java JCE KeyStore"], swap_endian=0 +signature file-magic-auto303 { + file-mime "application/x-java-jce-keystore", 70 + file-magic /(\xce\xce\xce\xce)/ +} + +# >1080 string,=32CN (len=4), ["32-channel Taketracker module sound data"], swap_endian=0 +signature file-magic-auto304 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(32CN)/ +} + +# >1080 string,=16CN (len=4), ["16-channel Taketracker module sound data"], swap_endian=0 +signature file-magic-auto305 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(16CN)/ +} + +# >1080 string,=OKTA (len=4), ["8-channel Octalyzer module sound data"], swap_endian=0 +signature file-magic-auto306 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(OKTA)/ +} + +# >1080 string,=CD81 (len=4), ["8-channel Octalyser module sound data"], swap_endian=0 +signature file-magic-auto307 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(CD81)/ +} + +# >1080 string,=8CHN (len=4), ["8-channel Fasttracker module sound data"], swap_endian=0 +signature file-magic-auto308 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(8CHN)/ +} + +# >1080 string,=6CHN (len=4), ["6-channel Fasttracker module sound data"], swap_endian=0 +signature file-magic-auto309 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(6CHN)/ +} + +# >1080 string,=4CHN (len=4), ["4-channel Fasttracker module sound data"], swap_endian=0 +signature file-magic-auto310 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(4CHN)/ +} + +# >1080 string,=FLT8 (len=4), ["8-channel Startracker module sound data"], swap_endian=0 +signature file-magic-auto311 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(FLT8)/ +} + +# >1080 string,=FLT4 (len=4), ["4-channel Startracker module sound data"], swap_endian=0 +signature file-magic-auto312 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(FLT4)/ +} + +# >1080 string,=M!K! (len=4), ["4-channel Protracker module sound data"], swap_endian=0 +signature file-magic-auto313 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(M\x21K\x21)/ +} + +# >1080 string,=M.K. (len=4), ["4-channel Protracker module sound data"], swap_endian=0 +signature file-magic-auto314 { + file-mime "audio/x-mod", 70 + file-magic /(.{1080})(M\x2eK\x2e)/ +} + +# >0 lelong&,=336851773 (0x1413f33d), ["SYSLINUX' LSS16 image data"], swap_endian=0 +signature file-magic-auto315 { + file-mime "image/x-lss16", 70 + file-magic /(\x3d\xf3\x13\x14)/ +} + +# >0 belong&,=779248125 (0x2e7261fd), ["RealAudio sound file"], swap_endian=0 +signature file-magic-auto316 { + file-mime "audio/x-pn-realaudio", 70 + file-magic /(\x2e\x72\x61\xfd)/ +} + +# >0 string,=CTMF (len=4), ["Creative Music (CMF) data"], swap_endian=0 +signature file-magic-auto317 { + file-mime "audio/x-unknown", 70 + file-magic /(CTMF)/ +} + +# >0 string,=MThd (len=4), ["Standard MIDI data"], swap_endian=0 +signature file-magic-auto318 { + file-mime "audio/midi", 70 + file-magic /(MThd)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=1 (0x00000001), ["8-bit ISDN mu-law,"], swap_endian=0 +signature file-magic-auto319 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x01\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=2 (0x00000002), ["8-bit linear PCM [REF-PCM],"], swap_endian=0 +signature file-magic-auto320 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x02\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=3 (0x00000003), ["16-bit linear PCM,"], swap_endian=0 +signature file-magic-auto321 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x03\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=4 (0x00000004), ["24-bit linear PCM,"], swap_endian=0 +signature file-magic-auto322 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x04\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=5 (0x00000005), ["32-bit linear PCM,"], swap_endian=0 +signature file-magic-auto323 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x05\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=6 (0x00000006), ["32-bit IEEE floating point,"], swap_endian=0 +signature file-magic-auto324 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x06\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=7 (0x00000007), ["64-bit IEEE floating point,"], swap_endian=0 +signature file-magic-auto325 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x07\x00\x00\x00)/ +} + +# >0 lelong&,=6583086 (0x0064732e), ["DEC audio data:"], swap_endian=0 +# >>12 lelong&,=23 (0x00000017), ["8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),"], swap_endian=0 +signature file-magic-auto326 { + file-mime "audio/x-dec-basic", 70 + file-magic /(\x2e\x73\x64\x00)(.{8})(\x17\x00\x00\x00)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=1 (0x00000001), ["8-bit ISDN mu-law,"], swap_endian=0 +signature file-magic-auto327 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x01)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=2 (0x00000002), ["8-bit linear PCM [REF-PCM],"], swap_endian=0 +signature file-magic-auto328 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x02)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=3 (0x00000003), ["16-bit linear PCM,"], swap_endian=0 +signature file-magic-auto329 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x03)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=4 (0x00000004), ["24-bit linear PCM,"], swap_endian=0 +signature file-magic-auto330 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x04)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=5 (0x00000005), ["32-bit linear PCM,"], swap_endian=0 +signature file-magic-auto331 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x05)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=6 (0x00000006), ["32-bit IEEE floating point,"], swap_endian=0 +signature file-magic-auto332 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x06)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=7 (0x00000007), ["64-bit IEEE floating point,"], swap_endian=0 +signature file-magic-auto333 { + file-mime "audio/basic", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x07)/ +} + +# >0 string,=.snd (len=4), ["Sun/NeXT audio data:"], swap_endian=0 +# >>12 belong&,=23 (0x00000017), ["8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),"], swap_endian=0 +signature file-magic-auto334 { + file-mime "audio/x-adpcm", 70 + file-magic /(\x2esnd)(.{8})(\x00\x00\x00\x17)/ +} + +# >0 string,=SIT! (len=4), ["StuffIt Archive (data)"], swap_endian=0 +signature file-magic-auto335 { + file-mime "application/x-stuffit", 70 + file-magic /(SIT\x21)/ +} + +# >0 lelong&,=574529400 (0x223e9f78), ["Transport Neutral Encapsulation Format"], swap_endian=0 +signature file-magic-auto336 { + file-mime "application/vnd.ms-tnef", 70 + file-magic /(\x78\x9f\x3e\x22)/ +} + +# >0 string,= (len=4), ["System V Release 1 ar archive"], swap_endian=0 +signature file-magic-auto337 { + file-mime "application/x-archive", 70 + file-magic /(\x3car\x3e)/ +} + +# >0 lelong&ffffffff8080ffff,=2074 (0x0000081a), ["ARC archive data, dynamic LZW"], swap_endian=0 +signature file-magic-auto338 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x08\x1a)/ +} + +# >0 lelong&ffffffff8080ffff,=2330 (0x0000091a), ["ARC archive data, squashed"], swap_endian=0 +signature file-magic-auto339 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x09\x1a)/ +} + +# >0 lelong&ffffffff8080ffff,=538 (0x0000021a), ["ARC archive data, uncompressed"], swap_endian=0 +signature file-magic-auto340 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x02\x1a)/ +} + +# >0 lelong&,=270539386 (0x10201a7a), ["Symbian installation file (Symbian OS 9.x)"], swap_endian=0 +signature file-magic-auto341 { + file-mime "x-epoc/x-sisx-app", 70 + file-magic /(\x7a\x1a\x20\x10)/ +} + +# >8 lelong&,=268436505 (0x10000419), ["Symbian installation file"], swap_endian=0 +signature file-magic-auto342 { + file-mime "application/vnd.symbian.install", 70 + file-magic /(.{8})(\x19\x04\x00\x10)/ +} + +# >0 lelong&ffffffff8080ffff,=794 (0x0000031a), ["ARC archive data, packed"], swap_endian=0 +signature file-magic-auto343 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x03\x1a)/ +} + +# >0 belong&,=518520576 (0x1ee7ff00), ["EET archive"], swap_endian=0 +signature file-magic-auto344 { + file-mime "application/x-eet", 70 + file-magic /(\x1e\xe7\xff\x00)/ +} + +# >0 lelong&ffffffff8080ffff,=1050 (0x0000041a), ["ARC archive data, squeezed"], swap_endian=0 +signature file-magic-auto345 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x04\x1a)/ +} + +# >0 lelong&ffffffff8080ffff,=1562 (0x0000061a), ["ARC archive data, crunched"], swap_endian=0 +signature file-magic-auto346 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x06\x1a)/ +} + +# >0 lelong&ffffffff8080ffff,=2586 (0x00000a1a), ["PAK archive data"], swap_endian=0 +signature file-magic-auto347 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x0a\x1a)/ +} + +# >0 lelong&ffffffff8080ffff,=5146 (0x0000141a), ["ARC+ archive data"], swap_endian=0 +signature file-magic-auto348 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x14\x1a)/ +} + +# >20 lelong&,=-37443620 (0xfdc4a7dc), ["Zoo archive data"], swap_endian=0 +signature file-magic-auto349 { + file-mime "application/x-zoo", 70 + file-magic /(.{20})(\xdc\xa7\xc4\xfd)/ +} + +# >0 string,=Rar! (len=4), ["RAR archive data,"], swap_endian=0 +signature file-magic-auto350 { + file-mime "application/x-rar", 70 + file-magic /(Rar\x21)/ +} + +# >0 lelong&ffffffff8080ffff,=18458 (0x0000481a), ["HYP archive data"], swap_endian=0 +signature file-magic-auto351 { + file-mime "application/x-arc", 70 + file-magic /([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f]{2})(\x48\x1a)/ +} + +# >0 string,=drpm (len=4), ["Delta RPM"], swap_endian=0 +signature file-magic-auto352 { + file-mime "application/x-rpm", 70 + file-magic /(drpm)/ +} + +# >0 belong&,=-307499301 (0xedabeedb), ["RPM"], swap_endian=0 +signature file-magic-auto353 { + file-mime "application/x-rpm", 70 + file-magic /(\xed\xab\xee\xdb)/ +} + +# >0 string,=RIFF (len=4), ["RIFF (little-endian) data"], swap_endian=0 +# >>8 string,=WAVE (len=4), [", WAVE audio"], swap_endian=0 +signature file-magic-auto354 { + file-mime "audio/x-wav", 70 + file-magic /(RIFF)(.{4})(WAVE)/ +} + +# >0 string,=RIFF (len=4), ["RIFF (little-endian) data"], swap_endian=0 +# >>8 string,=CDRA (len=4), [", Corel Draw Picture"], swap_endian=0 +signature file-magic-auto355 { + file-mime "image/x-coreldraw", 70 + file-magic /(RIFF)(.{4})(CDRA)/ +} + +# >0 string,=RIFF (len=4), ["RIFF (little-endian) data"], swap_endian=0 +# >>8 string,=CDR6 (len=4), [", Corel Draw Picture, version 6"], swap_endian=0 +signature file-magic-auto356 { + file-mime "image/x-coreldraw", 70 + file-magic /(RIFF)(.{4})(CDR6)/ +} + +# >0 string,=RIFF (len=4), ["RIFF (little-endian) data"], swap_endian=0 +# >>8 string,=AVI (len=4), [", AVI"], swap_endian=0 +signature file-magic-auto357 { + file-mime "video/x-msvideo", 70 + file-magic /(RIFF)(.{4})(AVI )/ +} + +# >0 belong&,=834535424 (0x31be0000), ["Microsoft Word Document"], swap_endian=0 +signature file-magic-auto358 { + file-mime "application/msword", 70 + file-magic /(\x31\xbe\x00\x00)/ +} + +# >0 string/b,=\3767\000# (len=4), ["Microsoft Office Document"], swap_endian=0 +signature file-magic-auto359 { + file-mime "application/msword", 70 + file-magic /(\xfe7\x00\x23)/ +} + +# >0 string/b,=\333\245-\000 (len=4), ["Microsoft WinWord 2.0 Document"], swap_endian=0 +signature file-magic-auto360 { + file-mime "application/msword", 70 + file-magic /(\xdb\xa5\x2d\x00)/ +} + +# >0 string/b,=\333\245-\000 (len=4), ["Microsoft WinWord 2.0 Document"], swap_endian=0 +signature file-magic-auto361 { + file-mime "application/msword", 70 + file-magic /(\xdb\xa5\x2d\x00)/ +} + +# >0 belong&,=6656 (0x00001a00), ["Lotus 1-2-3"], swap_endian=0 +signature file-magic-auto362 { + file-mime "application/x-123", 70 + file-magic /(\x00\x00\x1a\x00)/ +} + +# >0 belong&,=512 (0x00000200), ["Lotus 1-2-3"], swap_endian=0 +signature file-magic-auto363 { + file-mime "application/x-123", 70 + file-magic /(\x00\x00\x02\x00)/ +} + +# >0 string/b,=\000\000\001\000 (len=4), ["MS Windows icon resource"], swap_endian=0 +signature file-magic-auto364 { + file-mime "image/x-icon", 70 + file-magic /(\x00\x00\x01\x00)/ +} + +# >0 lelong&,=268435536 (0x10000050), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), ["database"], swap_endian=0 +# >>>8 lelong&,=268435588 (0x10000084), ["Agenda file"], swap_endian=0 +signature file-magic-auto365 { + file-mime "application/x-epoc-agenda", 70 + file-magic /(\x50\x00\x00\x10)(\x6d\x00\x00\x10)(\x84\x00\x00\x10)/ +} + +# >0 lelong&,=268435536 (0x10000050), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), ["database"], swap_endian=0 +# >>>8 lelong&,=268435590 (0x10000086), ["Data file"], swap_endian=0 +signature file-magic-auto366 { + file-mime "application/x-epoc-data", 70 + file-magic /(\x50\x00\x00\x10)(\x6d\x00\x00\x10)(\x86\x00\x00\x10)/ +} + +# >0 lelong&,=268435536 (0x10000050), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), ["database"], swap_endian=0 +# >>>8 lelong&,=268438762 (0x10000cea), ["Jotter file"], swap_endian=0 +signature file-magic-auto367 { + file-mime "application/x-epoc-jotter", 70 + file-magic /(\x50\x00\x00\x10)(\x6d\x00\x00\x10)(\xea\x0c\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435522 (0x10000042), ["multi-bitmap image"], swap_endian=0 +signature file-magic-auto368 { + file-mime "image/x-epoc-mbm", 70 + file-magic /(\x37\x00\x00\x10)(\x42\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), [""], swap_endian=0 +# >>>8 lelong&,=268435581 (0x1000007d), ["Sketch image"], swap_endian=0 +signature file-magic-auto369 { + file-mime "image/x-epoc-sketch", 70 + file-magic /(\x37\x00\x00\x10)(\x6d\x00\x00\x10)(\x7d\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), [""], swap_endian=0 +# >>>8 lelong&,=268435583 (0x1000007f), ["Word file"], swap_endian=0 +signature file-magic-auto370 { + file-mime "application/x-epoc-word", 70 + file-magic /(\x37\x00\x00\x10)(\x6d\x00\x00\x10)(\x7f\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), [""], swap_endian=0 +# >>>8 lelong&,=268435589 (0x10000085), ["OPL program (TextEd)"], swap_endian=0 +signature file-magic-auto371 { + file-mime "application/x-epoc-opl", 70 + file-magic /(\x37\x00\x00\x10)(\x6d\x00\x00\x10)(\x85\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435565 (0x1000006d), [""], swap_endian=0 +# >>>8 lelong&,=268435592 (0x10000088), ["Sheet file"], swap_endian=0 +signature file-magic-auto372 { + file-mime "application/x-epoc-sheet", 70 + file-magic /(\x37\x00\x00\x10)(\x6d\x00\x00\x10)(\x88\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435571 (0x10000073), ["OPO module"], swap_endian=0 +signature file-magic-auto373 { + file-mime "application/x-epoc-opo", 70 + file-magic /(\x37\x00\x00\x10)(\x73\x00\x00\x10)/ +} + +# >0 lelong&,=268435511 (0x10000037), ["Psion Series 5"], swap_endian=0 +# >>4 lelong&,=268435572 (0x10000074), ["OPL application"], swap_endian=0 +signature file-magic-auto374 { + file-mime "application/x-epoc-app", 70 + file-magic /(\x37\x00\x00\x10)(\x74\x00\x00\x10)/ +} + +# >0 long&,=398689 (0x00061561), ["Berkeley DB"], swap_endian=0 +signature file-magic-auto375 { + file-mime "application/x-dbm", 70 + file-magic /((\x61\x15\x06\x00)|(\x00\x06\x15\x61))/ +} + +# >0 string,=GDBM (len=4), ["GNU dbm 2.x database"], swap_endian=0 +signature file-magic-auto376 { + file-mime "application/x-gdbm", 70 + file-magic /(GDBM)/ +} + +# >0 lelong&,=324508366 (0x13579ace), ["GNU dbm 1.x or ndbm database, little endian"], swap_endian=0 +signature file-magic-auto377 { + file-mime "application/x-gdbm", 70 + file-magic /(\xce\x9a\x57\x13)/ +} + +# >0 belong&,=324508366 (0x13579ace), ["GNU dbm 1.x or ndbm database, big endian"], swap_endian=0 +signature file-magic-auto378 { + file-mime "application/x-gdbm", 70 + file-magic /(\x13\x57\x9a\xce)/ +} + +# >0 belong&,=4 (0x00000004), ["X11 SNF font data, MSB first"], swap_endian=0 +signature file-magic-auto379 { + file-mime "application/x-font-sfn", 70 + file-magic /(\x00\x00\x00\x04)/ +} + +# >0 string,=OTTO (len=4), ["OpenType font data"], swap_endian=0 +signature file-magic-auto380 { + file-mime "application/vnd.ms-opentype", 70 + file-magic /(OTTO)/ +} + +# >0 string,=0 lelong&,=407642370 (0x184c2102), ["LZ4 compressed data, legacy format"], swap_endian=0 +signature file-magic-auto382 { + file-mime "application/x-lz4", 70 + file-magic /(\x02\x21\x4c\x18)/ +} + +# >0 lelong&,=407708164 (0x184d2204), ["LZ4 compressed data"], swap_endian=0 +signature file-magic-auto383 { + file-mime "application/x-lz4", 70 + file-magic /(\x04\x22\x4d\x18)/ +} + +# >0 string,=LRZI (len=4), ["LRZIP compressed data"], swap_endian=0 +# >>5 byte&,x, [".%d"], swap_endian=0 +signature file-magic-auto384 { + file-mime "application/x-lrzip", 1 + file-magic /(LRZI)(.{1})(.{1})/ +} + +# >0 string,=OggS (len=4), ["Ogg data"], swap_endian=0 +signature file-magic-auto385 { + file-mime "application/ogg", 70 + file-magic /(OggS)/ +} + +# >0 string,=LZIP (len=4), ["lzip compressed data"], swap_endian=0 +signature file-magic-auto386 { + file-mime "application/x-lzip", 70 + file-magic /(LZIP)/ +} + +# >0 belong&,=-889270259 (0xcafed00d), ["JAR compressed with pack200,"], swap_endian=0 +# >>4 byte&,x, ["%d"], swap_endian=0 +signature file-magic-auto387 { + file-mime "application/x-java-pack200", 1 + file-magic /(\xca\xfe\xd0\x0d)(.{1})/ +} + +# >0 belong&,=-889270259 (0xcafed00d), ["JAR compressed with pack200,"], swap_endian=0 +# >>4 byte&,x, ["%d"], swap_endian=0 +signature file-magic-auto388 { + file-mime "application/x-java-pack200", 1 + file-magic /(\xca\xfe\xd0\x0d)(.{1})/ +} + +# >0 regex,=^( |\t){0,50}def {1,50}[a-zA-Z]{1,100} (len=38), [""], swap_endian=0 +# >>&0 regex,= {0,50}\(([a-zA-Z]|,| ){1,500}\):$ (len=34), ["Python script text executable"], swap_endian=0 +signature file-magic-auto389 { + file-mime "text/x-python", 64 + file-magic /(^( |\t){0,50}def {1,50}[a-zA-Z]{1,100})( {0,50}\(([a-zA-Z]|,| ){1,500}\):$)/ +} + +# >0 search/4096,=\documentstyle (len=14), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto390 { + file-mime "text/x-tex", 62 + file-magic /(.*)(\x5cdocumentstyle)/ +} + +# >0 string,=DOC (len=3), [""], swap_endian=0 +# >>43 byte&,=0x14, ["Just System Word Processor Ichitaro v4"], swap_endian=0 +signature file-magic-auto391 { + file-mime "application/x-ichitaro4", 40 + file-magic /(DOC)(.{40})([\x14])/ +} + +# >0 string,=DOC (len=3), [""], swap_endian=0 +# >>43 byte&,=0x15, ["Just System Word Processor Ichitaro v5"], swap_endian=0 +signature file-magic-auto392 { + file-mime "application/x-ichitaro5", 40 + file-magic /(DOC)(.{40})([\x15])/ +} + +# >1 string,=SaR (len=3), [""], swap_endian=0 +# >>0 string,=3 (len=1), ["Cups Raster version 3, Little Endian"], swap_endian=0 +signature file-magic-auto393 { + file-mime "application/vnd.cups-raster", 40 + file-magic /(3)(SaR)/ +} + +# >0 string,=RaS (len=3), [""], swap_endian=0 +# >>3 string,=3 (len=1), ["Cups Raster version 3, Big Endian"], swap_endian=0 +signature file-magic-auto394 { + file-mime "application/vnd.cups-raster", 40 + file-magic /(RaS)(3)/ +} + +# >0 string,=DOC (len=3), [""], swap_endian=0 +# >>43 byte&,=0x16, ["Just System Word Processor Ichitaro v6"], swap_endian=0 +signature file-magic-auto395 { + file-mime "application/x-ichitaro6", 40 + file-magic /(DOC)(.{40})([\x16])/ +} + +# >0 search/w/1,=#! /usr/local/bin/php (len=21), ["PHP script text executable"], swap_endian=0 +signature file-magic-auto396 { + file-mime "text/x-php", 61 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fphp)/ +} + +# >0 search/1,=eval '(exit $?0)' && eval 'exec (len=31), ["Perl script text"], swap_endian=0 +signature file-magic-auto397 { + file-mime "text/x-perl", 61 + file-magic /(.*)(eval \x27\x28exit \x24\x3f0\x29\x27 \x26\x26 eval \x27exec)/ +} + +# >0 regex,=^[ \t]*require[ \t]'[A-Za-z_/]+' (len=30), [""], swap_endian=0 +# >>0 regex,=include [A-Z]|def [a-z]| do$ (len=28), [""], swap_endian=0 +# >>>0 regex,=^[ \t]*end([ \t]*[;#].*)?$ (len=24), ["Ruby script text"], swap_endian=0 +signature file-magic-auto398 { + file-mime "text/x-ruby", 54 + file-magic /(^[ \x09]*require[ \x09]'[A-Za-z_\x2f]+')(include [A-Z]|def [a-z]| do$)(^[ \x09]*end([ \x09]*[;#].*)?$)/ +} + +# >0 search/1,=eval "exec /usr/local/bin/perl (len=30), ["Perl script text"], swap_endian=0 +signature file-magic-auto399 { + file-mime "text/x-perl", 60 + file-magic /(.*)(eval \x22exec \x2fusr\x2flocal\x2fbin\x2fperl)/ +} + +# >0 string,=FLV (len=3), ["Macromedia Flash Video"], swap_endian=0 +signature file-magic-auto400 { + file-mime "video/x-flv", 60 + file-magic /(FLV)/ +} + +# >0 string,=MP+ (len=3), ["Musepack audio"], swap_endian=0 +signature file-magic-auto401 { + file-mime "audio/x-musepack", 60 + file-magic /(MP\x2b)/ +} + +# >0 string,=PBF (len=3), ["PBF image (deflate compression)"], swap_endian=0 +signature file-magic-auto402 { + file-mime "image/x-unknown", 60 + file-magic /(PBF)/ +} + +# >0 string,=SBI (len=3), ["SoundBlaster instrument data"], swap_endian=0 +signature file-magic-auto403 { + file-mime "audio/x-unknown", 60 + file-magic /(SBI)/ +} + +# >0 string/b,=\224\246. (len=3), ["Microsoft Word Document"], swap_endian=0 +signature file-magic-auto404 { + file-mime "application/msword", 60 + file-magic /(\x94\xa6\x2e)/ +} + +# >0 string,=\004%! (len=3), ["PostScript document text"], swap_endian=0 +signature file-magic-auto405 { + file-mime "application/postscript", 60 + file-magic /(\x04\x25\x21)/ +} + +# >0 string,=BZh (len=3), ["bzip2 compressed data"], swap_endian=0 +signature file-magic-auto406 { + file-mime "application/x-bzip2", 60 + file-magic /(BZh)/ +} + +# >0 regex,=^[ \t]*(class|module)[ \t][A-Z] (len=29), [""], swap_endian=0 +# >>0 regex,=(modul|includ)e [A-Z]|def [a-z] (len=31), [""], swap_endian=0 +# >>>0 regex,=^[ \t]*end([ \t]*[;#].*)?$ (len=24), ["Ruby module source text"], swap_endian=0 +signature file-magic-auto407 { + file-mime "text/x-ruby", 54 + file-magic /(^[ \x09]*(class|module)[ \x09][A-Z])((modul|includ)e [A-Z]|def [a-z])(^[ \x09]*end([ \x09]*[;#].*)?$)/ +} + +# >512 string/b,=\354\245\301 (len=3), ["Microsoft Word Document"], swap_endian=0 +signature file-magic-auto408 { + file-mime "application/msword", 60 + file-magic /(.{512})(\xec\xa5\xc1)/ +} + +# >0 string,=FWS (len=3), ["Macromedia Flash data,"], swap_endian=0 +# >>3 byte&,x, ["version %d"], swap_endian=0 +signature file-magic-auto409 { + file-mime "application/x-shockwave-flash", 1 + file-magic /(FWS)(.{1})/ +} + +# >0 string,=CWS (len=3), ["Macromedia Flash data (compressed),"], swap_endian=0 +signature file-magic-auto410 { + file-mime "application/x-shockwave-flash", 60 + file-magic /(CWS)/ +} + +# >0 regex/20,=^\.[A-Za-z0-9][A-Za-z0-9][ \t] (len=29), ["troff or preprocessor input text"], swap_endian=0 +signature file-magic-auto411 { + file-mime "text/troff", 59 + file-magic /(^\.[A-Za-z0-9][A-Za-z0-9][ \x09])/ +} + +# >0 search/4096,=\documentclass (len=14), ["LaTeX 2e document text"], swap_endian=0 +signature file-magic-auto412 { + file-mime "text/x-tex", 59 + file-magic /(.*)(\x5cdocumentclass)/ +} + +# >0 regex,=^from\s+(\w|\.)+\s+import.*$ (len=28), ["Python script text executable"], swap_endian=0 +signature file-magic-auto413 { + file-mime "text/x-python", 58 + file-magic /(^from\s+(\w|\.)+\s+import.*$)/ +} + +# >0 search/4096,=\contentsline (len=13), ["LaTeX table of contents"], swap_endian=0 +signature file-magic-auto414 { + file-mime "text/x-tex", 58 + file-magic /(.*)(\x5ccontentsline)/ +} + +# >0 search/4096,=\chapter (len=8), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto415 { + file-mime "text/x-tex", 56 + file-magic /(.*)(\x5cchapter)/ +} + +# >0 search/4096,=\section (len=8), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto416 { + file-mime "text/x-tex", 56 + file-magic /(.*)(\x5csection)/ +} + +# >0 regex/20,=^\.[A-Za-z0-9][A-Za-z0-9]$ (len=26), ["troff or preprocessor input text"], swap_endian=0 +signature file-magic-auto417 { + file-mime "text/troff", 56 + file-magic /(^\.[A-Za-z0-9][A-Za-z0-9]$)/ +} + +# >0 search/w/1,=#! /usr/bin/php (len=15), ["PHP script text executable"], swap_endian=0 +signature file-magic-auto418 { + file-mime "text/x-php", 55 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2fphp)/ +} + +# >0 search/4096,=\setlength (len=10), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto419 { + file-mime "text/x-tex", 55 + file-magic /(.*)(\x5csetlength)/ +} + +# >0 search/1,=eval "exec /usr/bin/perl (len=24), ["Perl script text"], swap_endian=0 +signature file-magic-auto420 { + file-mime "text/x-perl", 54 + file-magic /(.*)(eval \x22exec \x2fusr\x2fbin\x2fperl)/ +} + +# >0 search/w/1,=#! /usr/local/bin/python (len=24), ["Python script text executable"], swap_endian=0 +signature file-magic-auto421 { + file-mime "text/x-python", 54 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fpython)/ +} + +# >0 search/1,=Common subdirectories: (len=23), ["diff output text"], swap_endian=0 +signature file-magic-auto422 { + file-mime "text/x-diff", 53 + file-magic /(.*)(Common subdirectories\x3a )/ +} + +# >0 search/1,=#! /usr/bin/env python (len=22), ["Python script text executable"], swap_endian=0 +signature file-magic-auto423 { + file-mime "text/x-python", 52 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv python)/ +} + +# >0 search/w/1,=#! /usr/local/bin/ruby (len=22), ["Ruby script text executable"], swap_endian=0 +signature file-magic-auto424 { + file-mime "text/x-ruby", 52 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fruby)/ +} + +# >0 search/w/1,=#! /usr/local/bin/wish (len=22), ["Tcl/Tk script text executable"], swap_endian=0 +signature file-magic-auto425 { + file-mime "text/x-tcl", 52 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2fwish)/ +} + +# >0 search/4096,=(custom-set-variables (len=22), ["Lisp/Scheme program text"], swap_endian=0 +signature file-magic-auto426 { + file-mime "text/x-lisp", 52 + file-magic /(.*)(\x28custom\x2dset\x2dvariables )/ +} + +# >0 beshort&,=-40 (0xffd8), ["JPEG image data"], swap_endian=0 +signature file-magic-auto427 { + file-mime "image/jpeg", 52 + file-magic /(\xff\xd8)/ +} + +# >0 search/1,=#!/usr/bin/env python (len=21), ["Python script text executable"], swap_endian=0 +signature file-magic-auto428 { + file-mime "text/x-python", 51 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv python)/ +} + +# >0 search/1,=#!/usr/bin/env nodejs (len=21), ["Node.js script text executable"], swap_endian=0 +signature file-magic-auto429 { + file-mime "application/javascript", 51 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv nodejs)/ +} + +# >0 search/w/1,=#! /usr/local/bin/tcl (len=21), ["Tcl script text executable"], swap_endian=0 +signature file-magic-auto430 { + file-mime "text/x-tcl", 51 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2ftcl)/ +} + +# This didn't autogenerate well due to indirect offset, bitmasking, and +# relational comparisons. +# >0 leshort&fffffffffffffefe,=0 (0x0000), [""], swap_endian=0 +# >>4 ulelong&fcfffe00,=0 (0x00000000), [""], swap_endian=0 +# >>>68 ulelong&,>87 (0x00000057), [""], swap_endian=0 +# >>>>68 (lelong,-1), ubelong&ffe0c519,=4194328 (0x00400018), ["Windows Precompiled iNF"], swap_endian=0 +#signature file-magic-auto431 { +# file-mime "application/x-pnf", 70 +# file-magic /(.{2})(.{2})(.{4})(.{60})(.{4})(.{4})/ +#} + +# >0 search/w/1,=#! /usr/local/bin/lua (len=21), ["Lua script text executable"], swap_endian=0 +signature file-magic-auto432 { + file-mime "text/x-lua", 51 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2flocal\x2fbin\x2flua)/ +} + +# >0 string/b,=MZ (len=2), [""], swap_endian=0 +signature file-magic-auto433 { + file-mime "application/x-dosexec", 51 + file-magic /(MZ)/ +} + +# >0 string/b,=MZ (len=2), [""], swap_endian=0 +# >>30 string,=Copyright 1989-1990 PKWARE Inc. (len=31), ["Self-extracting PKZIP archive"], swap_endian=0 +signature file-magic-auto434 { + file-mime "application/zip", 340 + file-magic /(MZ)(.{28})(Copyright 1989\x2d1990 PKWARE Inc\x2e)/ +} + +# >0 string/b,=MZ (len=2), [""], swap_endian=0 +# >>30 string,=PKLITE Copr. (len=12), ["Self-extracting PKZIP archive"], swap_endian=0 +signature file-magic-auto435 { + file-mime "application/zip", 150 + file-magic /(MZ)(.{28})(PKLITE Copr\x2e)/ +} + +# >0 string/b,=MZ (len=2), [""], swap_endian=0 +# >>36 string,=LHa's SFX (len=9), [", LHa self-extracting archive"], swap_endian=0 +signature file-magic-auto436 { + file-mime "application/x-lha", 120 + file-magic /(MZ)(.{34})(LHa\x27s SFX)/ +} + +# >0 string/b,=MZ (len=2), [""], swap_endian=0 +# >>36 string,=LHA's SFX (len=9), [", LHa self-extracting archive"], swap_endian=0 +signature file-magic-auto437 { + file-mime "application/x-lha", 120 + file-magic /(MZ)(.{34})(LHA\x27s SFX)/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x10, ["MPEG ADTS, layer III, v1, 32 kbps"], swap_endian=0 +signature file-magic-auto438 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x20, ["MPEG ADTS, layer III, v1, 40 kbps"], swap_endian=0 +signature file-magic-auto439 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x30, ["MPEG ADTS, layer III, v1, 48 kbps"], swap_endian=0 +signature file-magic-auto440 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x40, ["MPEG ADTS, layer III, v1, 56 kbps"], swap_endian=0 +signature file-magic-auto441 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x50, ["MPEG ADTS, layer III, v1, 64 kbps"], swap_endian=0 +signature file-magic-auto442 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x60, ["MPEG ADTS, layer III, v1, 80 kbps"], swap_endian=0 +signature file-magic-auto443 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x70, ["MPEG ADTS, layer III, v1, 96 kbps"], swap_endian=0 +signature file-magic-auto444 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x80, ["MPEG ADTS, layer III, v1, 112 kbps"], swap_endian=0 +signature file-magic-auto445 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0x90, ["MPEG ADTS, layer III, v1, 128 kbps"], swap_endian=0 +signature file-magic-auto446 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0xa0, ["MPEG ADTS, layer III, v1, 160 kbps"], swap_endian=0 +signature file-magic-auto447 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0xb0, ["MPEG ADTS, layer III, v1, 192 kbps"], swap_endian=0 +signature file-magic-auto448 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0xc0, ["MPEG ADTS, layer III, v1, 224 kbps"], swap_endian=0 +signature file-magic-auto449 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0xd0, ["MPEG ADTS, layer III, v1, 256 kbps"], swap_endian=0 +signature file-magic-auto450 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf])/ +} + +# >0 beshort&fffffffffffffffe,=-6 (0xfffa), [""], swap_endian=0 +# >>2 byte&fffffffffffffff0,=0xe0, ["MPEG ADTS, layer III, v1, 320 kbps"], swap_endian=0 +signature file-magic-auto451 { + file-mime "audio/mpeg", 40 + file-magic /(\xff[\xfa\xfb])([\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef])/ +} + +# >4 leshort&,=-20719 (0xaf11), [""], swap_endian=0 +# >>8 leshort&,=320 (0x0140), [""], swap_endian=0 +# >>>10 leshort&,=200 (0x00c8), [""], swap_endian=0 +# >>>>12 leshort&,=8 (0x0008), ["FLI animation, 320x200x8"], swap_endian=0 +signature file-magic-auto452 { + file-mime "video/x-fli", 50 + file-magic /(.{4})(\x11\xaf)(.{2})(\x40\x01)(\xc8\x00)(\x08\x00)/ +} + +# >4 leshort&,=-20718 (0xaf12), [""], swap_endian=0 +# >>12 leshort&,=8 (0x0008), ["FLC animation"], swap_endian=0 +signature file-magic-auto453 { + file-mime "video/x-flc", 50 + file-magic /(.{4})(\x12\xaf)(.{6})(\x08\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=12 (0x000c), ["PC bitmap, OS/2 1.x format"], swap_endian=0 +signature file-magic-auto454 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x0c\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=64 (0x0040), ["PC bitmap, OS/2 2.x format"], swap_endian=0 +signature file-magic-auto455 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x40\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=40 (0x0028), ["PC bitmap, Windows 3.x format"], swap_endian=0 +signature file-magic-auto456 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x28\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=124 (0x007c), ["PC bitmap, Windows 98/2000 and newer format"], swap_endian=0 +signature file-magic-auto457 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x7c\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=108 (0x006c), ["PC bitmap, Windows 95/NT4 and newer format"], swap_endian=0 +signature file-magic-auto458 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x6c\x00)/ +} + +# >0 string,=BM (len=2), [""], swap_endian=0 +# >>14 leshort&,=128 (0x0080), ["PC bitmap, Windows NT/2000 format"], swap_endian=0 +signature file-magic-auto459 { + file-mime "image/x-ms-bmp", 50 + file-magic /(BM)(.{12})(\x80\x00)/ +} + +# >20 string,=45 (len=2), [""], swap_endian=0 +# >>0 regex/1,=(^[0-9]{5})[acdnp][^bhlnqsu-z] (len=30), ["MARC21 Bibliographic"], swap_endian=0 +signature file-magic-auto460 { + file-mime "application/marc", 60 + file-magic /(.{20})(45)(.*)((^[0-9]{5})[acdnp][^bhlnqsu-z])/ +} + +# >20 string,=45 (len=2), [""], swap_endian=0 +# >>0 regex/1,=(^[0-9]{5})[acdnosx][z] (len=23), ["MARC21 Authority"], swap_endian=0 +signature file-magic-auto461 { + file-mime "application/marc", 53 + file-magic /(.{20})(45)(.*)((^[0-9]{5})[acdnosx][z])/ +} + +# >20 string,=45 (len=2), [""], swap_endian=0 +# >>0 regex/1,=(^[0-9]{5})[cdn][uvxy] (len=22), ["MARC21 Holdings"], swap_endian=0 +signature file-magic-auto462 { + file-mime "application/marc", 52 + file-magic /(.{20})(45)(.*)((^[0-9]{5})[cdn][uvxy])/ +} + +# >0 search/4096,=\relax (len=6), ["LaTeX auxiliary file"], swap_endian=0 +signature file-magic-auto463 { + file-mime "text/x-tex", 51 + file-magic /(.*)(\x5crelax)/ +} + +# >0 search/4096,=\begin (len=6), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto464 { + file-mime "text/x-tex", 51 + file-magic /(.*)(\x5cbegin)/ +} + +# >0 search/4096,=\input (len=6), ["TeX document text"], swap_endian=0 +signature file-magic-auto465 { + file-mime "text/x-tex", 51 + file-magic /(.*)(\x5cinput)/ +} + +# >0 leshort&,=-24712 (0x9f78), ["TNEF"], swap_endian=0 +signature file-magic-auto466 { + file-mime "application/vnd.ms-tnef", 50 + file-magic /(\x78\x9f)/ +} + +# >0 leshort&,=-5536 (0xea60), ["ARJ archive data"], swap_endian=0 +signature file-magic-auto467 { + file-mime "application/x-arj", 50 + file-magic /(\x60\xea)/ +} + +# >0 search/1,=eval "exec /bin/perl (len=20), ["Perl script text"], swap_endian=0 +signature file-magic-auto468 { + file-mime "text/x-perl", 50 + file-magic /(.*)(eval \x22exec \x2fbin\x2fperl)/ +} + +# >0 search/1,=#! /usr/bin/env perl (len=20), ["Perl script text executable"], swap_endian=0 +signature file-magic-auto469 { + file-mime "text/x-perl", 50 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv perl)/ +} + +# >0 beshort&,=-26368 (0x9900), ["PGP key public ring"], swap_endian=0 +signature file-magic-auto470 { + file-mime "application/x-pgp-keyring", 50 + file-magic /(\x99\x00)/ +} + +# >0 beshort&,=-27391 (0x9501), ["PGP key security ring"], swap_endian=0 +signature file-magic-auto471 { + file-mime "application/x-pgp-keyring", 50 + file-magic /(\x95\x01)/ +} + +# >0 beshort&,=-27392 (0x9500), ["PGP key security ring"], swap_endian=0 +signature file-magic-auto472 { + file-mime "application/x-pgp-keyring", 50 + file-magic /(\x95\x00)/ +} + +# >0 beshort&,=-23040 (0xa600), ["PGP encrypted data"], swap_endian=0 +signature file-magic-auto473 { + file-mime "text/PGP", 50 + file-magic /(\xa6\x00)/ +} + +# >0 string,=%! (len=2), ["PostScript document text"], swap_endian=0 +signature file-magic-auto474 { + file-mime "application/postscript", 50 + file-magic /(\x25\x21)/ +} + +# >0 search/1,=#! /usr/bin/env ruby (len=20), ["Ruby script text executable"], swap_endian=0 +signature file-magic-auto475 { + file-mime "text/x-ruby", 50 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv ruby)/ +} + +# >0 regex/1,=(^[0-9]{5})[acdn][w] (len=20), ["MARC21 Classification"], swap_endian=0 +signature file-magic-auto476 { + file-mime "application/marc", 50 + file-magic /((^[0-9]{5})[acdn][w])/ +} + +# >0 regex/1,=(^[0-9]{5})[acdn][w] (len=20), ["MARC21 Classification"], swap_endian=0 +# >>0 regex/1,=(^[0-9]{5})[cdn][q] (len=19), ["MARC21 Community"], swap_endian=0 +signature file-magic-auto477 { + file-mime "application/marc", 49 + file-magic /((^[0-9]{5})[acdn][w])((^[0-9]{5})[cdn][q])/ +} + +# >0 regex/1,=(^[0-9]{5})[acdn][w] (len=20), ["MARC21 Classification"], swap_endian=0 +# >>0 regex/1,=(^.{21})([^0]{2}) (len=17), ["(non-conforming)"], swap_endian=0 +signature file-magic-auto478 { + file-mime "application/marc", 47 + file-magic /((^[0-9]{5})[acdn][w])((^.{21})([^0]{2}))/ +} + +# >0 short&,=-14479 (0xc771), ["byte-swapped cpio archive"], swap_endian=0 +signature file-magic-auto479 { + file-mime "application/x-cpio", 50 + file-magic /((\x71\xc7)|(\xc7\x71))/ +} + +# >0 short&,=29127 (0x71c7), ["cpio archive"], swap_endian=0 +signature file-magic-auto480 { + file-mime "application/x-cpio", 50 + file-magic /((\xc7\x71)|(\x71\xc7))/ +} + +# >0 string,=\n( (len=2), ["Emacs v18 byte-compiled Lisp data"], swap_endian=0 +signature file-magic-auto481 { + file-mime "application/x-elc", 50 + file-magic /(\x0a\x28)/ +} + +# >0 string,=\021\t (len=2), ["Award BIOS Logo, 136 x 126"], swap_endian=0 +signature file-magic-auto482 { + file-mime "image/x-award-bioslogo", 50 + file-magic /(\x11\x09)/ +} + +# >0 string,=\021\006 (len=2), ["Award BIOS Logo, 136 x 84"], swap_endian=0 +signature file-magic-auto483 { + file-mime "image/x-award-bioslogo", 50 + file-magic /(\x11\x06)/ +} + +# >0 string,=P7 (len=2), ["Netpbm PAM image file"], swap_endian=0 +signature file-magic-auto484 { + file-mime "image/x-portable-pixmap", 50 + file-magic /(P7)/ +} + +# >0 beshort&ffffffffffffffe0,=22240 (0x56e0), ["MPEG-4 LOAS"], swap_endian=0 +signature file-magic-auto485 { + file-mime "audio/x-mp4a-latm", 50 + file-magic /(\x56[\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 beshort&fffffffffffffff6,=-16 (0xfff0), ["MPEG ADTS, AAC"], swap_endian=0 +signature file-magic-auto486 { + file-mime "audio/x-hx-aac-adts", 50 + file-magic /(\xff[\xf0\xf1\xf8\xf9])/ +} + +# >0 beshort&fffffffffffffffe,=-30 (0xffe2), ["MPEG ADTS, layer III, v2.5"], swap_endian=0 +signature file-magic-auto487 { + file-mime "audio/mpeg", 50 + file-magic /(\xff[\xe2\xe3])/ +} + +# >0 beshort&fffffffffffffffe,=-10 (0xfff6), ["MPEG ADTS, layer I, v2"], swap_endian=0 +signature file-magic-auto488 { + file-mime "audio/mpeg", 50 + file-magic /(\xff[\xf6\xf7])/ +} + +# >0 beshort&fffffffffffffffe,=-14 (0xfff2), ["MPEG ADTS, layer III, v2"], swap_endian=0 +signature file-magic-auto489 { + file-mime "audio/mpeg", 50 + file-magic /(\xff[\xf2\xf3])/ +} + +# >0 beshort&fffffffffffffffe,=-4 (0xfffc), ["MPEG ADTS, layer II, v1"], swap_endian=0 +signature file-magic-auto490 { + file-mime "audio/mpeg", 50 + file-magic /(\xff[\xfc\xfd])/ +} + +# >0 search/1,=#! /usr/bin/env wish (len=20), ["Tcl/Tk script text executable"], swap_endian=0 +signature file-magic-auto491 { + file-mime "text/x-tcl", 50 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv wish)/ +} + +# >0 beshort&,=-26367 (0x9901), ["GPG key public ring"], swap_endian=0 +signature file-magic-auto492 { + file-mime "application/x-gnupg-keyring", 50 + file-magic /(\x99\x01)/ +} + +# >0 string,=\367\002 (len=2), ["TeX DVI file"], swap_endian=0 +signature file-magic-auto493 { + file-mime "application/x-dvi", 50 + file-magic /(\xf7\x02)/ +} + +# >2 string,=\000\021 (len=2), ["TeX font metric data"], swap_endian=0 +signature file-magic-auto494 { + file-mime "application/x-tex-tfm", 50 + file-magic /(.{2})(\x00\x11)/ +} + +# >2 string,=\000\022 (len=2), ["TeX font metric data"], swap_endian=0 +signature file-magic-auto495 { + file-mime "application/x-tex-tfm", 50 + file-magic /(.{2})(\x00\x12)/ +} + +# >0 beshort&,=-31486 (0x8502), ["GPG encrypted data"], swap_endian=0 +signature file-magic-auto496 { + file-mime "text/PGP", 50 + file-magic /(\x85\x02)/ +} + +# >4 string/W,=jP (len=2), ["JPEG 2000 image"], swap_endian=0 +signature file-magic-auto497 { + file-mime "image/jp2", 50 + file-magic /(.{4})(jP)/ +} + +# >0 regex,=^template[ \t\n]+ (len=15), ["C++ source text"], swap_endian=0 +signature file-magic-auto498 { + file-mime "text/x-c++", 50 + file-magic /(^template[ \x09\x0a]+)/ +} + +# >0 search/c/1,=0 string,=\037\235 (len=2), ["compress'd data"], swap_endian=0 +signature file-magic-auto500 { + file-mime "application/x-compress", 50 + file-magic /(\x1f\x9d)/ +} + +# >0 string,=\037\036 (len=2), ["packed data"], swap_endian=0 +signature file-magic-auto501 { + file-mime "application/octet-stream", 50 + file-magic /(\x1f\x1e)/ +} + +# >0 short&,=7967 (0x1f1f), ["old packed data"], swap_endian=0 +signature file-magic-auto502 { + file-mime "application/octet-stream", 50 + file-magic /((\x1f\x1f)|(\x1f\x1f))/ +} + +# >0 short&,=8191 (0x1fff), ["compacted data"], swap_endian=0 +signature file-magic-auto503 { + file-mime "application/octet-stream", 50 + file-magic /((\xff\x1f)|(\x1f\xff))/ +} + +# >0 string,=\377\037 (len=2), ["compacted data"], swap_endian=0 +signature file-magic-auto504 { + file-mime "application/octet-stream", 50 + file-magic /(\xff\x1f)/ +} + +# >0 short&,=-13563 (0xcb05), ["huf output"], swap_endian=0 +signature file-magic-auto505 { + file-mime "application/octet-stream", 50 + file-magic /((\x05\xcb)|(\xcb\x05))/ +} + +# >34 string,=LP (len=2), ["Embedded OpenType (EOT)"], swap_endian=0 +signature file-magic-auto506 { + file-mime "application/vnd.ms-fontobject", 50 + file-magic /(.{34})(LP)/ +} + +# >0 beshort&,=2935 (0x0b77), ["ATSC A/52 aka AC-3 aka Dolby Digital stream,"], swap_endian=0 +signature file-magic-auto507 { + file-mime "audio/vnd.dolby.dd-raw", 50 + file-magic /(\x0b\x77)/ +} + +# >0 search/1,=#!/usr/bin/env node (len=19), ["Node.js script text executable"], swap_endian=0 +signature file-magic-auto508 { + file-mime "application/javascript", 49 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv node)/ +} + +# >0 search/1,=#!/usr/bin/env wish (len=19), ["Tcl/Tk script text executable"], swap_endian=0 +signature file-magic-auto509 { + file-mime "text/x-tcl", 49 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv wish)/ +} + +# >0 regex,=^[ \t]{0,50}\.asciiz (len=19), ["assembler source text"], swap_endian=0 +signature file-magic-auto510 { + file-mime "text/x-asm", 49 + file-magic /(^[ \x09]{0,50}\.asciiz)/ +} + +# >0 search/1,=#!/usr/bin/env perl (len=19), ["Perl script text executable"], swap_endian=0 +signature file-magic-auto511 { + file-mime "text/x-perl", 49 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv perl)/ +} + +# >0 search/Wct/4096,=0 regex,=^virtual[ \t\n]+ (len=14), ["C++ source text"], swap_endian=0 +signature file-magic-auto513 { + file-mime "text/x-c++", 49 + file-magic /(^virtual[ \x09\x0a]+)/ +} + +# >0 search/1,=#! /usr/bin/env lua (len=19), ["Lua script text executable"], swap_endian=0 +signature file-magic-auto514 { + file-mime "text/x-lua", 49 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv lua)/ +} + +# >0 search/1,=#!/usr/bin/env ruby (len=19), ["Ruby script text executable"], swap_endian=0 +signature file-magic-auto515 { + file-mime "text/x-ruby", 49 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv ruby)/ +} + +# >0 search/1,=#! /usr/bin/env tcl (len=19), ["Tcl script text executable"], swap_endian=0 +signature file-magic-auto516 { + file-mime "text/x-tcl", 49 + file-magic /(.*)(\x23\x21 \x2fusr\x2fbin\x2fenv tcl)/ +} + +# >0 regex,=^[ \t]{0,50}\.globl (len=18), ["assembler source text"], swap_endian=0 +signature file-magic-auto517 { + file-mime "text/x-asm", 48 + file-magic /(^[ \x09]{0,50}\.globl)/ +} + +# >0 search/1,=#!/usr/bin/env tcl (len=18), ["Tcl script text executable"], swap_endian=0 +signature file-magic-auto518 { + file-mime "text/x-tcl", 48 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv tcl)/ +} + +# >0 search/1,=#!/usr/bin/env lua (len=18), ["Lua script text executable"], swap_endian=0 +signature file-magic-auto519 { + file-mime "text/x-lua", 48 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fenv lua)/ +} + +# >0 search/w/1,=#! /usr/bin/python (len=18), ["Python script text executable"], swap_endian=0 +signature file-magic-auto520 { + file-mime "text/x-python", 48 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2fpython)/ +} + +# >0 search/w/1,=#!/usr/bin/nodejs (len=17), ["Node.js script text executable"], swap_endian=0 +signature file-magic-auto521 { + file-mime "application/javascript", 47 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fnodejs)/ +} + +# >0 regex,=^class[ \t\n]+ (len=12), ["C++ source text"], swap_endian=0 +signature file-magic-auto522 { + file-mime "text/x-c++", 47 + file-magic /(^class[ \x09\x0a]+)/ +} + +# >0 regex,=^[ \t]{0,50}\.text (len=17), ["assembler source text"], swap_endian=0 +signature file-magic-auto523 { + file-mime "text/x-asm", 47 + file-magic /(^[ \x09]{0,50}\.text)/ +} + +# >0 regex,=^[ \t]{0,50}\.even (len=17), ["assembler source text"], swap_endian=0 +signature file-magic-auto524 { + file-mime "text/x-asm", 47 + file-magic /(^[ \x09]{0,50}\.even)/ +} + +# >0 regex,=^[ \t]{0,50}\.byte (len=17), ["assembler source text"], swap_endian=0 +signature file-magic-auto525 { + file-mime "text/x-asm", 47 + file-magic /(^[ \x09]{0,50}\.byte)/ +} + +# >0 regex,=^[ \t]{0,50}\.file (len=17), ["assembler source text"], swap_endian=0 +signature file-magic-auto526 { + file-mime "text/x-asm", 47 + file-magic /(^[ \x09]{0,50}\.file)/ +} + +# >0 regex,=^[ \t]{0,50}\.type (len=17), ["assembler source text"], swap_endian=0 +signature file-magic-auto527 { + file-mime "text/x-asm", 47 + file-magic /(^[ \x09]{0,50}\.type)/ +} + +# >0 search/1,=This is Info file (len=17), ["GNU Info text"], swap_endian=0 +signature file-magic-auto528 { + file-mime "text/x-info", 47 + file-magic /(.*)(This is Info file)/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(autorun)]\r\n (len=13), [""], swap_endian=0 +# >>>>&0 ubyte&,=0x5b, ["INItialization configuration"], swap_endian=0 +signature file-magic-auto529 { + file-mime "application/x-wine-extension-ini", 40 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([aA][uU][tT][oO][rR][uU][nN])]\x0d\x0a)([\x5b])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(autorun)]\r\n (len=13), [""], swap_endian=0 +# >>>>&0 ubyte&,!0x5b, ["Microsoft Windows Autorun file"], swap_endian=0 +signature file-magic-auto530 { + file-mime "application/x-setupscript", 1 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([aA][uU][tT][oO][rR][uU][nN])]\x0d\x0a)([\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(version|strings)] (len=19), ["Windows setup INFormation"], swap_endian=0 +signature file-magic-auto531 { + file-mime "application/x-setupscript", 49 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([vV][eE][rR][sS][iI][oO][nN]|[sS][tT][rR][iI][nN][gG][sS])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(WinsockCRCList|OEMCPL)] (len=25), ["Windows setup INFormation"], swap_endian=0 +signature file-magic-auto532 { + file-mime "text/inf", 55 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([Ww][iI][nN][sS][oO][cC][kK][Cc][Rr][Cc][Ll][iI][sS][tT]|[Oo][Ee][Mm][Cc][Pp][Ll])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(.ShellClassInfo|DeleteOnCopy|LocalizedFileNames)] (len=51), ["Windows desktop.ini"], swap_endian=0 +signature file-magic-auto533 { + file-mime "application/x-wine-extension-ini", 81 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^(.[Ss][hH][eE][lL][lL][Cc][lL][aA][sS][sS][Ii][nN][fF][oO]|[Dd][eE][lL][eE][tT][eE][Oo][nN][Cc][oO][pP][yY]|[Ll][oO][cC][aA][lL][iI][zZ][eE][dD][Ff][iI][lL][eE][Nn][aA][mM][eE][sS])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(don't load)] (len=14), ["Windows CONTROL.INI"], swap_endian=0 +signature file-magic-auto534 { + file-mime "application/x-wine-extension-ini", 44 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([dD][oO][nN]'[tT] [lL][oO][aA][dD])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(ndishlp\$|protman\$|NETBEUI\$)] (len=33), ["Windows PROTOCOL.INI"], swap_endian=0 +signature file-magic-auto535 { + file-mime "application/x-wine-extension-ini", 63 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([nN][dD][iI][sS][hH][lL][pP]\$|[pP][rR][oO][tT][mM][aA][nN]\$|[Nn][Ee][Tt][Bb][Ee][Uu][Ii]\$)])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(windows|Compatibility|embedding)] (len=35), ["Windows WIN.INI"], swap_endian=0 +signature file-magic-auto536 { + file-mime "application/x-wine-extension-ini", 65 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([wW][iI][nN][dD][oO][wW][sS]|[Cc][oO][mM][pP][aA][tT][iI][bB][iI][lL][iI][tT][yY]|[eE][mM][bB][eE][dD][dD][iI][nN][gG])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(boot|386enh|drivers)] (len=23), ["Windows SYSTEM.INI"], swap_endian=0 +signature file-magic-auto537 { + file-mime "application/x-wine-extension-ini", 53 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([bB][oO][oO][tT]|386[eE][nN][hH]|[dD][rR][iI][vV][eE][rR][sS])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(SafeList)] (len=12), ["Windows IOS.INI"], swap_endian=0 +signature file-magic-auto538 { + file-mime "application/x-wine-extension-ini", 42 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([Ss][aA][fF][eE][Ll][iI][sS][tT])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 regex/c,=^(boot loader)] (len=15), ["Windows boot.ini"], swap_endian=0 +signature file-magic-auto539 { + file-mime "application/x-wine-extension-ini", 45 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(^([bB][oO][oO][tT] [lL][oO][aA][dD][eE][rR])])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 ubequad&ffdfffdfffdfffdf,=24207144355233875 (0x0056004500520053), [""], swap_endian=0 +# >>>>&0 ubequad&ffdfffdfffdfffff,=20548012607406173 (0x0049004f004e005d), ["Windows setup INFormation "], swap_endian=0 +signature file-magic-auto540 { + file-mime "application/x-setupscript", 110 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(\x00[\x56\x76]\x00[\x45\x65]\x00[\x52\x72]\x00[\x53\x73])(\x00[\x49\x69]\x00[\x4f\x6f]\x00[\x4e\x6e]\x00\x5d)/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 ubequad&ffdfffdfffdfffdf,=23362783849611337 (0x0053005400520049), [""], swap_endian=0 +# >>>>&0 ubequad&ffdfffdfffdfffff,=21955353131548765 (0x004e00470053005d), ["Windows setup INFormation "], swap_endian=0 +signature file-magic-auto541 { + file-mime "application/x-setupscript", 110 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(\x00[\x53\x73]\x00[\x54\x74]\x00[\x52\x72]\x00[\x49\x69)(\x00[\x4e\x6e]\x00[\x47\x67]\x00[\x53\x73]\x00\x5d)/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 default&,x, [""], swap_endian=0 +# >>>>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>>>&0 string/c,=version (len=7), ["Windows setup INFormation "], swap_endian=0 +signature file-magic-auto542 { + file-mime "application/x-setupscript", 100 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(.*)(\x5b)([vV][eE][rR][sS][iI][oO][nN])/ +} + +# >0 regex/s,=\`(\r\n|;|[[]|\377\376) (len=15), [""], swap_endian=0 +# >>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>&0 default&,x, [""], swap_endian=0 +# >>>>&0 search/8192,=[ (len=1), [""], swap_endian=0 +# >>>>>&0 ubequad&ffdfffdfffdfffdf,=24207144355233875 (0x0056004500520053), [""], swap_endian=0 +# >>>>>>&0 ubequad&ffdfffdfffdfffff,=20548012607406173 (0x0049004f004e005d), ["Windows setup INFormation "], swap_endian=0 +signature file-magic-auto543 { + file-mime "application/x-setupscript", 110 + file-magic /(\`(\x0d\x0a|;|[[]|\xff\xfe))(.*)(\x5b)(.*)(\x5b)(\x00[\x56\x76]\x00[\x45\x65]\x00[\x52\x72]\x00[\x53\x73])(\x00[\x49\x69]\x00[\x4f\x6f]\x00[\x4e\x6e]\x00\x5d)/ +} + +# >0 search/1,=0 search/w/1,=#! /usr/bin/wish (len=16), ["Tcl/Tk script text executable"], swap_endian=0 +signature file-magic-auto545 { + file-mime "text/x-tcl", 46 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2fwish)/ +} + +# >0 search/w/1,=#! /usr/bin/ruby (len=16), ["Ruby script text executable"], swap_endian=0 +signature file-magic-auto546 { + file-mime "text/x-ruby", 46 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2fruby)/ +} + +# >0 search/w/1,=#! /usr/bin/lua (len=15), ["Lua script text executable"], swap_endian=0 +signature file-magic-auto547 { + file-mime "text/x-lua", 45 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2flua)/ +} + +# >0 search/w/1,=#! /usr/bin/tcl (len=15), ["Tcl script text executable"], swap_endian=0 +signature file-magic-auto548 { + file-mime "text/x-tcl", 45 + file-magic /(.*)(\x23\x21 ?\x2fusr\x2fbin\x2ftcl)/ +} + +# >0 search/wct/4096,=0 search/wct/4096,=0 search/w/1,=#!/usr/bin/node (len=15), ["Node.js script text executable"], swap_endian=0 +signature file-magic-auto551 { + file-mime "application/javascript", 45 + file-magic /(.*)(\x23\x21\x2fusr\x2fbin\x2fnode)/ +} + +# >0 search/wct/1,=0 search/1,=\input texinfo (len=14), ["Texinfo source text"], swap_endian=0 +signature file-magic-auto553 { + file-mime "text/x-texinfo", 44 + file-magic /(.*)(\x5cinput texinfo)/ +} + +# >0 regex,=^private: (len=9), ["C++ source text"], swap_endian=0 +signature file-magic-auto554 { + file-mime "text/x-c++", 44 + file-magic /(^private:)/ +} + +# >0 search/4096,=def __init__ (len=12), [""], swap_endian=0 +# >>&0 search/64,=self (len=4), ["Python script text executable"], swap_endian=0 +signature file-magic-auto555 { + file-mime "text/x-python", 38 + file-magic /(.*)(def \x5f\x5finit\x5f\x5f)(.*)(self)/ +} + +# >0 search/wct/4096,=0 regex,=^extern[ \t\n]+ (len=13), ["C source text"], swap_endian=0 +signature file-magic-auto557 { + file-mime "text/x-c", 43 + file-magic /(^extern[ \x09\x0a]+)/ +} + +# >0 search/4096,=% -*-latex-*- (len=13), ["LaTeX document text"], swap_endian=0 +signature file-magic-auto558 { + file-mime "text/x-tex", 43 + file-magic /(.*)(\x25 \x2d\x2a\x2dlatex\x2d\x2a\x2d)/ +} + +# >0 regex,=^double[ \t\n]+ (len=13), ["C source text"], swap_endian=0 +signature file-magic-auto559 { + file-mime "text/x-c", 43 + file-magic /(^double[ \x09\x0a]+)/ +} + +# >0 regex,=^struct[ \t\n]+ (len=13), ["C source text"], swap_endian=0 +signature file-magic-auto560 { + file-mime "text/x-c", 43 + file-magic /(^struct[ \x09\x0a]+)/ +} + +# >0 search/w/1,=#!/bin/nodejs (len=13), ["Node.js script text executable"], swap_endian=0 +signature file-magic-auto561 { + file-mime "application/javascript", 43 + file-magic /(.*)(\x23\x21\x2fbin\x2fnodejs)/ +} + +# >0 regex,=^public: (len=8), ["C++ source text"], swap_endian=0 +signature file-magic-auto562 { + file-mime "text/x-c++", 43 + file-magic /(^public:)/ +} + +# >0 search/wct/4096,=