Example #1
0
/* Status callback for the SCD GENKEY command. */
static gpg_error_t
scd_genkey_cb (void *opaque, const char *line)
{
    struct agent_card_genkey_s *parm = opaque;
    const char *keyword = line;
    int keywordlen;

    for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
        ;
    while (spacep (line))
        line++;

    if (keywordlen == 7 && !memcmp (keyword, "KEY-FPR", keywordlen))
    {
        parm->fprvalid = unhexify_fpr (line, parm->fpr);
    }
    else if (keywordlen == 14 && !memcmp (keyword,"KEY-CREATED-AT", keywordlen))
    {
        parm->created_at = (u32)strtoul (line, NULL, 10);
    }
    else if (keywordlen == 8 && !memcmp (keyword, "PROGRESS", keywordlen))
    {
        write_status_text (STATUS_PROGRESS, line);
    }

    return 0;
}
Example #2
0
static gpg_error_t
isvalid_status_cb (void *opaque, const char *line)
{
  struct isvalid_status_parm_s *parm = opaque;

  if (!strncmp (line, "PROGRESS", 8) && (line[8]==' ' || !line[8]))
    {
      if (parm->ctrl)
        {
          for (line += 8; *line == ' '; line++)
            ;
          if (gpgsm_status (parm->ctrl, STATUS_PROGRESS, line))
            return gpg_error (GPG_ERR_ASS_CANCELED);
        }
    }
  else if (!strncmp (line, "ONLY_VALID_IF_CERT_VALID", 24)
      && (line[24]==' ' || !line[24]))
    {
      parm->seen++;
      if (!line[24] || !unhexify_fpr (line+25, parm->fpr))
        parm->seen++; /* Bumb it to indicate an error. */
    }
  return 0;
}
Example #3
0
static gpg_error_t
learn_status_cb (void *opaque, const char *line)
{
    struct agent_card_info_s *parm = opaque;
    const char *keyword = line;
    int keywordlen;
    int i;

    for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
        ;
    while (spacep (line))
        line++;

    if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
    {
        xfree (parm->serialno);
        parm->serialno = store_serialno (line);
        parm->is_v2 = (strlen (parm->serialno) >= 16
                       && xtoi_2 (parm->serialno+12) >= 2 );
    }
    else if (keywordlen == 7 && !memcmp (keyword, "APPTYPE", keywordlen))
    {
        xfree (parm->apptype);
        parm->apptype = unescape_status_string (line);
    }
    else if (keywordlen == 9 && !memcmp (keyword, "DISP-NAME", keywordlen))
    {
        xfree (parm->disp_name);
        parm->disp_name = unescape_status_string (line);
    }
    else if (keywordlen == 9 && !memcmp (keyword, "DISP-LANG", keywordlen))
    {
        xfree (parm->disp_lang);
        parm->disp_lang = unescape_status_string (line);
    }
    else if (keywordlen == 8 && !memcmp (keyword, "DISP-SEX", keywordlen))
    {
        parm->disp_sex = *line == '1'? 1 : *line == '2' ? 2: 0;
    }
    else if (keywordlen == 10 && !memcmp (keyword, "PUBKEY-URL", keywordlen))
    {
        xfree (parm->pubkey_url);
        parm->pubkey_url = unescape_status_string (line);
    }
    else if (keywordlen == 10 && !memcmp (keyword, "LOGIN-DATA", keywordlen))
    {
        xfree (parm->login_data);
        parm->login_data = unescape_status_string (line);
    }
    else if (keywordlen == 11 && !memcmp (keyword, "SIG-COUNTER", keywordlen))
    {
        parm->sig_counter = strtoul (line, NULL, 0);
    }
    else if (keywordlen == 10 && !memcmp (keyword, "CHV-STATUS", keywordlen))
    {
        char *p, *buf;

        buf = p = unescape_status_string (line);
        if (buf)
        {
            while (spacep (p))
                p++;
            parm->chv1_cached = atoi (p);
            while (*p && !spacep (p))
                p++;
            while (spacep (p))
                p++;
            for (i=0; *p && i < 3; i++)
            {
                parm->chvmaxlen[i] = atoi (p);
                while (*p && !spacep (p))
                    p++;
                while (spacep (p))
                    p++;
            }
            for (i=0; *p && i < 3; i++)
            {
                parm->chvretry[i] = atoi (p);
                while (*p && !spacep (p))
                    p++;
                while (spacep (p))
                    p++;
            }
            xfree (buf);
        }
    }
    else if (keywordlen == 6 && !memcmp (keyword, "EXTCAP", keywordlen))
    {
        char *p, *p2, *buf;
        int abool;

        buf = p = unescape_status_string (line);
        if (buf)
        {
            for (p = strtok (buf, " "); p; p = strtok (NULL, " "))
            {
                p2 = strchr (p, '=');
                if (p2)
                {
                    *p2++ = 0;
                    abool = (*p2 == '1');
                    if (!strcmp (p, "ki"))
                        parm->extcap.ki = abool;
                    else if (!strcmp (p, "aac"))
                        parm->extcap.aac = abool;
                }
            }
            xfree (buf);
        }
    }
    else if (keywordlen == 7 && !memcmp (keyword, "KEY-FPR", keywordlen))
    {
        int no = atoi (line);
        while (*line && !spacep (line))
            line++;
        while (spacep (line))
            line++;
        if (no == 1)
            parm->fpr1valid = unhexify_fpr (line, parm->fpr1);
        else if (no == 2)
            parm->fpr2valid = unhexify_fpr (line, parm->fpr2);
        else if (no == 3)
            parm->fpr3valid = unhexify_fpr (line, parm->fpr3);
    }
    else if (keywordlen == 8 && !memcmp (keyword, "KEY-TIME", keywordlen))
    {
        int no = atoi (line);
        while (* line && !spacep (line))
            line++;
        while (spacep (line))
            line++;
        if (no == 1)
            parm->fpr1time = strtoul (line, NULL, 10);
        else if (no == 2)
            parm->fpr2time = strtoul (line, NULL, 10);
        else if (no == 3)
            parm->fpr3time = strtoul (line, NULL, 10);
    }
    else if (keywordlen == 6 && !memcmp (keyword, "CA-FPR", keywordlen))
    {
        int no = atoi (line);
        while (*line && !spacep (line))
            line++;
        while (spacep (line))
            line++;
        if (no == 1)
            parm->cafpr1valid = unhexify_fpr (line, parm->cafpr1);
        else if (no == 2)
            parm->cafpr2valid = unhexify_fpr (line, parm->cafpr2);
        else if (no == 3)
            parm->cafpr3valid = unhexify_fpr (line, parm->cafpr3);
    }
    else if (keywordlen == 8 && !memcmp (keyword, "KEY-ATTR", keywordlen))
    {
        int keyno, algo, nbits;

        sscanf (line, "%d %d %d", &keyno, &algo, &nbits);
        keyno--;
        if (keyno >= 0 && keyno < DIM (parm->key_attr))
        {
            parm->key_attr[keyno].algo = algo;
            parm->key_attr[keyno].nbits = nbits;
        }
    }

    return 0;
}