summaryrefslogtreecommitdiff
path: root/core/fdrm/crypto
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2017-05-05 17:08:07 -0700
committerChromium commit bot <commit-bot@chromium.org>2017-05-06 00:23:07 +0000
commit332ef5423df9aa7a28166907f4a6ac8ac095163d (patch)
treeff0891147fb3cf505e337b3968bdd0c404530961 /core/fdrm/crypto
parentf0ea70825a465ebb8979a7f6e70b0133be398f64 (diff)
downloadpdfium-332ef5423df9aa7a28166907f4a6ac8ac095163d.tar.xz
Remove type-unsafe void* / uint8_t* usage in fx_crypt.h
Consolidate all of the sha2 contexts while we're at it, the one with the largest buf is suitable for use by all the others. Change-Id: Iace6cd8ca4405f75f78842a1559c3a2478910218 Reviewed-on: https://pdfium-review.googlesource.com/4994 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core/fdrm/crypto')
-rw-r--r--core/fdrm/crypto/fx_crypt.h49
-rw-r--r--core/fdrm/crypto/fx_crypt_aes.cpp65
-rw-r--r--core/fdrm/crypto/fx_crypt_sha.cpp39
3 files changed, 79 insertions, 74 deletions
diff --git a/core/fdrm/crypto/fx_crypt.h b/core/fdrm/crypto/fx_crypt.h
index 2b127948f0..5416080af7 100644
--- a/core/fdrm/crypto/fx_crypt.h
+++ b/core/fdrm/crypto/fx_crypt.h
@@ -16,6 +16,19 @@ struct CRYPT_rc4_context {
int32_t m[kRC4ContextPermutationLength];
};
+#define MAX_NR 14
+#define MAX_NK 8
+#define MAX_NB 8
+struct CRYPT_aes_context {
+ void (*encrypt)(CRYPT_aes_context* ctx, unsigned int* block);
+ void (*decrypt)(CRYPT_aes_context* ctx, unsigned int* block);
+ int Nb;
+ int Nr;
+ unsigned int keysched[(MAX_NR + 1) * MAX_NB];
+ unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];
+ unsigned int iv[MAX_NB];
+};
+
struct CRYPT_md5_context {
uint32_t total[2];
uint32_t state[4];
@@ -30,13 +43,7 @@ struct CRYPT_sha1_context {
unsigned int lenlo;
};
-struct CRYPT_sha256_context {
- uint32_t total[2];
- uint32_t state[8];
- uint8_t buffer[64];
-};
-
-struct CRYPT_sha384_context {
+struct CRYPT_sha2_context {
uint64_t total[2];
uint64_t state[8];
uint8_t buffer[128];
@@ -53,17 +60,17 @@ void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context,
uint8_t* data,
uint32_t size);
-void CRYPT_AESSetKey(void* context,
+void CRYPT_AESSetKey(CRYPT_aes_context* context,
uint32_t blocklen,
const uint8_t* key,
uint32_t keylen,
bool bEncrypt);
-void CRYPT_AESSetIV(void* context, const uint8_t* iv);
-void CRYPT_AESDecrypt(void* context,
+void CRYPT_AESSetIV(CRYPT_aes_context* context, const uint8_t* iv);
+void CRYPT_AESDecrypt(CRYPT_aes_context* context,
uint8_t* dest,
const uint8_t* src,
uint32_t size);
-void CRYPT_AESEncrypt(void* context,
+void CRYPT_AESEncrypt(CRYPT_aes_context* context,
uint8_t* dest,
const uint8_t* src,
uint32_t size);
@@ -82,27 +89,29 @@ void CRYPT_SHA1Update(CRYPT_sha1_context* context,
void CRYPT_SHA1Finish(CRYPT_sha1_context* context, uint8_t digest[20]);
void CRYPT_SHA1Generate(const uint8_t* data, uint32_t size, uint8_t digest[20]);
-void CRYPT_SHA256Start(CRYPT_sha256_context* context);
-void CRYPT_SHA256Update(CRYPT_sha256_context* context,
+void CRYPT_SHA256Start(CRYPT_sha2_context* context);
+void CRYPT_SHA256Update(CRYPT_sha2_context* context,
const uint8_t* data,
uint32_t size);
-void CRYPT_SHA256Finish(CRYPT_sha256_context* context, uint8_t digest[32]);
+void CRYPT_SHA256Finish(CRYPT_sha2_context* context, uint8_t digest[32]);
void CRYPT_SHA256Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[32]);
-void CRYPT_SHA384Start(CRYPT_sha384_context* context);
-void CRYPT_SHA384Update(CRYPT_sha384_context* context,
+void CRYPT_SHA384Start(CRYPT_sha2_context* context);
+void CRYPT_SHA384Update(CRYPT_sha2_context* context,
const uint8_t* data,
uint32_t size);
-void CRYPT_SHA384Finish(CRYPT_sha384_context* context, uint8_t digest[48]);
+void CRYPT_SHA384Finish(CRYPT_sha2_context* context, uint8_t digest[48]);
void CRYPT_SHA384Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[48]);
-void CRYPT_SHA512Start(void* context);
-void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size);
-void CRYPT_SHA512Finish(void* context, uint8_t digest[64]);
+void CRYPT_SHA512Start(CRYPT_sha2_context* context);
+void CRYPT_SHA512Update(CRYPT_sha2_context* context,
+ const uint8_t* data,
+ uint32_t size);
+void CRYPT_SHA512Finish(CRYPT_sha2_context* context, uint8_t digest[64]);
void CRYPT_SHA512Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[64]);
diff --git a/core/fdrm/crypto/fx_crypt_aes.cpp b/core/fdrm/crypto/fx_crypt_aes.cpp
index 671dc65f31..94d66d0956 100644
--- a/core/fdrm/crypto/fx_crypt_aes.cpp
+++ b/core/fdrm/crypto/fx_crypt_aes.cpp
@@ -6,9 +6,6 @@
#include "core/fdrm/crypto/fx_crypt.h"
-#define MAX_NR 14
-#define MAX_NK 8
-#define MAX_NB 8
#define mulby2(x) (((x & 0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0))
#define GET_32BIT_MSB_FIRST(cp) \
(((unsigned long)(unsigned char)(cp)[3]) | \
@@ -23,15 +20,6 @@
(cp)[0] = (value) >> 24; \
} while (0)
-struct AESContext {
- unsigned int keysched[(MAX_NR + 1) * MAX_NB];
- unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];
- void (*encrypt)(AESContext* ctx, unsigned int* block);
- void (*decrypt)(AESContext* ctx, unsigned int* block);
- unsigned int iv[MAX_NB];
- int Nb, Nr;
-};
-
namespace {
const unsigned char Sbox[256] = {
@@ -462,7 +450,8 @@ const unsigned int D3[256] = {
(Sbox[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
(Sbox[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) | \
(Sbox[(block[(i + C3) % Nb]) & 0xFF]))
-void aes_encrypt_nb_4(AESContext* ctx, unsigned int* block) {
+
+void aes_encrypt_nb_4(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;
unsigned int* keysched = ctx->keysched;
@@ -489,7 +478,8 @@ void aes_encrypt_nb_4(AESContext* ctx, unsigned int* block) {
MOVEWORD(3);
ADD_ROUND_KEY_4;
}
-void aes_encrypt_nb_6(AESContext* ctx, unsigned int* block) {
+
+void aes_encrypt_nb_6(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;
unsigned int* keysched = ctx->keysched;
@@ -524,7 +514,8 @@ void aes_encrypt_nb_6(AESContext* ctx, unsigned int* block) {
MOVEWORD(5);
ADD_ROUND_KEY_6;
}
-void aes_encrypt_nb_8(AESContext* ctx, unsigned int* block) {
+
+void aes_encrypt_nb_8(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;
unsigned int* keysched = ctx->keysched;
@@ -579,7 +570,8 @@ void aes_encrypt_nb_8(AESContext* ctx, unsigned int* block) {
(Sboxinv[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
(Sboxinv[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) | \
(Sboxinv[(block[(i + C3) % Nb]) & 0xFF]))
-void aes_decrypt_nb_4(AESContext* ctx, unsigned int* block) {
+
+void aes_decrypt_nb_4(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;
unsigned int* keysched = ctx->invkeysched;
@@ -606,7 +598,8 @@ void aes_decrypt_nb_4(AESContext* ctx, unsigned int* block) {
MOVEWORD(3);
ADD_ROUND_KEY_4;
}
-void aes_decrypt_nb_6(AESContext* ctx, unsigned int* block) {
+
+void aes_decrypt_nb_6(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;
unsigned int* keysched = ctx->invkeysched;
@@ -641,7 +634,8 @@ void aes_decrypt_nb_6(AESContext* ctx, unsigned int* block) {
MOVEWORD(5);
ADD_ROUND_KEY_6;
}
-void aes_decrypt_nb_8(AESContext* ctx, unsigned int* block) {
+
+void aes_decrypt_nb_8(CRYPT_aes_context* ctx, unsigned int* block) {
int i;
const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;
unsigned int* keysched = ctx->invkeysched;
@@ -686,7 +680,7 @@ void aes_decrypt_nb_8(AESContext* ctx, unsigned int* block) {
}
#undef MAKEWORD
#undef LASTWORD
-void aes_setup(AESContext* ctx,
+void aes_setup(CRYPT_aes_context* ctx,
int blocklen,
const unsigned char* key,
int keylen) {
@@ -753,13 +747,13 @@ void aes_setup(AESContext* ctx,
}
}
}
-void aes_decrypt(AESContext* ctx, unsigned int* block) {
+void aes_decrypt(CRYPT_aes_context* ctx, unsigned int* block) {
ctx->decrypt(ctx, block);
}
void aes_decrypt_cbc(unsigned char* dest,
const unsigned char* src,
int len,
- AESContext* ctx) {
+ CRYPT_aes_context* ctx) {
unsigned int iv[4], x[4], ct[4];
int i;
ASSERT((len & 15) == 0);
@@ -779,13 +773,15 @@ void aes_decrypt_cbc(unsigned char* dest,
}
memcpy(ctx->iv, iv, sizeof(iv));
}
-void aes_encrypt(AESContext* ctx, unsigned int* block) {
+
+void aes_encrypt(CRYPT_aes_context* ctx, unsigned int* block) {
ctx->encrypt(ctx, block);
}
+
void aes_encrypt_cbc(unsigned char* dest,
const unsigned char* src,
int len,
- AESContext* ctx) {
+ CRYPT_aes_context* ctx) {
unsigned int iv[4];
int i;
ASSERT((len & 15) == 0);
@@ -807,28 +803,29 @@ void aes_encrypt_cbc(unsigned char* dest,
} // namespace
-void CRYPT_AESSetKey(void* context,
+void CRYPT_AESSetKey(CRYPT_aes_context* context,
uint32_t blocklen,
const uint8_t* key,
uint32_t keylen,
bool bEncrypt) {
- aes_setup((AESContext*)context, blocklen, key, keylen);
+ aes_setup(context, blocklen, key, keylen);
}
-void CRYPT_AESSetIV(void* context, const uint8_t* iv) {
- int i;
- for (i = 0; i < ((AESContext*)context)->Nb; i++) {
- ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);
- }
+
+void CRYPT_AESSetIV(CRYPT_aes_context* context, const uint8_t* iv) {
+ for (int i = 0; i < context->Nb; i++)
+ context->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);
}
-void CRYPT_AESDecrypt(void* context,
+
+void CRYPT_AESDecrypt(CRYPT_aes_context* context,
uint8_t* dest,
const uint8_t* src,
uint32_t len) {
- aes_decrypt_cbc(dest, src, len, (AESContext*)context);
+ aes_decrypt_cbc(dest, src, len, context);
}
-void CRYPT_AESEncrypt(void* context,
+
+void CRYPT_AESEncrypt(CRYPT_aes_context* context,
uint8_t* dest,
const uint8_t* src,
uint32_t len) {
- aes_encrypt_cbc(dest, src, len, (AESContext*)context);
+ aes_encrypt_cbc(dest, src, len, context);
}
diff --git a/core/fdrm/crypto/fx_crypt_sha.cpp b/core/fdrm/crypto/fx_crypt_sha.cpp
index 49f77558f0..7420a32d48 100644
--- a/core/fdrm/crypto/fx_crypt_sha.cpp
+++ b/core/fdrm/crypto/fx_crypt_sha.cpp
@@ -144,7 +144,7 @@ void SHATransform(unsigned int* digest, unsigned int* block) {
digest[4] += e;
}
-void sha256_process(CRYPT_sha256_context* ctx, const uint8_t data[64]) {
+void sha256_process(CRYPT_sha2_context* ctx, const uint8_t data[64]) {
uint32_t temp1, temp2, W[64];
uint32_t A, B, C, D, E, F, G, H;
GET_UINT32(W[0], data, 0);
@@ -289,7 +289,7 @@ uint64_t const constants[] = {
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
};
-void sha384_process(CRYPT_sha384_context* ctx, const uint8_t data[128]) {
+void sha384_process(CRYPT_sha2_context* ctx, const uint8_t data[128]) {
uint64_t temp1, temp2;
uint64_t A, B, C, D, E, F, G, H;
uint64_t W[80];
@@ -436,7 +436,7 @@ void CRYPT_SHA1Generate(const uint8_t* data,
CRYPT_SHA1Update(&s, data, size);
CRYPT_SHA1Finish(&s, digest);
}
-void CRYPT_SHA256Start(CRYPT_sha256_context* ctx) {
+void CRYPT_SHA256Start(CRYPT_sha2_context* ctx) {
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x6A09E667;
@@ -449,7 +449,7 @@ void CRYPT_SHA256Start(CRYPT_sha256_context* ctx) {
ctx->state[7] = 0x5BE0CD19;
}
-void CRYPT_SHA256Update(CRYPT_sha256_context* ctx,
+void CRYPT_SHA256Update(CRYPT_sha2_context* ctx,
const uint8_t* input,
uint32_t length) {
if (!length)
@@ -478,7 +478,7 @@ void CRYPT_SHA256Update(CRYPT_sha256_context* ctx,
memcpy(ctx->buffer + left, input, length);
}
-void CRYPT_SHA256Finish(CRYPT_sha256_context* ctx, uint8_t digest[32]) {
+void CRYPT_SHA256Finish(CRYPT_sha2_context* ctx, uint8_t digest[32]) {
uint32_t last, padn;
uint32_t high, low;
uint8_t msglen[8];
@@ -503,17 +503,17 @@ void CRYPT_SHA256Finish(CRYPT_sha256_context* ctx, uint8_t digest[32]) {
void CRYPT_SHA256Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[32]) {
- CRYPT_sha256_context ctx;
+ CRYPT_sha2_context ctx;
CRYPT_SHA256Start(&ctx);
CRYPT_SHA256Update(&ctx, data, size);
CRYPT_SHA256Finish(&ctx, digest);
}
-void CRYPT_SHA384Start(CRYPT_sha384_context* ctx) {
+void CRYPT_SHA384Start(CRYPT_sha2_context* ctx) {
if (!ctx)
return;
- memset(ctx, 0, sizeof(CRYPT_sha384_context));
+ memset(ctx, 0, sizeof(CRYPT_sha2_context));
ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
ctx->state[1] = 0x629a292a367cd507ULL;
ctx->state[2] = 0x9159015a3070dd17ULL;
@@ -524,7 +524,7 @@ void CRYPT_SHA384Start(CRYPT_sha384_context* ctx) {
ctx->state[7] = 0x47b5481dbefa4fa4ULL;
}
-void CRYPT_SHA384Update(CRYPT_sha384_context* ctx,
+void CRYPT_SHA384Update(CRYPT_sha2_context* ctx,
const uint8_t* input,
uint32_t length) {
if (!length)
@@ -552,7 +552,7 @@ void CRYPT_SHA384Update(CRYPT_sha384_context* ctx,
memcpy(ctx->buffer + left, input, length);
}
-void CRYPT_SHA384Finish(CRYPT_sha384_context* ctx, uint8_t digest[48]) {
+void CRYPT_SHA384Finish(CRYPT_sha2_context* ctx, uint8_t digest[48]) {
uint32_t last, padn;
uint8_t msglen[16];
memset(msglen, 0, 16);
@@ -576,18 +576,17 @@ void CRYPT_SHA384Finish(CRYPT_sha384_context* ctx, uint8_t digest[48]) {
void CRYPT_SHA384Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[64]) {
- CRYPT_sha384_context context;
+ CRYPT_sha2_context context;
CRYPT_SHA384Start(&context);
CRYPT_SHA384Update(&context, data, size);
CRYPT_SHA384Finish(&context, digest);
}
-void CRYPT_SHA512Start(void* context) {
- if (!context)
+void CRYPT_SHA512Start(CRYPT_sha2_context* ctx) {
+ if (!ctx)
return;
- CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
- memset(ctx, 0, sizeof(CRYPT_sha384_context));
+ memset(ctx, 0, sizeof(CRYPT_sha2_context));
ctx->state[0] = 0xa09e667f3bcc908ULL;
ctx->state[1] = 0xb67ae8584caa73bULL;
ctx->state[2] = 0xc6ef372fe94f82bULL;
@@ -598,13 +597,13 @@ void CRYPT_SHA512Start(void* context) {
ctx->state[7] = 0xbe0cd19137e2179ULL;
}
-void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) {
- CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
+void CRYPT_SHA512Update(CRYPT_sha2_context* ctx,
+ const uint8_t* data,
+ uint32_t size) {
CRYPT_SHA384Update(ctx, data, size);
}
-void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) {
- CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
+void CRYPT_SHA512Finish(CRYPT_sha2_context* ctx, uint8_t digest[64]) {
uint32_t last, padn;
uint8_t msglen[16];
memset(msglen, 0, 16);
@@ -630,7 +629,7 @@ void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) {
void CRYPT_SHA512Generate(const uint8_t* data,
uint32_t size,
uint8_t digest[64]) {
- CRYPT_sha384_context context;
+ CRYPT_sha2_context context;
CRYPT_SHA512Start(&context);
CRYPT_SHA512Update(&context, data, size);
CRYPT_SHA512Finish(&context, digest);