From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- include/Makefile.in | 1 + include/cryptxml.h | 283 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 include/cryptxml.h
diff --git a/include/Makefile.in b/include/Makefile.in index 662b149da32..5edd519d2fc 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -104,6 +104,7 @@ SOURCES = \ crtrow.idl \ cryptdlg.h \ cryptuiapi.h \ + cryptxml.h \ ctfutb.idl \ ctxtcall.idl \ custcntl.h \ diff --git a/include/cryptxml.h b/include/cryptxml.h new file mode 100644 index 00000000000..1a531f9739d --- /dev/null +++ b/include/cryptxml.h @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2025 Mohamad Al-Jaf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __CRYPTXML_H__ +#define __CRYPTXML_H__ + +#include <wincrypt.h> +#include <bcrypt.h> +#include <ncrypt.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *HCRYPTXML; + +#define CRYPT_XML_FLAG_NO_SERIALIZE 0x80000000 +#define CRYPT_XML_FLAG_ALWAYS_RETURN_ENCODED_OBJECT 0x40000000 +#define CRYPT_XML_FLAG_ENFORCE_ID_NCNAME_FORMAT 0x20000000 +#define CRYPT_XML_FLAG_DISABLE_EXTENSIONS 0x10000000 +#define CRYPT_XML_FLAG_ENFORCE_ID_NAME_FORMAT 0x08000000 +#define CRYPT_XML_FLAG_ECDSA_DSIG11 0x04000000 + +typedef HRESULT (CALLBACK *PFN_CRYPT_XML_DATA_PROVIDER_READ)(void *, BYTE *, ULONG, ULONG *); +typedef HRESULT (CALLBACK *PFN_CRYPT_XML_DATA_PROVIDER_CLOSE)(void *); + +typedef enum _CRYPT_XML_CHARSET +{ + CRYPT_XML_CHARSET_AUTO = 0, + CRYPT_XML_CHARSET_UTF8 = 1, + CRYPT_XML_CHARSET_UTF16LE = 2, + CRYPT_XML_CHARSET_UTF16BE = 3, +} CRYPT_XML_CHARSET; + +typedef struct _CRYPT_XML_BLOB +{ + CRYPT_XML_CHARSET dwCharset; + ULONG cbData; + BYTE *pbData; +} CRYPT_XML_BLOB, *PCRYPT_XML_BLOB; + +typedef struct _CRYPT_XML_DATA_BLOB +{ + ULONG cbData; + BYTE *pbData; +} CRYPT_XML_DATA_BLOB, *PCRYPT_XML_DATA_BLOB; + +typedef struct _CRYPT_XML_DATA_PROVIDER +{ + void *pvCallbackState; + ULONG cbBufferSize; + PFN_CRYPT_XML_DATA_PROVIDER_READ pfnRead; + PFN_CRYPT_XML_DATA_PROVIDER_CLOSE pfnClose; +} CRYPT_XML_DATA_PROVIDER, *PCRYPT_XML_DATA_PROVIDER; + +typedef struct _CRYPT_XML_ALGORITHM +{ + ULONG cbSize; + LPCWSTR wszAlgorithm; + CRYPT_XML_BLOB Encoded; +} CRYPT_XML_ALGORITHM, *PCRYPT_XML_ALGORITHM; + +typedef HRESULT (CALLBACK *PFN_CRYPT_XML_CREATE_TRANSFORM)(const CRYPT_XML_ALGORITHM *, CRYPT_XML_DATA_PROVIDER *, CRYPT_XML_DATA_PROVIDER *); + +typedef struct _CRYPT_XML_TRANSFORM_INFO +{ + ULONG cbSize; + LPCWSTR wszAlgorithm; + ULONG cbBufferSize; + DWORD dwFlags; + PFN_CRYPT_XML_CREATE_TRANSFORM pfnCreateTransform; +} CRYPT_XML_TRANSFORM_INFO, *PCRYPT_XML_TRANSFORM_INFO; + +typedef struct _CRYPT_XML_TRANSFORM_CHAIN_CONFIG +{ + ULONG cbSize; + ULONG cTransformInfo; + PCRYPT_XML_TRANSFORM_INFO *rgpTransformInfo; +} CRYPT_XML_TRANSFORM_CHAIN_CONFIG, *PCRYPT_XML_TRANSFORM_CHAIN_CONFIG; + +typedef enum _CRYPT_XML_PROPERTY_ID +{ + CRYPT_XML_PROPERTY_MAX_HEAP_SIZE = 1, + CRYPT_XML_PROPERTY_SIGNATURE_LOCATION = 2, + CRYPT_XML_PROPERTY_MAX_SIGNATURES = 3, + CRYPT_XML_PROPERTY_DOC_DECLARATION = 4, + CRYPT_XML_PROPERTY_XML_OUTPUT_CHARSET = 5, +} CRYPT_XML_PROPERTY_ID; + +typedef struct _CRYPT_XML_PROPERTY +{ + CRYPT_XML_PROPERTY_ID dwPropId; + const void *pvValue; + ULONG cbValue; +} CRYPT_XML_PROPERTY, *PCRYPT_XML_PROPERTY; + +typedef struct _CRYPT_XML_ISSUER_SERIAL +{ + LPCWSTR wszIssuer; + LPCWSTR wszSerial; +} CRYPT_XML_ISSUER_SERIAL; + +typedef struct _CRYPT_XML_X509DATA_ITEM +{ + DWORD dwType; + union + { + CRYPT_XML_ISSUER_SERIAL IssuerSerial; + CRYPT_XML_DATA_BLOB SKI; + LPCWSTR wszSubjectName; + CRYPT_XML_DATA_BLOB Certificate; + CRYPT_XML_DATA_BLOB CRL; + CRYPT_XML_BLOB Custom; + }; +} CRYPT_XML_X509DATA_ITEM; + +#define CRYPT_XML_X509DATA_TYPE_ISSUER_SERIAL 0x00000001 +#define CRYPT_XML_X509DATA_TYPE_SKI 0x00000002 +#define CRYPT_XML_X509DATA_TYPE_SUBJECT_NAME 0x00000003 +#define CRYPT_XML_X509DATA_TYPE_CERTIFICATE 0x00000004 +#define CRYPT_XML_X509DATA_TYPE_CRL 0x00000005 +#define CRYPT_XML_X509DATA_TYPE_CUSTOM 0x00000006 + +typedef struct _CRYPT_XML_X509DATA +{ + UINT cX509Data; + CRYPT_XML_X509DATA_ITEM *rgX509Data; +} CRYPT_XML_X509DATA; + +typedef struct _CRYPT_XML_KEY_DSA_KEY_VALUE +{ + CRYPT_XML_DATA_BLOB P; + CRYPT_XML_DATA_BLOB Q; + CRYPT_XML_DATA_BLOB G; + CRYPT_XML_DATA_BLOB Y; + CRYPT_XML_DATA_BLOB J; + CRYPT_XML_DATA_BLOB Seed; + CRYPT_XML_DATA_BLOB Counter; +} CRYPT_XML_KEY_DSA_KEY_VALUE; + +typedef struct _CRYPT_XML_KEY_RSA_KEY_VALUE{ + CRYPT_XML_DATA_BLOB Modulus; + CRYPT_XML_DATA_BLOB Exponent; +} CRYPT_XML_KEY_RSA_KEY_VALUE; + +typedef struct _CRYPT_XML_KEY_ECDSA_KEY_VALUE +{ + LPCWSTR wszNamedCurve; + CRYPT_XML_DATA_BLOB X; + CRYPT_XML_DATA_BLOB Y; + CRYPT_XML_BLOB ExplicitPara; +} CRYPT_XML_KEY_ECDSA_KEY_VALUE; + +typedef struct _CRYPT_XML_KEY_VALUE +{ + DWORD dwType; + union + { + CRYPT_XML_KEY_DSA_KEY_VALUE DSAKeyValue; + CRYPT_XML_KEY_RSA_KEY_VALUE RSAKeyValue; + CRYPT_XML_KEY_ECDSA_KEY_VALUE ECDSAKeyValue; + CRYPT_XML_BLOB Custom; + }; +} CRYPT_XML_KEY_VALUE; + +#define CRYPT_XML_KEY_VALUE_TYPE_DSA 0x00000001 +#define CRYPT_XML_KEY_VALUE_TYPE_RSA 0x00000002 +#define CRYPT_XML_KEY_VALUE_TYPE_ECDSA 0x00000003 +#define CRYPT_XML_KEY_VALUE_TYPE_CUSTOM 0x00000004 + +typedef struct _CRYPT_XML_KEY_INFO_ITEM +{ + DWORD dwType; + union + { + LPCWSTR wszKeyName; + CRYPT_XML_KEY_VALUE KeyValue; + CRYPT_XML_BLOB RetrievalMethod; + CRYPT_XML_X509DATA X509Data; + CRYPT_XML_BLOB Custom; + }; +} CRYPT_XML_KEY_INFO_ITEM; + +#define CRYPT_XML_KEYINFO_TYPE_KEYNAME 0x00000001 +#define CRYPT_XML_KEYINFO_TYPE_KEYVALUE 0x00000002 +#define CRYPT_XML_KEYINFO_TYPE_RETRIEVAL 0x00000003 +#define CRYPT_XML_KEYINFO_TYPE_X509DATA 0x00000004 +#define CRYPT_XML_KEYINFO_TYPE_CUSTOM 0x00000005 + +typedef struct _CRYPT_XML_KEY_INFO +{ + ULONG cbSize; + LPCWSTR wszId; + UINT cKeyInfo; + CRYPT_XML_KEY_INFO_ITEM *rgKeyInfo; + BCRYPT_KEY_HANDLE hVerifyKey; +} CRYPT_XML_KEY_INFO, *PCRYPT_XML_KEY_INFO; + +typedef struct _CRYPT_XML_REFERENCE +{ + ULONG cbSize; + HCRYPTXML hReference; + LPCWSTR wszId; + LPCWSTR wszUri; + LPCWSTR wszType; + CRYPT_XML_ALGORITHM DigestMethod; + CRYPT_DATA_BLOB DigestValue; + ULONG cTransform; + CRYPT_XML_ALGORITHM *rgTransform; +} CRYPT_XML_REFERENCE, *PCRYPT_XML_REFERENCE; + +typedef struct _CRYPT_XML_REFERENCES +{ + ULONG cReference; + PCRYPT_XML_REFERENCE *rgpReference; +} CRYPT_XML_REFERENCES, *PCRYPT_XML_REFERENCES; + +typedef struct _CRYPT_XML_OBJECT +{ + ULONG cbSize; + HCRYPTXML hObject; + LPCWSTR wszId; + LPCWSTR wszMimeType; + LPCWSTR wszEncoding; + CRYPT_XML_REFERENCES Manifest; + CRYPT_XML_BLOB Encoded; +} CRYPT_XML_OBJECT, *PCRYPT_XML_OBJECT; + +typedef struct _CRYPT_XML_SIGNED_INFO +{ + ULONG cbSize; + LPCWSTR wszId; + CRYPT_XML_ALGORITHM Canonicalization; + CRYPT_XML_ALGORITHM SignatureMethod; + ULONG cReference; + PCRYPT_XML_REFERENCE *rgpReference; + CRYPT_XML_BLOB Encoded; +} CRYPT_XML_SIGNED_INFO, *PCRYPT_XML_SIGNED_INFO; + +typedef struct _CRYPT_XML_SIGNATURE +{ + ULONG cbSize; + HCRYPTXML hSignature; + LPCWSTR wszId; + CRYPT_XML_SIGNED_INFO SignedInfo; + CRYPT_DATA_BLOB SignatureValue; + CRYPT_XML_KEY_INFO *pKeyInfo; + ULONG cObject; + PCRYPT_XML_OBJECT *rgpObject; +} CRYPT_XML_SIGNATURE, *PCRYPT_XML_SIGNATURE; + +typedef struct _CRYPT_XML_DOC_CTXT +{ + ULONG cbSize; + HCRYPTXML hDocCtxt; + CRYPT_XML_TRANSFORM_CHAIN_CONFIG *pTransformsConfig; + ULONG cSignature; + PCRYPT_XML_SIGNATURE *rgpSignature; +} CRYPT_XML_DOC_CTXT, *PCRYPT_XML_DOC_CTXT; + +HRESULT WINAPI CryptXmlOpenToDecode(const CRYPT_XML_TRANSFORM_CHAIN_CONFIG *config, DWORD flags, const CRYPT_XML_PROPERTY *property, + ULONG property_count, const CRYPT_XML_BLOB *blob, HCRYPTXML *handle); + +#ifdef __cplusplus +} +#endif + +#endif /* CRYPTXML_H */