On Fri, Jan 21, 2022 at 01:36:30PM -0700, Bob Beck wrote:
>
> I like that.. LGTM
>
> ok beck@
Ditto
>
> On Fri, Jan 21, 2022 at 08:37:27PM +0100, Theo Buehler wrote:
> > > Lets start with that and optimize this in tree. I think we can rename the
> > > function to something like rtype_from_mftfile(). In that case I would move
> > > the function as well...
> >
> > Like this?
> >
> > Index: extern.h
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v
> > retrieving revision 1.111
> > diff -u -p -r1.111 extern.h
> > --- extern.h 21 Jan 2022 18:49:44 -0000 1.111
> > +++ extern.h 21 Jan 2022 19:36:09 -0000
> > @@ -421,6 +421,8 @@ void mft_free(struct mft *);
> > struct mft *mft_parse(X509 **, const char *, const unsigned char *,
> > size_t);
> > struct mft *mft_read(struct ibuf *);
> > +enum rtype rtype_from_file_extension(const char *);
> > +enum rtype rtype_from_mftfile(const char *);
> >
> > void roa_buffer(struct ibuf *, const struct roa *);
> > void roa_free(struct roa *);
> > @@ -447,12 +449,9 @@ int valid_ta(const char *, struct auth
> > int valid_cert(const char *, struct auth_tree *,
> > const struct cert *);
> > int valid_roa(const char *, struct auth_tree *, struct roa
> > *);
> > -int valid_filename(const char *);
> > int valid_filehash(int, const char *, size_t);
> > int valid_uri(const char *, size_t, const char *);
> > int valid_origin(const char *, const char *);
> > -
> > -enum rtype rtype_from_file_extension(const char *);
> >
> > /* Working with CMS. */
> > unsigned char *cms_parse_validate(X509 **, const char *,
> > Index: mft.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/rpki-client/mft.c,v
> > retrieving revision 1.49
> > diff -u -p -r1.49 mft.c
> > --- mft.c 21 Jan 2022 18:49:44 -0000 1.49
> > +++ mft.c 21 Jan 2022 19:36:10 -0000
> > @@ -16,6 +16,7 @@
> > */
> >
> > #include <assert.h>
> > +#include <ctype.h>
> > #include <err.h>
> > #include <limits.h>
> > #include <stdarg.h>
> > @@ -121,6 +122,66 @@ check_validity(const ASN1_GENERALIZEDTIM
> > }
> >
> > /*
> > + * Determine rtype corresponding to file extension. Returns RTYPE_INVALID
> > + * on error or unkown extension.
> > + */
> > +enum rtype
> > +rtype_from_file_extension(const char *fn)
> > +{
> > + size_t sz;
> > +
> > + sz = strlen(fn);
> > + if (sz < 5)
> > + return RTYPE_INVALID;
> > +
> > + if (strcasecmp(fn + sz - 4, ".tal") == 0)
> > + return RTYPE_TAL;
> > + if (strcasecmp(fn + sz - 4, ".cer") == 0)
> > + return RTYPE_CER;
> > + if (strcasecmp(fn + sz - 4, ".crl") == 0)
> > + return RTYPE_CRL;
> > + if (strcasecmp(fn + sz - 4, ".mft") == 0)
> > + return RTYPE_MFT;
> > + if (strcasecmp(fn + sz - 4, ".roa") == 0)
> > + return RTYPE_ROA;
> > + if (strcasecmp(fn + sz - 4, ".gbr") == 0)
> > + return RTYPE_GBR;
> > +
> > + return RTYPE_INVALID;
> > +}
> > +
> > +/*
> > + * Validate that a filename listed on a Manifest only contains characters
> > + * permitted in draft-ietf-sidrops-6486bis section 4.2.2 and check that
> > + * it's a CER, CRL, GBR or a ROA.
> > + * Returns corresponding rtype or RTYPE_INVALID on error.
> > + */
> > +enum rtype
> > +rtype_from_mftfile(const char *fn)
> > +{
> > + const unsigned char *c;
> > + enum rtype type;
> > +
> > + for (c = fn; *c != '\0'; ++c)
> > + if (!isalnum(*c) && *c != '-' && *c != '_' && *c != '.')
> > + return RTYPE_INVALID;
> > +
> > + if (strchr(fn, '.') != strrchr(fn, '.'))
> > + return RTYPE_INVALID;
> > +
> > + type = rtype_from_file_extension(fn);
> > + switch (type) {
> > + case RTYPE_CER:
> > + case RTYPE_CRL:
> > + case RTYPE_GBR:
> > + case RTYPE_ROA:
> > + return type;
> > + default:
> > + return RTYPE_INVALID;
> > + }
> > +}
> > +
> > +/*
> > * Parse an individual "FileAndHash", RFC 6486, sec. 4.2.
> > * Return zero on failure, non-zero on success.
> > */
> > @@ -161,12 +222,10 @@ mft_parse_filehash(struct parse *p, cons
> > if (fn == NULL)
> > err(1, NULL);
> >
> > - if (!valid_filename(fn)) {
> > + if ((type = rtype_from_mftfile(fn)) == RTYPE_INVALID) {
> > warnx("%s: invalid filename: %s", p->fn, fn);
> > goto out;
> > }
> > -
> > - type = rtype_from_file_extension(fn);
> >
> > /* Now hash value. */
> >
> > Index: parser.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v
> > retrieving revision 1.49
> > diff -u -p -r1.49 parser.c
> > --- parser.c 21 Jan 2022 18:49:44 -0000 1.49
> > +++ parser.c 21 Jan 2022 19:36:10 -0000
> > @@ -307,7 +307,7 @@ proc_parser_mft_check(const char *fn, st
> >
> > for (i = 0; i < p->filesz; i++) {
> > const struct mftfile *m = &p->files[i];
> > - if (!valid_filename(m->file)) {
> > + if (rtype_from_mftfile(m->file) == RTYPE_INVALID) {
> > if (base64_encode(m->hash, sizeof(m->hash), &h) == -1)
> > errx(1, "base64_encode failed in %s", __func__);
> > warnx("%s: unsupported filename for %s", fn, h);
> > Index: validate.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/rpki-client/validate.c,v
> > retrieving revision 1.25
> > diff -u -p -r1.25 validate.c
> > --- validate.c 21 Jan 2022 18:49:44 -0000 1.25
> > +++ validate.c 21 Jan 2022 19:36:10 -0000
> > @@ -234,63 +234,6 @@ valid_roa(const char *fn, struct auth_tr
> > }
> >
> > /*
> > - * Determine rtype corresponding to file extension. Returns RTYPE_INVALID
> > - * on error or unkown extension.
> > - */
> > -enum rtype
> > -rtype_from_file_extension(const char *fn)
> > -{
> > - size_t sz;
> > -
> > - sz = strlen(fn);
> > - if (sz < 5)
> > - return RTYPE_INVALID;
> > -
> > - if (strcasecmp(fn + sz - 4, ".tal") == 0)
> > - return RTYPE_TAL;
> > - if (strcasecmp(fn + sz - 4, ".cer") == 0)
> > - return RTYPE_CER;
> > - if (strcasecmp(fn + sz - 4, ".crl") == 0)
> > - return RTYPE_CRL;
> > - if (strcasecmp(fn + sz - 4, ".mft") == 0)
> > - return RTYPE_MFT;
> > - if (strcasecmp(fn + sz - 4, ".roa") == 0)
> > - return RTYPE_ROA;
> > - if (strcasecmp(fn + sz - 4, ".gbr") == 0)
> > - return RTYPE_GBR;
> > -
> > - return RTYPE_INVALID;
> > -}
> > -
> > -/*
> > - * Validate a filename listed on a Manifest.
> > - * draft-ietf-sidrops-6486bis section 4.2.2
> > - * Returns 1 if filename is valid, otherwise 0.
> > - */
> > -int
> > -valid_filename(const char *fn)
> > -{
> > - const unsigned char *c;
> > -
> > - for (c = fn; *c != '\0'; ++c)
> > - if (!isalnum(*c) && *c != '-' && *c != '_' && *c != '.')
> > - return 0;
> > -
> > - if (strchr(fn, '.') != strrchr(fn, '.'))
> > - return 0;
> > -
> > - switch (rtype_from_file_extension(fn)) {
> > - case RTYPE_CER:
> > - case RTYPE_CRL:
> > - case RTYPE_GBR:
> > - case RTYPE_ROA:
> > - return 1;
> > - default:
> > - return 0;
> > - }
> > -}
> > -
> > -/*
> > * Validate a file by verifying the SHA256 hash of that file.
> > * The file to check is passed as a file descriptor.
> > * Returns 1 if hash matched, 0 otherwise. Closes fd when done.
> >
>
--
:wq Claudio