winlin

Merge branch 'master' of github.com:winlinvip/simple-rtmp-server

@@ -167,6 +167,8 @@ See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-serv @@ -167,6 +167,8 @@ See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-serv
167 * nginx v1.5.0: 139524 lines <br/> 167 * nginx v1.5.0: 139524 lines <br/>
168 168
169 ### History 169 ### History
  170 +* v1.0, 2014-03-19, add vn/an for FFMPEG to drop video/audio for radio stream.
  171 +* v1.0, 2014-03-19, refine handshake, client support coplex handshake, add utest.
170 * v1.0, 2014-03-16, support ARM([debian armhf, v7cpu](https://github.com/winlinvip/simple-rtmp-server/wiki/SrsLinuxArm)) with rtmp/ssl/hls/librtmp. 172 * v1.0, 2014-03-16, support ARM([debian armhf, v7cpu](https://github.com/winlinvip/simple-rtmp-server/wiki/SrsLinuxArm)) with rtmp/ssl/hls/librtmp.
171 * v1.0, 2014-03-12, finish utest for amf0 codec. 173 * v1.0, 2014-03-12, finish utest for amf0 codec.
172 * v1.0, 2014-03-06, add gperftools for mem leak detect, mem/cpu profile. 174 * v1.0, 2014-03-06, add gperftools for mem leak detect, mem/cpu profile.
@@ -291,6 +291,25 @@ vhost audio.transcode.vhost.com { @@ -291,6 +291,25 @@ vhost audio.transcode.vhost.com {
291 } 291 }
292 } 292 }
293 } 293 }
  294 +# disable video, transcode/copy audio.
  295 +# for example, publish pure audio stream.
  296 +vhost vn.transcode.vhost.com {
  297 + transcode {
  298 + enabled on;
  299 + ffmpeg ./objs/ffmpeg/bin/ffmpeg;
  300 + engine vn {
  301 + enabled on;
  302 + vcodec vn;
  303 + acodec libaacplus;
  304 + abitrate 45;
  305 + asample_rate 44100;
  306 + achannels 2;
  307 + aparams {
  308 + }
  309 + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
  310 + }
  311 + }
  312 +}
294 # ffmpeg-copy(forward implements by ffmpeg). 313 # ffmpeg-copy(forward implements by ffmpeg).
295 # copy the video and audio to a new stream. 314 # copy the video and audio to a new stream.
296 vhost copy.transcode.vhost.com { 315 vhost copy.transcode.vhost.com {
@@ -333,6 +352,7 @@ vhost all.transcode.vhost.com { @@ -333,6 +352,7 @@ vhost all.transcode.vhost.com {
333 # video encoder name. can be: 352 # video encoder name. can be:
334 # libx264: use h.264(libx264) video encoder. 353 # libx264: use h.264(libx264) video encoder.
335 # copy: donot encoder the video stream, copy it. 354 # copy: donot encoder the video stream, copy it.
  355 + # vn: disable video output.
336 vcodec libx264; 356 vcodec libx264;
337 # video bitrate, in kbps 357 # video bitrate, in kbps
338 vbitrate 1500; 358 vbitrate 1500;
@@ -364,6 +384,7 @@ vhost all.transcode.vhost.com { @@ -364,6 +384,7 @@ vhost all.transcode.vhost.com {
364 # audio encoder name. can be: 384 # audio encoder name. can be:
365 # libaacplus: use aac(libaacplus) audio encoder. 385 # libaacplus: use aac(libaacplus) audio encoder.
366 # copy: donot encoder the audio stream, copy it. 386 # copy: donot encoder the audio stream, copy it.
  387 + # an: disable audio output.
367 acodec libaacplus; 388 acodec libaacplus;
368 # audio bitrate, in kbps. [16, 72] for libaacplus. 389 # audio bitrate, in kbps. [16, 72] for libaacplus.
369 abitrate 70; 390 abitrate 70;
@@ -42,6 +42,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -42,6 +42,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42 #ifdef SRS_FFMPEG 42 #ifdef SRS_FFMPEG
43 43
44 #define SRS_ENCODER_COPY "copy" 44 #define SRS_ENCODER_COPY "copy"
  45 +#define SRS_ENCODER_NO_VIDEO "vn"
  46 +#define SRS_ENCODER_NO_AUDIO "an"
45 #define SRS_ENCODER_VCODEC "libx264" 47 #define SRS_ENCODER_VCODEC "libx264"
46 #define SRS_ENCODER_ACODEC "libaacplus" 48 #define SRS_ENCODER_ACODEC "libaacplus"
47 49
@@ -138,7 +140,13 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) @@ -138,7 +140,13 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine)
138 } 140 }
139 _transcoded_url.push_back(output); 141 _transcoded_url.push_back(output);
140 142
141 - if (vcodec != SRS_ENCODER_COPY) { 143 + if (vcodec == SRS_ENCODER_NO_VIDEO && acodec == SRS_ENCODER_NO_AUDIO) {
  144 + ret = ERROR_ENCODER_VCODEC;
  145 + srs_warn("video and audio disabled. ret=%d", ret);
  146 + return ret;
  147 + }
  148 +
  149 + if (vcodec != SRS_ENCODER_COPY && vcodec != SRS_ENCODER_NO_VIDEO) {
142 if (vcodec != SRS_ENCODER_VCODEC) { 150 if (vcodec != SRS_ENCODER_VCODEC) {
143 ret = ERROR_ENCODER_VCODEC; 151 ret = ERROR_ENCODER_VCODEC;
144 srs_error("invalid vcodec, must be %s, actual %s, ret=%d", 152 srs_error("invalid vcodec, must be %s, actual %s, ret=%d",
@@ -182,7 +190,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) @@ -182,7 +190,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine)
182 } 190 }
183 } 191 }
184 192
185 - if (acodec != SRS_ENCODER_COPY) { 193 + if (acodec != SRS_ENCODER_COPY && acodec != SRS_ENCODER_NO_AUDIO) {
186 if (acodec != SRS_ENCODER_ACODEC) { 194 if (acodec != SRS_ENCODER_ACODEC) {
187 ret = ERROR_ENCODER_ACODEC; 195 ret = ERROR_ENCODER_ACODEC;
188 srs_error("invalid acodec, must be %s, actual %s, ret=%d", 196 srs_error("invalid acodec, must be %s, actual %s, ret=%d",
@@ -254,11 +262,15 @@ int SrsFFMPEG::start() @@ -254,11 +262,15 @@ int SrsFFMPEG::start()
254 } 262 }
255 263
256 // video specified. 264 // video specified.
  265 + if (vcodec != SRS_ENCODER_NO_VIDEO) {
257 params.push_back("-vcodec"); 266 params.push_back("-vcodec");
258 params.push_back(vcodec); 267 params.push_back(vcodec);
  268 + } else {
  269 + params.push_back("-vn");
  270 + }
259 271
260 // the codec params is disabled when copy 272 // the codec params is disabled when copy
261 - if (vcodec != SRS_ENCODER_COPY) { 273 + if (vcodec != SRS_ENCODER_COPY && vcodec != SRS_ENCODER_NO_VIDEO) {
262 params.push_back("-b:v"); 274 params.push_back("-b:v");
263 snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000); 275 snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000);
264 params.push_back(tmp); 276 params.push_back(tmp);
@@ -299,11 +311,15 @@ int SrsFFMPEG::start() @@ -299,11 +311,15 @@ int SrsFFMPEG::start()
299 } 311 }
300 312
301 // audio specified. 313 // audio specified.
  314 + if (acodec != SRS_ENCODER_NO_AUDIO) {
302 params.push_back("-acodec"); 315 params.push_back("-acodec");
303 params.push_back(acodec); 316 params.push_back(acodec);
  317 + } else {
  318 + params.push_back("-an");
  319 + }
304 320
305 // the codec params is disabled when copy 321 // the codec params is disabled when copy
306 - if (acodec != SRS_ENCODER_COPY) { 322 + if (acodec != SRS_ENCODER_COPY && acodec != SRS_ENCODER_NO_AUDIO) {
307 params.push_back("-b:a"); 323 params.push_back("-b:a");
308 snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000); 324 snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000);
309 params.push_back(tmp); 325 params.push_back(tmp);
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "21" 34 +#define VERSION_REVISION "22"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "srs" 37 #define RTMP_SIG_SRS_KEY "srs"
@@ -32,12 +32,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -32,12 +32,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 #include <srs_protocol_utility.hpp> 32 #include <srs_protocol_utility.hpp>
33 #include <srs_protocol_rtmp.hpp> 33 #include <srs_protocol_rtmp.hpp>
34 34
  35 +#ifdef SRS_SSL
  36 +
35 using namespace srs; 37 using namespace srs;
36 38
37 -#ifdef SRS_SSL 39 +// for openssl_HMACsha256
  40 +#include <openssl/evp.h>
  41 +#include <openssl/hmac.h>
  42 +// for __openssl_generate_key
  43 +#include <openssl/dh.h>
38 44
39 -// 68bytes FMS key which is used to sign the sever packet.  
40 -u_int8_t srs::SrsGenuineFMSKey[] = { 45 +namespace srs
  46 +{
  47 + // 68bytes FMS key which is used to sign the sever packet.
  48 + u_int8_t SrsGenuineFMSKey[] = {
41 0x47, 0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x20, 49 0x47, 0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x20,
42 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x46, 0x6c, 50 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x46, 0x6c,
43 0x61, 0x73, 0x68, 0x20, 0x4d, 0x65, 0x64, 0x69, 51 0x61, 0x73, 0x68, 0x20, 0x4d, 0x65, 0x64, 0x69,
@@ -47,10 +55,10 @@ u_int8_t srs::SrsGenuineFMSKey[] = { @@ -47,10 +55,10 @@ u_int8_t srs::SrsGenuineFMSKey[] = {
47 0x2e, 0x00, 0xd0, 0xd1, 0x02, 0x9e, 0x7e, 0x57, 55 0x2e, 0x00, 0xd0, 0xd1, 0x02, 0x9e, 0x7e, 0x57,
48 0x6e, 0xec, 0x5d, 0x2d, 0x29, 0x80, 0x6f, 0xab, 56 0x6e, 0xec, 0x5d, 0x2d, 0x29, 0x80, 0x6f, 0xab,
49 0x93, 0xb8, 0xe6, 0x36, 0xcf, 0xeb, 0x31, 0xae 57 0x93, 0xb8, 0xe6, 0x36, 0xcf, 0xeb, 0x31, 0xae
50 -}; // 68 58 + }; // 68
51 59
52 -// 62bytes FP key which is used to sign the client packet.  
53 -u_int8_t srs::SrsGenuineFPKey[] = { 60 + // 62bytes FP key which is used to sign the client packet.
  61 + u_int8_t SrsGenuineFPKey[] = {
54 0x47, 0x65, 0x6E, 0x75, 0x69, 0x6E, 0x65, 0x20, 62 0x47, 0x65, 0x6E, 0x75, 0x69, 0x6E, 0x65, 0x20,
55 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x46, 0x6C, 63 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x46, 0x6C,
56 0x61, 0x73, 0x68, 0x20, 0x50, 0x6C, 0x61, 0x79, 64 0x61, 0x73, 0x68, 0x20, 0x50, 0x6C, 0x61, 0x79,
@@ -59,12 +67,10 @@ u_int8_t srs::SrsGenuineFPKey[] = { @@ -59,12 +67,10 @@ u_int8_t srs::SrsGenuineFPKey[] = {
59 0x2E, 0x00, 0xD0, 0xD1, 0x02, 0x9E, 0x7E, 0x57, 67 0x2E, 0x00, 0xD0, 0xD1, 0x02, 0x9E, 0x7E, 0x57,
60 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, 68 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB,
61 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE 69 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE
62 -}; // 62 70 + }; // 62
63 71
64 -#include <openssl/evp.h>  
65 -#include <openssl/hmac.h>  
66 -int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest)  
67 -{ 72 + int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest)
  73 + {
68 HMAC_CTX ctx; 74 HMAC_CTX ctx;
69 75
70 HMAC_CTX_init(&ctx); 76 HMAC_CTX_init(&ctx);
@@ -81,20 +87,19 @@ int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, in @@ -81,20 +87,19 @@ int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, in
81 } 87 }
82 88
83 return ERROR_SUCCESS; 89 return ERROR_SUCCESS;
84 -} 90 + }
85 91
86 -#include <openssl/dh.h>  
87 -#define RFC2409_PRIME_1024 \ 92 + #define RFC2409_PRIME_1024 \
88 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ 93 "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \
89 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ 94 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \
90 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ 95 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \
91 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ 96 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \
92 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \ 97 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \
93 "FFFFFFFFFFFFFFFF" 98 "FFFFFFFFFFFFFFFF"
94 -int __openssl_generate_key(  
95 - u_int8_t*& _private_key, u_int8_t*& _public_key, int32_t& size, 99 + int __openssl_generate_key(
  100 + u_int8_t* _private_key, u_int8_t* _public_key, int32_t& size,
96 DH*& pdh, int32_t& bits_count, u_int8_t*& shared_key, int32_t& shared_key_length, BIGNUM*& peer_public_key 101 DH*& pdh, int32_t& bits_count, u_int8_t*& shared_key, int32_t& shared_key_length, BIGNUM*& peer_public_key
97 -){ 102 + ){
98 int ret = ERROR_SUCCESS; 103 int ret = ERROR_SUCCESS;
99 104
100 //1. Create the DH 105 //1. Create the DH
@@ -182,9 +187,9 @@ int __openssl_generate_key( @@ -182,9 +187,9 @@ int __openssl_generate_key(
182 } 187 }
183 188
184 return ret; 189 return ret;
185 -}  
186 -int openssl_generate_key(char* _private_key, char* _public_key, int32_t size)  
187 -{ 190 + }
  191 + int openssl_generate_key(char* _private_key, char* _public_key, int32_t size)
  192 + {
188 int ret = ERROR_SUCCESS; 193 int ret = ERROR_SUCCESS;
189 194
190 // Initialize 195 // Initialize
@@ -195,7 +200,7 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) @@ -195,7 +200,7 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size)
195 BIGNUM* peer_public_key = NULL; 200 BIGNUM* peer_public_key = NULL;
196 201
197 ret = __openssl_generate_key( 202 ret = __openssl_generate_key(
198 - (u_int8_t*&)_private_key, (u_int8_t*&)_public_key, size, 203 + (u_int8_t*)_private_key, (u_int8_t*)_public_key, size,
199 pdh, bits_count, shared_key, shared_key_length, peer_public_key 204 pdh, bits_count, shared_key, shared_key_length, peer_public_key
200 ); 205 );
201 206
@@ -223,12 +228,12 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) @@ -223,12 +228,12 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size)
223 } 228 }
224 229
225 return ret; 230 return ret;
226 -} 231 + }
227 232
228 -// calc the offset of key,  
229 -// the key->offset cannot be used as the offset of key.  
230 -int srs_key_block_get_offset(key_block* key)  
231 -{ 233 + // calc the offset of key,
  234 + // the key->offset cannot be used as the offset of key.
  235 + int srs_key_block_get_offset(key_block* key)
  236 + {
232 int max_offset_size = 764 - 128 - 4; 237 int max_offset_size = 764 - 128 - 4;
233 238
234 int offset = 0; 239 int offset = 0;
@@ -239,11 +244,12 @@ int srs_key_block_get_offset(key_block* key) @@ -239,11 +244,12 @@ int srs_key_block_get_offset(key_block* key)
239 offset += *pp++; 244 offset += *pp++;
240 245
241 return offset % max_offset_size; 246 return offset % max_offset_size;
242 -}  
243 -// create new key block data.  
244 -// if created, user must free it by srs_key_block_free  
245 -void srs_key_block_init(key_block* key)  
246 -{ 247 + }
  248 +
  249 + // create new key block data.
  250 + // if created, user must free it by srs_key_block_free
  251 + void srs_key_block_init(key_block* key)
  252 + {
247 key->offset = (int32_t)rand(); 253 key->offset = (int32_t)rand();
248 key->random0 = NULL; 254 key->random0 = NULL;
249 key->random1 = NULL; 255 key->random1 = NULL;
@@ -264,12 +270,13 @@ void srs_key_block_init(key_block* key) @@ -264,12 +270,13 @@ void srs_key_block_init(key_block* key)
264 key->random1 = new char[key->random1_size]; 270 key->random1 = new char[key->random1_size];
265 srs_random_generate(key->random1, key->random1_size); 271 srs_random_generate(key->random1, key->random1_size);
266 } 272 }
267 -}  
268 -// parse key block from c1s1.  
269 -// if created, user must free it by srs_key_block_free  
270 -// @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764  
271 -int srs_key_block_parse(key_block* key, char* c1s1_key_bytes)  
272 -{ 273 + }
  274 +
  275 + // parse key block from c1s1.
  276 + // if created, user must free it by srs_key_block_free
  277 + // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764
  278 + int srs_key_block_parse(key_block* key, char* c1s1_key_bytes)
  279 + {
273 int ret = ERROR_SUCCESS; 280 int ret = ERROR_SUCCESS;
274 281
275 char* pp = c1s1_key_bytes + 764; 282 char* pp = c1s1_key_bytes + 764;
@@ -301,23 +308,24 @@ int srs_key_block_parse(key_block* key, char* c1s1_key_bytes) @@ -301,23 +308,24 @@ int srs_key_block_parse(key_block* key, char* c1s1_key_bytes)
301 } 308 }
302 309
303 return ret; 310 return ret;
304 -}  
305 -// free the block data create by  
306 -// srs_key_block_init or srs_key_block_parse  
307 -void srs_key_block_free(key_block* key)  
308 -{ 311 + }
  312 +
  313 + // free the block data create by
  314 + // srs_key_block_init or srs_key_block_parse
  315 + void srs_key_block_free(key_block* key)
  316 + {
309 if (key->random0) { 317 if (key->random0) {
310 srs_freepa(key->random0); 318 srs_freepa(key->random0);
311 } 319 }
312 if (key->random1) { 320 if (key->random1) {
313 srs_freepa(key->random1); 321 srs_freepa(key->random1);
314 } 322 }
315 -} 323 + }
316 324
317 -// calc the offset of digest,  
318 -// the key->offset cannot be used as the offset of digest.  
319 -int srs_digest_block_get_offset(digest_block* digest)  
320 -{ 325 + // calc the offset of digest,
  326 + // the key->offset cannot be used as the offset of digest.
  327 + int srs_digest_block_get_offset(digest_block* digest)
  328 + {
321 int max_offset_size = 764 - 32 - 4; 329 int max_offset_size = 764 - 32 - 4;
322 330
323 int offset = 0; 331 int offset = 0;
@@ -328,11 +336,12 @@ int srs_digest_block_get_offset(digest_block* digest) @@ -328,11 +336,12 @@ int srs_digest_block_get_offset(digest_block* digest)
328 offset += *pp++; 336 offset += *pp++;
329 337
330 return offset % max_offset_size; 338 return offset % max_offset_size;
331 -}  
332 -// create new digest block data.  
333 -// if created, user must free it by srs_digest_block_free  
334 -void srs_digest_block_init(digest_block* digest)  
335 -{ 339 + }
  340 +
  341 + // create new digest block data.
  342 + // if created, user must free it by srs_digest_block_free
  343 + void srs_digest_block_init(digest_block* digest)
  344 + {
336 digest->offset = (int32_t)rand(); 345 digest->offset = (int32_t)rand();
337 digest->random0 = NULL; 346 digest->random0 = NULL;
338 digest->random1 = NULL; 347 digest->random1 = NULL;
@@ -353,12 +362,13 @@ void srs_digest_block_init(digest_block* digest) @@ -353,12 +362,13 @@ void srs_digest_block_init(digest_block* digest)
353 digest->random1 = new char[digest->random1_size]; 362 digest->random1 = new char[digest->random1_size];
354 srs_random_generate(digest->random1, digest->random1_size); 363 srs_random_generate(digest->random1, digest->random1_size);
355 } 364 }
356 -}  
357 -// parse digest block from c1s1.  
358 -// if created, user must free it by srs_digest_block_free  
359 -// @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764  
360 -int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes)  
361 -{ 365 + }
  366 +
  367 + // parse digest block from c1s1.
  368 + // if created, user must free it by srs_digest_block_free
  369 + // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764
  370 + int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes)
  371 + {
362 int ret = ERROR_SUCCESS; 372 int ret = ERROR_SUCCESS;
363 373
364 char* pp = c1s1_digest_bytes; 374 char* pp = c1s1_digest_bytes;
@@ -389,33 +399,34 @@ int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) @@ -389,33 +399,34 @@ int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes)
389 } 399 }
390 400
391 return ret; 401 return ret;
392 -}  
393 -// free the block data create by  
394 -// srs_digest_block_init or srs_digest_block_parse  
395 -void srs_digest_block_free(digest_block* digest)  
396 -{ 402 + }
  403 +
  404 + // free the block data create by
  405 + // srs_digest_block_init or srs_digest_block_parse
  406 + void srs_digest_block_free(digest_block* digest)
  407 + {
397 if (digest->random0) { 408 if (digest->random0) {
398 srs_freepa(digest->random0); 409 srs_freepa(digest->random0);
399 } 410 }
400 if (digest->random1) { 411 if (digest->random1) {
401 srs_freepa(digest->random1); 412 srs_freepa(digest->random1);
402 } 413 }
403 -} 414 + }
404 415
405 -void __srs_time_copy_to(char*& pp, int32_t time)  
406 -{ 416 + void __srs_time_copy_to(char*& pp, int32_t time)
  417 + {
407 // 4bytes time 418 // 4bytes time
408 *(int32_t*)pp = time; 419 *(int32_t*)pp = time;
409 pp += 4; 420 pp += 4;
410 -}  
411 -void __srs_version_copy_to(char*& pp, int32_t version)  
412 -{ 421 + }
  422 + void __srs_version_copy_to(char*& pp, int32_t version)
  423 + {
413 // 4bytes version 424 // 4bytes version
414 *(int32_t*)pp = version; 425 *(int32_t*)pp = version;
415 pp += 4; 426 pp += 4;
416 -}  
417 -void __srs_key_copy_to(char*& pp, key_block* key)  
418 -{ 427 + }
  428 + void __srs_key_copy_to(char*& pp, key_block* key)
  429 + {
419 // 764bytes key block 430 // 764bytes key block
420 if (key->random0_size > 0) { 431 if (key->random0_size > 0) {
421 memcpy(pp, key->random0, key->random0_size); 432 memcpy(pp, key->random0, key->random0_size);
@@ -432,9 +443,9 @@ void __srs_key_copy_to(char*& pp, key_block* key) @@ -432,9 +443,9 @@ void __srs_key_copy_to(char*& pp, key_block* key)
432 443
433 *(int32_t*)pp = key->offset; 444 *(int32_t*)pp = key->offset;
434 pp += 4; 445 pp += 4;
435 -}  
436 -void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest)  
437 -{ 446 + }
  447 + void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest)
  448 + {
438 // 732bytes digest block without the 32bytes digest-data 449 // 732bytes digest block without the 32bytes digest-data
439 // nbytes digest block part1 450 // nbytes digest block part1
440 *(int32_t*)pp = digest->offset; 451 *(int32_t*)pp = digest->offset;
@@ -456,14 +467,14 @@ void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) @@ -456,14 +467,14 @@ void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest)
456 memcpy(pp, digest->random1, digest->random1_size); 467 memcpy(pp, digest->random1, digest->random1_size);
457 } 468 }
458 pp += digest->random1_size; 469 pp += digest->random1_size;
459 -} 470 + }
460 471
461 -/**  
462 -* copy whole c1s1 to bytes.  
463 -*/  
464 -void srs_schema0_copy_to(char* bytes, bool with_digest, 472 + /**
  473 + * copy whole c1s1 to bytes.
  474 + */
  475 + void srs_schema0_copy_to(char* bytes, bool with_digest,
465 int32_t time, int32_t version, key_block* key, digest_block* digest) 476 int32_t time, int32_t version, key_block* key, digest_block* digest)
466 -{ 477 + {
467 char* pp = bytes; 478 char* pp = bytes;
468 479
469 __srs_time_copy_to(pp, time); 480 __srs_time_copy_to(pp, time);
@@ -476,10 +487,10 @@ void srs_schema0_copy_to(char* bytes, bool with_digest, @@ -476,10 +487,10 @@ void srs_schema0_copy_to(char* bytes, bool with_digest,
476 } else { 487 } else {
477 srs_assert(pp - bytes == 1536 - 32); 488 srs_assert(pp - bytes == 1536 - 32);
478 } 489 }
479 -}  
480 -void srs_schema1_copy_to(char* bytes, bool with_digest, 490 + }
  491 + void srs_schema1_copy_to(char* bytes, bool with_digest,
481 int32_t time, int32_t version, digest_block* digest, key_block* key) 492 int32_t time, int32_t version, digest_block* digest, key_block* key)
482 -{ 493 + {
483 char* pp = bytes; 494 char* pp = bytes;
484 495
485 __srs_time_copy_to(pp, time); 496 __srs_time_copy_to(pp, time);
@@ -492,46 +503,54 @@ void srs_schema1_copy_to(char* bytes, bool with_digest, @@ -492,46 +503,54 @@ void srs_schema1_copy_to(char* bytes, bool with_digest,
492 } else { 503 } else {
493 srs_assert(pp - bytes == 1536 - 32); 504 srs_assert(pp - bytes == 1536 - 32);
494 } 505 }
495 -} 506 + }
496 507
497 -/**  
498 -* c1s1 is splited by digest:  
499 -* c1s1-part1: n bytes (time, version, key and digest-part1).  
500 -* digest-data: 32bytes  
501 -* c1s1-part2: (1536-n-32)bytes (digest-part2)  
502 -*/  
503 -char* srs::srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest)  
504 -{ 508 + /**
  509 + * c1s1 is splited by digest:
  510 + * c1s1-part1: n bytes (time, version, key and digest-part1).
  511 + * digest-data: 32bytes
  512 + * c1s1-part2: (1536-n-32)bytes (digest-part2)
  513 + */
  514 + char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest)
  515 + {
505 char* bytes = new char[1536 -32]; 516 char* bytes = new char[1536 -32];
506 517
507 srs_schema0_copy_to(bytes, false, time, version, key, digest); 518 srs_schema0_copy_to(bytes, false, time, version, key, digest);
508 519
509 return bytes; 520 return bytes;
510 -} 521 + }
511 522
512 -/**  
513 -* c1s1 is splited by digest:  
514 -* c1s1-part1: n bytes (time, version and digest-part1).  
515 -* digest-data: 32bytes  
516 -* c1s1-part2: (1536-n-32)bytes (digest-part2 and key)  
517 -*/  
518 -char* srs::srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key)  
519 -{ 523 + /**
  524 + * c1s1 is splited by digest:
  525 + * c1s1-part1: n bytes (time, version and digest-part1).
  526 + * digest-data: 32bytes
  527 + * c1s1-part2: (1536-n-32)bytes (digest-part2 and key)
  528 + */
  529 + char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key)
  530 + {
520 char* bytes = new char[1536 -32]; 531 char* bytes = new char[1536 -32];
521 532
522 srs_schema1_copy_to(bytes, false, time, version, digest, key); 533 srs_schema1_copy_to(bytes, false, time, version, digest, key);
523 534
524 return bytes; 535 return bytes;
525 -} 536 + }
526 537
527 -/**  
528 -* compare the memory in bytes.  
529 -*/  
530 -bool srs::srs_bytes_equals(void* pa, void* pb, int size)  
531 -{ 538 + /**
  539 + * compare the memory in bytes.
  540 + */
  541 + bool srs_bytes_equals(void* pa, void* pb, int size)
  542 + {
532 u_int8_t* a = (u_int8_t*)pa; 543 u_int8_t* a = (u_int8_t*)pa;
533 u_int8_t* b = (u_int8_t*)pb; 544 u_int8_t* b = (u_int8_t*)pb;
534 545
  546 + if (!a && !b) {
  547 + return true;
  548 + }
  549 +
  550 + if (!a || !b) {
  551 + return false;
  552 + }
  553 +
535 for(int i = 0; i < size; i++){ 554 for(int i = 0; i < size; i++){
536 if(a[i] != b[i]){ 555 if(a[i] != b[i]){
537 return false; 556 return false;
@@ -539,32 +558,32 @@ bool srs::srs_bytes_equals(void* pa, void* pb, int size) @@ -539,32 +558,32 @@ bool srs::srs_bytes_equals(void* pa, void* pb, int size)
539 } 558 }
540 559
541 return true; 560 return true;
542 -} 561 + }
543 562
544 -c2s2::c2s2()  
545 -{ 563 + c2s2::c2s2()
  564 + {
546 srs_random_generate(random, 1504); 565 srs_random_generate(random, 1504);
547 srs_random_generate(digest, 32); 566 srs_random_generate(digest, 32);
548 -} 567 + }
549 568
550 -c2s2::~c2s2()  
551 -{  
552 -} 569 + c2s2::~c2s2()
  570 + {
  571 + }
553 572
554 -void c2s2::dump(char* _c2s2)  
555 -{ 573 + void c2s2::dump(char* _c2s2)
  574 + {
556 memcpy(_c2s2, random, 1504); 575 memcpy(_c2s2, random, 1504);
557 memcpy(_c2s2 + 1504, digest, 32); 576 memcpy(_c2s2 + 1504, digest, 32);
558 -} 577 + }
559 578
560 -void c2s2::parse(char* _c2s2)  
561 -{ 579 + void c2s2::parse(char* _c2s2)
  580 + {
562 memcpy(random, _c2s2, 1504); 581 memcpy(random, _c2s2, 1504);
563 memcpy(digest, _c2s2 + 1504, 32); 582 memcpy(digest, _c2s2 + 1504, 32);
564 -} 583 + }
565 584
566 -int c2s2::c2_create(c1s1* s1)  
567 -{ 585 + int c2s2::c2_create(c1s1* s1)
  586 + {
568 int ret = ERROR_SUCCESS; 587 int ret = ERROR_SUCCESS;
569 588
570 char temp_key[OpensslHashSize]; 589 char temp_key[OpensslHashSize];
@@ -584,10 +603,10 @@ int c2s2::c2_create(c1s1* s1) @@ -584,10 +603,10 @@ int c2s2::c2_create(c1s1* s1)
584 memcpy(digest, _digest, 32); 603 memcpy(digest, _digest, 32);
585 604
586 return ret; 605 return ret;
587 -} 606 + }
588 607
589 -int c2s2::c2_validate(c1s1* s1, bool& is_valid)  
590 -{ 608 + int c2s2::c2_validate(c1s1* s1, bool& is_valid)
  609 + {
591 is_valid = false; 610 is_valid = false;
592 int ret = ERROR_SUCCESS; 611 int ret = ERROR_SUCCESS;
593 612
@@ -608,10 +627,10 @@ int c2s2::c2_validate(c1s1* s1, bool& is_valid) @@ -608,10 +627,10 @@ int c2s2::c2_validate(c1s1* s1, bool& is_valid)
608 is_valid = srs_bytes_equals(digest, _digest, 32); 627 is_valid = srs_bytes_equals(digest, _digest, 32);
609 628
610 return ret; 629 return ret;
611 -} 630 + }
612 631
613 -int c2s2::s2_create(c1s1* c1)  
614 -{ 632 + int c2s2::s2_create(c1s1* c1)
  633 + {
615 int ret = ERROR_SUCCESS; 634 int ret = ERROR_SUCCESS;
616 635
617 char temp_key[OpensslHashSize]; 636 char temp_key[OpensslHashSize];
@@ -631,10 +650,10 @@ int c2s2::s2_create(c1s1* c1) @@ -631,10 +650,10 @@ int c2s2::s2_create(c1s1* c1)
631 memcpy(digest, _digest, 32); 650 memcpy(digest, _digest, 32);
632 651
633 return ret; 652 return ret;
634 -} 653 + }
635 654
636 -int c2s2::s2_validate(c1s1* c1, bool& is_valid)  
637 -{ 655 + int c2s2::s2_validate(c1s1* c1, bool& is_valid)
  656 + {
638 is_valid = false; 657 is_valid = false;
639 int ret = ERROR_SUCCESS; 658 int ret = ERROR_SUCCESS;
640 659
@@ -655,20 +674,20 @@ int c2s2::s2_validate(c1s1* c1, bool& is_valid) @@ -655,20 +674,20 @@ int c2s2::s2_validate(c1s1* c1, bool& is_valid)
655 is_valid = srs_bytes_equals(digest, _digest, 32); 674 is_valid = srs_bytes_equals(digest, _digest, 32);
656 675
657 return ret; 676 return ret;
658 -} 677 + }
659 678
660 -// TODO: FIXME: move to the right position.  
661 -c1s1::c1s1()  
662 -{ 679 + // TODO: FIXME: move to the right position.
  680 + c1s1::c1s1()
  681 + {
663 schema = srs_schema_invalid; 682 schema = srs_schema_invalid;
664 -}  
665 -c1s1::~c1s1()  
666 -{ 683 + }
  684 + c1s1::~c1s1()
  685 + {
667 destroy_blocks(); 686 destroy_blocks();
668 -} 687 + }
669 688
670 -char* c1s1::get_digest()  
671 -{ 689 + char* c1s1::get_digest()
  690 + {
672 srs_assert(schema != srs_schema_invalid); 691 srs_assert(schema != srs_schema_invalid);
673 692
674 if (schema == srs_schema0) { 693 if (schema == srs_schema0) {
@@ -676,10 +695,10 @@ char* c1s1::get_digest() @@ -676,10 +695,10 @@ char* c1s1::get_digest()
676 } else { 695 } else {
677 return block0.digest.digest; 696 return block0.digest.digest;
678 } 697 }
679 -} 698 + }
680 699
681 -void c1s1::dump(char* _c1s1)  
682 -{ 700 + void c1s1::dump(char* _c1s1)
  701 + {
683 srs_assert(schema != srs_schema_invalid); 702 srs_assert(schema != srs_schema_invalid);
684 703
685 if (schema == srs_schema0) { 704 if (schema == srs_schema0) {
@@ -687,10 +706,10 @@ void c1s1::dump(char* _c1s1) @@ -687,10 +706,10 @@ void c1s1::dump(char* _c1s1)
687 } else { 706 } else {
688 srs_schema1_copy_to(_c1s1, true, time, version, &block0.digest, &block1.key); 707 srs_schema1_copy_to(_c1s1, true, time, version, &block0.digest, &block1.key);
689 } 708 }
690 -} 709 + }
691 710
692 -int c1s1::parse(char* _c1s1, srs_schema_type _schema)  
693 -{ 711 + int c1s1::parse(char* _c1s1, srs_schema_type _schema)
  712 + {
694 int ret = ERROR_SUCCESS; 713 int ret = ERROR_SUCCESS;
695 714
696 if (_schema == srs_schema_invalid) { 715 if (_schema == srs_schema_invalid) {
@@ -733,10 +752,10 @@ int c1s1::parse(char* _c1s1, srs_schema_type _schema) @@ -733,10 +752,10 @@ int c1s1::parse(char* _c1s1, srs_schema_type _schema)
733 schema = _schema; 752 schema = _schema;
734 753
735 return ret; 754 return ret;
736 -} 755 + }
737 756
738 -int c1s1::c1_create(srs_schema_type _schema)  
739 -{ 757 + int c1s1::c1_create(srs_schema_type _schema)
  758 + {
740 int ret = ERROR_SUCCESS; 759 int ret = ERROR_SUCCESS;
741 760
742 if (_schema == srs_schema_invalid) { 761 if (_schema == srs_schema_invalid) {
@@ -777,10 +796,10 @@ int c1s1::c1_create(srs_schema_type _schema) @@ -777,10 +796,10 @@ int c1s1::c1_create(srs_schema_type _schema)
777 } 796 }
778 797
779 return ret; 798 return ret;
780 -} 799 + }
781 800
782 -int c1s1::c1_validate_digest(bool& is_valid)  
783 -{ 801 + int c1s1::c1_validate_digest(bool& is_valid)
  802 + {
784 is_valid = false; 803 is_valid = false;
785 int ret = ERROR_SUCCESS; 804 int ret = ERROR_SUCCESS;
786 805
@@ -801,10 +820,10 @@ int c1s1::c1_validate_digest(bool& is_valid) @@ -801,10 +820,10 @@ int c1s1::c1_validate_digest(bool& is_valid)
801 } 820 }
802 821
803 return ret; 822 return ret;
804 -} 823 + }
805 824
806 -int c1s1::s1_validate_digest(bool& is_valid)  
807 -{ 825 + int c1s1::s1_validate_digest(bool& is_valid)
  826 + {
808 is_valid = false; 827 is_valid = false;
809 int ret = ERROR_SUCCESS; 828 int ret = ERROR_SUCCESS;
810 829
@@ -825,10 +844,10 @@ int c1s1::s1_validate_digest(bool& is_valid) @@ -825,10 +844,10 @@ int c1s1::s1_validate_digest(bool& is_valid)
825 } 844 }
826 845
827 return ret; 846 return ret;
828 -} 847 + }
829 848
830 -int c1s1::s1_create(c1s1* c1)  
831 -{ 849 + int c1s1::s1_create(c1s1* c1)
  850 + {
832 int ret = ERROR_SUCCESS; 851 int ret = ERROR_SUCCESS;
833 852
834 if (c1->schema == srs_schema_invalid) { 853 if (c1->schema == srs_schema_invalid) {
@@ -882,10 +901,10 @@ int c1s1::s1_create(c1s1* c1) @@ -882,10 +901,10 @@ int c1s1::s1_create(c1s1* c1)
882 srs_verbose("copy s1 key success."); 901 srs_verbose("copy s1 key success.");
883 902
884 return ret; 903 return ret;
885 -} 904 + }
886 905
887 -int c1s1::calc_s1_digest(char*& digest)  
888 -{ 906 + int c1s1::calc_s1_digest(char*& digest)
  907 + {
889 int ret = ERROR_SUCCESS; 908 int ret = ERROR_SUCCESS;
890 909
891 srs_assert(schema == srs_schema0 || schema == srs_schema1); 910 srs_assert(schema == srs_schema0 || schema == srs_schema1);
@@ -909,10 +928,10 @@ int c1s1::calc_s1_digest(char*& digest) @@ -909,10 +928,10 @@ int c1s1::calc_s1_digest(char*& digest)
909 srs_verbose("digest calculated for s1"); 928 srs_verbose("digest calculated for s1");
910 929
911 return ret; 930 return ret;
912 -} 931 + }
913 932
914 -int c1s1::calc_c1_digest(char*& digest)  
915 -{ 933 + int c1s1::calc_c1_digest(char*& digest)
  934 + {
916 int ret = ERROR_SUCCESS; 935 int ret = ERROR_SUCCESS;
917 936
918 srs_assert(schema == srs_schema0 || schema == srs_schema1); 937 srs_assert(schema == srs_schema0 || schema == srs_schema1);
@@ -936,10 +955,10 @@ int c1s1::calc_c1_digest(char*& digest) @@ -936,10 +955,10 @@ int c1s1::calc_c1_digest(char*& digest)
936 srs_verbose("digest calculated for c1"); 955 srs_verbose("digest calculated for c1");
937 956
938 return ret; 957 return ret;
939 -} 958 + }
940 959
941 -void c1s1::destroy_blocks()  
942 -{ 960 + void c1s1::destroy_blocks()
  961 + {
943 if (schema == srs_schema_invalid) { 962 if (schema == srs_schema_invalid) {
944 return; 963 return;
945 } 964 }
@@ -951,6 +970,7 @@ void c1s1::destroy_blocks() @@ -951,6 +970,7 @@ void c1s1::destroy_blocks()
951 srs_digest_block_free(&block0.digest); 970 srs_digest_block_free(&block0.digest);
952 srs_key_block_free(&block1.key); 971 srs_key_block_free(&block1.key);
953 } 972 }
  973 + }
954 } 974 }
955 975
956 #endif 976 #endif
@@ -1144,13 +1164,10 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs @@ -1144,13 +1164,10 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs
1144 c2s2 c2; 1164 c2s2 c2;
1145 c2.parse(hs_bytes->c2); 1165 c2.parse(hs_bytes->c2);
1146 srs_verbose("complex handshake read c2 success."); 1166 srs_verbose("complex handshake read c2 success.");
  1167 +
1147 // verify c2 1168 // verify c2
1148 - if ((ret = c2.c2_validate(&s1, is_valid)) != ERROR_SUCCESS || !is_valid) {  
1149 - ret = ERROR_RTMP_HANDSHAKE;  
1150 - srs_trace("verify c2 failed. ret=%d", ret);  
1151 - return ret;  
1152 - }  
1153 - srs_verbose("verify c2 success."); 1169 + // never verify c2, for ffmpeg will failed.
  1170 + // it's ok for flash.
1154 1171
1155 srs_trace("comple handshake with client success"); 1172 srs_trace("comple handshake with client success");
1156 1173
@@ -97,6 +97,78 @@ namespace srs @@ -97,6 +97,78 @@ namespace srs
97 int random1_size; 97 int random1_size;
98 }; 98 };
99 99
  100 + // the digest key generate size.
  101 + #define OpensslHashSize 512
  102 + extern u_int8_t SrsGenuineFMSKey[];
  103 + extern u_int8_t SrsGenuineFPKey[];
  104 + int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest);
  105 + int openssl_generate_key(char* _private_key, char* _public_key, int32_t size);
  106 +
  107 + // calc the offset of key,
  108 + // the key->offset cannot be used as the offset of key.
  109 + int srs_key_block_get_offset(key_block* key);
  110 +
  111 + // create new key block data.
  112 + // if created, user must free it by srs_key_block_free
  113 + void srs_key_block_init(key_block* key);
  114 +
  115 + // parse key block from c1s1.
  116 + // if created, user must free it by srs_key_block_free
  117 + // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764
  118 + int srs_key_block_parse(key_block* key, char* c1s1_key_bytes);
  119 +
  120 + // free the block data create by
  121 + // srs_key_block_init or srs_key_block_parse
  122 + void srs_key_block_free(key_block* key);
  123 +
  124 + // calc the offset of digest,
  125 + // the key->offset cannot be used as the offset of digest.
  126 + int srs_digest_block_get_offset(digest_block* digest);
  127 +
  128 + // create new digest block data.
  129 + // if created, user must free it by srs_digest_block_free
  130 + void srs_digest_block_init(digest_block* digest);
  131 +
  132 + // parse digest block from c1s1.
  133 + // if created, user must free it by srs_digest_block_free
  134 + // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764
  135 + int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes);
  136 +
  137 + // free the block data create by
  138 + // srs_digest_block_init or srs_digest_block_parse
  139 + void srs_digest_block_free(digest_block* digest);
  140 +
  141 + /**
  142 + * copy whole c1s1 to bytes.
  143 + */
  144 + void srs_schema0_copy_to(char* bytes, bool with_digest,
  145 + int32_t time, int32_t version, key_block* key, digest_block* digest);
  146 + void srs_schema1_copy_to(char* bytes, bool with_digest,
  147 + int32_t time, int32_t version, digest_block* digest, key_block* key);
  148 +
  149 + /**
  150 + * c1s1 is splited by digest:
  151 + * c1s1-part1: n bytes (time, version, key and digest-part1).
  152 + * digest-data: 32bytes
  153 + * c1s1-part2: (1536-n-32)bytes (digest-part2)
  154 + * @return a new allocated bytes, user must free it.
  155 + */
  156 + char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest);
  157 +
  158 + /**
  159 + * c1s1 is splited by digest:
  160 + * c1s1-part1: n bytes (time, version and digest-part1).
  161 + * digest-data: 32bytes
  162 + * c1s1-part2: (1536-n-32)bytes (digest-part2 and key)
  163 + * @return a new allocated bytes, user must free it.
  164 + */
  165 + char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key);
  166 +
  167 + /**
  168 + * compare the memory in bytes.
  169 + */
  170 + bool srs_bytes_equals(void* pa, void* pb, int size);
  171 +
100 /** 172 /**
101 * c1s1 schema0 173 * c1s1 schema0
102 * time: 4bytes 174 * time: 4bytes
@@ -236,41 +308,14 @@ namespace srs @@ -236,41 +308,14 @@ namespace srs
236 */ 308 */
237 virtual int s2_validate(c1s1* c1, bool& is_valid); 309 virtual int s2_validate(c1s1* c1, bool& is_valid);
238 }; 310 };
239 -  
240 - /**  
241 - * compare the memory in bytes.  
242 - */  
243 - bool srs_bytes_equals(void* pa, void* pb, int size);  
244 -  
245 - /**  
246 - * c1s1 is splited by digest:  
247 - * c1s1-part1: n bytes (time, version, key and digest-part1).  
248 - * digest-data: 32bytes  
249 - * c1s1-part2: (1536-n-32)bytes (digest-part2)  
250 - * @return a new allocated bytes, user must free it.  
251 - */  
252 - char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest);  
253 -  
254 - /**  
255 - * c1s1 is splited by digest:  
256 - * c1s1-part1: n bytes (time, version and digest-part1).  
257 - * digest-data: 32bytes  
258 - * c1s1-part2: (1536-n-32)bytes (digest-part2 and key)  
259 - * @return a new allocated bytes, user must free it.  
260 - */  
261 - char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key);  
262 -  
263 - // the digest key generate size.  
264 - #define OpensslHashSize 512  
265 - extern u_int8_t SrsGenuineFMSKey[];  
266 - extern u_int8_t SrsGenuineFPKey[];  
267 - int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest);  
268 } 311 }
269 312
270 #endif 313 #endif
271 314
272 /** 315 /**
273 -* try complex handshake, if failed, fallback to simple handshake. 316 +* simple handshake.
  317 +* user can try complex handshake first,
  318 +* rollback to simple handshake if error ERROR_RTMP_TRY_SIMPLE_HS
274 */ 319 */
275 class SrsSimpleHandshake 320 class SrsSimpleHandshake
276 { 321 {
@@ -36,6 +36,77 @@ ISrsThreadContext* _srs_context = new ISrsThreadContext(); @@ -36,6 +36,77 @@ ISrsThreadContext* _srs_context = new ISrsThreadContext();
36 SrsConfig* _srs_config = NULL; 36 SrsConfig* _srs_config = NULL;
37 SrsServer* _srs_server = NULL; 37 SrsServer* _srs_server = NULL;
38 38
  39 +MockEmptyIO::MockEmptyIO()
  40 +{
  41 +}
  42 +
  43 +MockEmptyIO::~MockEmptyIO()
  44 +{
  45 +}
  46 +
  47 +bool MockEmptyIO::is_never_timeout(int64_t /*timeout_us*/)
  48 +{
  49 + return true;
  50 +}
  51 +
  52 +int MockEmptyIO::read_fully(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/)
  53 +{
  54 + return ERROR_SUCCESS;
  55 +}
  56 +
  57 +int MockEmptyIO::write(const void* /*buf*/, size_t /*size*/, ssize_t* /*nwrite*/)
  58 +{
  59 + return ERROR_SUCCESS;
  60 +}
  61 +
  62 +void MockEmptyIO::set_recv_timeout(int64_t /*timeout_us*/)
  63 +{
  64 +}
  65 +
  66 +int64_t MockEmptyIO::get_recv_timeout()
  67 +{
  68 + return -1;
  69 +}
  70 +
  71 +int64_t MockEmptyIO::get_recv_bytes()
  72 +{
  73 + return -1;
  74 +}
  75 +
  76 +int MockEmptyIO::get_recv_kbps()
  77 +{
  78 + return 0;
  79 +}
  80 +
  81 +void MockEmptyIO::set_send_timeout(int64_t /*timeout_us*/)
  82 +{
  83 +}
  84 +
  85 +int64_t MockEmptyIO::get_send_timeout()
  86 +{
  87 + return 0;
  88 +}
  89 +
  90 +int64_t MockEmptyIO::get_send_bytes()
  91 +{
  92 + return 0;
  93 +}
  94 +
  95 +int MockEmptyIO::get_send_kbps()
  96 +{
  97 + return 0;
  98 +}
  99 +
  100 +int MockEmptyIO::writev(const iovec */*iov*/, int /*iov_size*/, ssize_t* /*nwrite*/)
  101 +{
  102 + return ERROR_SUCCESS;
  103 +}
  104 +
  105 +int MockEmptyIO::read(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/)
  106 +{
  107 + return ERROR_SUCCESS;
  108 +}
  109 +
39 // basic test and samples. 110 // basic test and samples.
40 VOID TEST(SampleTest, FastSampleInt64Test) 111 VOID TEST(SampleTest, FastSampleInt64Test)
41 { 112 {
@@ -34,4 +34,36 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,4 +34,36 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 // we add an empty macro for upp to show the smart tips. 34 // we add an empty macro for upp to show the smart tips.
35 #define VOID 35 #define VOID
36 36
  37 +#include <srs_protocol_io.hpp>
  38 +
  39 +class MockEmptyIO : public ISrsProtocolReaderWriter
  40 +{
  41 +public:
  42 + MockEmptyIO();
  43 + virtual ~MockEmptyIO();
  44 +// for protocol
  45 +public:
  46 + virtual bool is_never_timeout(int64_t timeout_us);
  47 +// for handshake.
  48 +public:
  49 + virtual int read_fully(const void* buf, size_t size, ssize_t* nread);
  50 + virtual int write(const void* buf, size_t size, ssize_t* nwrite);
  51 +// for protocol
  52 +public:
  53 + virtual void set_recv_timeout(int64_t timeout_us);
  54 + virtual int64_t get_recv_timeout();
  55 + virtual int64_t get_recv_bytes();
  56 + virtual int get_recv_kbps();
  57 +// for protocol
  58 +public:
  59 + virtual void set_send_timeout(int64_t timeout_us);
  60 + virtual int64_t get_send_timeout();
  61 + virtual int64_t get_send_bytes();
  62 + virtual int get_send_kbps();
  63 + virtual int writev(const iovec *iov, int iov_size, ssize_t* nwrite);
  64 +// for protocol/amf0/msg-codec
  65 +public:
  66 + virtual int read(const void* buf, size_t size, ssize_t* nread);
  67 +};
  68 +
37 #endif 69 #endif
@@ -24,77 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -24,77 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 24
25 #include <srs_kernel_error.hpp> 25 #include <srs_kernel_error.hpp>
26 #include <srs_core_autofree.hpp> 26 #include <srs_core_autofree.hpp>
27 -  
28 -MockEmptyIO::MockEmptyIO()  
29 -{  
30 -}  
31 -  
32 -MockEmptyIO::~MockEmptyIO()  
33 -{  
34 -}  
35 -  
36 -bool MockEmptyIO::is_never_timeout(int64_t /*timeout_us*/)  
37 -{  
38 - return true;  
39 -}  
40 -  
41 -int MockEmptyIO::read_fully(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/)  
42 -{  
43 - return ERROR_SUCCESS;  
44 -}  
45 -  
46 -int MockEmptyIO::write(const void* /*buf*/, size_t /*size*/, ssize_t* /*nwrite*/)  
47 -{  
48 - return ERROR_SUCCESS;  
49 -}  
50 -  
51 -void MockEmptyIO::set_recv_timeout(int64_t /*timeout_us*/)  
52 -{  
53 -}  
54 -  
55 -int64_t MockEmptyIO::get_recv_timeout()  
56 -{  
57 - return -1;  
58 -}  
59 -  
60 -int64_t MockEmptyIO::get_recv_bytes()  
61 -{  
62 - return -1;  
63 -}  
64 -  
65 -int MockEmptyIO::get_recv_kbps()  
66 -{  
67 - return 0;  
68 -}  
69 -  
70 -void MockEmptyIO::set_send_timeout(int64_t /*timeout_us*/)  
71 -{  
72 -}  
73 -  
74 -int64_t MockEmptyIO::get_send_timeout()  
75 -{  
76 - return 0;  
77 -}  
78 -  
79 -int64_t MockEmptyIO::get_send_bytes()  
80 -{  
81 - return 0;  
82 -}  
83 -  
84 -int MockEmptyIO::get_send_kbps()  
85 -{  
86 - return 0;  
87 -}  
88 -  
89 -int MockEmptyIO::writev(const iovec */*iov*/, int /*iov_size*/, ssize_t* /*nwrite*/)  
90 -{  
91 - return ERROR_SUCCESS;  
92 -}  
93 -  
94 -int MockEmptyIO::read(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/)  
95 -{  
96 - return ERROR_SUCCESS;  
97 -} 27 +#include <srs_protocol_utility.hpp>
98 28
99 // verify the sha256 29 // verify the sha256
100 VOID TEST(HandshakeTest, OpensslSha256) 30 VOID TEST(HandshakeTest, OpensslSha256)
@@ -124,6 +54,37 @@ VOID TEST(HandshakeTest, OpensslSha256) @@ -124,6 +54,37 @@ VOID TEST(HandshakeTest, OpensslSha256)
124 EXPECT_TRUE(srs_bytes_equals(digest, expect_digest, 32)); 54 EXPECT_TRUE(srs_bytes_equals(digest, expect_digest, 32));
125 } 55 }
126 56
  57 +// verify the dh key
  58 +VOID TEST(HandshakeTest, DHKey)
  59 +{
  60 + char pri_key[] = {
  61 + 0x6e, 0x65, 0x69, 0x2d, 0x69, 0x2d, 0x69, 0x73,
  62 + 0x6e, 0x69, 0x73, 0x6c, 0x65, 0x72, 0x69, 0x72,
  63 + 0x76, 0x65, 0x72, 0x69, 0x77, 0x74, 0x2e, 0x6e,
  64 + 0x72, 0x76, 0x72, 0x65, 0x72, 0x70, 0x72, 0x69,
  65 + 0x69, 0x70, 0x72, 0x73, 0x6e, 0x65, 0x72, 0x72,
  66 + 0x6e, 0x2d, 0x65, 0x74, 0x72, 0x6c, 0x69, 0x74,
  67 + 0x69, 0x65, 0x40, 0x69, 0x69, 0x76, 0x77, 0x2d,
  68 + 0x73, 0x65, 0x72, 0x72, 0x76, 0x73, 0x72, 0x2e,
  69 + 0x2d, 0x76, 0x65, 0x31, 0x65, 0x6d, 0x6d, 0x73,
  70 + 0x69, 0x73, 0x74, 0x2e, 0x74, 0x72, 0x65, 0x65,
  71 + 0x72, 0x65, 0x2d, 0x74, 0x69, 0x31, 0x65, 0x2d,
  72 + 0x6f, 0x77, 0x2e, 0x76, 0x77, 0x2d, 0x77, 0x72,
  73 + 0x65, 0x65, 0x31, 0x74, 0x73, 0x70, 0x74, 0x6e,
  74 + 0x72, 0x6e, 0x73, 0x6d, 0x2e, 0x69, 0x72, 0x2d,
  75 + 0x65, 0x69, 0x77, 0x69, 0x76, 0x72, 0x77, 0x72,
  76 + 0x32, 0x6e, 0x65, 0x6c, 0x2e, 0x2d, 0x6e, 0x69
  77 + };
  78 +
  79 + char pub_key1[128];
  80 + openssl_generate_key(pri_key, pub_key1, 128);
  81 +
  82 + char pub_key2[128];
  83 + openssl_generate_key(pri_key, pub_key2, 128);
  84 +
  85 + EXPECT_FALSE(srs_bytes_equals(pub_key1, pub_key2, 128));
  86 +}
  87 +
127 // flash will sendout a c0c1 encrypt by ssl. 88 // flash will sendout a c0c1 encrypt by ssl.
128 VOID TEST(HandshakeTest, VerifyFPC0C1) 89 VOID TEST(HandshakeTest, VerifyFPC0C1)
129 { 90 {
@@ -260,3 +221,19 @@ VOID TEST(HandshakeTest, ComplexHandshake) @@ -260,3 +221,19 @@ VOID TEST(HandshakeTest, ComplexHandshake)
260 ASSERT_TRUE(is_valid); 221 ASSERT_TRUE(is_valid);
261 } 222 }
262 } 223 }
  224 +
  225 +VOID TEST(HandshakeTest, BytesEqual)
  226 +{
  227 + char a1[] = { 0x01 };
  228 + char b1[] = { 0x02 };
  229 + char a2[] = { 0x01, 0x02 };
  230 + char b2[] = { 0x02, 0x03 };
  231 +
  232 + EXPECT_TRUE(srs_bytes_equals(NULL, NULL, 0));
  233 + EXPECT_FALSE(srs_bytes_equals(a1, NULL, 1));
  234 + EXPECT_FALSE(srs_bytes_equals(NULL, a1, 1));
  235 + EXPECT_FALSE(srs_bytes_equals(a1, b1, 1));
  236 + EXPECT_TRUE(srs_bytes_equals(a1, a1, 1));
  237 + EXPECT_TRUE(srs_bytes_equals(a1, a2, 1));
  238 + EXPECT_FALSE(srs_bytes_equals(a1, b2, 1));
  239 +}
@@ -29,39 +29,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -29,39 +29,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 */ 29 */
30 #include <srs_utest.hpp> 30 #include <srs_utest.hpp>
31 31
32 -#include <srs_protocol_io.hpp>  
33 #include <srs_protocol_rtmp.hpp> 32 #include <srs_protocol_rtmp.hpp>
34 #include <srs_protocol_handshake.hpp> 33 #include <srs_protocol_handshake.hpp>
35 using namespace srs; 34 using namespace srs;
36 35
37 -class MockEmptyIO : public ISrsProtocolReaderWriter  
38 -{  
39 -public:  
40 - MockEmptyIO();  
41 - virtual ~MockEmptyIO();  
42 -// for protocol  
43 -public:  
44 - virtual bool is_never_timeout(int64_t timeout_us);  
45 -// for handshake.  
46 -public:  
47 - virtual int read_fully(const void* buf, size_t size, ssize_t* nread);  
48 - virtual int write(const void* buf, size_t size, ssize_t* nwrite);  
49 -// for protocol  
50 -public:  
51 - virtual void set_recv_timeout(int64_t timeout_us);  
52 - virtual int64_t get_recv_timeout();  
53 - virtual int64_t get_recv_bytes();  
54 - virtual int get_recv_kbps();  
55 -// for protocol  
56 -public:  
57 - virtual void set_send_timeout(int64_t timeout_us);  
58 - virtual int64_t get_send_timeout();  
59 - virtual int64_t get_send_bytes();  
60 - virtual int get_send_kbps();  
61 - virtual int writev(const iovec *iov, int iov_size, ssize_t* nwrite);  
62 -// for protocol/amf0/msg-codec  
63 -public:  
64 - virtual int read(const void* buf, size_t size, ssize_t* nread);  
65 -};  
66 -  
67 #endif 36 #endif