forked from wolfSSL/wolfssl
BuildMD5/SHA for GetHash, RestorePos
This commit is contained in:
108
src/internal.c
108
src/internal.c
@@ -3025,22 +3025,44 @@ static const byte PAD2[PAD_MD5] =
|
||||
};
|
||||
|
||||
/* calculate MD5 hash for finished */
|
||||
#ifdef WOLFSSL_TI_HASH
|
||||
#include <wolfssl/wolfcrypt/hash.h>
|
||||
#endif
|
||||
|
||||
static void BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
|
||||
{
|
||||
|
||||
byte md5_result[MD5_DIGEST_SIZE];
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
Md5* md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
Md5* md5_2 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#else
|
||||
Md5 md5[1];
|
||||
Md5 md5_2[1];
|
||||
#endif
|
||||
|
||||
/* make md5 inner */
|
||||
md5[0] = ssl->hsHashes->hashMd5 ; /* Save current position */
|
||||
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, sender, SIZEOF_SENDER);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, PAD1, PAD_MD5);
|
||||
wc_Md5GetHash(&ssl->hsHashes->hashMd5, md5_result);
|
||||
wc_Md5RestorePos(&ssl->hsHashes->hashMd5, md5) ; /* Restore current position */
|
||||
|
||||
/* make md5 outer */
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, PAD2, PAD_MD5);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, md5_result, MD5_DIGEST_SIZE);
|
||||
wc_InitMd5(md5_2) ;
|
||||
wc_Md5Update(md5_2, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_Md5Update(md5_2, PAD2, PAD_MD5);
|
||||
wc_Md5Update(md5_2, md5_result, MD5_DIGEST_SIZE);
|
||||
wc_Md5Final(md5_2, hashes->md5);
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
XFREE(md5_2, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#endif
|
||||
|
||||
wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
|
||||
}
|
||||
|
||||
|
||||
@@ -3049,21 +3071,36 @@ static void BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
|
||||
{
|
||||
byte sha_result[SHA_DIGEST_SIZE];
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
Sha* sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
Sha* sha2 = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#else
|
||||
Sha sha[1];
|
||||
Sha sha2[1] ;
|
||||
#endif
|
||||
/* make sha inner */
|
||||
sha[0] = ssl->hsHashes->hashSha ; /* Save current position */
|
||||
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, sender, SIZEOF_SENDER);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, PAD1, PAD_SHA);
|
||||
wc_ShaGetHash(&ssl->hsHashes->hashSha, sha_result);
|
||||
wc_ShaRestorePos(&ssl->hsHashes->hashSha, sha) ; /* Restore current position */
|
||||
|
||||
/* make sha outer */
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, PAD2, PAD_SHA);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, sha_result, SHA_DIGEST_SIZE);
|
||||
wc_InitSha(sha2) ;
|
||||
wc_ShaUpdate(sha2, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(sha2, PAD2, PAD_SHA);
|
||||
wc_ShaUpdate(sha2, sha_result, SHA_DIGEST_SIZE);
|
||||
wc_ShaFinal(sha2, hashes->sha);
|
||||
|
||||
wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
|
||||
}
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
XFREE(sha2, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Finished doesn't support SHA512, not SHA512 cipher suites yet */
|
||||
static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
|
||||
@@ -6811,17 +6848,33 @@ static void BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
|
||||
{
|
||||
byte md5_result[MD5_DIGEST_SIZE];
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
Md5* md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
Md5* md5_2 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#else
|
||||
Md5 md5[1];
|
||||
Md5 md5_2[1];
|
||||
#endif
|
||||
|
||||
/* make md5 inner */
|
||||
md5[0] = ssl->hsHashes->hashMd5 ; /* Save current position */
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, PAD1, PAD_MD5);
|
||||
wc_Md5Final(&ssl->hsHashes->hashMd5, md5_result);
|
||||
wc_Md5GetHash(&ssl->hsHashes->hashMd5, md5_result);
|
||||
wc_Md5RestorePos(&ssl->hsHashes->hashMd5, md5) ; /* Restore current position */
|
||||
|
||||
/* make md5 outer */
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, ssl->arrays->masterSecret, SECRET_LEN);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, PAD2, PAD_MD5);
|
||||
wc_Md5Update(&ssl->hsHashes->hashMd5, md5_result, MD5_DIGEST_SIZE);
|
||||
wc_InitMd5(md5_2) ;
|
||||
wc_Md5Update(md5_2, ssl->arrays->masterSecret, SECRET_LEN);
|
||||
wc_Md5Update(md5_2, PAD2, PAD_MD5);
|
||||
wc_Md5Update(md5_2, md5_result, MD5_DIGEST_SIZE);
|
||||
|
||||
wc_Md5Final(&ssl->hsHashes->hashMd5, digest);
|
||||
wc_Md5Final(md5_2, digest);
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
XFREE(md5_2, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -6829,17 +6882,34 @@ static void BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
|
||||
{
|
||||
byte sha_result[SHA_DIGEST_SIZE];
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
Sha* sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
Sha* sha2 = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#else
|
||||
Sha sha[1];
|
||||
Sha sha2[1];
|
||||
#endif
|
||||
|
||||
/* make sha inner */
|
||||
sha[0] = ssl->hsHashes->hashSha ; /* Save current position */
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, PAD1, PAD_SHA);
|
||||
wc_ShaFinal(&ssl->hsHashes->hashSha, sha_result);
|
||||
wc_ShaGetHash(&ssl->hsHashes->hashSha, sha_result);
|
||||
wc_ShaRestorePos(&ssl->hsHashes->hashSha, sha) ; /* Restore current position */
|
||||
|
||||
/* make sha outer */
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, PAD2, PAD_SHA);
|
||||
wc_ShaUpdate(&ssl->hsHashes->hashSha, sha_result, SHA_DIGEST_SIZE);
|
||||
wc_InitSha(sha2) ;
|
||||
wc_ShaUpdate(sha2, ssl->arrays->masterSecret,SECRET_LEN);
|
||||
wc_ShaUpdate(sha2, PAD2, PAD_SHA);
|
||||
wc_ShaUpdate(sha2, sha_result, SHA_DIGEST_SIZE);
|
||||
|
||||
wc_ShaFinal(sha2, digest);
|
||||
|
||||
#ifdef WOLFSSL_SMALL_STACK
|
||||
XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
XFREE(sha2, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
#endif
|
||||
|
||||
wc_ShaFinal(&ssl->hsHashes->hashSha, digest);
|
||||
}
|
||||
#endif /* NO_CERTS */
|
||||
#endif /* NO_OLD_TLS */
|
||||
|
Reference in New Issue
Block a user