on every call that could use it.
int gnutls_pkcs11_obj_init ( gnutls_pkcs11_obj_t *certificate);
#define GNUTLS_PKCS11_OBJ_FLAG_LOGIN 1 /* force login in the token for the operation */
+#define GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED 1 /* object marked as trusted */
int gnutls_pkcs11_obj_import_url (gnutls_pkcs11_obj_t, const char * url,
unsigned int flags/* GNUTLS_PKCS11_OBJ_FLAG_* */);
void *output_data, size_t * output_data_size);
-#define GNUTLS_PKCS11_COPY_FLAG_MARK_TRUSTED 1 /* object marked as trusted */
-
int gnutls_pkcs11_copy_x509_crt(const char* token_url, gnutls_x509_crt_t crt,
- const char* label, unsigned int flags /* GNUTLS_PKCS11_COPY_FLAG_* */);
+ const char* label, unsigned int flags /* GNUTLS_PKCS11_OBJ_FLAG_* */);
int gnutls_pkcs11_copy_x509_privkey(const char* token_url,
gnutls_x509_privkey_t crt, const char* label, unsigned int key_usage /*GNUTLS_KEY_* */,
- unsigned int flags /* GNUTLS_PKCS11_COPY_FLAG_* */);
-int gnutls_pkcs11_delete_url(const char* object_url);
+ unsigned int flags /* GNUTLS_PKCS11_OBJ_FLAG_* */);
+int gnutls_pkcs11_delete_url(const char* object_url,
+ unsigned int flags/* GNUTLS_PKCS11_OBJ_FLAG_* */);
typedef enum {
GNUTLS_PKCS11_OBJ_ID_HEX=1,
return ret;
}
-inline static unsigned int pkcs11_obj_flags_to_int(unsigned int flags)
+unsigned int pkcs11_obj_flags_to_int(unsigned int flags)
{
switch(flags) {
case GNUTLS_PKCS11_OBJ_FLAG_LOGIN:
struct pkcs11_url_info *info, token_creds_st *,
unsigned int flags);
+unsigned int pkcs11_obj_flags_to_int(unsigned int flags);
+
#endif
* @token_url: A PKCS #11 URL specifying a token
* @crt: A certificate
* @label: A name to be used for the stored data
- * @flags: One of GNUTLS_PKCS11_COPY_FLAG_*
+ * @flags: One of GNUTLS_PKCS11_OBJ_FLAG_*
*
* This function will copy a certificate into a PKCS #11 token specified by
* a URL. The certificate can be marked as trusted or not.
ret =
pkcs11_open_session(&pks, &info, NULL,
- SESSION_WRITE | SESSION_LOGIN);
+ SESSION_WRITE | pkcs11_obj_flags_to_int(flags));
if (ret < 0) {
gnutls_assert();
return ret;
a_val++;
}
- if (flags & GNUTLS_PKCS11_COPY_FLAG_MARK_TRUSTED) {
+ if (flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED) {
a[a_val].type = CKA_TRUSTED;
a[a_val].value = &tval;
a[a_val].value_len = sizeof(tval);
* @key: A private key
* @label: A name to be used for the stored data
* @key_usage: One of GNUTLS_KEY_*
- * @flags: One of GNUTLS_PKCS11_COPY_* flags
+ * @flags: One of GNUTLS_PKCS11_OBJ_* flags
*
* This function will copy a private key into a PKCS #11 token specified by
* a URL.
ret =
pkcs11_open_session(&pks, &info, NULL,
- SESSION_WRITE | SESSION_LOGIN);
+ SESSION_WRITE | pkcs11_obj_flags_to_int(flags));
if (ret < 0) {
gnutls_assert();
return ret;
}
}
- ret = pkcs11_login(pks, info, NULL);
- if (ret < 0) {
- gnutls_assert();
- return ret;
- }
-
a_vals = 0;
/* Find objects with given class and type */
/**
* gnutls_pkcs11_delete_url:
* @object_url: The URL of the object to delete.
+ * @flags: One of GNUTLS_PKCS11_OBJ_* flags
*
* This function will delete objects matching the given URL.
*
* Returns: On success, the number of objects deleted is returned, otherwise a
* negative error value.
**/
-int gnutls_pkcs11_delete_url(const char *object_url)
+int gnutls_pkcs11_delete_url(const char *object_url, unsigned int flags)
{
int ret;
struct delete_data_st find_data;
ret =
_pkcs11_traverse_tokens(delete_obj_url, &find_data,
- SESSION_WRITE);
+ SESSION_WRITE|pkcs11_obj_flags_to_int(flags));
if (ret < 0) {
gnutls_assert();
return ret;
void pkcs11_list( FILE*outfile, const char* url, int type, unsigned int login);
void pkcs11_export(FILE* outfile, const char *pkcs11_url, unsigned int login);
void pkcs11_token_list(FILE* outfile);
-void pkcs11_write(FILE* outfile, const char *pkcs11_url, const char* label, int trusted);
-void pkcs11_delete(FILE* outfile, const char *pkcs11_url, int batch);
+void pkcs11_write(FILE* outfile, const char *pkcs11_url, const char* label, int trusted, unsigned int login);
+void pkcs11_delete(FILE* outfile, const char *pkcs11_url, int batch, unsigned int login);
#define PKCS11_TYPE_CRT_ALL 1
#define PKCS11_TYPE_TRUSTED 2
pkcs11_export(outfile, info.pkcs11_url, info.pkcs11_login);
break;
case ACTION_PKCS11_WRITE_URL:
- pkcs11_write(outfile, info.pkcs11_url, info.pkcs11_label, info.pkcs11_trusted);
+ pkcs11_write(outfile, info.pkcs11_url, info.pkcs11_label, info.pkcs11_trusted, info.pkcs11_login);
break;
case ACTION_PKCS11_DELETE_URL:
- pkcs11_delete(outfile, info.pkcs11_url, batch);
+ pkcs11_delete(outfile, info.pkcs11_url, batch, info.pkcs11_login);
break;
#ifdef ENABLE_OPENPGP
case ACTION_PGP_INFO:
}
-void pkcs11_delete(FILE* outfile, const char* url, int batch)
+void pkcs11_delete(FILE* outfile, const char* url, int batch, unsigned int login)
{
int ret;
+unsigned int obj_flags = 0;
+
+ if (login)
+ obj_flags = GNUTLS_PKCS11_OBJ_FLAG_LOGIN;
+
if (!batch) {
- pkcs11_list(outfile, url, PKCS11_TYPE_ALL, 1/*login*/);
+ pkcs11_list(outfile, url, PKCS11_TYPE_ALL, login);
ret = read_yesno("Are you sure you want to delete those objects? (Y/N): ");
if (ret == 0) {
exit(1);
}
}
- ret = gnutls_pkcs11_delete_url(url);
+ ret = gnutls_pkcs11_delete_url(url, obj_flags);
if (ret < 0) {
fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__, gnutls_strerror(ret));
exit(1);
return;
}
-void pkcs11_write(FILE* outfile, const char* url, const char* label, int trusted)
+void pkcs11_write(FILE* outfile, const char* url, const char* label, int trusted, unsigned int login)
{
gnutls_x509_crt_t xcrt;
gnutls_x509_privkey_t xkey;
unsigned int flags = 0;
unsigned int key_usage;
+ if (login)
+ flags = GNUTLS_PKCS11_OBJ_FLAG_LOGIN;
+
pkcs11_common();
if (url == NULL)
xcrt = load_cert(0);
if (xcrt != NULL) {
if (trusted)
- flags |= GNUTLS_PKCS11_COPY_FLAG_MARK_TRUSTED;
+ flags |= GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED;
ret = gnutls_pkcs11_copy_x509_crt(url, xcrt, label, flags);
if (ret < 0) {
fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__, gnutls_strerror(ret));