30#include <openssl/bio.h>
31#include <openssl/err.h>
32#include <openssl/bn.h>
33#include <openssl/rsa.h>
34#include <openssl/x509.h>
35#include <openssl/evp.h>
41#define PKCS11_FLAG_NO_METHODS 1
43int ERR_load_CKR_strings(
void);
44void ERR_unload_CKR_strings(
void);
45void ERR_CKR_error(
int function,
int reason,
char *file,
int line);
46# define CKRerr(f,r) ERR_CKR_error((f),(r),__FILE__,__LINE__)
47int ERR_get_CKR_code(
void);
56typedef struct pkcs11_object_private PKCS11_OBJECT_private;
57typedef struct pkcs11_slot_private PKCS11_SLOT_private;
58typedef struct pkcs11_ctx_private PKCS11_CTX_private;
74#define PKCS11_EDDSA_KGEN PKCS11_NID_KGEN
83 PKCS11_OBJECT_private *_private;
92 PKCS11_OBJECT_private *_private;
101 unsigned char initialized;
102 unsigned char loginRequired;
103 unsigned char secureLogin;
104 unsigned char userPinSet;
105 unsigned char readOnly;
106 unsigned char hasRng;
107 unsigned char userPinCountLow;
108 unsigned char userPinFinalTry;
109 unsigned char userPinLocked;
110 unsigned char userPinToBeChanged;
111 unsigned char soPinCountLow;
112 unsigned char soPinFinalTry;
113 unsigned char soPinLocked;
114 unsigned char soPinToBeChanged;
122 unsigned char removable;
124 PKCS11_SLOT_private *_private;
131 PKCS11_CTX_private *_private;
147 unsigned char extractable;
148 unsigned char sensitive;
160 PKCS11_EDDSA_KGEN *eddsa;
161 PKCS11_NID_KGEN *nid;
162 PKCS11_RSA_KGEN *rsa;
164 const char *token_label;
165 const char *key_label;
166 const unsigned char *key_id;
240 PKCS11_SLOT **slotsp,
unsigned int *nslotsp);
257 PKCS11_SLOT **slotsp,
unsigned int *nslotsp);
275 PKCS11_SLOT *slots,
unsigned int nslots);
287 PKCS11_SLOT *slots,
unsigned int nslots);
300 PKCS11_SLOT *slots,
unsigned int nslots,
335extern int PKCS11_enumerate_keys(PKCS11_TOKEN *,
336 PKCS11_KEY **,
unsigned int *);
339extern int PKCS11_enumerate_keys_ext(PKCS11_TOKEN *,
340 const PKCS11_KEY *, PKCS11_KEY **,
unsigned int *);
343extern int PKCS11_remove_key(PKCS11_KEY *);
346extern int PKCS11_enumerate_public_keys(PKCS11_TOKEN *,
347 PKCS11_KEY **,
unsigned int *);
350extern int PKCS11_enumerate_public_keys_ext(PKCS11_TOKEN *,
351 const PKCS11_KEY *, PKCS11_KEY **,
unsigned int *);
354extern int PKCS11_get_key_type(PKCS11_KEY *);
375extern PKCS11_CERT *PKCS11_find_certificate(PKCS11_KEY *);
378extern PKCS11_KEY *PKCS11_find_key(PKCS11_CERT *);
381extern int PKCS11_enumerate_certs(PKCS11_TOKEN *, PKCS11_CERT **,
unsigned int *);
384extern int PKCS11_enumerate_certs_ext(PKCS11_TOKEN *,
385 const PKCS11_CERT *, PKCS11_CERT **,
unsigned int *);
388extern int PKCS11_remove_certificate(PKCS11_CERT *);
391extern int PKCS11_set_ui_method(PKCS11_CTX *ctx,
392 UI_METHOD *ui_method,
void *ui_user_data);
426 const char *new_pin);
467 char *label,
unsigned char *
id,
size_t id_len,
468 PKCS11_CERT **ret_cert);
471extern int PKCS11_seed_random(PKCS11_SLOT *slot,
const unsigned char *s,
unsigned int s_len);
472extern int PKCS11_generate_random(PKCS11_SLOT *slot,
unsigned char *r,
unsigned int r_len);
477RSA_METHOD *PKCS11_get_rsa_method(
void);
479#if OPENSSL_VERSION_NUMBER >= 0x10100002L && !defined(LIBRESSL_VERSION_NUMBER)
480EC_KEY_METHOD *PKCS11_get_ec_key_method(
void);
481void *PKCS11_get_ecdsa_method(
void);
482void *PKCS11_get_ecdh_method(
void);
484void *PKCS11_get_ec_key_method(
void);
485ECDSA_METHOD *PKCS11_get_ecdsa_method(
void);
486ECDH_METHOD *PKCS11_get_ecdh_method(
void);
489#if OPENSSL_VERSION_NUMBER < 0x40000000L
490int PKCS11_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth,
491 const int **nids,
int nid);
493int PKCS11_pkey_meths(
void *e,
void **pmeth,
const int **nids,
int nid);
518extern int PKCS11_keygen(PKCS11_TOKEN *token, PKCS11_KGEN_ATTRS *kgen_attrs);
533 int algorithm,
unsigned int bits_or_nid,
534 char *label,
unsigned char *
id,
size_t id_len);
537extern int PKCS11_get_key_size(PKCS11_KEY *);
540extern int PKCS11_get_key_modulus(PKCS11_KEY *, BIGNUM **);
543extern int PKCS11_get_key_exponent(PKCS11_KEY *, BIGNUM **);
546extern int PKCS11_ecdsa_sign(
547 const unsigned char *m,
unsigned int m_len,
548 unsigned char *sigret,
unsigned int *siglen, PKCS11_KEY *key);
551extern int PKCS11_sign(
int type,
552 const unsigned char *m,
unsigned int m_len,
553 unsigned char *sigret,
unsigned int *siglen, PKCS11_KEY *key);
556extern int PKCS11_verify(
int type,
557 const unsigned char *m,
unsigned int m_len,
558 unsigned char *signature,
unsigned int siglen, PKCS11_KEY *key);
560#if OPENSSL_VERSION_NUMBER >= 0x30000000L
562extern int PKCS11_evp_pkey_sign(EVP_PKEY *pkey,
int type,
const char *mdname,
563 const int pad_mode,
const int salt_len,
const char *mgf1_mdname,
564 unsigned char *sig,
size_t *siglen,
565 const unsigned char *tbs,
size_t tbslen);
568int PKCS11_evp_pkey_verify(EVP_PKEY *pkey,
int type,
569 const unsigned char *sig,
size_t siglen,
570 const unsigned char *tbs,
size_t tbslen);
573extern int PKCS11_evp_pkey_decrypt(EVP_PKEY *pk,
int type,
const char *mdname,
574 const int pad_mode,
const char *mgf1_mdname,
575 unsigned char *oaep_label,
size_t oaep_labellen,
576 unsigned char *sig,
size_t *siglen,
577 const unsigned char *in,
size_t inlen);
580extern int PKCS11_evp_pkey_derive(EVP_PKEY *pk,
int type,
581 const unsigned char *peer_pub,
size_t peer_pub_len,
582 int cofactor_mode,
unsigned char *secret,
size_t *secretlen);
587extern int PKCS11_private_encrypt(
588 int flen,
const unsigned char *from,
589 unsigned char *to, PKCS11_KEY *rsa,
int padding);
602 int flen,
const unsigned char *from,
603 unsigned char *to, PKCS11_KEY *key,
int padding);
609# define CKR_F_PKCS11_CHANGE_PIN 100
610# define CKR_F_PKCS11_CHECK_TOKEN 101
611# define CKR_F_PKCS11_CTX_LOAD 102
612# define CKR_F_PKCS11_ECDH_DERIVE 103
613# define CKR_F_PKCS11_ECDSA_SIGN 104
614# define CKR_F_PKCS11_ENUMERATE_SLOTS 105
615# define CKR_F_PKCS11_FIND_CERTS 106
616# define CKR_F_PKCS11_FIND_KEYS 107
617# define CKR_F_PKCS11_GENERATE_RANDOM 108
618# define CKR_F_PKCS11_GETATTR_ALLOC 109
619# define CKR_F_PKCS11_GETATTR_BN 110
620# define CKR_F_PKCS11_GETATTR_INT 111
621# define CKR_F_PKCS11_INIT_PIN 112
622# define CKR_F_PKCS11_INIT_SLOT 113
623# define CKR_F_PKCS11_INIT_TOKEN 114
624# define CKR_F_PKCS11_IS_LOGGED_IN 115
625# define CKR_F_PKCS11_LOGIN 116
626# define CKR_F_PKCS11_LOGOUT 117
627# define CKR_F_PKCS11_NEXT_CERT 118
628# define CKR_F_PKCS11_NEXT_KEY 119
629# define CKR_F_PKCS11_OPEN_SESSION 120
630# define CKR_F_PKCS11_PRIVATE_DECRYPT 121
631# define CKR_F_PKCS11_PRIVATE_ENCRYPT 122
632# define CKR_F_PKCS11_RELOAD_KEY 123
633# define CKR_F_PKCS11_SEED_RANDOM 125
634# define CKR_F_PKCS11_STORE_CERTIFICATE 126
635# define CKR_F_PKCS11_STORE_KEY 127
636# define CKR_F_PKCS11_REMOVE_KEY 128
637# define CKR_F_PKCS11_REMOVE_CERTIFICATE 129
638# define CKR_F_PKCS11_GENERATE_KEY 130
639# define CKR_F_PKCS11_RELOAD_CERTIFICATE 131
640# define CKR_F_PKCS11_GET_SESSION 132
641# define CKR_F_PKCS11_EDDSA_SIGN 133
644#define PKCS11_F_PKCS11_CHANGE_PIN CKR_F_PKCS11_CHANGE_PIN
645#define PKCS11_F_PKCS11_CHECK_TOKEN CKR_F_PKCS11_CHECK_TOKEN
646#define PKCS11_F_PKCS11_CTX_LOAD CKR_F_PKCS11_CTX_LOAD
647#define PKCS11_F_PKCS11_ECDH_DERIVE CKR_F_PKCS11_ECDH_DERIVE
648#define PKCS11_F_PKCS11_ECDSA_SIGN CKR_F_PKCS11_ECDSA_SIGN
649#define PKCS11_F_PKCS11_ENUMERATE_SLOTS CKR_F_PKCS11_ENUMERATE_SLOTS
650#define PKCS11_F_PKCS11_FIND_CERTS CKR_F_PKCS11_FIND_CERTS
651#define PKCS11_F_PKCS11_FIND_KEYS CKR_F_PKCS11_FIND_KEYS
652#define PKCS11_F_PKCS11_GENERATE_RANDOM CKR_F_PKCS11_GENERATE_RANDOM
653#define PKCS11_F_PKCS11_GETATTR_ALLOC CKR_F_PKCS11_GETATTR_ALLOC
654#define PKCS11_F_PKCS11_GETATTR_BN CKR_F_PKCS11_GETATTR_BN
655#define PKCS11_F_PKCS11_GETATTR_INT CKR_F_PKCS11_GETATTR_INT
656#define PKCS11_F_PKCS11_INIT_PIN CKR_F_PKCS11_INIT_PIN
657#define PKCS11_F_PKCS11_INIT_SLOT CKR_F_PKCS11_INIT_SLOT
658#define PKCS11_F_PKCS11_INIT_TOKEN CKR_F_PKCS11_INIT_TOKEN
659#define PKCS11_F_PKCS11_IS_LOGGED_IN CKR_F_PKCS11_IS_LOGGED_IN
660#define PKCS11_F_PKCS11_LOGIN CKR_F_PKCS11_LOGIN
661#define PKCS11_F_PKCS11_LOGOUT CKR_F_PKCS11_LOGOUT
662#define PKCS11_F_PKCS11_NEXT_CERT CKR_F_PKCS11_NEXT_CERT
663#define PKCS11_F_PKCS11_NEXT_KEY CKR_F_PKCS11_NEXT_KEY
664#define PKCS11_F_PKCS11_OPEN_SESSION CKR_F_PKCS11_OPEN_SESSION
665#define PKCS11_F_PKCS11_PRIVATE_DECRYPT CKR_F_PKCS11_PRIVATE_DECRYPT
666#define PKCS11_F_PKCS11_PRIVATE_ENCRYPT CKR_F_PKCS11_PRIVATE_ENCRYPT
667#define PKCS11_F_PKCS11_RELOAD_KEY CKR_F_PKCS11_RELOAD_KEY
668#define PKCS11_F_PKCS11_SEED_RANDOM CKR_F_PKCS11_SEED_RANDOM
669#define PKCS11_F_PKCS11_STORE_CERTIFICATE CKR_F_PKCS11_STORE_CERTIFICATE
670#define PKCS11_F_PKCS11_STORE_KEY CKR_F_PKCS11_STORE_KEY
671#define PKCS11_F_PKCS11_REMOVE_KEY CKR_F_PKCS11_REMOVE_KEY
672#define PKCS11_F_PKCS11_REMOVE_CERTIFICATE CKR_F_PKCS11_REMOVE_CERTIFICATE
673#define PKCS11_F_PKCS11_GENERATE_KEY CKR_F_PKCS11_GENERATE_KEY
676#define PKCS11_LOAD_MODULE_ERROR P11_R_LOAD_MODULE_ERROR
677#define PKCS11_MODULE_LOADED_ERROR -1
678#define PKCS11_SYMBOL_NOT_FOUND_ERROR -1
679#define PKCS11_NOT_SUPPORTED P11_R_NOT_SUPPORTED
680#define PKCS11_NO_SESSION P11_R_NO_SESSION
681#define PKCS11_KEYGEN_FAILED P11_R_KEYGEN_FAILED
682#define PKCS11_UI_FAILED P11_R_UI_FAILED
688#define ERR_LIB_PKCS11 (ERR_get_CKR_code())
unsigned long PKCS11_get_slotid_from_slot(PKCS11_SLOT *slotp)
Get the slot_id from a slot as it is stored in private.
int PKCS11_store_public_key(PKCS11_TOKEN *token, EVP_PKEY *pk, char *label, unsigned char *id, size_t id_len)
Store public key on a token.
void PKCS11_CTX_free(PKCS11_CTX *ctx)
Free a libp11 context.
PKCS11_CTX * PKCS11_CTX_new_ex(int flags)
Create a new libp11 context with specified flags.
int PKCS11_change_pin(PKCS11_SLOT *slot, const char *old_pin, const char *new_pin)
Change the currently used (either USER or SO) PIN on a token.
void(* PKCS11_VLOG_A_CB)(int, const char *, va_list)
PKCS11 ASCII logging callback.
int PKCS11_init_pin(PKCS11_TOKEN *token, const char *pin)
Initialize the user PIN on a token.
int PKCS11_store_certificate(PKCS11_TOKEN *token, X509 *x509, char *label, unsigned char *id, size_t id_len, PKCS11_CERT **ret_cert)
Store certificate on a token.
EVP_PKEY * PKCS11_get_public_key(PKCS11_KEY *key)
Returns a EVP_PKEY object with the public key.
int PKCS11_keygen(PKCS11_TOKEN *token, PKCS11_KGEN_ATTRS *kgen_attrs)
Generate key pair on the token.
int PKCS11_login(PKCS11_SLOT *slot, int so, const char *pin)
Authenticate to the card.
void PKCS11_CTX_unload(PKCS11_CTX *ctx)
Unload a PKCS#11 module.
PKCS11_SLOT * PKCS11_find_next_token(PKCS11_CTX *ctx, PKCS11_SLOT *slots, unsigned int nslots, PKCS11_SLOT *slot)
Find the next slot with a token.
int PKCS11_init_token(PKCS11_TOKEN *token, const char *pin, const char *label)
Initialize a token.
int PKCS11_enumerate_slots(PKCS11_CTX *ctx, PKCS11_SLOT **slotsp, unsigned int *nslotsp)
Get a list of all slots.
PKCS11_CTX * PKCS11_CTX_new(void)
Create a new libp11 context.
EVP_PKEY * PKCS11_get_private_key(PKCS11_KEY *key)
Returns a EVP_PKEY object for the private key.
int PKCS11_is_logged_in(PKCS11_SLOT *slot, int so, int *res)
Check if user is already authenticated to a card.
int PKCS11_update_slots(PKCS11_CTX *ctx, PKCS11_SLOT **slotsp, unsigned int *nslotsp)
Get or update a list of all slots.
void PKCS11_CTX_init_args(PKCS11_CTX *ctx, const char *init_args)
Specify any private PKCS#11 module initialization args, if necessary.
int PKCS11_CTX_load(PKCS11_CTX *ctx, const char *ident)
Load a PKCS#11 module.
void PKCS11_release_all_slots(PKCS11_CTX *ctx, PKCS11_SLOT *slots, unsigned int nslots)
Free the list of slots allocated by PKCS11_enumerate_slots().
PKCS11_SLOT * PKCS11_find_token(PKCS11_CTX *ctx, PKCS11_SLOT *slots, unsigned int nslots)
Find the first slot with a token.
int PKCS11_open_session(PKCS11_SLOT *slot, int rw)
Open a session in RO or RW mode.
int PKCS11_private_decrypt(int flen, const unsigned char *from, unsigned char *to, PKCS11_KEY *key, int padding)
Decrypts data using the private key.
int PKCS11_store_private_key(PKCS11_TOKEN *token, EVP_PKEY *pk, char *label, unsigned char *id, size_t id_len)
Store private key on a token.
int PKCS11_generate_key(PKCS11_TOKEN *token, int algorithm, unsigned int bits_or_nid, char *label, unsigned char *id, size_t id_len)
Generate a private key on the token.
void ERR_load_PKCS11_strings(void)
Load PKCS11 error strings.
int PKCS11_logout(PKCS11_SLOT *slot)
De-authenticate from the card.
PKCS11 certificate object.
PKCS11 key object (public or private).
unsigned char isPrivate
private key present?
unsigned char needLogin
login to read private key?
PKCS11 slot: card reader.
PKCS11_TOKEN * token
NULL if no token present.
PKCS11 token: smart card or USB key.