Index | Thread | Search

From:
Jonathan Matthew <jonathan@d14n.org>
Subject:
Re: acme-client: support for external account binding
To:
"Anthony J. Bentley" <anthony@anjbe.name>
Cc:
tech@openbsd.org, sthen@openbsd.org, florian@openbsd.org
Date:
Mon, 22 Jun 2026 16:38:44 +1000

Download raw body.

Thread
  • Anthony J. Bentley:

    acme-client: support for external account binding

  • On Thu, Jun 11, 2026 at 04:26:06AM -0600, Anthony J. Bentley wrote:
    > Jonathan Matthew writes:
    > > Sadly this adds yet another base64 decoder implementation, because there
    > > wasn't one using the base64url encoding that acme-client could get to.
    > > This one is based on the libc bcrypt implementation, because it's short and
    > > uncomplicated and doesn't care about padding.
    > 
    > It seems that padding matters here. Actalis gave me a key ending in =
    > which acme-client doesn't understand:
    > 
    > $ acme-client -e XXXXXXXXXXXXXXXXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABC= mydomain
    > acme-client: unable to decode EAB key
    
    Interesting.  Most of the code I've looked at for dealing with EAB keys
    will fail if the base64url encoded string is padded with '='s, so I assumed
    we weren't going to see that in the wild.  Can you try this diff?
    
    Index: base64.c
    ===================================================================
    RCS file: /cvs/src/usr.sbin/acme-client/base64.c,v
    diff -u -p -r1.10 base64.c
    --- base64.c	22 May 2026 01:53:10 -0000	1.10
    +++ base64.c	22 Jun 2026 05:08:17 -0000
    @@ -113,6 +113,8 @@ unbase64buf_url(const unsigned char *dat
                     if ((p + 2) >= data + len)
                             break;
     
    +                if (*(p + 2) == '=')
    +                        break;
                     c3 = CHAR64(*(p + 2));
                     if (c3 == 255)
                             return -1;
    @@ -121,6 +123,8 @@ unbase64buf_url(const unsigned char *dat
                     if ((p + 3) >= data + len)
                             break;
     
    +                if (*(p + 3) == '=')
    +                        break;
                     c4 = CHAR64(*(p + 3));
                     if (c4 == 255)
                             return -1;
    
    
  • Anthony J. Bentley:

    acme-client: support for external account binding