// reqdumper - Requirement un-parsing (disassembly)
//
#include "reqdumper.h"
+#if TARGET_OS_OSX
#include <security_cdsa_utilities/cssmdata.h> // OID encoder
+#endif
#include <cstdarg>
namespace Security {
case opCertField:
print("certificate"); certSlot(); print("["); dotString(); print("]"); match();
break;
+ case opCertFieldDate:
+ print("certificate"); certSlot(); print("[");
+#if TARGET_OS_OSX
+ {
+ const unsigned char *data; size_t length;
+ getData(data, length);
+ print("timestamp.%s", CssmOid((unsigned char *)data, length).toOid().c_str());
+ }
+#endif
case opCertGeneric:
print("certificate"); certSlot(); print("[");
+#if TARGET_OS_OSX
{
const unsigned char *data; size_t length;
getData(data, length);
print("field.%s", CssmOid((unsigned char *)data, length).toOid().c_str());
}
+#endif
print("]"); match();
break;
case opCertPolicy:
print("certificate"); certSlot(); print("[");
+#if TARGET_OS_OSX
{
const unsigned char *data; size_t length;
getData(data, length);
print("policy.%s", CssmOid((unsigned char *)data, length).toOid().c_str());
}
+#endif
print("]"); match();
break;
case opTrustedCert:
case opPlatform:
print("platform = %d", get<int32_t>());
break;
+ case opNotarized:
+ print("notarized");
+ break;
+ case opLegacyDevID:
+ print("legacy");
+ break;
default:
if (op & opGenericFalse) {
print(" false /* opcode %d */", op & ~opFlagMask);
case matchExists:
print(" /* exists */");
break;
+ case matchAbsent:
+ print(" absent ");
+ break;
case matchEqual:
print(" = "); data();
break;
case matchGreaterThan:
print(" > "); data();
break;
+ case matchOn:
+ print(" = "); timestamp();
+ break;
+ case matchBefore:
+ print(" < "); timestamp();
+ break;
+ case matchAfter:
+ print(" > "); timestamp();
+ break;
+ case matchOnOrBefore:
+ print(" <= "); timestamp();
+ break;
+ case matchOnOrAfter:
+ print(" >= "); timestamp();
+ break;
default:
print("MATCH OPCODE %d NOT UNDERSTOOD", op);
break;
switch (bestMode) {
case isSimple:
- print("%.*s", length, data);
+ print("%.*s", (int)length, data);
break;
case isPrintable:
print("\"");
break;
}
}
+
+void Dumper::timestamp()
+{
+ CFAbsoluteTime at = static_cast<CFAbsoluteTime>(get<int64_t>());
+ CFRef<CFDateRef> date = CFDateCreate(NULL, at);
+
+ CFRef<CFStringRef> str = CFCopyDescription(date);
+
+ print("<%s>", cfString(str).c_str());
+}
void Dumper::printBytes(const Byte *data, size_t length)
{