Key usage of ECC keys on PKCS#15 smartcards doesn't allow decryption?

Mario Haustein mario.haustein at hrz.tu-chemnitz.de
Fri Feb 16 15:12:49 CET 2024


Dear developers,

while implementing the D-Trust ECC smartcards I encountered an issue I 
couldn't make sense of and would like to request assistance from you. I also 
couldn't find an issue in the bug tracker looking similar to it.

My test cards provides two certificates: one for qualified signatures and one 
for (non-qualified) signatures and decryption. While the signature creation 
works out of the box for both keys, I am unable to decrypt an encrypted 
message with the latter key.

This is the secret key:

           ID: 0x2F5CD959
          S/N: 71440EE33409F4256085AFE32C15B5A6
        (dec): 150556141664708457568253825304782812582
       Issuer: /CN=D-TRUST Limited Basic Test CA 1-4 2020/O=D-Trust GmbH/C=DE
      Subject: /CN=XXX/C=DE/SerialNumber=DTR230045177P0004/SN=XXX/GN=XXX
          aka: XXX at d-trust.net
     validity: 2024-01-10 22:03:55 through 2026-01-20 22:03:55
     key type: nistp256
    key usage: digitalSignature keyAgreement
ext key usage: emailProtection (suggested), clientAuth (suggested)
     policies: 1.3.6.1.4.1.4788.2.2.2:N:
  fingerprint: DF:30:3A:2E:C7:6E:60:FD:77:41:BA:03:86:F6:46:18:2F:5C:D9:59
     sha2 fpr: 53:F5:22:23:CD:AD:52:7F:8A:B6:81:FD:C3:9D:04:0A:
7D:B8:48:7C:DF:B1:4D:84:84:D2:AA:C9:BE:19:BC:94
     card s/n: 9276003211760004942F

It supports the usage flags `sign` and `derive` reported as `digitalSignature` 
and `keyAgreement` in the frontend.

I could narrow down the issue to `do_decipher()` in scd/app-p15.c. The 
function bails out at the following check.

```
  if (!(prkdf->usageflags.decrypt
        || prkdf->usageflags.unwrap
        || prkdf->gpgusage.encr     ))
    {
      log_error ("p15: key %s may not be used for decryption\n", keyidstr);
      return gpg_error (GPG_ERR_WRONG_KEY_USAGE);
    }
```

AFAIK decryption with ECDH keys is done by negotiating a common secret between 
Alice and Bob from which the symmetric encryption key is derived. So the 
`derive` key usage flag makes sense as the key is not capable of decrypting 
directly.

When skipping this check, the smartcard works fine for decryption, too.

Is it likely that the `derive` check was just forgotten at this place? I 
cannot judge the consequences of this change, which is the reason for asking 
here in advance.

Many thanks in advance for reviewing my thoughts.

Kind regards
-- 
Mario Haustein
Facharbeitsgruppe Anwendungen
Universitätsrechenzentrum

Technische Universität Chemnitz
Straße der Nationen 62 | R. 1/B303 (neu: A11.303)
09111 Chemnitz
Germany

Tel:    +49 371 531-36606
Fax:    +49 371 531-836606

mario.haustein at hrz.tu-chemnitz.de
www.tu-chemnitz.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.gnupg.org/pipermail/gnupg-devel/attachments/20240216/d2b6d1fe/attachment.sig>


More information about the Gnupg-devel mailing list