| Index: core/fdrm/crypto/fx_crypt_sha.cpp
|
| diff --git a/core/fdrm/crypto/fx_crypt_sha.cpp b/core/fdrm/crypto/fx_crypt_sha.cpp
|
| index 5fb45ab66ad30e9aa743bd602119d5f3ce24a789..79ff503334f1b018f37abc83dedf16e12111639f 100644
|
| --- a/core/fdrm/crypto/fx_crypt_sha.cpp
|
| +++ b/core/fdrm/crypto/fx_crypt_sha.cpp
|
| @@ -9,12 +9,6 @@
|
| #ifdef __cplusplus
|
| extern "C" {
|
| #endif
|
| -typedef struct {
|
| - unsigned int h[5];
|
| - unsigned char block[64];
|
| - int blkused;
|
| - unsigned int lenhi, lenlo;
|
| -} SHA_State;
|
| #define rol(x, y) (((x) << (y)) | (((unsigned int)x) >> (32 - y)))
|
| static void SHA_Core_Init(unsigned int h[5]) {
|
| h[0] = 0x67452301;
|
| @@ -78,14 +72,16 @@ static void SHATransform(unsigned int* digest, unsigned int* block) {
|
| digest[3] += d;
|
| digest[4] += e;
|
| }
|
| -void CRYPT_SHA1Start(void* context) {
|
| - SHA_State* s = (SHA_State*)context;
|
| +
|
| +void CRYPT_SHA1Start(CRYPT_sha1_context* s) {
|
| SHA_Core_Init(s->h);
|
| s->blkused = 0;
|
| s->lenhi = s->lenlo = 0;
|
| }
|
| -void CRYPT_SHA1Update(void* context, const uint8_t* data, uint32_t size) {
|
| - SHA_State* s = (SHA_State*)context;
|
| +
|
| +void CRYPT_SHA1Update(CRYPT_sha1_context* s,
|
| + const uint8_t* data,
|
| + uint32_t size) {
|
| unsigned char* q = (unsigned char*)data;
|
| unsigned int wordblock[16];
|
| int len = size;
|
| @@ -114,8 +110,8 @@ void CRYPT_SHA1Update(void* context, const uint8_t* data, uint32_t size) {
|
| s->blkused = len;
|
| }
|
| }
|
| -void CRYPT_SHA1Finish(void* context, uint8_t digest[20]) {
|
| - SHA_State* s = (SHA_State*)context;
|
| +
|
| +void CRYPT_SHA1Finish(CRYPT_sha1_context* s, uint8_t digest[20]) {
|
| int i;
|
| int pad;
|
| unsigned char c[64];
|
| @@ -149,16 +145,11 @@ void CRYPT_SHA1Finish(void* context, uint8_t digest[20]) {
|
| void CRYPT_SHA1Generate(const uint8_t* data,
|
| uint32_t size,
|
| uint8_t digest[20]) {
|
| - SHA_State s;
|
| + CRYPT_sha1_context s;
|
| CRYPT_SHA1Start(&s);
|
| CRYPT_SHA1Update(&s, data, size);
|
| CRYPT_SHA1Finish(&s, digest);
|
| }
|
| -typedef struct {
|
| - uint32_t total[2];
|
| - uint32_t state[8];
|
| - uint8_t buffer[64];
|
| -} sha256_context;
|
| #define GET_UINT32(n, b, i) \
|
| { \
|
| (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \
|
| @@ -171,8 +162,8 @@ typedef struct {
|
| (b)[(i) + 2] = (uint8_t)((n) >> 8); \
|
| (b)[(i) + 3] = (uint8_t)((n)); \
|
| }
|
| -void CRYPT_SHA256Start(void* context) {
|
| - sha256_context* ctx = (sha256_context*)context;
|
| +
|
| +void CRYPT_SHA256Start(CRYPT_sha256_context* ctx) {
|
| ctx->total[0] = 0;
|
| ctx->total[1] = 0;
|
| ctx->state[0] = 0x6A09E667;
|
| @@ -184,7 +175,8 @@ void CRYPT_SHA256Start(void* context) {
|
| ctx->state[6] = 0x1F83D9AB;
|
| ctx->state[7] = 0x5BE0CD19;
|
| }
|
| -static void sha256_process(sha256_context* ctx, const uint8_t data[64]) {
|
| +
|
| +static void sha256_process(CRYPT_sha256_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);
|
| @@ -300,14 +292,15 @@ static void sha256_process(sha256_context* ctx, const uint8_t data[64]) {
|
| ctx->state[6] += G;
|
| ctx->state[7] += H;
|
| }
|
| -void CRYPT_SHA256Update(void* context, const uint8_t* input, uint32_t length) {
|
| - sha256_context* ctx = (sha256_context*)context;
|
| - uint32_t left, fill;
|
| - if (!length) {
|
| +
|
| +void CRYPT_SHA256Update(CRYPT_sha256_context* ctx,
|
| + const uint8_t* input,
|
| + uint32_t length) {
|
| + if (!length)
|
| return;
|
| - }
|
| - left = ctx->total[0] & 0x3F;
|
| - fill = 64 - left;
|
| +
|
| + uint32_t left = ctx->total[0] & 0x3F;
|
| + uint32_t fill = 64 - left;
|
| ctx->total[0] += length;
|
| ctx->total[0] &= 0xFFFFFFFF;
|
| if (ctx->total[0] < length) {
|
| @@ -329,12 +322,13 @@ void CRYPT_SHA256Update(void* context, const uint8_t* input, uint32_t length) {
|
| FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length);
|
| }
|
| }
|
| +
|
| static const uint8_t sha256_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_SHA256Finish(void* context, uint8_t digest[32]) {
|
| - sha256_context* ctx = (sha256_context*)context;
|
| +
|
| +void CRYPT_SHA256Finish(CRYPT_sha256_context* ctx, uint8_t digest[32]) {
|
| uint32_t last, padn;
|
| uint32_t high, low;
|
| uint8_t msglen[8];
|
| @@ -355,19 +349,16 @@ void CRYPT_SHA256Finish(void* context, uint8_t digest[32]) {
|
| PUT_UINT32(ctx->state[6], digest, 24);
|
| PUT_UINT32(ctx->state[7], digest, 28);
|
| }
|
| +
|
| void CRYPT_SHA256Generate(const uint8_t* data,
|
| uint32_t size,
|
| uint8_t digest[32]) {
|
| - sha256_context ctx;
|
| + CRYPT_sha256_context ctx;
|
| CRYPT_SHA256Start(&ctx);
|
| CRYPT_SHA256Update(&ctx, data, size);
|
| CRYPT_SHA256Finish(&ctx, digest);
|
| }
|
| -typedef struct {
|
| - uint64_t total[2];
|
| - uint64_t state[8];
|
| - uint8_t buffer[128];
|
| -} sha384_context;
|
| +
|
| uint64_t FX_ato64i(const FX_CHAR* str) {
|
| ASSERT(str);
|
| uint64_t ret = 0;
|
| @@ -389,12 +380,12 @@ uint64_t FX_ato64i(const FX_CHAR* str) {
|
| }
|
| return ret;
|
| }
|
| -void CRYPT_SHA384Start(void* context) {
|
| - if (!context) {
|
| +
|
| +void CRYPT_SHA384Start(CRYPT_sha384_context* ctx) {
|
| + if (!ctx)
|
| return;
|
| - }
|
| - sha384_context* ctx = (sha384_context*)context;
|
| - FXSYS_memset(ctx, 0, sizeof(sha384_context));
|
| +
|
| + FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context));
|
| ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");
|
| ctx->state[1] = FX_ato64i("629a292a367cd507");
|
| ctx->state[2] = FX_ato64i("9159015a3070dd17");
|
| @@ -404,6 +395,7 @@ void CRYPT_SHA384Start(void* context) {
|
| ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");
|
| ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");
|
| }
|
| +
|
| #define SHA384_F0(x, y, z) ((x & y) | (z & (x | y)))
|
| #define SHA384_F1(x, y, z) (z ^ (x & (y ^ z)))
|
| #define SHA384_SHR(x, n) (x >> n)
|
| @@ -422,6 +414,9 @@ void CRYPT_SHA384Start(void* context) {
|
| d += temp1; \
|
| h = temp1 + temp2; \
|
| }
|
| +#define SHA384_R(t) \
|
| + (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
|
| +
|
| static const uint8_t sha384_padding[128] = {
|
| 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,
|
| @@ -430,8 +425,7 @@ static const uint8_t sha384_padding[128] = {
|
| 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,
|
| };
|
| -#define SHA384_R(t) \
|
| - (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
|
| +
|
| static const FX_CHAR* constants[] = {
|
| "428a2f98d728ae22", "7137449123ef65cd", "b5c0fbcfec4d3b2f",
|
| "e9b5dba58189dbbc", "3956c25bf348b538", "59f111f1b605d019",
|
| @@ -479,7 +473,8 @@ static const FX_CHAR* constants[] = {
|
| (b)[(i) + 6] = (uint8_t)((n) >> 8); \
|
| (b)[(i) + 7] = (uint8_t)((n)); \
|
| }
|
| -static void sha384_process(sha384_context* ctx, const uint8_t data[128]) {
|
| +
|
| +static void sha384_process(CRYPT_sha384_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];
|
| @@ -546,8 +541,10 @@ static void sha384_process(sha384_context* ctx, const uint8_t data[128]) {
|
| ctx->state[6] += G;
|
| ctx->state[7] += H;
|
| }
|
| -void CRYPT_SHA384Update(void* context, const uint8_t* input, uint32_t length) {
|
| - sha384_context* ctx = (sha384_context*)context;
|
| +
|
| +void CRYPT_SHA384Update(CRYPT_sha384_context* ctx,
|
| + const uint8_t* input,
|
| + uint32_t length) {
|
| uint32_t left, fill;
|
| if (!length) {
|
| return;
|
| @@ -574,8 +571,8 @@ void CRYPT_SHA384Update(void* context, const uint8_t* input, uint32_t length) {
|
| FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length);
|
| }
|
| }
|
| -void CRYPT_SHA384Finish(void* context, uint8_t digest[48]) {
|
| - sha384_context* ctx = (sha384_context*)context;
|
| +
|
| +void CRYPT_SHA384Finish(CRYPT_sha384_context* ctx, uint8_t digest[48]) {
|
| uint32_t last, padn;
|
| uint8_t msglen[16];
|
| FXSYS_memset(msglen, 0, 16);
|
| @@ -595,20 +592,22 @@ void CRYPT_SHA384Finish(void* context, uint8_t digest[48]) {
|
| PUT_UINT64(ctx->state[4], digest, 32);
|
| PUT_UINT64(ctx->state[5], digest, 40);
|
| }
|
| +
|
| void CRYPT_SHA384Generate(const uint8_t* data,
|
| uint32_t size,
|
| uint8_t digest[64]) {
|
| - sha384_context context;
|
| + CRYPT_sha384_context context;
|
| CRYPT_SHA384Start(&context);
|
| CRYPT_SHA384Update(&context, data, size);
|
| CRYPT_SHA384Finish(&context, digest);
|
| }
|
| +
|
| void CRYPT_SHA512Start(void* context) {
|
| if (!context) {
|
| return;
|
| }
|
| - sha384_context* ctx = (sha384_context*)context;
|
| - FXSYS_memset(ctx, 0, sizeof(sha384_context));
|
| + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
|
| + FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context));
|
| ctx->state[0] = FX_ato64i("6a09e667f3bcc908");
|
| ctx->state[1] = FX_ato64i("bb67ae8584caa73b");
|
| ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");
|
| @@ -618,11 +617,14 @@ void CRYPT_SHA512Start(void* context) {
|
| ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");
|
| ctx->state[7] = FX_ato64i("5be0cd19137e2179");
|
| }
|
| +
|
| void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) {
|
| - CRYPT_SHA384Update(context, data, size);
|
| + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
|
| + CRYPT_SHA384Update(ctx, data, size);
|
| }
|
| +
|
| void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) {
|
| - sha384_context* ctx = (sha384_context*)context;
|
| + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context;
|
| uint32_t last, padn;
|
| uint8_t msglen[16];
|
| FXSYS_memset(msglen, 0, 16);
|
| @@ -644,14 +646,16 @@ void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) {
|
| PUT_UINT64(ctx->state[6], digest, 48);
|
| PUT_UINT64(ctx->state[7], digest, 56);
|
| }
|
| +
|
| void CRYPT_SHA512Generate(const uint8_t* data,
|
| uint32_t size,
|
| uint8_t digest[64]) {
|
| - sha384_context context;
|
| + CRYPT_sha384_context context;
|
| CRYPT_SHA512Start(&context);
|
| CRYPT_SHA512Update(&context, data, size);
|
| CRYPT_SHA512Finish(&context, digest);
|
| }
|
| +
|
| #ifdef __cplusplus
|
| };
|
| #endif
|
|
|