/* return the next key which matches, starting searching at *from */ static const __ops_key_t * getkeybyname(__ops_io_t *io, const __ops_keyring_t *keyring, const char *name, unsigned *from) { const __ops_key_t *kp; uint8_t **uidp; unsigned i = 0; __ops_key_t *keyp; unsigned savedstart; regex_t r; uint8_t keyid[OPS_KEY_ID_SIZE + 1]; size_t len; if (!keyring || !name || !from) { return NULL; } len = strlen(name); if (__ops_get_debug_level(__FILE__)) { (void) fprintf(io->outs, "[%u] name '%s', len %zu\n", *from, name, len); } /* first try name as a keyid */ (void) memset(keyid, 0x0, sizeof(keyid)); str2keyid(name, keyid, sizeof(keyid)); if (__ops_get_debug_level(__FILE__)) { hexdump(io->outs, "keyid", keyid, 4); } savedstart = *from; if ((kp = __ops_getkeybyid(io, keyring, keyid, from, NULL)) != NULL) { return kp; } *from = savedstart; if (__ops_get_debug_level(__FILE__)) { (void) fprintf(io->outs, "regex match '%s' from %u\n", name, *from); } /* match on full name or email address as a NOSUB, ICASE regexp */ (void) regcomp(&r, name, REG_EXTENDED | REG_ICASE); for (keyp = &keyring->keys[*from]; *from < keyring->keyc; *from += 1, keyp++) { uidp = keyp->uids; for (i = 0 ; i < keyp->uidc; i++, uidp++) { if (regexec(&r, (char *)*uidp, 0, NULL, 0) == 0) { if (__ops_get_debug_level(__FILE__)) { (void) fprintf(io->outs, "MATCHED keyid \"%s\" len %" PRIsize "u\n", (char *) *uidp, len); } regfree(&r); return keyp; } } } regfree(&r); return NULL; }
/* print out the successful signature information */ static void resultp(__ops_io_t *io, const char *f, __ops_validation_t *res, __ops_keyring_t *ring) { const __ops_key_t *key; __ops_pubkey_t *sigkey; unsigned from; unsigned i; time_t t; char id[MAX_ID_LENGTH + 1]; for (i = 0; i < res->validc; i++) { (void) fprintf(io->res, "Good signature for %s made %s", (f) ? f : "<stdin>", ctime(&res->valid_sigs[i].birthtime)); if (res->duration > 0) { t = res->birthtime + res->duration; (void) fprintf(io->res, "Valid until %s", ctime(&t)); } (void) fprintf(io->res, "using %s key %s\n", __ops_show_pka(res->valid_sigs[i].key_alg), userid_to_id(res->valid_sigs[i].signer_id, id)); from = 0; key = __ops_getkeybyid(io, ring, (const uint8_t *) res->valid_sigs[i].signer_id, &from, &sigkey); if (sigkey == &key->enckey) { (void) fprintf(io->res, "WARNING: signature for %s made with encryption key\n", (f) ? f : "<stdin>"); } __ops_print_keydata(io, ring, key, "signature ", &key->key.pubkey, 0); } }