Message ID | 20240523212515.4875-1-jarkko@kernel.org |
---|---|
Headers | show |
Series | KEYS: asymmetric: tpm2_key_rsa | expand |
On Fri May 24, 2024 at 12:25 AM EEST, Jarkko Sakkinen wrote: > + /* > + * ABI requires this according include/crypto/akcipher.h, which says > + * that there is epilogue with algorithm OID and parameters length. > + * Neither size nor semantics is documented *anywhere*, and there's no > + * struct to hold them. > + * > + * So zeroing out the last eight bytes after the key blob seems like the > + * best bet, given no better (or any) information. The size of the > + * parameters (two u32's) was found from crypto/asymmetric/public_key.c. > + */ > + memset(work, 0, 8); This is a mystery (or nightmare). BR, Jarkko
On Fri May 24, 2024 at 12:52 AM EEST, Jarkko Sakkinen wrote: > On Fri May 24, 2024 at 12:39 AM EEST, Jarkko Sakkinen wrote: > > On Fri May 24, 2024 at 12:25 AM EEST, Jarkko Sakkinen wrote: > > > + /* > > > + * ABI requires this according include/crypto/akcipher.h, which says > > > + * that there is epilogue with algorithm OID and parameters length. > > > + * Neither size nor semantics is documented *anywhere*, and there's no > > > + * struct to hold them. > > > + * > > > + * So zeroing out the last eight bytes after the key blob seems like the > > > + * best bet, given no better (or any) information. The size of the > > > + * parameters (two u32's) was found from crypto/asymmetric/public_key.c. > > > + */ > > > + memset(work, 0, 8); > > > > This is a mystery (or nightmare). > > This is from akchiper_alg documentation: > > * @set_pub_key: Function invokes the algorithm specific set public key > * function, which knows how to decode and interpret > * the BER encoded public key and parameters > > No struct, no size information and no description what they are used for. > > Can we get these properly documented? My documentation at the moment > is grep and kprobes, literally. That said, zero issues with the interface, just pointing out the part that is not right, and should be fixed. I mean I have three layers: this, rsa-pcks1 and rsa. How I can be sure that either of two layers below never ever up until sun melts will do any changes that would break, with the data that I put there? Is this a contract that will hold forever? This is concerning so I have to point this out. BR, Jarkko
On Fri May 24, 2024 at 12:25 AM EEST, Jarkko Sakkinen wrote: > ## Overview > > Introduce tpm2_key_rsa module, which implements asymmetric TPM2 RSA key. > The feature can be enabled with the CONFIG_ASYMMETRIC_TPM2_KEY_RSA_SUBTYPE > kconfig option. This feature allows the private key to be uploaded to > the TPM2 for signing, and software can use the public key to verify > the signatures. Since barely v6.9 is out I wrote over night also tpm2_key_ecdsa i.e. ECC/ECDSA based module :-) It was a good idea. I realized e.g. actually documented in the API fact that I should return -EBADMSG as legit undetected. Also found a memory corruption bugs. I renamed extract_pub to probe because that made me sort of realized the role better too. Some of the code could later on put to up-level struct tpm2_key but it is not a functional requirement. I.e. top-level does raw parsing and then these modules check each that if this is for them (e.g. ECDSA) then eat it. Otherwise, pass over. I did do some rudimentary testing and it seems to be quite good, and my pattern seems to work. I.e. different modules for RSA and ECDSA fit well how asymmetric keys are probed and allows to do as a sysadmin appropriate configuration for the use case. My biggest concern is undocumented parameters API in akcipher. BR, Jarkko