diff options
author | Alex Dowad <alexinbeijing@gmail.com> | 2020-06-23 16:32:41 +0200 |
---|---|---|
committer | Alex Dowad <alexinbeijing@gmail.com> | 2020-06-24 13:40:27 +0200 |
commit | 19d3e29bf5383b5b71b00727bd9bb5971bbbdce5 (patch) | |
tree | cee4ee4c8791aeec0c295d5fc6eba529f83ae690 /ext/standard/php_crypt_r.c | |
parent | e94afec7007dcd3557a40b020f6f184fa2338cdf (diff) | |
download | php-git-19d3e29bf5383b5b71b00727bd9bb5971bbbdce5.tar.gz |
Clean house in cryptographic hashing code
- Remove dead code from php_crypt_r.c
This code has been commented out since the file was added in 2008. It's safe to say
that no-one is ever going to use it.
- Fix typo in comment in php_crypt_r.c
- Remove redundant Windows-only implementation of php_md5_crypt_r
There is a portable implementation in the same file, which is selected if not
building for Windows. But why should Windows have its own special implementation
of this function at all? There doesn't seem to be any good reason.
Better to use the portable implementation on all platforms.
- Don't define useless __CONST macro in php_crypt_r.h
This preprocessor macro is not used anywhere.
- Add comment on functions for encoding data as Base64
- Remove dead code from crypt_blowfish.h
- Remove unneeded junk comments from crypt_freesec.c
- Remove dead code from crypt_blowfish.c
This function has been commented out since 2011.
Diffstat (limited to 'ext/standard/php_crypt_r.c')
-rw-r--r-- | ext/standard/php_crypt_r.c | 206 |
1 files changed, 3 insertions, 203 deletions
diff --git a/ext/standard/php_crypt_r.c b/ext/standard/php_crypt_r.c index 432657cf47..1e55f5f9b5 100644 --- a/ext/standard/php_crypt_r.c +++ b/ext/standard/php_crypt_r.c @@ -41,20 +41,12 @@ #include "php_crypt_r.h" #include "crypt_freesec.h" - -#if !PHP_WIN32 #include "ext/standard/md5.h" -#endif #ifdef ZTS MUTEX_T php_crypt_extended_init_lock; #endif -/* TODO: enable it when enabling vista/2k8 mode in tsrm */ -#if 0 -CONDITION_VARIABLE initialized; -#endif - void php_init_crypt_r() { #ifdef ZTS @@ -87,15 +79,15 @@ void _crypt_extended_init_r(void) #endif } -/* MD% crypt implementation using the windows CryptoApi */ +/* MD5 crypt implementation using the windows CryptoApi */ #define MD5_MAGIC "$1$" #define MD5_MAGIC_LEN 3 static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -static void -to64(char *s, int32_t v, int n) +/* Convert a 16/32 bit integer to Base64 string representation */ +static void to64(char *s, int32_t v, int n) { while (--n >= 0) { *s++ = itoa64[v & 0x3f]; @@ -103,194 +95,6 @@ to64(char *s, int32_t v, int n) } } -#ifdef PHP_WIN32 -char * php_md5_crypt_r(const char *pw, const char *salt, char *out) { - HCRYPTPROV hCryptProv; - HCRYPTHASH ctx, ctx1; - DWORD i, pwl, sl; - const BYTE magic_md5[4] = "$1$"; - const DWORD magic_md5_len = 3; - DWORD dwHashLen; - int pl; - __int32 l; - const char *sp = salt; - const char *ep = salt; - char *p = NULL; - char *passwd = out; - unsigned char final[16]; - - /* Acquire a cryptographic provider context handle. */ - if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { - return NULL; - } - - pwl = (DWORD) strlen(pw); - - /* Refine the salt first */ - sp = salt; - - /* If it starts with the magic string, then skip that */ - if (strncmp(sp, MD5_MAGIC, MD5_MAGIC_LEN) == 0) { - sp += MD5_MAGIC_LEN; - } - - /* It stops at the first '$', max 8 chars */ - for (ep = sp; *ep != '\0' && *ep != '$' && ep < (sp + 8); ep++); - - /* get the length of the true salt */ - sl = (DWORD)(ep - sp); - - /* Create an empty hash object. */ - if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &ctx)) { - goto _destroyProv; - } - - /* The password first, since that is what is most unknown */ - if(!CryptHashData(ctx, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx0; - } - - /* Then our magic string */ - if(!CryptHashData(ctx, magic_md5, magic_md5_len, 0)) { - goto _destroyCtx0; - } - - /* Then the raw salt */ - if(!CryptHashData( ctx, (BYTE *)sp, sl, 0)) { - goto _destroyCtx0; - } - - /* MD5(pw,salt,pw), valid. */ - /* Then just as many characters of the MD5(pw,salt,pw) */ - if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &ctx1)) { - goto _destroyCtx0; - } - if(!CryptHashData(ctx1, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx1; - } - if(!CryptHashData(ctx1, (BYTE *)sp, sl, 0)) { - goto _destroyCtx1; - } - if(!CryptHashData(ctx1, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx1; - } - - dwHashLen = 16; - CryptGetHashParam(ctx1, HP_HASHVAL, final, &dwHashLen, 0); - /* MD5(pw,salt,pw). Valid. */ - - for (pl = pwl; pl > 0; pl -= 16) { - CryptHashData(ctx, final, (DWORD)(pl > 16 ? 16 : pl), 0); - } - - /* Don't leave anything around in vm they could use. */ - ZEND_SECURE_ZERO(final, sizeof(final)); - - /* Then something really weird... */ - for (i = pwl; i != 0; i >>= 1) { - if ((i & 1) != 0) { - CryptHashData(ctx, (const BYTE *)final, 1, 0); - } else { - CryptHashData(ctx, (const BYTE *)pw, 1, 0); - } - } - - memcpy(passwd, MD5_MAGIC, MD5_MAGIC_LEN); - - if (strncpy_s(passwd + MD5_MAGIC_LEN, MD5_HASH_MAX_LEN - MD5_MAGIC_LEN, sp, sl + 1) != 0) { - goto _destroyCtx1; - } - passwd[MD5_MAGIC_LEN + sl] = '\0'; - strcat_s(passwd, MD5_HASH_MAX_LEN, "$"); - - dwHashLen = 16; - - /* Fetch the ctx hash value */ - CryptGetHashParam(ctx, HP_HASHVAL, final, &dwHashLen, 0); - - for (i = 0; i < 1000; i++) { - if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &ctx1)) { - goto _destroyCtx1; - } - - if ((i & 1) != 0) { - if(!CryptHashData(ctx1, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx1; - } - } else { - if(!CryptHashData(ctx1, (BYTE *)final, 16, 0)) { - goto _destroyCtx1; - } - } - - if ((i % 3) != 0) { - if(!CryptHashData(ctx1, (BYTE *)sp, sl, 0)) { - goto _destroyCtx1; - } - } - - if ((i % 7) != 0) { - if(!CryptHashData(ctx1, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx1; - } - } - - if ((i & 1) != 0) { - if(!CryptHashData(ctx1, (BYTE *)final, 16, 0)) { - goto _destroyCtx1; - } - } else { - if(!CryptHashData(ctx1, (BYTE *)pw, pwl, 0)) { - goto _destroyCtx1; - } - } - - /* Fetch the ctx hash value */ - dwHashLen = 16; - CryptGetHashParam(ctx1, HP_HASHVAL, final, &dwHashLen, 0); - if(!(CryptDestroyHash(ctx1))) { - goto _destroyCtx0; - } - } - - ctx1 = (HCRYPTHASH) NULL; - - p = passwd + sl + MD5_MAGIC_LEN + 1; - - l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p,l,4); p += 4; - l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p,l,4); p += 4; - l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p,l,4); p += 4; - l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p,l,4); p += 4; - l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p,l,4); p += 4; - l = final[11]; to64(p,l,2); p += 2; - - *p = '\0'; - - ZEND_SECURE_ZERO(final, sizeof(final)); - - -_destroyCtx1: - if (ctx1) { - if (!CryptDestroyHash(ctx1)) { - - } - } - -_destroyCtx0: - CryptDestroyHash(ctx); - -_destroyProv: - /* Release the provider handle.*/ - if(hCryptProv) { - if(!(CryptReleaseContext(hCryptProv, 0))) { - return NULL; - } - } - - return out; -} -#else - /* * MD5 password encryption. */ @@ -398,7 +202,3 @@ char * php_md5_crypt_r(const char *pw, const char *salt, char *out) ZEND_SECURE_ZERO(final, sizeof(final)); return (passwd); } - -#undef MD5_MAGIC -#undef MD5_MAGIC_LEN -#endif |