From: Mark Wooding Date: Thu, 12 Aug 2021 09:34:01 +0000 (+0100) Subject: symm/* (aead): Implement the `szok' methods. X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/commitdiff_plain/1491bf9eaa065ee9d654ae342b085ddb777c7711 symm/* (aead): Implement the `szok' methods. I think this was intended to be part of the initial AEAD work, but got forgotten. Oh, well. --- diff --git a/symm/ccm-def.h b/symm/ccm-def.h index 7002aba1..7c6bd2ed 100644 --- a/symm/ccm-def.h +++ b/symm/ccm-def.h @@ -715,13 +715,23 @@ static gaead_key *gckey(const void *k, size_t ksz) \ return (&key->k); \ } \ \ +static int gcszok(size_t nsz, size_t hsz, size_t msz, size_t tsz) \ +{ \ + ccm_params p; \ + \ + if (!gaead_szokcommon(&pre##_ccm, nsz, hsz, msz, tsz)) return (0); \ + p.hsz = hsz; p.msz = msz; p.bsz = PRE##_BLKSZ; p.nsz = nsz; p.tsz = tsz; \ + if (!ccm_check(&p)) return (0); \ + return (1); \ +} \ + \ const gcaead pre##_ccm = { \ name "-ccm", \ pre##_keysz, pre##_ccmnoncesz, pre##_ccmtagsz, \ PRE##_BLKSZ, 0, 0, \ AEADF_PCHSZ | AEADF_PCMSZ | AEADF_PCTSZ | \ AEADF_AADNDEP | AEADF_AADFIRST, \ - gckey \ + gckey, gcszok \ }; \ \ CCM_TESTX(PRE, pre, name, fname) diff --git a/symm/eax-def.h b/symm/eax-def.h index 3154ac07..8daf2d8c 100644 --- a/symm/eax-def.h +++ b/symm/eax-def.h @@ -675,11 +675,14 @@ static gaead_key *gckey(const void *k, size_t ksz) \ return (&key->k); \ } \ \ +static int gcszok(size_t nsz, size_t hsz, size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&pre##_eax, nsz, hsz, msz, tsz)); } \ + \ const gcaead pre##_eax = { \ name "-eax", \ pre##_keysz, pre##_eaxnoncesz, pre##_eaxtagsz, \ PRE##_BLKSZ, 0, 0, 0, \ - gckey \ + gckey, gcszok \ }; \ \ EAX_TESTX(PRE, pre, name, fname) diff --git a/symm/gaead.c b/symm/gaead.c index 45aeb614..d5130693 100644 --- a/symm/gaead.c +++ b/symm/gaead.c @@ -31,6 +31,27 @@ /*----- Main code ---------------------------------------------------------*/ +/* --- @gaead_szokcommon@ --- * + * + * Arguments: @const gcaead *aec@ = pointer to AEAD class + * @size_t nsz@, @size_t hsz@, @size_t msz@, @size_t tsz@ = + * nonce, header, message, and tag sizes + * + * Returns: Nonzero if the sizes are acceptable to the AEAD scheme in + * combination. + * + * Use: Generic implementation for sensible AEAD schemes. + */ + +int gaead_szokcommon(const gcaead *aec, + size_t nsz, size_t hsz, size_t msz, size_t tsz) +{ + if (keysz(nsz, aec->noncesz) != nsz) return (0); + if (keysz(tsz, aec->tagsz) != tsz) return (0); + if (hsz && (aec->f&AEADF_NOAAD)) return (0); + return (1); +} + /* --- @gaead_encrypt@ --- * * * Arguments: @const gaead_key *k@ = the AEAD key, already prepared diff --git a/symm/gcm-def.h b/symm/gcm-def.h index 53784f13..ffa008c3 100644 --- a/symm/gcm-def.h +++ b/symm/gcm-def.h @@ -790,11 +790,14 @@ static gaead_key *gckey(const void *k, size_t ksz) \ return (&key->k); \ } \ \ +static int gcszok(size_t nsz, size_t hsz, size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&pre##_gcm, nsz, hsz, msz, tsz)); } \ + \ const gcaead pre##_gcm = { \ name "-gcm", \ pre##_keysz, pre##_gcmnoncesz, pre##_gcmtagsz, \ PRE##_BLKSZ, 0, 0, 0, \ - gckey \ + gckey, gcszok \ }; \ \ GCM_TESTX(PRE, pre, name, fname) diff --git a/symm/latinpoly-def.h b/symm/latinpoly-def.h index af917fad..885b748d 100644 --- a/symm/latinpoly-def.h +++ b/symm/latinpoly-def.h @@ -445,19 +445,27 @@ static gaead_key *gkey_##latin##_common(const gaead_keyops *ops, \ static gaead_key *gkey_##latin##_poly1305(const void *k, size_t ksz) \ { return (gkey_##latin##_common(&gkops_##latin##_poly1305, k, ksz)); } \ \ +static int gszok_##latin##_poly1305(size_t nsz, size_t hsz, \ + size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&latin##_poly1305, nsz, hsz, msz, tsz)); } \ + \ static gaead_key *gkey_##latin##_naclbox(const void *k, size_t ksz) \ { return (gkey_##latin##_common(&gkops_##latin##_naclbox, k, ksz)); } \ \ +static int gszok_##latin##_naclbox(size_t nsz, size_t hsz, \ + size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&latin##_poly1305, nsz, hsz, msz, tsz)); } \ + \ const gcaead latin##_poly1305 = { \ name "-poly1305", latin##_keysz, latinpoly_noncesz, latinpoly_tagsz, \ 64, 0, 0, AEADF_AADNDEP, \ - gkey_##latin##_poly1305 \ + gkey_##latin##_poly1305, gszok_##latin##_poly1305 \ }; \ \ const gcaead latin##_naclbox = { \ name "-naclbox", latin##_keysz, latinpoly_noncesz, latinpoly_tagsz, \ 64, 0, 0, AEADF_AADNDEP | AEADF_NOAAD, \ - gkey_##latin##_naclbox \ + gkey_##latin##_naclbox, gszok_##latin##_naclbox \ }; /*----- That's all, folks -------------------------------------------------*/ diff --git a/symm/ocb1-def.h b/symm/ocb1-def.h index 2820aae1..09b3824d 100644 --- a/symm/ocb1-def.h +++ b/symm/ocb1-def.h @@ -495,11 +495,14 @@ static gaead_key *gckey(const void *k, size_t ksz) \ return (&key->k); \ } \ \ +static int gcszok(size_t nsz, size_t hsz, size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&pre##_ocb1, nsz, hsz, msz, tsz)); } \ + \ const gcaead pre##_ocb1 = { \ name "-ocb1", \ pre##_keysz, pre##_ocb1noncesz, pre##_ocb1tagsz, \ PRE##_BLKSZ, PRE##_BLKSZ, 0, 0, \ - gckey \ + gckey, gcszok \ }; \ \ OCB1_TESTX(PRE, pre, name, fname) diff --git a/symm/ocb3-def.h b/symm/ocb3-def.h index 31293cb4..a5ee46e9 100644 --- a/symm/ocb3-def.h +++ b/symm/ocb3-def.h @@ -768,11 +768,14 @@ static gaead_key *gckey(const void *k, size_t ksz) \ return (&key->k); \ } \ \ +static int gcszok(size_t nsz, size_t hsz, size_t msz, size_t tsz) \ + { return (gaead_szokcommon(&pre##_ocb3, nsz, hsz, msz, tsz)); } \ + \ const gcaead pre##_ocb3 = { \ name "-ocb3", \ pre##_keysz, pre##_ocb3noncesz, pre##_ocb3tagsz, \ PRE##_BLKSZ, PRE##_BLKSZ - 1, 0, AEADF_PCTSZ, \ - gckey \ + gckey, gcszok \ }; \ \ OCB3_TESTX(PRE, pre, name, fname)