symm/* (aead): Implement the `szok' methods.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 12 Aug 2021 09:34:01 +0000 (10:34 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 12 Aug 2021 09:34:01 +0000 (10:34 +0100)
I think this was intended to be part of the initial AEAD work, but got
forgotten.  Oh, well.

symm/ccm-def.h
symm/eax-def.h
symm/gaead.c
symm/gcm-def.h
symm/latinpoly-def.h
symm/ocb1-def.h
symm/ocb3-def.h

index 7002aba..7c6bd2e 100644 (file)
@@ -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)
index 3154ac0..8daf2d8 100644 (file)
@@ -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)
index 45aeb61..d513069 100644 (file)
 
 /*----- 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
index 53784f1..ffa008c 100644 (file)
@@ -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)
index af917fa..885b748 100644 (file)
@@ -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 -------------------------------------------------*/
index 2820aae..09b3824 100644 (file)
@@ -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)
index 31293cb..a5ee46e 100644 (file)
@@ -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)