hcrypto WinCNG backend: zero rgb{Hash,Key}Object on reinit
In the interest of being paranoid, when a WinCNG crypto or digest context is being reinitialized, zero out the backing store as well as destroying the handle.
This commit is contained in:
		| @@ -96,8 +96,10 @@ wincng_cleanup(EVP_CIPHER_CTX *ctx) | |||||||
| { | { | ||||||
|     struct wincng_key *cng = ctx->cipher_data; |     struct wincng_key *cng = ctx->cipher_data; | ||||||
|  |  | ||||||
|     if (cng->hKey) |     if (cng->hKey) { | ||||||
| 	BCryptDestroyKey(cng->hKey); | 	BCryptDestroyKey(cng->hKey); | ||||||
|  | 	cng->hKey = (BCRYPT_KEY_HANDLE)0; | ||||||
|  |     } | ||||||
|     SecureZeroMemory(cng->rgbKeyObject, WINCNG_KEY_OBJECT_SIZE(ctx)); |     SecureZeroMemory(cng->rgbKeyObject, WINCNG_KEY_OBJECT_SIZE(ctx)); | ||||||
|  |  | ||||||
|     return 1; |     return 1; | ||||||
| @@ -196,10 +198,7 @@ wincng_key_init(EVP_CIPHER_CTX *ctx, | |||||||
|     if (ctx->cipher->app_data == NULL) |     if (ctx->cipher->app_data == NULL) | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|     if (cng->hKey) { |     wincng_cleanup(ctx); | ||||||
| 	BCryptDestroyKey(cng->hKey); /* allow reinitialization */ |  | ||||||
| 	cng->hKey = (BCRYPT_KEY_HANDLE)0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|      * Note: ctx->key_len not EVP_CIPHER_CTX_key_length() for |      * Note: ctx->key_len not EVP_CIPHER_CTX_key_length() for | ||||||
| @@ -567,6 +566,9 @@ wincng_md_algorithm_init(EVP_MD *md, | |||||||
|     return hAlgorithm; |     return hAlgorithm; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | wincng_md_cleanup(EVP_MD_CTX *ctx); | ||||||
|  |  | ||||||
| static int | static int | ||||||
| wincng_md_hash_init(BCRYPT_ALG_HANDLE hAlgorithm, | wincng_md_hash_init(BCRYPT_ALG_HANDLE hAlgorithm, | ||||||
| 		    EVP_MD_CTX *ctx) | 		    EVP_MD_CTX *ctx) | ||||||
| @@ -575,10 +577,7 @@ wincng_md_hash_init(BCRYPT_ALG_HANDLE hAlgorithm, | |||||||
|     NTSTATUS status; |     NTSTATUS status; | ||||||
|     ULONG cbData; |     ULONG cbData; | ||||||
|  |  | ||||||
|     if (cng->hHash) { |     wincng_md_cleanup(ctx); | ||||||
| 	BCryptDestroyHash(cng->hHash); /* allow reinitialization */ |  | ||||||
| 	cng->hHash = (BCRYPT_HASH_HANDLE)0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     status = BCryptGetProperty(hAlgorithm, |     status = BCryptGetProperty(hAlgorithm, | ||||||
| 			       BCRYPT_OBJECT_LENGTH, | 			       BCRYPT_OBJECT_LENGTH, | ||||||
| @@ -643,8 +642,10 @@ wincng_md_cleanup(EVP_MD_CTX *ctx) | |||||||
| { | { | ||||||
|     struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; |     struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; | ||||||
|  |  | ||||||
|     if (cng->hHash) |     if (cng->hHash) { | ||||||
| 	BCryptDestroyHash(cng->hHash); | 	BCryptDestroyHash(cng->hHash); | ||||||
|  | 	cng->hHash = (BCRYPT_HASH_HANDLE)0; | ||||||
|  |     } | ||||||
|     SecureZeroMemory(cng->rgbHashObject, cng->cbHashObject); |     SecureZeroMemory(cng->rgbHashObject, cng->cbHashObject); | ||||||
|  |  | ||||||
|     return 1; |     return 1; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Luke Howard
					Luke Howard