From previous private conversations, can you comments on if this is a PIV or NEO with a PIV applet?

Did you generate a key on the card using the piv-tool or NEO tool?

  https://github.com/OpenSC/OpenSC/wiki/PivTool

 https://github.com/OpenSC/OpenSC/wiki/PivTool#generate-a-key-pair

Did you have the piv-tool save the public key to a file using the -o option?

Did you create a certificate  and load it on the card?
I assume not.

There is a chicken and egg problem with the PIV. To determine if a key is on the card, and its attributes,
the public key that was saved during key generate step is needed. In normal use the public key is in the certificate,
on the card. But if there is NO certificate on the card,  as when you are trying to generate the certificate, the OpenSC
low level routines will look for the public key from a file off the card.

 https://github.com/OpenSC/OpenSC/wiki/PivTool#generate-a-certificate-request

shows setting of the PIV_9A_KEY =  environment variable.
In your case because you are using the "SIGN key"  you would need to set
PIV_9C_KEY=path.to.pubkey.file.der
This should  work with other programs like openssl pkeyutl too.

Once the certificate is then loaded, the PIV_9X_KEY environment variable will not be used.







On 12/10/2015 9:38 AM, Blumenthal, Uri - 0553 - MITLL wrote:
On 12/10/15, 3:39 , "openssl-dev on behalf of Richard Levitte"
<openssl-dev-boun...@openssl.org on behalf of levi...@openssl.org> wrote:

This is an odity with 'openssl pkeyutl'.  Try this option order:
I see!

LOAD_CERT_CTRL=true VERBOSE=7 openssl pkeyutl -engine pkcs11 -sign
-keyform engine -inkey
"pkcs11:object=SIGN%20key;object-type=private;pin-value=123456" -out
config.status.sig -in config.status.hash
Much better now - but at this time I hit “unsupported algorithm”. The key
in question is RSA-2048, with SHA256.

$ LOAD_CERT_CTRL=true VERBOSE=7 openssl pkeyutl -engine pkcs11 -sign
-keyform engine -inkey
"pkcs11:object=SIGN%20key;object-type=private;pin-value=123456" -out
config.status.sig -in config.status.hash
engine "pkcs11" set.
Error initializing context
140735296230224:error:260C0065:engine
routines:ENGINE_get_pkey_meth:unimplemented public key
method:tb_pkmeth.c:128:
140735296230224:error:0609D09C:digital envelope
routines:INT_CTX_NEW:unsupported algorithm:pmeth_lib.c:164:
Usage: pkeyutl [options]
-in file        input file
-out file       output file
-sigfile file signature file (verify operation only)
-inkey file     input key
-keyform arg    private key format - default PEM
-pubin          input is a public key
-certin         input is a certificate carrying a public key
-pkeyopt X:Y    public key options
-sign           sign with private key
-verify         verify with public key
-verifyrecover  verify with public key, recover original data
-encrypt        encrypt with public key
-decrypt        decrypt with private key
-derive         derive shared secret
-hexdump        hex dump output
-engine e       use engine e, possibly a hardware device.
-passin arg     pass phrase source
$


I observed exactly the same happening with the decryption key.

In case it helps:

$ pkcs15-tool -k
Using reader with a card: Yubico Yubikey NEO OTP+U2F+CCID
Private RSA Key [PIV AUTH key]
	Object Flags   : [0x1], private
	Usage          : [0x2E], decrypt, sign, signRecover, unwrap
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 154 (0x9A)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : 
0x'303165623538356130633436626635356438343233643936396232336465623700000000
00000000'


Private RSA Key [SIGN key]
	Object Flags   : [0x1], private
	Usage          : [0x20E], decrypt, sign, signRecover, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 156 (0x9C)
	Native         : yes
	Auth ID        : 01
	ID             : 02
	MD:guid        : 
0x'303265623538356130633436626635356438343233643936396232336465623700000000
00000000'


Private RSA Key [KEY MAN key]
	Object Flags   : [0x1], private
	Usage          : [0x22], decrypt, unwrap
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 157 (0x9D)
	Native         : yes
	Auth ID        : 01
	ID             : 03
	MD:guid        : 
0x'303365623538356130633436626635356438343233643936396232336465623700000000
00000000'


Private RSA Key [CARD AUTH key]
	Object Flags   : [0x0]
	Usage          : [0xC], sign, signRecover
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 158 (0x9E)
	Native         : yes
	ID             : 04
	MD:guid        : 
0x'303465623538356130633436626635356438343233643936396232336465623700000000
00000000'



The reason for this is that pkeyutl (as opposed to most other openssl
subcommands) tries to load the key while parsing the options, so if
'-keyform engine' comes after '-inkey ...', it will try to load the
key before having seen that it should be loaded from engine.

I think a bugfix for this is in order...
I appreciate your willingness to help - and your willingness to fix this
even more.

By the way, there appears to be another order-related issue also: -pkeyopt
must follow -inkey. But in this case pkeyutl at least reports the problem
correctly.

Thanks!


In message <d28e0643.23c27%...@ll.mit.edu> on Wed, 9 Dec 2015 21:24:41
+0000, "Blumenthal, Uri - 0553 - MITLL" <u...@ll.mit.edu> said:

uri> I’m having a problem, and am not sure whether it’s due to my
uri> ignorance/misuse of the tool (i.e. it should be done differently), or
uri> a bug in the tool, or it’s just not capable of doing what I want it
uri> to.
uri> 
uri> What I’m trying to accomplish: use engine_pkcs11 with OpenSSL to sign
uri> and decrypt with private keys on a smart card, accessed as a PKCS#11
uri> token. To support this engine, I’ve also installed libp11, and of
uri> course OpenSC itself.
uri> 
uri> This shows that OpenSC works and accesses the smart card
successfully:
uri> 
uri> $ p11tool --provider /Library/OpenSC/lib/opensc-pkcs11.dylib -
uri> -list-privkeys --login
uri> 
uri> Token 'PIV_II (PIV Card Holder pin)' with URL
uri> 
'pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=P
IV_II%20%28PIV%20Card%20Holder%20pin%29'
uri> requires user PIN
uri> 
uri> Enter PIN:
uri> 
uri> Object 0:
uri> 
uri> URL:
uri> 
pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=PI
V_II%20%28PIV%20Card%20Holder%20pin%29;id=%01;object=PIV%20AUTH%20key;obje
ct-type=private
uri> 
uri> Type: Private key
uri> 
uri> Label: PIV AUTH key
uri> 
uri> Flags: CKA_WRAP/UNWRAP; CKA_PRIVATE; CKA_SENSITIVE;
uri> 
uri> ID: 01
uri> 
uri> Object 1:
uri> 
uri> URL:
uri> 
pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=PI
V_II%20%28PIV%20Card%20Holder%20pin%29;id=%02;object=SIGN%20key;object-typ
e=private
uri> 
uri> Type: Private key
uri> 
uri> Label: SIGN key
uri> 
uri> Flags: CKA_PRIVATE; CKA_SENSITIVE;
uri> 
uri> ID: 02
uri> 
uri> Object 2:
uri> 
uri> URL:
uri> 
pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=PI
V_II%20%28PIV%20Card%20Holder%20pin%29;id=%03;object=KEY%20MAN%20key;objec
t-type=private
uri> 
uri> Type: Private key
uri> 
uri> Label: KEY MAN key
uri> 
uri> Flags: CKA_WRAP/UNWRAP; CKA_PRIVATE; CKA_SENSITIVE;
uri> 
uri> ID: 03
uri> 
uri> Object 3:
uri> 
uri> URL:
uri> 
pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=PI
V_II%20%28PIV%20Card%20Holder%20pin%29;id=%04;object=CARD%20AUTH%20key;obj
ect-type=private
uri> 
uri> Type: Private key
uri> 
uri> Label: CARD AUTH key
uri> 
uri> Flags: CKA_SENSITIVE;
uri> 
uri> ID: 04
uri> 
uri> This shows that OpenSSL does seem to load the engine, but fails to
uri> access the key on the smart card:
uri> 
uri> $ openssl engine pkcs11 -t
uri> 
uri> (pkcs11) pkcs11 engine
uri> 
uri> [ available ]
uri> 
uri> $ openssl req -engine pkcs11 -new -key
uri> 
"pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=……..;token=P
IV_II%20%28PIV%20Card%20Holder%20pin%29;id=%02;object=SIGN%20key;object-ty
pe=private;pin-value=123456"
uri> -keyform engine -out req.pem -text -x509 -subj "/CN=Tester"
uri> 
uri> engine "pkcs11" set.
uri> 
uri> specified object not found
uri> 
uri> PKCS11_get_private_key returned NULL
uri> 
uri> cannot load Private Key from engine
uri> 
uri> 140735296230224:error:26096080:engine
uri> routines:ENGINE_load_private_key:failed loading private
uri> key:eng_pkey.c:124:
uri> 
uri> unable to load Private Key
uri> 
uri> $ LOAD_CERT_CTRL=true VERBOSE=7 openssl pkeyutl -engine pkcs11 -sign
-
uri> inkey 
"pkcs11:object=SIGN%20key;object-type=private;pin-value=123456" -
uri> keyform engine -out config.status.sig -in config.status.hash
uri> 
uri> engine "pkcs11" set.
uri> 
uri> Error opening Private Key
uri> pkcs11:object=SIGN%20key;object-type=private;pin-value=123456
uri> 
uri> 140735296230224:error:02001002:system library:fopen:No such file or
uri> directory:bss_file.c:398:fopen
uri> ('pkcs11:object=SIGN%20key;object-type=private;pin-value=123456','r')
uri> 
uri> 140735296230224:error:20074002:BIO routines:FILE_CTRL:system
uri> lib:bss_file.c:400:
uri> 
uri> unable to load Private Key
uri> 
uri> Error initializing context
uri> 
uri> Usage: pkeyutl [options]
uri> 
uri> -in file input file
uri> 
uri> -out file output file
uri> 
uri> -sigfile file signature file (verify operation only)
uri> 
uri> -inkey file input key
uri> 
uri> -keyform arg private key format - default PEM
uri> 
uri> -pubin input is a public key
uri> 
uri> -certin input is a certificate carrying a public key
uri> 
uri> -pkeyopt X:Y public key options
uri> 
uri> -sign sign with private key
uri> 
uri> -verify verify with public key
uri> 
uri> -verifyrecover verify with public key, recover original data
uri> 
uri> -encrypt encrypt with public key
uri> 
uri> -decrypt decrypt with private key
uri> 
uri> -derive derive shared secret
uri> 
uri> -hexdump hex dump output
uri> 
uri> -engine e use engine e, possibly a hardware device.
uri> 
uri> -passin arg pass phrase source
uri> 
uri> $
uri> 
uri> I would appreciate guidance regarding how to accomplish what I’m
uri> trying to do, and whether it is possible to do so staying within the
uri> OpenSSL CLI.
uri> 
uri> Thanks!
uri> 
uri> P.S. I followed the README from
uri> https://github.com/OpenSC/engine_pkcs11 as an example of how to use
uri> OpenSSL with engine_pkcs11 and the token.
uri> --
uri> Regards,
uri> Uri Blumenthal
_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev


_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

-- 

 Douglas E. Engert  <deeng...@gmail.com>
 
_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

Reply via email to