At the moment signify(1) requires sigfiles to begin with 'untrusted
comment: '. Sometimes one wants to have no comments and just signature
itself.

Index: signify.c
===================================================================
RCS file: /cvs/src/usr.bin/signify/signify.c,v
retrieving revision 1.126
diff -u -p -r1.126 signify.c
--- signify.c   6 Oct 2016 22:38:25 -0000       1.126
+++ signify.c   11 Oct 2016 00:19:35 -0000
@@ -125,27 +125,33 @@ static size_t
 parseb64file(const char *filename, char *b64, void *buf, size_t buflen,
     char *comment)
 {
-       char *commentend, *b64end;
+       char *linebegin, *lineend;

-       commentend = strchr(b64, '\n');
-       if (!commentend || commentend - b64 <= COMMENTHDRLEN ||
-           memcmp(b64, COMMENTHDR, COMMENTHDRLEN) != 0)
-               errx(1, "invalid comment in %s; must start with '%s'",
-                   filename, COMMENTHDR);
-       *commentend = '\0';
-       if (comment) {
-               if (strlcpy(comment, b64 + COMMENTHDRLEN,
-                   COMMENTMAXLEN) >= COMMENTMAXLEN)
-                       errx(1, "comment too long");
+       linebegin = b64;
+       lineend = strchr(linebegin, '\n');
+       if (!lineend) {
+               errx(1, "not enough lines in %s", filename);
        }
-       if (!(b64end = strchr(commentend + 1, '\n')))
-               errx(1, "missing new line after base64 in %s", filename);
-       *b64end = '\0';
-       if (b64_pton(commentend + 1, buf, buflen) != buflen)
-               errx(1, "invalid base64 encoding in %s", filename);
+       if (lineend - linebegin > COMMENTHDRLEN &&
+           memcmp(b64, COMMENTHDR, COMMENTHDRLEN) == 0) {
+               *lineend = '\0';
+               if (comment) {
+                       if (strlcpy(comment, b64 + COMMENTHDRLEN,
+                       COMMENTMAXLEN) >= COMMENTMAXLEN)
+                               errx(1, "comment too long");
+               }
+               linebegin = lineend + 1;
+
+               if (!(lineend = strchr(linebegin, '\n')))
+                       errx(1, "missing new line after base64 in %s",
filename);
+       }
+
+       *lineend = '\0';
+       if (b64_pton(linebegin, buf, buflen) != buflen)
+               errx(1, "invalid base64 encoding or corrupted comment in
%s", filename);
        if (memcmp(buf, PKALG, 2) != 0)
                errx(1, "unsupported file %s", filename);
-       return b64end - b64 + 1;
+       return lineend - b64 + 1;
 }

 static void

Reply via email to