89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
|
#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_ */
|