#define KEEP_LOGIN_FLAGS(flags) (flags & (GNUTLS_PKCS11_OBJ_FLAG_LOGIN|GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO))
-#define CHECK_LOGIN_FLAG(flags) \
- if ((flags & KEEP_LOGIN_FLAGS(flags)) == 0) \
- fprintf(stderr, \
- "warning: --login was not specified and it may be required for this operation.\n")
+#define CHECK_LOGIN_FLAG(url, flags) \
+ if ((flags & KEEP_LOGIN_FLAGS(flags)) == 0) { \
+ unsigned _tflags; \
+ int _r = gnutls_pkcs11_token_get_flags(url, &_tflags); \
+ if (_r >= 0 && (_tflags & GNUTLS_PKCS11_TOKEN_LOGIN_REQUIRED)) { \
+ flags |= GNUTLS_PKCS11_OBJ_FLAG_LOGIN; \
+ fprintf(stderr, \
+ "note: assuming --login for this operation.\n"); \
+ } else { \
+ fprintf(stderr, \
+ "warning: --login was not specified and it may be required for this operation.\n"); \
+ } \
+ }
void
pkcs11_common(info);
FIX(url, outfile, 0, info);
- CHECK_LOGIN_FLAG(flags);
+
+ CHECK_LOGIN_FLAG(url, flags);
if (label == NULL && info->batch == 0) {
label = read_str("warning: The object's label was not specified.\nLabel: ");
}
pkcs11_common(info);
FIX(url, outfile, detailed, info);
- CHECK_LOGIN_FLAG(flags);
+
+ CHECK_LOGIN_FLAG(url, flags);
if (id != NULL) {
raw_id_size = sizeof(raw_id);
pkcs11_common(info);
FIX(url, outfile, detailed, info);
- CHECK_LOGIN_FLAG(flags);
+
+ CHECK_LOGIN_FLAG(url, flags);
if (outfile == stderr || outfile == stdout) {
fprintf(stderr, "warning: no --outfile was specified and the public key will be printed on screen.\n");
pkcs11_common(info);
FIX(url, outfile, detailed, info);
- CHECK_LOGIN_FLAG(flags);
+
+ CHECK_LOGIN_FLAG(url, flags);
ret = gnutls_pkcs11_obj_init(&obj);
if (ret < 0) {