summaryrefslogtreecommitdiff
path: root/Build/source/libs/pplib/pplib-src/src/ppcrypt.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/pplib/pplib-src/src/ppcrypt.h')
-rw-r--r--Build/source/libs/pplib/pplib-src/src/ppcrypt.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/Build/source/libs/pplib/pplib-src/src/ppcrypt.h b/Build/source/libs/pplib/pplib-src/src/ppcrypt.h
new file mode 100644
index 00000000000..98864f860c7
--- /dev/null
+++ b/Build/source/libs/pplib/pplib-src/src/ppcrypt.h
@@ -0,0 +1,67 @@
+
+#ifndef PP_CRYPT_H
+#define PP_CRYPT_H
+
+#include "ppfilter.h"
+#include "utilcrypt.h"
+#include "utilcryptdef.h"
+
+typedef struct {
+ ppuint algorithm_variant; /* /V entry of encrypt dict */
+ ppuint algorithm_revision; /* /R entry of encrypt dict */
+ ppint permissions; /* /P entry of encrypt dict */
+ ppdict *map; /* /CF filters map of encrypt dict */
+ uint8_t userpass[32]; /* padded user password */
+ size_t userpasslength; /* the length of unpadded user password */
+ uint8_t ownerpass[32]; /* padded owner password */
+ size_t ownerpasslength; /* the length of unpadded owner password */
+ uint8_t filekey[32+5+4]; /* generated file key with extra space of 5..9 bytes for salt */
+ size_t filekeylength; /* key length; usually 5, 16 or 32 bytes */
+ uint8_t cryptkey[32]; /* final crypt key for a given reference */
+ size_t cryptkeylength; /* final crypt key length; usually keylength + 5 */
+ ppref *ref; /* currently loaded ref (each ref may have a different key) */
+ union { /* cached crypt states for strings encrypted/decrypted with the same key */
+ struct {
+ rc4_state rc4state;
+ rc4_map rc4map;
+ rc4_map rc4copy;
+ };
+ struct {
+ aes_state aesstate;
+ aes_keyblock aeskeyblock;
+ uint8_t ivcopy[16];
+ };
+ };
+ int flags;
+} ppcrypt;
+
+#define PPCRYPT_NO_METADATA (1<<0)
+#define PPCRYPT_USER_PASSWORD (1<<1)
+#define PPCRYPT_OWNER_PASSWORD (1<<2)
+#define PPCRYPT_STREAM_RC4 (1<<3)
+#define PPCRYPT_STRING_RC4 (1<<4)
+#define PPCRYPT_STREAM_AES (1<<5)
+#define PPCRYPT_STRING_AES (1<<6)
+#define PPCRYPT_OBSCURITY (1<<7)
+
+#define PPCRYPT_STREAM (PPCRYPT_STREAM_AES|PPCRYPT_STREAM_RC4)
+#define PPCRYPT_STRING (PPCRYPT_STRING_AES|PPCRYPT_STRING_RC4)
+#define PPCRYPT_RC4 (PPCRYPT_STREAM_RC4|PPCRYPT_STRING_RC4)
+#define PPCRYPT_AES (PPCRYPT_STREAM_AES|PPCRYPT_STRING_AES)
+
+#define PPCRYPT_INFO_AES (1<<0)
+#define PPCRYPT_INFO_RC4 (1<<1)
+#define PPCRYPT_INFO_MD (1<<2)
+#define PPCRYPT_INFO_NOMD (1<<3)
+
+ppcrypt_status ppdoc_crypt_init (ppdoc *pdf, const void *userpass, size_t userpasslength, const void *ownerpass, size_t ownerpasslength);
+int ppstring_decrypt (ppcrypt *crypt, const void *input, size_t size, void *output, size_t *newsize);
+
+#define ppcrypt_start_ref(crypt, r) ((crypt)->ref = r, (crypt)->cryptkeylength = 0)
+#define ppcrypt_end_ref(crypt) ((crypt)->ref = NULL, (crypt)->cryptkeylength = 0)
+#define ppcrypt_ref(pdf, crypt) ((crypt = (pdf)->crypt) != NULL && crypt->ref != NULL)
+
+int ppcrypt_type (ppcrypt *crypt, ppname *cryptname, ppuint *length, int *cryptflags);
+ppstring * ppcrypt_stmkey (ppcrypt *crypt, ppref *ref, int aes, ppheap *heap);
+
+#endif