--- /n/sources/plan9/sys/include/libsec.h Thu Jun 18 20:28:32 2026 +++ /sys/include/libsec.h Tue Jun 23 00:00:00 2026 @@ -190,6 +190,15 @@ enum Maxdlen= 64, Hmacblksz = 64, /* in bytes; from rfc2104 */ + + SHA1blksz= 64, /* SHA block size */ + SHA2_224blksz= 64, /* SHA-224 block size */ + SHA2_256blksz= 64, /* SHA-256 block size */ + SHA2_384blksz= 128, /* SHA-384 block size */ + SHA2_512blksz= 128, /* SHA-512 block size */ + MD4blksz= 64, /* MD4 block size */ + MD5blksz= 64, /* MD5 block size */ + Maxblksz = 128, }; typedef struct DigestState DigestState; --- /n/sources/plan9/sys/include/ape/libsec.h Thu Jun 18 20:28:32 2026 +++ /sys/include/ape/libsec.h Tue Jun 23 00:00:00 2026 @@ -153,6 +153,15 @@ enum Maxdlen= 64, Hmacblksz = 64, /* in bytes; from rfc2104 */ + + SHA1blksz= 64, /* SHA block size */ + SHA2_224blksz= 64, /* SHA-224 block size */ + SHA2_256blksz= 64, /* SHA-256 block size */ + SHA2_384blksz= 128, /* SHA-384 block size */ + SHA2_512blksz= 128, /* SHA-512 block size */ + MD4blksz= 64, /* MD4 block size */ + MD5blksz= 64, /* MD5 block size */ + Maxblksz = 128, }; typedef struct DigestState DigestState; --- /n/sources/plan9/sys/src/libsec/port/hmac.c Wed Aug 29 06:00:01 2007 +++ /sys/src/libsec/port/hmac.c Tue Jun 23 00:00:00 2026 @@ -6,21 +6,33 @@ DigestState* hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s, DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen) { - int i; - uchar pad[Hmacblksz+1], innerdigest[256]; + int i, blksz; + uchar pad[Maxblksz+1], innerdigest[256], hkey[Maxdlen], *k; + + assert(xlen <= Maxdlen); + + /* MD4, MD5, SHA1 to SHA2_256 block sizes are identical */ + blksz = SHA1blksz; + if(xlen > SHA2_256dlen) + blksz = SHA2_384blksz; /* SHA2_384 and SHA2_512 */ if(xlen > sizeof(innerdigest)) return nil; - if(klen > Hmacblksz) - return nil; + if(klen <= blksz) + k = key; + else { + x(key, klen, hkey, nil); + k = hkey; + klen = xlen; + } /* first time through */ if(s == nil || s->seeded == 0){ - memset(pad, 0x36, Hmacblksz); - pad[Hmacblksz] = 0; + memset(pad, 0x36, blksz); + pad[blksz] = 0; for(i = 0; i < klen; i++) - pad[i] ^= key[i]; - s = (*x)(pad, Hmacblksz, nil, s); + pad[i] ^= k[i]; + s = (*x)(pad, blksz, nil, s); if(s == nil) return nil; } @@ -30,12 +42,12 @@ hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState * return s; /* last time through */ - memset(pad, 0x5c, Hmacblksz); - pad[Hmacblksz] = 0; + memset(pad, 0x5c, blksz); + pad[blksz] = 0; for(i = 0; i < klen; i++) - pad[i] ^= key[i]; + pad[i] ^= k[i]; (*x)(nil, 0, innerdigest, s); - s = (*x)(pad, Hmacblksz, nil, nil); + s = (*x)(pad, blksz, nil, nil); (*x)(innerdigest, xlen, digest, s); return nil; }