I'm trying to reproduce this in jammy, but so far things are working. I tried with p11tool, pkcs11-tool, and openssl configured with a pkcs11 engine.
I don't doubt the issue exists, I'm definitely just missing something in this very complicated stack.
My testing has been around loading certificates and keys into a smart card byt forcing specific labels and IDs. In particular, my last test was forcing an empty label, and different ids, and then specifying the object I want via a pkcs11 url of the form "pkcs11:id=%XX".
The bug report at https://github.com/OpenSC/libp11/issues/435 specifically mentioned the case of different IDs, but same (empty) label, so that's what I tried. That bug report doesn't show the exact commands that were being tried, nor how to produce that debug output.
What I have loaded:
$ p11tool --login --list-all
Token 'label1' with URL 'pkcs11:model=19C43A06010D0000;manufacturer=A.E.T.%20Europe%20B.V.;serial=0191001F00670608;token=label1' requires user PIN
Enter PIN:
Object 0:
URL: pkcs11:model=19C43A06010D0000;manufacturer=A.E.T.%20Europe%20B.V.;serial=0191001F00670608;token=label1;id=%99;type=cert
Type: X.509 Certificate (RSA-2048)
Expires: Sat Sep 3 16:30:50 2022
Label:
Flags: CKA_PRIVATE;
ID: 99
Likewise for ID 99. I then tried encrypting something using a specific key id, and decrypting it using the same key id (in which case it would have to pick the right private key), and it always worked, regardless if I used key 11 or 99.
$ openssl rsautl -encrypt -inkey "pkcs11:id=%99" -engine pkcs11 -pubin -in secret.txt -out secret.enc -keyform engine
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
$ openssl rsautl -engine pkcs11 -keyform engine -decrypt -inkey "pkcs11:id=%99" -in secret.enc
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
Enter PKCS#11 token PIN for label1:
secret
And if I specify the id of the non-matching private key, decryption doesn't work:
$ openssl rsautl -engine pkcs11 -keyform engine -decrypt -inkey "pkcs11:id=%11" -in secret.enc
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
Enter PKCS#11 token PIN for label1:
So, could you please give some steps on how to reproduce the problem, or at least the type of command that was picking up the wrong key or certificate?
Hello,
I'm trying to reproduce this in jammy, but so far things are working. I tried with p11tool, pkcs11-tool, and openssl configured with a pkcs11 engine.
I don't doubt the issue exists, I'm definitely just missing something in this very complicated stack.
My testing has been around loading certificates and keys into a smart card byt forcing specific labels and IDs. In particular, my last test was forcing an empty label, and different ids, and then specifying the object I want via a pkcs11 url of the form "pkcs11:id=%XX".
The bug report at https:/ /github. com/OpenSC/ libp11/ issues/ 435 specifically mentioned the case of different IDs, but same (empty) label, so that's what I tried. That bug report doesn't show the exact commands that were being tried, nor how to produce that debug output.
What I have loaded: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1' requires user PIN model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%99; type=cert
$ p11tool --login --list-all
Token 'label1' with URL 'pkcs11:
Enter PIN:
Object 0:
URL: pkcs11:
Type: X.509 Certificate (RSA-2048)
Expires: Sat Sep 3 16:30:50 2022
Label:
Flags: CKA_PRIVATE;
ID: 99
Object 1: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=cert
URL: pkcs11:
Type: X.509 Certificate (RSA-2048)
Expires: Sat Sep 3 16:33:27 2022
Label:
Flags: CKA_PRIVATE;
ID: 11
Object 2: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=public
URL: pkcs11:
Type: Public key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP;
ID: 11
Object 3: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%99; type=public
URL: pkcs11:
Type: Public key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP;
ID: 99
Object 4: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%99; type=private
URL: pkcs11:
Type: Private key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP; CKA_PRIVATE; CKA_SENSITIVE;
ID: 99
Object 5: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=private
URL: pkcs11:
Type: Private key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP; CKA_PRIVATE; CKA_SENSITIVE;
ID: 11
Object 6: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; object= User%20Pin
URL: pkcs11:
Type: Unknown
Label: User Pin
Flags: CKA_SENSITIVE;
ID:
Object 7: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; object= SO%20Pin
URL: pkcs11:
Type: Unknown
Label: SO Pin
Flags: CKA_SENSITIVE;
ID:
Object 8: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1
URL: pkcs11:
Type: Unknown
Label:
ID:
Filtering by id seems to work fine: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1' requires user PIN model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=cert
$ p11tool --login --list-all "pkcs11:id=%11"
Token 'label1' with URL 'pkcs11:
Enter PIN:
Object 0:
URL: pkcs11:
Type: X.509 Certificate (RSA-2048)
Expires: Sat Sep 3 16:33:27 2022
Label:
Flags: CKA_PRIVATE;
ID: 11
Object 1: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=public
URL: pkcs11:
Type: Public key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP;
ID: 11
Object 2: model=19C43A060 10D0000; manufacturer= A.E.T.% 20Europe% 20B.V.; serial= 0191001F0067060 8;token= label1; id=%11; type=private
URL: pkcs11:
Type: Private key (RSA-2048)
Label:
Flags: CKA_WRAP/UNWRAP; CKA_PRIVATE; CKA_SENSITIVE;
ID: 11
Likewise for ID 99. I then tried encrypting something using a specific key id, and decrypting it using the same key id (in which case it would have to pick the right private key), and it always worked, regardless if I used key 11 or 99.
$ openssl rsautl -encrypt -inkey "pkcs11:id=%99" -engine pkcs11 -pubin -in secret.txt -out secret.enc -keyform engine
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
$ openssl rsautl -engine pkcs11 -keyform engine -decrypt -inkey "pkcs11:id=%99" -in secret.enc
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
Enter PKCS#11 token PIN for label1:
secret
And if I specify the id of the non-matching private key, decryption doesn't work:
$ openssl rsautl -engine pkcs11 -keyform engine -decrypt -inkey "pkcs11:id=%11" -in secret.enc
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
Engine "pkcs11" set.
Enter PKCS#11 token PIN for label1:
So, could you please give some steps on how to reproduce the problem, or at least the type of command that was picking up the wrong key or certificate?