From b3e144a7dfc6953df3b3e478eb8b8521ab5c6ecc Mon Sep 17 00:00:00 2001 From: David Goldwich Date: Fri, 2 Sep 2011 08:20:58 +0200 Subject: des: add possibility to calculate DES-CBC-MAC with small buffer This patch adds the possibility to calculate the DES-CBC-MAC of a source buffer (i.e. the last block of the buffer encrypted in CBC mode) without having to allocate a destination buffer that is as long as the complete source buffer, but instead only 8 bytes for the MAC. Signed-off-by: David Goldwich Signed-off-by: Anton Khirnov --- libavutil/des.c | 13 +++++++++++-- libavutil/des.h | 11 ++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/libavutil/des.c b/libavutil/des.c index d3f715e8fc..d65760e575 100644 --- a/libavutil/des.c +++ b/libavutil/des.c @@ -298,7 +298,7 @@ int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) { return 0; } -void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt) { +static void av_des_crypt_mac(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt, int mac) { uint64_t iv_val = iv ? AV_RB64(iv) : 0; while (count-- > 0) { uint64_t dst_val; @@ -321,12 +321,21 @@ void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t } AV_WB64(dst, dst_val); src += 8; - dst += 8; + if (!mac) + dst += 8; } if (iv) AV_WB64(iv, iv_val); } +void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt) { + av_des_crypt_mac(d, dst, src, count, iv, decrypt, 0); +} + +void av_des_mac(AVDES *d, uint8_t *dst, const uint8_t *src, int count) { + av_des_crypt_mac(d, dst, src, count, (uint8_t[8]){0}, 0, 1); +} + #ifdef TEST #undef printf #undef rand diff --git a/libavutil/des.h b/libavutil/des.h index 935d7c5d71..cda98122d3 100644 --- a/libavutil/des.h +++ b/libavutil/des.h @@ -33,7 +33,7 @@ struct AVDES { * @brief Initializes an AVDES context. * * @param key_bits must be 64 or 192 - * @param decrypt 0 for encryption, 1 for decryption + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption */ int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); @@ -49,4 +49,13 @@ int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); */ void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + #endif /* AVUTIL_DES_H */ -- cgit v1.2.3