diff options
author | James Almer | 2017-10-21 13:31:13 -0300 |
---|---|---|
committer | James Almer | 2017-10-21 13:32:13 -0300 |
commit | 5f84ad3ecce39a6857f5b391341291009d891eb4 (patch) | |
tree | 0315c7b11d7116082d87f272a260f5e07dfc7d44 /libavformat/rtmpdigest.c | |
parent | 0814f4f720e8c52607933ace1fdbf16050838ab7 (diff) | |
parent | b864230c49089b087eef56988a3d6a784f6f9827 (diff) |
Merge commit 'b864230c49089b087eef56988a3d6a784f6f9827'
* commit 'b864230c49089b087eef56988a3d6a784f6f9827':
rtmp: Move RTMP digest calculation to a separate file
Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/rtmpdigest.c')
-rw-r--r-- | libavformat/rtmpdigest.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libavformat/rtmpdigest.c b/libavformat/rtmpdigest.c new file mode 100644 index 0000000000..a9b1177ed1 --- /dev/null +++ b/libavformat/rtmpdigest.c @@ -0,0 +1,67 @@ +/* + * RTMP network protocol + * Copyright (c) 2009 Konstantin Shishkov + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * RTMP protocol digest + */ + +#include <stdint.h> + +#include "libavutil/error.h" +#include "libavutil/hmac.h" + +#include "rtmp.h" + +int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap, + const uint8_t *key, int keylen, uint8_t *dst) +{ + AVHMAC *hmac; + + hmac = av_hmac_alloc(AV_HMAC_SHA256); + if (!hmac) + return AVERROR(ENOMEM); + + av_hmac_init(hmac, key, keylen); + if (gap <= 0) { + av_hmac_update(hmac, src, len); + } else { //skip 32 bytes used for storing digest + av_hmac_update(hmac, src, gap); + av_hmac_update(hmac, src + gap + 32, len - gap - 32); + } + av_hmac_final(hmac, dst, 32); + + av_hmac_free(hmac); + + return 0; +} + +int ff_rtmp_calc_digest_pos(const uint8_t *buf, int off, int mod_val, + int add_val) +{ + int i, digest_pos = 0; + + for (i = 0; i < 4; i++) + digest_pos += buf[i + off]; + digest_pos = digest_pos % mod_val + add_val; + + return digest_pos; +} |