denyhosts/clamav/libclamav/ole2_encryption.h

89 lines
2.8 KiB
C
Raw Normal View History

2023-01-14 18:28:39 +08:00
#ifndef OLE2_ENCRYPTION_H_
#define OLE2_ENCRYPTION_H_
#ifndef HAVE_ATTRIB_PACKED
#define __attribute__(x)
#endif
#ifdef HAVE_PRAGMA_PACK
#pragma pack(1)
#endif
#ifdef HAVE_PRAGMA_PACK_HPPA
#pragma pack 1
#endif
#define SE_HEADER_EI_AES128_KEYSIZE 0x00000080
#define SE_HEADER_EI_AES192_KEYSIZE 0x000000c0
#define SE_HEADER_EI_AES256_KEYSIZE 0x00000100
typedef struct {
uint8_t key[SE_HEADER_EI_AES256_KEYSIZE]; /*The longest key length supported by ole encryption */
uint32_t key_length_bits;
} encryption_key_t;
/* https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/dca653b5-b93b-48df-8e1e-0fb9e1c83b0f */
typedef struct __attribute__((packed)) {
uint32_t flags;
uint32_t sizeExtra; /* must be 0 */
uint32_t algorithmID;
uint32_t algorithmIDHash;
uint32_t keySize;
uint32_t providerType;
uint32_t reserved1;
uint32_t reserved2; /* MUST be 0 */
uint8_t cspName[1]; /* really the rest of the data in the block. Starts with a
string of wide characters, followed by the encryption verifier.
It is 44 instead of 32 because this structure is only used inside
encryption_info_stream_standard_t (below). It is in two different
structures because of the way the documentation is written.
*/
} encryption_info_t;
/*
* https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/2895eba1-acb1-4624-9bde-2cdad3fea015
*/
typedef struct __attribute__((packed)) {
uint16_t version_major;
uint16_t version_minor;
uint32_t flags; /* https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/200a3d61-1ab4-4402-ae11-0290b28ab9cb */
uint32_t size;
union {
encryption_info_t encryptionInfo;
uint8_t padding[512 - 12]; /* Subtract the size of version_major, version_minor, flags and size.
This consumes a sector (512 bytes), so make sure enough space is always allocated.
*/
};
} encryption_info_stream_standard_t;
#define CSP_NAME_LENGTH(__ptr__) (sizeof(__ptr__->padding) - sizeof(__ptr__->encryptionInfo) + 1)
/* https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/e5ad39b8-9bc1-4a19-bad3-44e6246d21e6 */
typedef struct __attribute__((packed)) {
uint32_t salt_size;
uint8_t salt[16];
uint8_t encrypted_verifier[16];
uint32_t verifier_hash_size;
uint8_t encrypted_verifier_hash[32]; /* RC4 requires 20 bytes
AES requires 32 bytes
*/
} encryption_verifier_t;
#ifdef HAVE_PRAGMA_PACK
#pragma pack()
#endif
#ifdef HAVE_PRAGMA_PACK_HPPA
#pragma pack
#endif
#endif /* OLE2_ENCRYPTION_H_ */