diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 08:18:12 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 08:18:12 -0800 | 
| commit | 33673dcb372b5d8179c22127ca71deb5f3dc7016 (patch) | |
| tree | d182e9dc6aa127375a92b5eb619d6cd2ddc23ce7 /lib | |
| parent | fe9453a1dcb5fb146f9653267e78f4a558066f6f (diff) | |
| parent | 5b2660326039a32b28766cb4c1a8b1bdcfadc375 (diff) | |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull security subsystem updates from James Morris:
 "This is basically a maintenance update for the TPM driver and EVM/IMA"
Fix up conflicts in lib/digsig.c and security/integrity/ima/ima_main.c
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (45 commits)
  tpm/ibmvtpm: build only when IBM pseries is configured
  ima: digital signature verification using asymmetric keys
  ima: rename hash calculation functions
  ima: use new crypto_shash API instead of old crypto_hash
  ima: add policy support for file system uuid
  evm: add file system uuid to EVM hmac
  tpm_tis: check pnp_acpi_device return code
  char/tpm/tpm_i2c_stm_st33: drop temporary variable for return value
  char/tpm/tpm_i2c_stm_st33: remove dead assignment in tpm_st33_i2c_probe
  char/tpm/tpm_i2c_stm_st33: Remove __devexit attribute
  char/tpm/tpm_i2c_stm_st33: Don't use memcpy for one byte assignment
  tpm_i2c_stm_st33: removed unused variables/code
  TPM: Wait for TPM_ACCESS tpmRegValidSts to go high at startup
  tpm: Fix cancellation of TPM commands (interrupt mode)
  tpm: Fix cancellation of TPM commands (polling mode)
  tpm: Store TPM vendor ID
  TPM: Work around buggy TPMs that block during continue self test
  tpm_i2c_stm_st33: fix oops when i2c client is unavailable
  char/tpm: Use struct dev_pm_ops for power management
  TPM: STMicroelectronics ST33 I2C BUILD STUFF
  ...
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/digsig.c | 41 | ||||
| -rw-r--r-- | lib/mpi/mpi-internal.h | 4 | ||||
| -rw-r--r-- | lib/mpi/mpicoder.c | 8 | 
3 files changed, 18 insertions, 35 deletions
| diff --git a/lib/digsig.c b/lib/digsig.c index dc2be7ed1765..2f31e6a45f0a 100644 --- a/lib/digsig.c +++ b/lib/digsig.c @@ -30,11 +30,10 @@  static struct crypto_shash *shash; -static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, -			unsigned long  msglen, -			unsigned long  modulus_bitlen, -			unsigned char *out, -			unsigned long *outlen) +static const char *pkcs_1_v1_5_decode_emsa(const unsigned char *msg, +						unsigned long  msglen, +						unsigned long  modulus_bitlen, +						unsigned long *outlen)  {  	unsigned long modulus_len, ps_len, i; @@ -42,11 +41,11 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,  	/* test message size */  	if ((msglen > modulus_len) || (modulus_len < 11)) -		return -EINVAL; +		return NULL;  	/* separate encoded message */ -	if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) -		return -EINVAL; +	if (msg[0] != 0x00 || msg[1] != 0x01) +		return NULL;  	for (i = 2; i < modulus_len - 1; i++)  		if (msg[i] != 0xFF) @@ -56,19 +55,13 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,  	if (msg[i] != 0)  		/* There was no octet with hexadecimal value 0x00  		to separate ps from m. */ -		return -EINVAL; +		return NULL;  	ps_len = i - 2; -	if (*outlen < (msglen - (2 + ps_len + 1))) { -		*outlen = msglen - (2 + ps_len + 1); -		return -EOVERFLOW; -	} -  	*outlen = (msglen - (2 + ps_len + 1)); -	memcpy(out, &msg[2 + ps_len + 1], *outlen); -	return 0; +	return msg + 2 + ps_len + 1;  }  /* @@ -83,7 +76,8 @@ static int digsig_verify_rsa(struct key *key,  	unsigned long mlen, mblen;  	unsigned nret, l;  	int head, i; -	unsigned char *out1 = NULL, *out2 = NULL; +	unsigned char *out1 = NULL; +	const char *m;  	MPI in = NULL, res = NULL, pkey[2];  	uint8_t *p, *datap, *endp;  	struct user_key_payload *ukp; @@ -120,7 +114,7 @@ static int digsig_verify_rsa(struct key *key,  	}  	mblen = mpi_get_nbits(pkey[0]); -	mlen = (mblen + 7)/8; +	mlen = DIV_ROUND_UP(mblen, 8);  	if (mlen == 0)  		goto err; @@ -129,10 +123,6 @@ static int digsig_verify_rsa(struct key *key,  	if (!out1)  		goto err; -	out2 = kzalloc(mlen, GFP_KERNEL); -	if (!out2) -		goto err; -  	nret = siglen;  	in = mpi_read_from_buffer(sig, &nret);  	if (!in) @@ -164,18 +154,15 @@ static int digsig_verify_rsa(struct key *key,  	kfree(p); -	err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); -	if (err) -		goto err; +	m = pkcs_1_v1_5_decode_emsa(out1, len, mblen, &len); -	if (len != hlen || memcmp(out2, h, hlen)) +	if (!m || len != hlen || memcmp(m, h, hlen))  		err = -EINVAL;  err:  	mpi_free(in);  	mpi_free(res);  	kfree(out1); -	kfree(out2);  	while (--i >= 0)  		mpi_free(pkey[i]);  err1: diff --git a/lib/mpi/mpi-internal.h b/lib/mpi/mpi-internal.h index 77adcf6bc257..60cf765628e9 100644 --- a/lib/mpi/mpi-internal.h +++ b/lib/mpi/mpi-internal.h @@ -65,10 +65,6 @@  typedef mpi_limb_t *mpi_ptr_t;	/* pointer to a limb */  typedef int mpi_size_t;		/* (must be a signed type) */ -#define ABS(x) (x >= 0 ? x : -x) -#define MIN(l, o) ((l) < (o) ? (l) : (o)) -#define MAX(h, i) ((h) > (i) ? (h) : (i)) -  static inline int RESIZE_IF_NEEDED(MPI a, unsigned b)  {  	if (a->alloced < b) diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 3962b7f7fe3f..5f9c44cdf1f5 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c @@ -52,7 +52,7 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes)  	else  		nbits = 0; -	nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; +	nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);  	val = mpi_alloc(nlimbs);  	if (!val)  		return NULL; @@ -96,8 +96,8 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)  	buffer += 2;  	nread = 2; -	nbytes = (nbits + 7) / 8; -	nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; +	nbytes = DIV_ROUND_UP(nbits, 8); +	nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);  	val = mpi_alloc(nlimbs);  	if (!val)  		return NULL; @@ -193,7 +193,7 @@ int mpi_set_buffer(MPI a, const void *xbuffer, unsigned nbytes, int sign)  	int nlimbs;  	int i; -	nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; +	nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);  	if (RESIZE_IF_NEEDED(a, nlimbs) < 0)  		return -ENOMEM;  	a->sign = sign; | 
