diff options
author | Matt Caswell <matt@openssl.org> | 2014-12-06 20:53:35 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2014-12-08 10:27:56 +0000 |
commit | c857a80c9dccf82de94137410c754b18e893a55d (patch) | |
tree | 9bde8561d625b8da61e598bed2e30a5f7fe68150 /crypto/modes/modes_lcl.h | |
parent | 376e2ca3e3525290619602dc6013c97c9653c037 (diff) | |
download | openssl-c857a80c9dccf82de94137410c754b18e893a55d.zip openssl-c857a80c9dccf82de94137410c754b18e893a55d.tar.gz openssl-c857a80c9dccf82de94137410c754b18e893a55d.tar.bz2 |
Add support for OCB mode as per RFC7253
Reviewed-by: Tim Hudson <tjh@openssl.org>
Diffstat (limited to 'crypto/modes/modes_lcl.h')
-rw-r--r-- | crypto/modes/modes_lcl.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/crypto/modes/modes_lcl.h b/crypto/modes/modes_lcl.h index 2d7015a..1813825 100644 --- a/crypto/modes/modes_lcl.h +++ b/crypto/modes/modes_lcl.h @@ -136,3 +136,42 @@ struct ccm128_context { void *key; }; +#ifdef STRICT_ALIGNMENT +typedef struct { + unsigned char a[16]; +} OCB_BLOCK; +# define ocb_block16_xor(in1,in2,out) \ + ocb_block_xor((in1)->a,(in2)->a,16,(out)->a) +#else +typedef struct { + u64 a; + u64 b; +} OCB_BLOCK; +# define ocb_block16_xor(in1,in2,out) \ + (out)->a=(in1)->a^(in2)->a; (out)->b=(in1)->b^(in2)->b; +#endif + +struct ocb128_context { + /* Need both encrypt and decrypt key schedules for decryption */ + block128_f encrypt; + block128_f decrypt; + void *keyenc; + void *keydec; + + /* Key dependent variables. Can be reused if key remains the same */ + size_t l_index; + size_t max_l_index; + OCB_BLOCK l_star; + OCB_BLOCK l_dollar; + OCB_BLOCK *l; + + /* Must be reset for each session */ + u64 blocks_hashed; + u64 blocks_processed; + OCB_BLOCK tag; + OCB_BLOCK offset_aad; + OCB_BLOCK sum; + OCB_BLOCK offset; + OCB_BLOCK checksum; + +}; |