2 * SRTP encryption/decryption
3 * Copyright (c) 2012 Martin Storsjo
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/base64.h"
23 #include "libavutil/aes.h"
24 #include "libavutil/hmac.h"
25 #include "libavutil/intreadwrite.h"
26 #include "libavutil/log.h"
31 void ff_srtp_free(struct SRTPContext
*s
)
37 av_hmac_free(s
->hmac
);
41 static void encrypt_counter(struct AVAES
*aes
, uint8_t *iv
, uint8_t *outbuf
,
45 for (i
= 0, outpos
= 0; outpos
< outlen
; i
++) {
46 uint8_t keystream
[16];
48 av_aes_crypt(aes
, keystream
, iv
, 1, NULL
, 0);
49 for (j
= 0; j
< 16 && outpos
< outlen
; j
++, outpos
++)
50 outbuf
[outpos
] ^= keystream
[j
];
54 static void derive_key(struct AVAES
*aes
, const uint8_t *salt
, int label
,
55 uint8_t *out
, int outlen
)
57 uint8_t input
[16] = { 0 };
58 memcpy(input
, salt
, 14);
59 // Key derivation rate assumed to be zero
60 input
[14 - 7] ^= label
;
61 memset(out
, 0, outlen
);
62 encrypt_counter(aes
, input
, out
, outlen
);
65 int ff_srtp_set_crypto(struct SRTPContext
*s
, const char *suite
,
73 if (!strcmp(suite
, "AES_CM_128_HMAC_SHA1_80") ||
74 !strcmp(suite
, "SRTP_AES128_CM_HMAC_SHA1_80")) {
75 s
->rtp_hmac_size
= s
->rtcp_hmac_size
= 10;
76 } else if (!strcmp(suite
, "AES_CM_128_HMAC_SHA1_32")) {
77 s
->rtp_hmac_size
= s
->rtcp_hmac_size
= 4;
78 } else if (!strcmp(suite
, "SRTP_AES128_CM_HMAC_SHA1_32")) {
79 // RFC 5764 section 4.1.2
81 s
->rtcp_hmac_size
= 10;
83 av_log(NULL
, AV_LOG_WARNING
, "SRTP Crypto suite %s not supported\n",
85 return AVERROR(EINVAL
);
87 if (av_base64_decode(buf
, params
, sizeof(buf
)) != sizeof(buf
)) {
88 av_log(NULL
, AV_LOG_WARNING
, "Incorrect amount of SRTP params\n");
89 return AVERROR(EINVAL
);
91 // MKI and lifetime not handled yet
92 s
->aes
= av_aes_alloc();
93 s
->hmac
= av_hmac_alloc(AV_HMAC_SHA1
);
94 if (!s
->aes
|| !s
->hmac
)
95 return AVERROR(ENOMEM
);
96 memcpy(s
->master_key
, buf
, 16);
97 memcpy(s
->master_salt
, buf
+ 16, 14);
100 av_aes_init(s
->aes
, s
->master_key
, 128, 0);
102 derive_key(s
->aes
, s
->master_salt
, 0x00, s
->rtp_key
, sizeof(s
->rtp_key
));
103 derive_key(s
->aes
, s
->master_salt
, 0x02, s
->rtp_salt
, sizeof(s
->rtp_salt
));
104 derive_key(s
->aes
, s
->master_salt
, 0x01, s
->rtp_auth
, sizeof(s
->rtp_auth
));
106 derive_key(s
->aes
, s
->master_salt
, 0x03, s
->rtcp_key
, sizeof(s
->rtcp_key
));
107 derive_key(s
->aes
, s
->master_salt
, 0x05, s
->rtcp_salt
, sizeof(s
->rtcp_salt
));
108 derive_key(s
->aes
, s
->master_salt
, 0x04, s
->rtcp_auth
, sizeof(s
->rtcp_auth
));
112 static void create_iv(uint8_t *iv
, const uint8_t *salt
, uint64_t index
,
118 AV_WB32(&iv
[4], ssrc
);
119 AV_WB64(indexbuf
, index
);
120 for (i
= 0; i
< 8; i
++) // index << 16
121 iv
[6 + i
] ^= indexbuf
[i
];
122 for (i
= 0; i
< 14; i
++)
126 int ff_srtp_decrypt(struct SRTPContext
*s
, uint8_t *buf
, int *lenptr
)
128 uint8_t iv
[16] = { 0 }, hmac
[20];
130 int av_uninit(seq_largest
);
131 uint32_t ssrc
, av_uninit(roc
);
135 // TODO: Missing replay protection
138 return AVERROR_INVALIDDATA
;
140 rtcp
= RTP_PT_IS_RTCP(buf
[1]);
141 hmac_size
= rtcp
? s
->rtcp_hmac_size
: s
->rtp_hmac_size
;
144 return AVERROR_INVALIDDATA
;
146 // Authentication HMAC
147 av_hmac_init(s
->hmac
, rtcp
? s
->rtcp_auth
: s
->rtp_auth
, sizeof(s
->rtp_auth
));
148 // If MKI is used, this should exclude the MKI as well
149 av_hmac_update(s
->hmac
, buf
, len
- hmac_size
);
152 int seq
= AV_RB16(buf
+ 2);
156 // RFC 3711 section 3.3.1, appendix A
157 seq_largest
= s
->seq_initialized
? s
->seq_largest
: seq
;
159 if (seq_largest
< 32768) {
160 if (seq
- seq_largest
> 32768)
163 if (seq_largest
- 32768 > seq
)
167 seq_largest
= FFMAX(seq_largest
, seq
);
168 } else if (v
== roc
+ 1) {
172 index
= seq
+ (((uint64_t)v
) << 16);
174 AV_WB32(rocbuf
, roc
);
175 av_hmac_update(s
->hmac
, rocbuf
, 4);
178 av_hmac_final(s
->hmac
, hmac
, sizeof(hmac
));
179 if (memcmp(hmac
, buf
+ len
- hmac_size
, hmac_size
)) {
180 av_log(NULL
, AV_LOG_WARNING
, "HMAC mismatch\n");
181 return AVERROR_INVALIDDATA
;
188 return AVERROR_INVALIDDATA
;
191 uint32_t srtcp_index
= AV_RB32(buf
+ len
- 4);
195 ssrc
= AV_RB32(buf
+ 4);
196 index
= srtcp_index
& 0x7fffffff;
200 if (!(srtcp_index
& 0x80000000))
204 s
->seq_initialized
= 1;
205 s
->seq_largest
= seq_largest
;
208 csrc
= buf
[0] & 0x0f;
210 ssrc
= AV_RB32(buf
+ 8);
218 return AVERROR_INVALIDDATA
;
222 return AVERROR_INVALIDDATA
;
223 ext
= (AV_RB16(buf
+ 2) + 1) * 4;
225 return AVERROR_INVALIDDATA
;
231 create_iv(iv
, rtcp
? s
->rtcp_salt
: s
->rtp_salt
, index
, ssrc
);
232 av_aes_init(s
->aes
, rtcp
? s
->rtcp_key
: s
->rtp_key
, 128, 0);
233 encrypt_counter(s
->aes
, iv
, buf
, len
);
238 int ff_srtp_encrypt(struct SRTPContext
*s
, const uint8_t *in
, int len
,
239 uint8_t *out
, int outlen
)
241 uint8_t iv
[16] = { 0 }, hmac
[20];
244 int rtcp
, hmac_size
, padding
;
248 return AVERROR_INVALIDDATA
;
250 rtcp
= RTP_PT_IS_RTCP(in
[1]);
251 hmac_size
= rtcp
? s
->rtcp_hmac_size
: s
->rtp_hmac_size
;
254 padding
+= 4; // For the RTCP index
256 if (len
+ padding
> outlen
)
259 memcpy(out
, in
, len
);
263 ssrc
= AV_RB32(buf
+ 4);
264 index
= s
->rtcp_index
++;
270 int seq
= AV_RB16(buf
+ 2);
273 return AVERROR_INVALIDDATA
;
275 ssrc
= AV_RB32(buf
+ 8);
277 if (seq
< s
->seq_largest
)
279 s
->seq_largest
= seq
;
280 index
= seq
+ (((uint64_t)s
->roc
) << 16);
282 csrc
= buf
[0] & 0x0f;
291 return AVERROR_INVALIDDATA
;
295 return AVERROR_INVALIDDATA
;
296 ext
= (AV_RB16(buf
+ 2) + 1) * 4;
298 return AVERROR_INVALIDDATA
;
304 create_iv(iv
, rtcp
? s
->rtcp_salt
: s
->rtp_salt
, index
, ssrc
);
305 av_aes_init(s
->aes
, rtcp
? s
->rtcp_key
: s
->rtp_key
, 128, 0);
306 encrypt_counter(s
->aes
, iv
, buf
, len
);
309 AV_WB32(buf
+ len
, 0x80000000 | index
);
313 av_hmac_init(s
->hmac
, rtcp
? s
->rtcp_auth
: s
->rtp_auth
, sizeof(s
->rtp_auth
));
314 av_hmac_update(s
->hmac
, out
, buf
+ len
- out
);
317 AV_WB32(rocbuf
, s
->roc
);
318 av_hmac_update(s
->hmac
, rocbuf
, 4);
320 av_hmac_final(s
->hmac
, hmac
, sizeof(hmac
));
322 memcpy(buf
+ len
, hmac
, hmac_size
);
324 return buf
+ len
- out
;