/* Opt-in observed-build declarations, not a universal Windows CI SDK. * Observed: ci.dll 10.0.26100.8328, x64, SHA-256 documented in docs/mincrypt-contracts.md. * Include after ntddk.h. Uses distinct names and function-pointer types so * including this file does not change the default layouts or add static imports. * Verify the actual CI build/architecture before use; Size alone cannot prove * layout identity. See docs/mincrypt-contracts.md for provenance and limits. * Field/parameter names are descriptive analyst names unless stated otherwise. */ #pragma once #if !defined(_M_AMD64) && !defined(__x86_64__) #error This research layout is validated only for x64. #endif #pragma pack(push, 8) typedef struct _DOMITO_CI26100_BLOB { ULONG Size; UCHAR *Data; } DOMITO_CI26100_BLOB; typedef struct _DOMITO_CI26100_NAME_BLOB { UCHAR *Data; /* Borrowed, length-delimited encoded bytes. */ USHORT Size; /* Bytes, not characters. */ UCHAR Asn1StringTag; /* Observed: 0x0c UTF8String, 0x1e BMPString. */ } DOMITO_CI26100_NAME_BLOB; typedef struct _DOMITO_CI26100_CHAIN_ELEMENT { ULONG HashAlgId; ULONG HashSize; UCHAR Hash[64]; DOMITO_CI26100_NAME_BLOB Subject; DOMITO_CI26100_NAME_BLOB Issuer; DOMITO_CI26100_BLOB Certificate; } DOMITO_CI26100_CHAIN_ELEMENT; typedef struct _DOMITO_CI26100_CHAIN_INFO { ULONG Size; /* Entire allocation, including trailing data. */ DOMITO_CI26100_BLOB *PublicKeys; ULONG NumberOfPublicKeys; DOMITO_CI26100_BLOB *EKUs; ULONG NumberOfEKUs; DOMITO_CI26100_CHAIN_ELEMENT *ChainElements; ULONG NumberOfChainElements; ULONG RootId; /* Opaque classification, NOT policy bits. */ DOMITO_CI26100_BLOB AuthenticodeAttributes; UCHAR PlatformManifestBinaryId[32]; /* NOT a file or certificate hash. */ } DOMITO_CI26100_CHAIN_INFO; typedef struct _DOMITO_CI26100_POLICY_INFO { ULONG Size; NTSTATUS VerificationStatus; /* Does not replace the API return status. */ ULONG PolicyBits; DOMITO_CI26100_CHAIN_INFO *ChainInfo; LARGE_INTEGER RevocationTime; LARGE_INTEGER NotBefore; LARGE_INTEGER NotAfter; } DOMITO_CI26100_POLICY_INFO, *PDOMITO_CI26100_POLICY_INFO; #pragma pack(pop) C_ASSERT(sizeof(DOMITO_CI26100_BLOB) == 16); C_ASSERT(sizeof(DOMITO_CI26100_NAME_BLOB) == 16); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_NAME_BLOB, Asn1StringTag) == 10); C_ASSERT(sizeof(DOMITO_CI26100_CHAIN_ELEMENT) == 120); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_CHAIN_ELEMENT, Certificate) == 104); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_CHAIN_INFO, RootId) == 52); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_CHAIN_INFO, AuthenticodeAttributes) == 56); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_CHAIN_INFO, PlatformManifestBinaryId) == 72); C_ASSERT(sizeof(DOMITO_CI26100_CHAIN_INFO) == 104); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_POLICY_INFO, ChainInfo) == 16); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_POLICY_INFO, RevocationTime) == 24); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_POLICY_INFO, NotBefore) == 32); C_ASSERT(FIELD_OFFSET(DOMITO_CI26100_POLICY_INFO, NotAfter) == 40); C_ASSERT(sizeof(DOMITO_CI26100_POLICY_INFO) == 48); /* Zero-initialize policies before first use. Free existing owned chains before * reuse. Never copy these structs as independently owned objects with memcpy. * Size is an output/initialization marker here, not runtime ABI negotiation. */ typedef VOID (NTAPI *DOMITO_CI26100_FREE_POLICY_INFO)( DOMITO_CI26100_POLICY_INFO *PolicyInfo); typedef NTSTATUS (NTAPI *DOMITO_CI26100_VALIDATE_FILE_OBJECT)( PFILE_OBJECT FileObject, ULONG ValidationFlags, UCHAR RequestedSigningLevel, DOMITO_CI26100_POLICY_INFO *PolicyInfo, DOMITO_CI26100_POLICY_INFO *TimeStampPolicyInfo, LARGE_INTEGER *SigningTime, UCHAR *Hash, /* Provide 64-byte capacity, even for SHA-1. */ ULONG *HashSize, /* In: capacity >=64. Out success: actual size. */ ULONG *HashAlgId); typedef NTSTATUS (NTAPI *DOMITO_CI26100_CHECK_SIGNED_FILE)( PVOID Hash, ULONG HashSize, ULONG HashAlgId, PVOID WinCertificate, /* WIN_CERTIFICATE header, not bCertificate. */ ULONG SizeOfSecurityDirectory, DOMITO_CI26100_POLICY_INFO *PolicyInfo, LARGE_INTEGER *SigningTime, DOMITO_CI26100_POLICY_INFO *TimeStampPolicyInfo); /* The existing BOOLEAN reload parameter ABI was not independently resolved * beyond the full-width use in this build; retain Domito's declaration until * cross-architecture call-site evidence settles its formal type. * Fifth argument nonzero filters on the catalog TRUSTED marker. * Sixth argument requires ANY overlap with catalog PolicyInfo.PolicyBits. */ typedef NTSTATUS (NTAPI *DOMITO_CI26100_VERIFY_HASH_IN_CATALOG)( PVOID Hash, ULONG HashSize, ULONG HashAlgId, BOOLEAN ReloadCatalogs, ULONG RequireTrustedCatalog, ULONG AcceptedCatalogPolicyBits, DOMITO_CI26100_POLICY_INFO *PolicyInfo, UNICODE_STRING *CatalogName, /* Optional; separate RtlFreeUnicodeString. */ LARGE_INTEGER *SigningTime, DOMITO_CI26100_POLICY_INFO *TimeStampPolicyInfo); typedef PVOID (NTAPI *DOMITO_CI26100_ALLOCATE)(SIZE_T ByteSize); typedef NTSTATUS (NTAPI *DOMITO_CI26100_GET_CERT_PUBLISHER_NAME)( DOMITO_CI26100_BLOB *Certificate, DOMITO_CI26100_ALLOCATE AllocateRoutine, UNICODE_STRING *PublisherName); /* Free with callback's allocator pair. */ /* Proposed descriptive diagnostic names. Not official Microsoft names, not * an exhaustive dictionary, and not accepted-input validation flags. * See the report for narrower branch conditions and composite values. */ #define DOMITO_CI26100_POLICY_SELF_ISSUED_TERMINAL 0x00000001UL // Also present on rgbMicrosoftRoot4 together with bit 0x800. #define DOMITO_CI26100_POLICY_MICROSOFT_ROOT_0_1_2 0x00000002UL #define DOMITO_CI26100_POLICY_TEST_ROOT 0x00000004UL #define DOMITO_CI26100_POLICY_MICROSOFT_ROOT_3 0x00000008UL #define DOMITO_CI26100_POLICY_DMD_ROOT 0x00000020UL #define DOMITO_CI26100_POLICY_DMD_TEST_ROOT 0x00000040UL #define DOMITO_CI26100_POLICY_MICROSOFT_ROOT_5 0x00000080UL #define DOMITO_CI26100_POLICY_FLIGHT_ROOT 0x00000400UL #define DOMITO_CI26100_POLICY_MARKETPLACE_ROOT 0x00002000UL #define DOMITO_CI26100_POLICY_SUPPLIED_CERT_OR_KEY 0x00004000UL #define DOMITO_CI26100_POLICY_IDENTITY_ROOT_2020 0x00008000UL #define DOMITO_CI26100_POLICY_PARTIAL_CHAIN 0x00000010UL #define DOMITO_CI26100_POLICY_CHAIN_FAILURE 0x00020000UL #define DOMITO_CI26100_POLICY_CRYPTO_FAILURE 0x00040000UL #define DOMITO_CI26100_POLICY_EKU_FAILURE 0x00080000UL #define DOMITO_CI26100_POLICY_PAGE_HASH_FAILURE 0x00100000UL #define DOMITO_CI26100_POLICY_CERT_REVOKED 0x00200000UL #define DOMITO_CI26100_POLICY_CERT_VALIDITY_FAILURE 0x00400000UL #define DOMITO_CI26100_POLICY_PATH_LENGTH_FAILURE 0x08000000UL #define DOMITO_CI26100_POLICY_GENERIC_FAILURE 0x10000000UL #define DOMITO_CI26100_POLICY_CA_CONSTRAINT_FAILURE 0x20000000UL /* Narrow branch observation: no usable timestamp during revoked-cert recovery; * not a universal flag for all signatures without a timestamp. */ #define DOMITO_CI26100_POLICY_REVOCATION_NO_TIMESTAMP 0x04000000UL