+
+#ifdef SMARTCARD
+static void
+process_add_smartcard_key (SocketEntry *e)
+{
+ Idtab *tab;
+ Key *n = NULL, *k = NULL;
+ char *sc_reader_id = NULL;
+ int success = 0;
+
+ sc_reader_id = buffer_get_string(&e->input, NULL);
+ k = sc_get_key(sc_reader_id);
+ xfree(sc_reader_id);
+
+ if (k == NULL) {
+ error("sc_get_pubkey failed");
+ goto send;
+ }
+ success = 1;
+
+ tab = idtab_lookup(1);
+ k->type = KEY_RSA1;
+ if (lookup_identity(k, 1) == NULL) {
+ Identity *id = xmalloc(sizeof(Identity));
+ n = key_new(KEY_RSA1);
+ BN_copy(n->rsa->n, k->rsa->n);
+ BN_copy(n->rsa->e, k->rsa->e);
+ RSA_set_method(n->rsa, sc_get_engine());
+ id->key = n;
+ id->comment = xstrdup("rsa1 smartcard");
+ TAILQ_INSERT_TAIL(&tab->idlist, id, next);
+ tab->nentries++;
+ }
+ k->type = KEY_RSA;
+ tab = idtab_lookup(2);
+ if (lookup_identity(k, 2) == NULL) {
+ Identity *id = xmalloc(sizeof(Identity));
+ n = key_new(KEY_RSA);
+ BN_copy(n->rsa->n, k->rsa->n);
+ BN_copy(n->rsa->e, k->rsa->e);
+ RSA_set_method(n->rsa, sc_get_engine());
+ id->key = n;
+ id->comment = xstrdup("rsa smartcard");
+ TAILQ_INSERT_TAIL(&tab->idlist, id, next);
+ tab->nentries++;
+ }
+ key_free(k);
+send:
+ buffer_put_int(&e->output, 1);
+ buffer_put_char(&e->output,
+ success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);
+}
+
+static void
+process_remove_smartcard_key(SocketEntry *e)
+{
+ Key *k = NULL;
+ int success = 0;
+ char *sc_reader_id = NULL;
+
+ sc_reader_id = buffer_get_string(&e->input, NULL);
+ k = sc_get_key(sc_reader_id);
+ xfree(sc_reader_id);
+
+ if (k == NULL) {
+ error("sc_get_pubkey failed");
+ } else {
+ Identity *id;
+ k->type = KEY_RSA1;
+ id = lookup_identity(k, 1);
+ if (id != NULL) {
+ Idtab *tab = idtab_lookup(1);
+ TAILQ_REMOVE(&tab->idlist, id, next);
+ free_identity(id);
+ tab->nentries--;
+ success = 1;
+ }
+ k->type = KEY_RSA;
+ id = lookup_identity(k, 2);
+ if (id != NULL) {
+ Idtab *tab = idtab_lookup(2);
+ TAILQ_REMOVE(&tab->idlist, id, next);
+ free_identity(id);
+ tab->nentries--;
+ success = 1;
+ }
+ key_free(k);
+ }
+
+ buffer_put_int(&e->output, 1);
+ buffer_put_char(&e->output,
+ success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);
+}
+#endif /* SMARTCARD */
+