Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/uvdevice: Report additional-data length for attestation

Additional data length in the attestation request is an in/out variable.
Software provides the capacity of the buffer. Upon successful request,
firmware reports the actual bytes written to the additional data in that
field. This information is lost, as the length field was not copied back
to userspace before. Attestation might fail, if user space did not
specify the exact amount of needed bytes required, as this length is
part of the attestation measurement.

Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20231106124922.3032370-1-seiden@linux.ibm.com
Message-Id: <20231106124922.3032370-1-seiden@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>

authored by

Steffen Eiden and committed by
Janosch Frank
26fb87ff 98b1cc82

+3
+3
drivers/s390/char/uvdevice.c
··· 109 109 struct uvio_attest *uvio_attest) 110 110 { 111 111 struct uvio_attest __user *user_uvio_attest = (void __user *)uv_ioctl->argument_addr; 112 + u32 __user *user_buf_add_len = (u32 __user *)&user_uvio_attest->add_data_len; 112 113 void __user *user_buf_add = (void __user *)uvio_attest->add_data_addr; 113 114 void __user *user_buf_meas = (void __user *)uvio_attest->meas_addr; 114 115 void __user *user_buf_uid = &user_uvio_attest->config_uid; ··· 117 116 if (copy_to_user(user_buf_meas, measurement, uvio_attest->meas_len)) 118 117 return -EFAULT; 119 118 if (add_data && copy_to_user(user_buf_add, add_data, uvio_attest->add_data_len)) 119 + return -EFAULT; 120 + if (put_user(uvio_attest->add_data_len, user_buf_add_len)) 120 121 return -EFAULT; 121 122 if (copy_to_user(user_buf_uid, uvcb_attest->config_uid, sizeof(uvcb_attest->config_uid))) 122 123 return -EFAULT;