On Thu, May 11, 2023 at 09:31:30AM +0000, Job Snijders wrote:
> Hi Theo,
> 
> On Wed, May 10, 2023 at 09:02:13PM +0200, Theo Buehler wrote:
> > Again, try to keep the code as it was as far as possible.
> 
> Indeed, thank you for the feedback! Below is an amended version.

I'm not sure if this is quite right.

valid_filehash() can be called twice first with the temp file and then
with the file from the valid repo. If the temp file has a bad hash then it
will result in a warning but the file from DIR_VALID may still be valid.
If both are invalid you end up with 3 warnings for a single file.

Also 'warnx("%s#%s: missing %s", fn, p->seqnum, m->file);' is incorrect
there may be a file with invalid hashes.  The missing message should only
be shown if noent == 2.

We really want to avoid excessive warnings especially for things that are
not an error.

> Index: parser.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v
> retrieving revision 1.93
> diff -u -p -r1.93 parser.c
> --- parser.c  27 Apr 2023 08:37:53 -0000      1.93
> +++ parser.c  11 May 2023 09:26:09 -0000
> @@ -177,20 +177,21 @@ proc_parser_mft_check(const char *fn, st
>                       fd = open(path, O_RDONLY);
>                       if (fd == -1 && errno == ENOENT)
>                               noent++;
> -                     free(path);
>  
>                       /* remember which path was checked */
>                       m->location = loc[try];
> -                     valid = valid_filehash(fd, m->hash, sizeof(m->hash));
> +
> +                     valid = valid_filehash(path, m->file, fd, m->hash,
> +                         sizeof(m->hash));
> +                     free(path);
>               }
>  
>               if (!valid) {
>                       /* silently skip not-existing unknown files */
>                       if (m->type == RTYPE_INVALID && noent == 2)
>                               continue;
> -                     warnx("%s: bad message digest for %s", fn, m->file);
> +                     warnx("%s#%s: missing %s", fn, p->seqnum, m->file);
>                       rc = 0;
> -                     continue;
>               }
>       }
>  
> Index: repo.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/repo.c,v
> retrieving revision 1.44
> diff -u -p -r1.44 repo.c
> --- repo.c    26 Apr 2023 16:32:41 -0000      1.44
> +++ repo.c    11 May 2023 09:26:09 -0000
> @@ -827,8 +827,7 @@ rrdp_handle_file(unsigned int id, enum p
>                       fd = open(fn, O_RDONLY);
>               } while (fd == -1 && try < 2);
>  
> -             if (!valid_filehash(fd, hash, hlen)) {
> -                     warnx("%s: bad file digest for %s", rr->notifyuri, fn);
> +             if (!valid_filehash(rr->notifyuri, fn, fd, hash, hlen)) {
>                       free(fn);
>                       return 0;
>               }
> Index: validate.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/validate.c,v
> retrieving revision 1.60
> diff -u -p -r1.60 validate.c
> --- validate.c        9 May 2023 10:34:32 -0000       1.60
> +++ validate.c        11 May 2023 09:26:09 -0000
> @@ -211,10 +211,11 @@ valid_roa(const char *fn, struct cert *c
>   * Returns 1 if hash matched, 0 otherwise. Closes fd when done.
>   */
>  int
> -valid_filehash(int fd, const char *hash, size_t hlen)
> +valid_filehash(const char *loc, const char *fn, int fd,
> +    const unsigned char *hash, size_t hlen)
>  {
>       SHA256_CTX      ctx;
> -     char            filehash[SHA256_DIGEST_LENGTH];
> +     unsigned char   filehash[SHA256_DIGEST_LENGTH];
>       char            buffer[8192];
>       ssize_t         nr;
>  
> @@ -230,8 +231,18 @@ valid_filehash(int fd, const char *hash,
>       close(fd);
>       SHA256_Final(filehash, &ctx);
>  
> -     if (memcmp(hash, filehash, sizeof(filehash)) != 0)
> +     if (memcmp(hash, filehash, SHA256_DIGEST_LENGTH) != 0) {
> +             char *expected, *computed;
> +             if (base64_encode(hash, hlen, &expected) == -1)
> +                     errx(1, "base64_encode failed");
> +             if (base64_encode(filehash, hlen, &computed) == -1)
> +                     errx(1, "base64_encode failed");
> +             warnx("%s: bad file digest for %s (expected: %s, got %s)",
> +                 loc, fn, expected, computed);
> +             free(expected);
> +             free(computed);
>               return 0;
> +     }
>       return 1;
>  }
>  
> 

-- 
:wq Claudio

Reply via email to