aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/call-agent.c24
-rw-r--r--g10/call-agent.h1
-rw-r--r--tools/card-call-scd.c25
-rw-r--r--tools/gpg-card.h2
4 files changed, 52 insertions, 0 deletions
diff --git a/g10/call-agent.c b/g10/call-agent.c
index 4e3bdf9e4..42e2d3720 100644
--- a/g10/call-agent.c
+++ b/g10/call-agent.c
@@ -499,6 +499,11 @@ agent_release_card_info (struct agent_card_info_s *info)
xfree (info->private_do[i]);
info->private_do[i] = NULL;
}
+ for (i=0; i < DIM(info->supported_keyalgo); i++)
+ {
+ free_strlist (info->supported_keyalgo[i]);
+ info->supported_keyalgo[i] = NULL;
+ }
}
@@ -744,6 +749,25 @@ learn_status_cb (void *opaque, const char *line)
parm->uif[no] = (data[0] != 0xff);
xfree (data);
}
+ else if (keywordlen == 13 && !memcmp (keyword, "KEY-ATTR-INFO", 13))
+ {
+ if (!strncmp (line, "OPENPGP.", 8))
+ {
+ int no;
+
+ line += 8;
+ no = atoi (line);
+ if (no >= 1 && no <= 3)
+ {
+ no--;
+ line++;
+ while (spacep (line))
+ line++;
+ append_to_strlist (&parm->supported_keyalgo[no], xstrdup (line));
+ }
+ }
+ /* Skip when it's not "OPENPGP.[123]". */
+ }
return 0;
}
diff --git a/g10/call-agent.h b/g10/call-agent.h
index 8f929be27..4a66af2aa 100644
--- a/g10/call-agent.h
+++ b/g10/call-agent.h
@@ -76,6 +76,7 @@ struct agent_card_info_s
unsigned int status_indicator;
int kdf_do_enabled; /* Non-zero if card has a KDF object, 0 if not. */
int uif[3]; /* True if User Interaction Flag is on. */
+ strlist_t supported_keyalgo[3];
};
diff --git a/tools/card-call-scd.c b/tools/card-call-scd.c
index 8800c5b52..0b529f06a 100644
--- a/tools/card-call-scd.c
+++ b/tools/card-call-scd.c
@@ -161,6 +161,11 @@ release_card_info (card_info_t info)
info->kinfo = kinfo;
}
info->chvusage[0] = info->chvusage[1] = 0;
+ for (i=0; i < DIM(info->supported_keyalgo); i++)
+ {
+ free_strlist (info->supported_keyalgo[i]);
+ info->supported_keyalgo[i] = NULL;
+ }
}
@@ -1042,6 +1047,26 @@ learn_status_cb (void *opaque, const char *line)
xfree (parm->dispserialno);
parm->dispserialno = unescape_status_string (line);
}
+ else if (!memcmp (keyword, "KEY-ATTR-INFO", keywordlen))
+ {
+ if (!strncmp (line, "OPENPGP.", 8))
+ {
+ int no;
+
+ line += 8;
+ no = atoi (line);
+ if (no >= 1 && no <= 3)
+ {
+ no--;
+ line++;
+ while (spacep (line))
+ line++;
+ append_to_strlist (&parm->supported_keyalgo[no],
+ xstrdup (line));
+ }
+ }
+ /* Skip when it's not "OPENPGP.[123]". */
+ }
break;
default:
diff --git a/tools/gpg-card.h b/tools/gpg-card.h
index 067720d6c..8c8bc0671 100644
--- a/tools/gpg-card.h
+++ b/tools/gpg-card.h
@@ -22,6 +22,7 @@
#define GNUPG_GPG_CARD_H
#include "../common/session-env.h"
+#include "../common/strlist.h"
/* We keep all global options in the structure OPT. */
@@ -188,6 +189,7 @@ struct card_info_s
int kdf_do_enabled; /* True if card has a KDF object. */
int uif[3]; /* True if User Interaction Flag is on. */
/* 1 = on, 2 = permanent on. */
+ strlist_t supported_keyalgo[3];
};
typedef struct card_info_s *card_info_t;