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)
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)
/*----- 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
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)
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 -------------------------------------------------*/
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)
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)