diff options
Diffstat (limited to 'security/keys/trusted.c')
| -rw-r--r-- | security/keys/trusted.c | 33 | 
1 files changed, 25 insertions, 8 deletions
diff --git a/security/keys/trusted.c b/security/keys/trusted.c index bcc9c6ead7fd..a75b2f0f1230 100644 --- a/security/keys/trusted.c +++ b/security/keys/trusted.c @@ -55,7 +55,6 @@ static struct sdesc *init_sdesc(struct crypto_shash *alg)  	if (!sdesc)  		return ERR_PTR(-ENOMEM);  	sdesc->shash.tfm = alg; -	sdesc->shash.flags = 0x0;  	return sdesc;  } @@ -125,7 +124,7 @@ out:   */  int TSS_authhmac(unsigned char *digest, const unsigned char *key,  			unsigned int keylen, unsigned char *h1, -			unsigned char *h2, unsigned char h3, ...) +			unsigned char *h2, unsigned int h3, ...)  {  	unsigned char paramdigest[SHA1_DIGEST_SIZE];  	struct sdesc *sdesc; @@ -135,13 +134,16 @@ int TSS_authhmac(unsigned char *digest, const unsigned char *key,  	int ret;  	va_list argp; +	if (!chip) +		return -ENODEV; +  	sdesc = init_sdesc(hashalg);  	if (IS_ERR(sdesc)) {  		pr_info("trusted_key: can't alloc %s\n", hash_alg);  		return PTR_ERR(sdesc);  	} -	c = h3; +	c = !!h3;  	ret = crypto_shash_init(&sdesc->shash);  	if (ret < 0)  		goto out; @@ -196,6 +198,9 @@ int TSS_checkhmac1(unsigned char *buffer,  	va_list argp;  	int ret; +	if (!chip) +		return -ENODEV; +  	bufsize = LOAD32(buffer, TPM_SIZE_OFFSET);  	tag = LOAD16(buffer, 0);  	ordinal = command; @@ -363,6 +368,9 @@ int trusted_tpm_send(unsigned char *cmd, size_t buflen)  {  	int rc; +	if (!chip) +		return -ENODEV; +  	dump_tpm_buf(cmd);  	rc = tpm_send(chip, cmd, buflen);  	dump_tpm_buf(cmd); @@ -429,6 +437,9 @@ int oiap(struct tpm_buf *tb, uint32_t *handle, unsigned char *nonce)  {  	int ret; +	if (!chip) +		return -ENODEV; +  	INIT_BUF(tb);  	store16(tb, TPM_TAG_RQU_COMMAND);  	store32(tb, TPM_OIAP_SIZE); @@ -1245,9 +1256,13 @@ static int __init init_trusted(void)  {  	int ret; +	/* encrypted_keys.ko depends on successful load of this module even if +	 * TPM is not used. +	 */  	chip = tpm_default_chip();  	if (!chip) -		return -ENOENT; +		return 0; +  	ret = init_digests();  	if (ret < 0)  		goto err_put; @@ -1269,10 +1284,12 @@ err_put:  static void __exit cleanup_trusted(void)  { -	put_device(&chip->dev); -	kfree(digests); -	trusted_shash_release(); -	unregister_key_type(&key_type_trusted); +	if (chip) { +		put_device(&chip->dev); +		kfree(digests); +		trusted_shash_release(); +		unregister_key_type(&key_type_trusted); +	}  }  late_initcall(init_trusted);  | 
