+//8- GCM mode, statful
+cc_aligned_struct(16) ccccm_ctx;
+cc_aligned_struct(16) ccccm_nonce;
+
+struct ccmode_ccm {
+ size_t size; /* first argument to ccccm_ctx_decl(). */
+ size_t nonce_size; /* first argument to ccccm_nonce_decl(). */
+ size_t block_size;
+ int (*init)(const struct ccmode_ccm *ccm, ccccm_ctx *ctx,
+ size_t key_len, const void *key);
+ int (*set_iv)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nonce_len, const void *nonce,
+ size_t mac_size, size_t auth_len, size_t data_len);
+ int (*cbcmac)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in); // could just be ccm with NULL out
+ int (*ccm)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in, void *out);
+ int (*finalize)(ccccm_ctx *key, ccccm_nonce *nonce_ctx, void *mac);
+ int (*reset)(ccccm_ctx *key, ccccm_nonce *nonce_ctx);
+ const void *custom;
+};