diff options
-rw-r--r-- | core/fdrm/crypto/fx_crypt.cpp | 39 | ||||
-rw-r--r-- | core/fdrm/crypto/fx_crypt.h | 22 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_crypto_handler.cpp | 7 |
3 files changed, 45 insertions, 23 deletions
diff --git a/core/fdrm/crypto/fx_crypt.cpp b/core/fdrm/crypto/fx_crypt.cpp index a28e569c05..4010ff49ee 100644 --- a/core/fdrm/crypto/fx_crypt.cpp +++ b/core/fdrm/crypto/fx_crypt.cpp @@ -9,11 +9,10 @@ #ifdef __cplusplus extern "C" { #endif -struct rc4_state { - int x, y, m[256]; -}; -void CRYPT_ArcFourSetup(void* context, const uint8_t* key, uint32_t length) { - rc4_state* s = (rc4_state*)context; + +void CRYPT_ArcFourSetup(CRYPT_rc4_context* s, + const uint8_t* key, + uint32_t length) { int i, j, k, *m, a; s->x = 0; s->y = 0; @@ -32,8 +31,10 @@ void CRYPT_ArcFourSetup(void* context, const uint8_t* key, uint32_t length) { } } } -void CRYPT_ArcFourCrypt(void* context, unsigned char* data, uint32_t length) { - struct rc4_state* s = (struct rc4_state*)context; + +void CRYPT_ArcFourCrypt(CRYPT_rc4_context* s, + unsigned char* data, + uint32_t length) { int i, x, y, *m, a, b; x = s->x; y = s->y; @@ -49,14 +50,16 @@ void CRYPT_ArcFourCrypt(void* context, unsigned char* data, uint32_t length) { s->x = x; s->y = y; } + void CRYPT_ArcFourCryptBlock(uint8_t* pData, uint32_t size, const uint8_t* key, uint32_t keylen) { - rc4_state s; + CRYPT_rc4_context s; CRYPT_ArcFourSetup(&s, key, keylen); CRYPT_ArcFourCrypt(&s, pData, size); } + #define GET_UINT32(n, b, i) \ { \ (n) = (uint32_t)((uint8_t*)b)[(i)] | \ @@ -71,7 +74,8 @@ void CRYPT_ArcFourCryptBlock(uint8_t* pData, (((uint8_t*)b)[(i) + 2]) = (uint8_t)(((n) >> 16) & 0xFF); \ (((uint8_t*)b)[(i) + 3]) = (uint8_t)(((n) >> 24) & 0xFF); \ } -void md5_process(struct CRYPT_md5_context* ctx, const uint8_t data[64]) { + +void md5_process(CRYPT_md5_context* ctx, const uint8_t data[64]) { uint32_t A, B, C, D, X[16]; GET_UINT32(X[0], data, 0); GET_UINT32(X[1], data, 4); @@ -176,8 +180,8 @@ void md5_process(struct CRYPT_md5_context* ctx, const uint8_t data[64]) { ctx->state[2] += C; ctx->state[3] += D; } -void CRYPT_MD5Start(void* context) { - struct CRYPT_md5_context* ctx = (struct CRYPT_md5_context*)context; + +void CRYPT_MD5Start(CRYPT_md5_context* ctx) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; @@ -185,8 +189,10 @@ void CRYPT_MD5Start(void* context) { ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; } -void CRYPT_MD5Update(void* pctx, const uint8_t* input, uint32_t length) { - struct CRYPT_md5_context* ctx = (struct CRYPT_md5_context*)pctx; + +void CRYPT_MD5Update(CRYPT_md5_context* ctx, + const uint8_t* input, + uint32_t length) { uint32_t left, fill; if (!length) { return; @@ -213,12 +219,13 @@ void CRYPT_MD5Update(void* pctx, const uint8_t* input, uint32_t length) { FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); } } + const uint8_t md5_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -void CRYPT_MD5Finish(void* pctx, uint8_t digest[16]) { - struct CRYPT_md5_context* ctx = (struct CRYPT_md5_context*)pctx; + +void CRYPT_MD5Finish(CRYPT_md5_context* ctx, uint8_t digest[16]) { uint32_t last, padn; uint8_t msglen[8]; PUT_UINT32(ctx->total[0], msglen, 0); @@ -232,6 +239,7 @@ void CRYPT_MD5Finish(void* pctx, uint8_t digest[16]) { PUT_UINT32(ctx->state[2], digest, 8); PUT_UINT32(ctx->state[3], digest, 12); } + void CRYPT_MD5Generate(const uint8_t* input, uint32_t length, uint8_t digest[16]) { @@ -240,6 +248,7 @@ void CRYPT_MD5Generate(const uint8_t* input, CRYPT_MD5Update(&ctx, input, length); CRYPT_MD5Finish(&ctx, digest); } + #ifdef __cplusplus }; #endif diff --git a/core/fdrm/crypto/fx_crypt.h b/core/fdrm/crypto/fx_crypt.h index a7cb4a51bc..fe043dcb12 100644 --- a/core/fdrm/crypto/fx_crypt.h +++ b/core/fdrm/crypto/fx_crypt.h @@ -13,6 +13,12 @@ extern "C" { #endif +struct CRYPT_rc4_context { + int32_t x; + int32_t y; + int32_t m[256]; +}; + struct CRYPT_md5_context { uint32_t total[2]; uint32_t state[4]; @@ -23,8 +29,12 @@ void CRYPT_ArcFourCryptBlock(uint8_t* data, uint32_t size, const uint8_t* key, uint32_t keylen); -void CRYPT_ArcFourSetup(void* context, const uint8_t* key, uint32_t length); -void CRYPT_ArcFourCrypt(void* context, uint8_t* data, uint32_t size); +void CRYPT_ArcFourSetup(CRYPT_rc4_context* context, + const uint8_t* key, + uint32_t length); +void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context, + uint8_t* data, + uint32_t size); void CRYPT_AESSetKey(void* context, uint32_t blocklen, const uint8_t* key, @@ -40,9 +50,11 @@ void CRYPT_AESEncrypt(void* context, const uint8_t* src, uint32_t size); void CRYPT_MD5Generate(const uint8_t* data, uint32_t size, uint8_t digest[16]); -void CRYPT_MD5Start(void* context); -void CRYPT_MD5Update(void* context, const uint8_t* data, uint32_t size); -void CRYPT_MD5Finish(void* context, uint8_t digest[16]); +void CRYPT_MD5Start(CRYPT_md5_context* context); +void CRYPT_MD5Update(CRYPT_md5_context* context, + const uint8_t* data, + uint32_t size); +void CRYPT_MD5Finish(CRYPT_md5_context* context, uint8_t digest[16]); void CRYPT_SHA1Generate(const uint8_t* data, uint32_t size, uint8_t digest[20]); void CRYPT_SHA1Start(void* context); void CRYPT_SHA1Update(void* context, const uint8_t* data, uint32_t size); diff --git a/core/fpdfapi/parser/cpdf_crypto_handler.cpp b/core/fpdfapi/parser/cpdf_crypto_handler.cpp index 5918754c5c..61f78c4ee5 100644 --- a/core/fpdfapi/parser/cpdf_crypto_handler.cpp +++ b/core/fpdfapi/parser/cpdf_crypto_handler.cpp @@ -126,7 +126,7 @@ void* CPDF_CryptoHandler::CryptStart(uint32_t objnum, } return pContext; } - void* pContext = FX_Alloc(uint8_t, 1040); + CRYPT_rc4_context* pContext = FX_Alloc(CRYPT_rc4_context, 1); CRYPT_ArcFourSetup(pContext, realkey, realkeylen); return pContext; } @@ -146,10 +146,11 @@ bool CPDF_CryptoHandler::CryptStream(void* context, if (m_Cipher == FXCIPHER_RC4) { int old_size = dest_buf.GetSize(); dest_buf.AppendBlock(src_buf, src_size); - CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size); + CRYPT_ArcFourCrypt(reinterpret_cast<CRYPT_rc4_context*>(context), + dest_buf.GetBuffer() + old_size, src_size); return true; } - AESCryptContext* pContext = (AESCryptContext*)context; + AESCryptContext* pContext = reinterpret_cast<AESCryptContext*>(context); if (pContext->m_bIV && bEncrypt) { dest_buf.AppendBlock(pContext->m_Block, 16); pContext->m_bIV = false; |