winlin

remove the read and write with SrsStream.

@@ -292,28 +292,6 @@ namespace _srs_internal @@ -292,28 +292,6 @@ namespace _srs_internal
292 return ret; 292 return ret;
293 } 293 }
294 294
295 - // read/write stream using SrsStream.  
296 - void __srs_stream_write_4bytes(char* pp, int32_t value)  
297 - {  
298 - static SrsStream stream;  
299 -  
300 - int ret = stream.initialize(pp, 4);  
301 - srs_assert(ret == ERROR_SUCCESS);  
302 -  
303 - stream.write_4bytes(value);  
304 - }  
305 - int32_t __srs_stream_read_4bytes(char* pp)  
306 - {  
307 - static SrsStream stream;  
308 -  
309 - int ret = stream.initialize(pp, 4);  
310 - srs_assert(ret == ERROR_SUCCESS);  
311 -  
312 - return stream.read_4bytes();  
313 - }  
314 -  
315 - // create new key block data.  
316 - // if created, user must free it by srs_key_block_free  
317 void key_block::init() 295 void key_block::init()
318 { 296 {
319 key_block* key = this; 297 key_block* key = this;
@@ -342,8 +320,6 @@ namespace _srs_internal @@ -342,8 +320,6 @@ namespace _srs_internal
342 } 320 }
343 } 321 }
344 322
345 - // calc the offset of key,  
346 - // the key->offset cannot be used as the offset of key.  
347 int key_block::offsets() 323 int key_block::offsets()
348 { 324 {
349 key_block* key = this; 325 key_block* key = this;
@@ -360,48 +336,46 @@ namespace _srs_internal @@ -360,48 +336,46 @@ namespace _srs_internal
360 return offset % max_offset_size; 336 return offset % max_offset_size;
361 } 337 }
362 338
363 - // parse key block from c1s1.  
364 - // if created, user must free it by srs_key_block_free  
365 - // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764  
366 - int key_block::parse(char* c1s1_key_bytes) 339 + int key_block::parse(SrsStream* stream)
367 { 340 {
368 key_block* key = this; 341 key_block* key = this;
369 342
370 int ret = ERROR_SUCCESS; 343 int ret = ERROR_SUCCESS;
  344 +
  345 + // the key must be 764 bytes.
  346 + srs_assert(stream->require(764));
371 347
372 - char* pp = c1s1_key_bytes + 764; 348 + // read the last offset first, 760-763
  349 + stream->skip(764 - sizeof(int32_t));
  350 + key->offset = stream->read_4bytes();
373 351
374 - pp -= sizeof(int32_t);  
375 - key->offset = __srs_stream_read_4bytes(pp); 352 + // reset stream to read others.
  353 + stream->skip(-764);
376 354
  355 + // TODO: FIXME: free it.
377 key->random0 = NULL; 356 key->random0 = NULL;
378 key->random1 = NULL; 357 key->random1 = NULL;
379 358
380 int offset = key->offsets(); 359 int offset = key->offsets();
381 srs_assert(offset >= 0); 360 srs_assert(offset >= 0);
382 361
383 - pp = c1s1_key_bytes;  
384 key->random0_size = offset; 362 key->random0_size = offset;
385 if (key->random0_size > 0) { 363 if (key->random0_size > 0) {
386 key->random0 = new char[key->random0_size]; 364 key->random0 = new char[key->random0_size];
387 - memcpy(key->random0, pp, key->random0_size); 365 + stream->read_bytes(key->random0, key->random0_size);
388 } 366 }
389 - pp += key->random0_size;  
390 367
391 - memcpy(key->key, pp, sizeof(key->key));  
392 - pp += sizeof(key->key); 368 + stream->read_bytes(key->key, 128);
393 369
394 key->random1_size = 764 - offset - 128 - 4; 370 key->random1_size = 764 - offset - 128 - 4;
395 if (key->random1_size > 0) { 371 if (key->random1_size > 0) {
396 key->random1 = new char[key->random1_size]; 372 key->random1 = new char[key->random1_size];
397 - memcpy(key->random1, pp, key->random1_size); 373 + stream->read_bytes(key->random1, key->random1_size);
398 } 374 }
399 375
400 return ret; 376 return ret;
401 } 377 }
402 378
403 - // free the block data create by  
404 - // srs_key_block_init or srs_key_block_parse  
405 void key_block::free() 379 void key_block::free()
406 { 380 {
407 key_block* key = this; 381 key_block* key = this;
@@ -414,8 +388,6 @@ namespace _srs_internal @@ -414,8 +388,6 @@ namespace _srs_internal
414 } 388 }
415 } 389 }
416 390
417 - // create new digest block data.  
418 - // if created, user must free it by srs_digest_block_free  
419 void digest_block::init() 391 void digest_block::init()
420 { 392 {
421 digest_block* digest = this; 393 digest_block* digest = this;
@@ -444,8 +416,6 @@ namespace _srs_internal @@ -444,8 +416,6 @@ namespace _srs_internal
444 } 416 }
445 } 417 }
446 418
447 - // calc the offset of digest,  
448 - // the key->offset cannot be used as the offset of digest.  
449 int digest_block::offsets() 419 int digest_block::offsets()
450 { 420 {
451 digest_block* digest = this; 421 digest_block* digest = this;
@@ -462,20 +432,18 @@ namespace _srs_internal @@ -462,20 +432,18 @@ namespace _srs_internal
462 return offset % max_offset_size; 432 return offset % max_offset_size;
463 } 433 }
464 434
465 - // parse digest block from c1s1.  
466 - // if created, user must free it by srs_digest_block_free  
467 - // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764  
468 - int digest_block::parse(char* c1s1_digest_bytes) 435 + int digest_block::parse(SrsStream* stream)
469 { 436 {
470 digest_block* digest = this; 437 digest_block* digest = this;
471 438
472 int ret = ERROR_SUCCESS; 439 int ret = ERROR_SUCCESS;
473 -  
474 - char* pp = c1s1_digest_bytes;  
475 440
476 - digest->offset = __srs_stream_read_4bytes(pp);  
477 - pp += sizeof(int32_t); 441 + // the digest must be 764 bytes.
  442 + srs_assert(stream->require(764));
  443 +
  444 + digest->offset = stream->read_4bytes();
478 445
  446 + // TODO: FIXME: free it.
479 digest->random0 = NULL; 447 digest->random0 = NULL;
480 digest->random1 = NULL; 448 digest->random1 = NULL;
481 449
@@ -485,24 +453,20 @@ namespace _srs_internal @@ -485,24 +453,20 @@ namespace _srs_internal
485 digest->random0_size = offset; 453 digest->random0_size = offset;
486 if (digest->random0_size > 0) { 454 if (digest->random0_size > 0) {
487 digest->random0 = new char[digest->random0_size]; 455 digest->random0 = new char[digest->random0_size];
488 - memcpy(digest->random0, pp, digest->random0_size); 456 + stream->read_bytes(digest->random0, digest->random0_size);
489 } 457 }
490 - pp += digest->random0_size;  
491 458
492 - memcpy(digest->digest, pp, sizeof(digest->digest));  
493 - pp += sizeof(digest->digest); 459 + stream->read_bytes(digest->digest, 32);
494 460
495 digest->random1_size = 764 - 4 - offset - 32; 461 digest->random1_size = 764 - 4 - offset - 32;
496 if (digest->random1_size > 0) { 462 if (digest->random1_size > 0) {
497 digest->random1 = new char[digest->random1_size]; 463 digest->random1 = new char[digest->random1_size];
498 - memcpy(digest->random1, pp, digest->random1_size); 464 + stream->read_bytes(digest->random1, digest->random1_size);
499 } 465 }
500 466
501 return ret; 467 return ret;
502 } 468 }
503 469
504 - // free the block data create by  
505 - // srs_digest_block_init or srs_digest_block_parse  
506 void digest_block::free() 470 void digest_block::free()
507 { 471 {
508 digest_block* digest = this; 472 digest_block* digest = this;
@@ -532,9 +496,9 @@ namespace _srs_internal @@ -532,9 +496,9 @@ namespace _srs_internal
532 return digest.digest; 496 return digest.digest;
533 } 497 }
534 498
535 - void c1s1_strategy::dump(c1s1* owner, char* _c1s1) 499 + int c1s1_strategy::dump(c1s1* owner, char* _c1s1, int size)
536 { 500 {
537 - copy_to(owner, _c1s1, true); 501 + return copy_to(owner, _c1s1, size, true);
538 } 502 }
539 503
540 int c1s1_strategy::c1_create(c1s1* owner) 504 int c1s1_strategy::c1_create(c1s1* owner)
@@ -646,7 +610,9 @@ namespace _srs_internal @@ -646,7 +610,9 @@ namespace _srs_internal
646 */ 610 */
647 char* c1s1_joined_bytes = new char[1536 -32]; 611 char* c1s1_joined_bytes = new char[1536 -32];
648 SrsAutoFree(char, c1s1_joined_bytes); 612 SrsAutoFree(char, c1s1_joined_bytes);
649 - copy_to(owner, c1s1_joined_bytes, false); 613 + if ((ret = copy_to(owner, c1s1_joined_bytes, 1536 - 32, false)) != ERROR_SUCCESS) {
  614 + return ret;
  615 + }
650 616
651 c1_digest = new char[__SRS_OpensslHashSize]; 617 c1_digest = new char[__SRS_OpensslHashSize];
652 if ((ret = openssl_HMACsha256(SrsGenuineFPKey, 30, c1s1_joined_bytes, 1536 - 32, c1_digest)) != ERROR_SUCCESS) { 618 if ((ret = openssl_HMACsha256(SrsGenuineFPKey, 30, c1s1_joined_bytes, 1536 - 32, c1_digest)) != ERROR_SUCCESS) {
@@ -672,7 +638,9 @@ namespace _srs_internal @@ -672,7 +638,9 @@ namespace _srs_internal
672 */ 638 */
673 char* c1s1_joined_bytes = new char[1536 -32]; 639 char* c1s1_joined_bytes = new char[1536 -32];
674 SrsAutoFree(char, c1s1_joined_bytes); 640 SrsAutoFree(char, c1s1_joined_bytes);
675 - copy_to(owner, c1s1_joined_bytes, false); 641 + if ((ret = copy_to(owner, c1s1_joined_bytes, 1536 - 32, false)) != ERROR_SUCCESS) {
  642 + return ret;
  643 + }
676 644
677 s1_digest = new char[__SRS_OpensslHashSize]; 645 s1_digest = new char[__SRS_OpensslHashSize];
678 if ((ret = openssl_HMACsha256(SrsGenuineFMSKey, 36, c1s1_joined_bytes, 1536 - 32, s1_digest)) != ERROR_SUCCESS) { 646 if ((ret = openssl_HMACsha256(SrsGenuineFMSKey, 36, c1s1_joined_bytes, 1536 - 32, s1_digest)) != ERROR_SUCCESS) {
@@ -685,58 +653,66 @@ namespace _srs_internal @@ -685,58 +653,66 @@ namespace _srs_internal
685 return ret; 653 return ret;
686 } 654 }
687 655
688 - void c1s1_strategy::copy_time_version(char*& pp, c1s1* owner) 656 + void c1s1_strategy::copy_time_version(SrsStream* stream, c1s1* owner)
689 { 657 {
  658 + srs_assert(stream->require(8));
  659 +
690 // 4bytes time 660 // 4bytes time
691 - __srs_stream_write_4bytes(pp, owner->time);  
692 - pp += 4; 661 + stream->write_4bytes(owner->time);
  662 +
693 // 4bytes version 663 // 4bytes version
694 - __srs_stream_write_4bytes(pp, owner->version);  
695 - pp += 4; 664 + stream->write_4bytes(owner->version);
696 } 665 }
697 - void c1s1_strategy::copy_key(char*& pp) 666 + void c1s1_strategy::copy_key(SrsStream* stream)
698 { 667 {
  668 + srs_assert(key.random0_size >= 0);
  669 + srs_assert(key.random1_size >= 0);
  670 +
  671 + int total = key.random0_size + 128 + key.random1_size + 4;
  672 + srs_assert(stream->require(total));
  673 +
699 // 764bytes key block 674 // 764bytes key block
700 if (key.random0_size > 0) { 675 if (key.random0_size > 0) {
701 - memcpy(pp, key.random0, key.random0_size); 676 + stream->write_bytes(key.random0, key.random0_size);
702 } 677 }
703 - pp += key.random0_size;  
704 678
705 - memcpy(pp, key.key, sizeof(key.key));  
706 - pp += sizeof(key.key); 679 + stream->write_bytes(key.key, 128);
707 680
708 if (key.random1_size > 0) { 681 if (key.random1_size > 0) {
709 - memcpy(pp, key.random1, key.random1_size); 682 + stream->write_bytes(key.random1, key.random1_size);
710 } 683 }
711 - pp += key.random1_size;  
712 684
713 - __srs_stream_write_4bytes(pp, key.offset);  
714 - pp += 4; 685 + stream->write_4bytes(key.offset);
715 } 686 }
716 - void c1s1_strategy::digest_key(char*& pp, bool with_digest) 687 + void c1s1_strategy::copy_digest(SrsStream* stream, bool with_digest)
717 { 688 {
  689 + srs_assert(key.random0_size >= 0);
  690 + srs_assert(key.random1_size >= 0);
  691 +
  692 + int total = 4 + digest.random0_size + digest.random1_size;
  693 + if (with_digest) {
  694 + total += 32;
  695 + }
  696 + srs_assert(stream->require(total));
  697 +
718 // 732bytes digest block without the 32bytes digest-data 698 // 732bytes digest block without the 32bytes digest-data
719 // nbytes digest block part1 699 // nbytes digest block part1
720 - __srs_stream_write_4bytes(pp, digest.offset);  
721 - pp += 4; 700 + stream->write_4bytes(digest.offset);
722 701
723 // digest random padding. 702 // digest random padding.
724 if (digest.random0_size > 0) { 703 if (digest.random0_size > 0) {
725 - memcpy(pp, digest.random0, digest.random0_size); 704 + stream->write_bytes(digest.random0, digest.random0_size);
726 } 705 }
727 - pp += digest.random0_size;  
728 706
729 // digest 707 // digest
730 if (with_digest) { 708 if (with_digest) {
731 - memcpy(pp, digest.digest, 32);  
732 - pp += 32; 709 + stream->write_bytes(digest.digest, 32);
733 } 710 }
734 711
735 // nbytes digest block part2 712 // nbytes digest block part2
736 if (digest.random1_size > 0) { 713 if (digest.random1_size > 0) {
737 - memcpy(pp, digest.random1, digest.random1_size); 714 + stream->write_bytes(digest.random1, digest.random1_size);
738 } 715 }
739 - pp += digest.random1_size;  
740 } 716 }
741 717
742 c1s1_strategy_schema0::c1s1_strategy_schema0() 718 c1s1_strategy_schema0::c1s1_strategy_schema0()
@@ -752,16 +728,28 @@ namespace _srs_internal @@ -752,16 +728,28 @@ namespace _srs_internal
752 return srs_schema0; 728 return srs_schema0;
753 } 729 }
754 730
755 - int c1s1_strategy_schema0::parse(char* _c1s1) 731 + int c1s1_strategy_schema0::parse(char* _c1s1, int size)
756 { 732 {
757 int ret = ERROR_SUCCESS; 733 int ret = ERROR_SUCCESS;
758 734
759 - if ((ret = key.parse(_c1s1 + 8)) != ERROR_SUCCESS) { 735 + srs_assert(size == 1536);
  736 +
  737 + SrsStream stream;
  738 +
  739 + if ((ret = stream.initialize(_c1s1 + 8, 764)) != ERROR_SUCCESS) {
  740 + return ret;
  741 + }
  742 +
  743 + if ((ret = key.parse(&stream)) != ERROR_SUCCESS) {
760 srs_error("parse the c1 key failed. ret=%d", ret); 744 srs_error("parse the c1 key failed. ret=%d", ret);
761 return ret; 745 return ret;
762 } 746 }
763 747
764 - if ((ret = digest.parse(_c1s1 + 8 + 764)) != ERROR_SUCCESS) { 748 + if ((ret = stream.initialize(_c1s1 + 8 + 764, 764)) != ERROR_SUCCESS) {
  749 + return ret;
  750 + }
  751 +
  752 + if ((ret = digest.parse(&stream)) != ERROR_SUCCESS) {
765 srs_error("parse the c1 digest failed. ret=%d", ret); 753 srs_error("parse the c1 digest failed. ret=%d", ret);
766 return ret; 754 return ret;
767 } 755 }
@@ -771,19 +759,20 @@ namespace _srs_internal @@ -771,19 +759,20 @@ namespace _srs_internal
771 return ret; 759 return ret;
772 } 760 }
773 761
774 - void c1s1_strategy_schema0::copy_to(c1s1* owner, char* bytes, bool with_digest) 762 + int c1s1_strategy_schema0::copy_to(c1s1* owner, char* bytes, int size, bool with_digest)
775 { 763 {
776 - char* pp = bytes;  
777 -  
778 - copy_time_version(pp, owner);  
779 - copy_key(pp);  
780 - digest_key(pp, with_digest); 764 + SrsStream stream;
  765 + int ret = ERROR_SUCCESS;
781 766
782 - if (with_digest) {  
783 - srs_assert(pp - bytes == 1536);  
784 - } else {  
785 - srs_assert(pp - bytes == 1536 - 32); 767 + if ((ret = stream.initialize(bytes, size)) != ERROR_SUCCESS) {
  768 + return ret;
786 } 769 }
  770 +
  771 + copy_time_version(&stream, owner);
  772 + copy_key(&stream);
  773 + copy_digest(&stream, with_digest);
  774 +
  775 + srs_assert(stream.empty());
787 } 776 }
788 777
789 c1s1_strategy_schema1::c1s1_strategy_schema1() 778 c1s1_strategy_schema1::c1s1_strategy_schema1()
@@ -799,16 +788,28 @@ namespace _srs_internal @@ -799,16 +788,28 @@ namespace _srs_internal
799 return srs_schema1; 788 return srs_schema1;
800 } 789 }
801 790
802 - int c1s1_strategy_schema1::parse(char* _c1s1) 791 + int c1s1_strategy_schema1::parse(char* _c1s1, int size)
803 { 792 {
804 int ret = ERROR_SUCCESS; 793 int ret = ERROR_SUCCESS;
805 794
806 - if ((ret = digest.parse(_c1s1 + 8)) != ERROR_SUCCESS) { 795 + srs_assert(size == 1536);
  796 +
  797 + SrsStream stream;
  798 +
  799 + if ((ret = stream.initialize(_c1s1 + 8, 764)) != ERROR_SUCCESS) {
  800 + return ret;
  801 + }
  802 +
  803 + if ((ret = digest.parse(&stream)) != ERROR_SUCCESS) {
807 srs_error("parse the c1 digest failed. ret=%d", ret); 804 srs_error("parse the c1 digest failed. ret=%d", ret);
808 return ret; 805 return ret;
809 } 806 }
810 807
811 - if ((ret = key.parse(_c1s1 + 8 + 764)) != ERROR_SUCCESS) { 808 + if ((ret = stream.initialize(_c1s1 + 8 + 764, 764)) != ERROR_SUCCESS) {
  809 + return ret;
  810 + }
  811 +
  812 + if ((ret = key.parse(&stream)) != ERROR_SUCCESS) {
812 srs_error("parse the c1 key failed. ret=%d", ret); 813 srs_error("parse the c1 key failed. ret=%d", ret);
813 return ret; 814 return ret;
814 } 815 }
@@ -818,19 +819,20 @@ namespace _srs_internal @@ -818,19 +819,20 @@ namespace _srs_internal
818 return ret; 819 return ret;
819 } 820 }
820 821
821 - void c1s1_strategy_schema1::copy_to(c1s1* owner, char* bytes, bool with_digest) 822 + int c1s1_strategy_schema1::copy_to(c1s1* owner, char* bytes, int size, bool with_digest)
822 { 823 {
823 - char* pp = bytes;  
824 -  
825 - copy_time_version(pp, owner);  
826 - digest_key(pp, with_digest);  
827 - copy_key(pp); 824 + SrsStream stream;
  825 + int ret = ERROR_SUCCESS;
828 826
829 - if (with_digest) {  
830 - srs_assert(pp - bytes == 1536);  
831 - } else {  
832 - srs_assert(pp - bytes == 1536 - 32); 827 + if ((ret = stream.initialize(bytes, size)) != ERROR_SUCCESS) {
  828 + return ret;
833 } 829 }
  830 +
  831 + copy_time_version(&stream, owner);
  832 + copy_digest(&stream, with_digest);
  833 + copy_key(&stream);
  834 +
  835 + srs_assert(stream.empty());
834 } 836 }
835 837
836 // TODO: FIXME: move to the right position. 838 // TODO: FIXME: move to the right position.
@@ -870,24 +872,32 @@ namespace _srs_internal @@ -870,24 +872,32 @@ namespace _srs_internal
870 return payload->get_digest(); 872 return payload->get_digest();
871 } 873 }
872 874
873 - void c1s1::dump(char* _c1s1) 875 + int c1s1::dump(char* _c1s1, int size)
874 { 876 {
875 srs_assert(payload != NULL); 877 srs_assert(payload != NULL);
876 - return payload->dump(this, _c1s1); 878 + return payload->dump(this, _c1s1, size);
877 } 879 }
878 880
879 - int c1s1::parse(char* _c1s1, srs_schema_type schema) 881 + int c1s1::parse(char* _c1s1, int size, srs_schema_type schema)
880 { 882 {
881 int ret = ERROR_SUCCESS; 883 int ret = ERROR_SUCCESS;
882 884
  885 + srs_assert(size == 1536);
  886 +
883 if (schema != srs_schema0 && schema != srs_schema1) { 887 if (schema != srs_schema0 && schema != srs_schema1) {
884 ret = ERROR_RTMP_CH_SCHEMA; 888 ret = ERROR_RTMP_CH_SCHEMA;
885 srs_error("parse c1 failed. invalid schema=%d, ret=%d", schema, ret); 889 srs_error("parse c1 failed. invalid schema=%d, ret=%d", schema, ret);
886 return ret; 890 return ret;
887 } 891 }
888 892
889 - time = __srs_stream_read_4bytes(_c1s1);  
890 - version = __srs_stream_read_4bytes(_c1s1 + 4); // client c1 version 893 + SrsStream stream;
  894 +
  895 + if ((ret = stream.initialize(_c1s1, size)) != ERROR_SUCCESS) {
  896 + return ret;
  897 + }
  898 +
  899 + time = stream.read_4bytes();
  900 + version = stream.read_4bytes(); // client c1 version
891 901
892 srs_freep(payload); 902 srs_freep(payload);
893 if (schema == srs_schema0) { 903 if (schema == srs_schema0) {
@@ -896,7 +906,7 @@ namespace _srs_internal @@ -896,7 +906,7 @@ namespace _srs_internal
896 payload = new c1s1_strategy_schema1(); 906 payload = new c1s1_strategy_schema1();
897 } 907 }
898 908
899 - return payload->parse(_c1s1); 909 + return payload->parse(_c1s1, size);
900 } 910 }
901 911
902 int c1s1::c1_create(srs_schema_type schema) 912 int c1s1::c1_create(srs_schema_type schema)
@@ -976,16 +986,24 @@ namespace _srs_internal @@ -976,16 +986,24 @@ namespace _srs_internal
976 { 986 {
977 } 987 }
978 988
979 - void c2s2::dump(char* _c2s2) 989 + int c2s2::dump(char* _c2s2, int size)
980 { 990 {
  991 + srs_assert(size == 1536);
  992 +
981 memcpy(_c2s2, random, 1504); 993 memcpy(_c2s2, random, 1504);
982 memcpy(_c2s2 + 1504, digest, 32); 994 memcpy(_c2s2 + 1504, digest, 32);
  995 +
  996 + return ERROR_SUCCESS;
983 } 997 }
984 998
985 - void c2s2::parse(char* _c2s2) 999 + int c2s2::parse(char* _c2s2, int size)
986 { 1000 {
  1001 + srs_assert(size == 1536);
  1002 +
987 memcpy(random, _c2s2, 1504); 1003 memcpy(random, _c2s2, 1504);
988 memcpy(digest, _c2s2 + 1504, 32); 1004 memcpy(digest, _c2s2 + 1504, 32);
  1005 +
  1006 + return ERROR_SUCCESS;
989 } 1007 }
990 1008
991 int c2s2::c2_create(c1s1* s1) 1009 int c2s2::c2_create(c1s1* s1)
@@ -1201,7 +1219,7 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs @@ -1201,7 +1219,7 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs
1201 c1s1 c1; 1219 c1s1 c1;
1202 // try schema0. 1220 // try schema0.
1203 // @remark, use schema0 to make flash player happy. 1221 // @remark, use schema0 to make flash player happy.
1204 - if ((ret = c1.parse(hs_bytes->c0c1 + 1, srs_schema0)) != ERROR_SUCCESS) { 1222 + if ((ret = c1.parse(hs_bytes->c0c1 + 1, 1536, srs_schema0)) != ERROR_SUCCESS) {
1205 srs_error("parse c1 schema%d error. ret=%d", srs_schema0, ret); 1223 srs_error("parse c1 schema%d error. ret=%d", srs_schema0, ret);
1206 return ret; 1224 return ret;
1207 } 1225 }
@@ -1209,7 +1227,7 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs @@ -1209,7 +1227,7 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs
1209 bool is_valid = false; 1227 bool is_valid = false;
1210 if ((ret = c1.c1_validate_digest(is_valid)) != ERROR_SUCCESS || !is_valid) { 1228 if ((ret = c1.c1_validate_digest(is_valid)) != ERROR_SUCCESS || !is_valid) {
1211 srs_info("schema0 failed, try schema1."); 1229 srs_info("schema0 failed, try schema1.");
1212 - if ((ret = c1.parse(hs_bytes->c0c1 + 1, srs_schema1)) != ERROR_SUCCESS) { 1230 + if ((ret = c1.parse(hs_bytes->c0c1 + 1, 1536, srs_schema1)) != ERROR_SUCCESS) {
1213 srs_error("parse c1 schema%d error. ret=%d", srs_schema1, ret); 1231 srs_error("parse c1 schema%d error. ret=%d", srs_schema1, ret);
1214 return ret; 1232 return ret;
1215 } 1233 }
@@ -1257,8 +1275,12 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs @@ -1257,8 +1275,12 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs
1257 if ((ret = hs_bytes->create_s0s1s2()) != ERROR_SUCCESS) { 1275 if ((ret = hs_bytes->create_s0s1s2()) != ERROR_SUCCESS) {
1258 return ret; 1276 return ret;
1259 } 1277 }
1260 - s1.dump(hs_bytes->s0s1s2 + 1);  
1261 - s2.dump(hs_bytes->s0s1s2 + 1537); 1278 + if ((ret = s1.dump(hs_bytes->s0s1s2 + 1, 1536)) != ERROR_SUCCESS) {
  1279 + return ret;
  1280 + }
  1281 + if ((ret = s2.dump(hs_bytes->s0s1s2 + 1537, 1536)) != ERROR_SUCCESS) {
  1282 + return ret;
  1283 + }
1262 if ((ret = io->write(hs_bytes->s0s1s2, 3073, &nsize)) != ERROR_SUCCESS) { 1284 if ((ret = io->write(hs_bytes->s0s1s2, 3073, &nsize)) != ERROR_SUCCESS) {
1263 srs_warn("complex handshake send s0s1s2 failed. ret=%d", ret); 1285 srs_warn("complex handshake send s0s1s2 failed. ret=%d", ret);
1264 return ret; 1286 return ret;
@@ -1270,7 +1292,9 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs @@ -1270,7 +1292,9 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs
1270 return ret; 1292 return ret;
1271 } 1293 }
1272 c2s2 c2; 1294 c2s2 c2;
1273 - c2.parse(hs_bytes->c2); 1295 + if ((ret = c2.parse(hs_bytes->c2, 1536)) != ERROR_SUCCESS) {
  1296 + return ret;
  1297 + }
1274 srs_verbose("complex handshake read c2 success."); 1298 srs_verbose("complex handshake read c2 success.");
1275 1299
1276 // verify c2 1300 // verify c2
@@ -1306,7 +1330,9 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs @@ -1306,7 +1330,9 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs
1306 if ((ret = c1.c1_create(srs_schema1)) != ERROR_SUCCESS) { 1330 if ((ret = c1.c1_create(srs_schema1)) != ERROR_SUCCESS) {
1307 return ret; 1331 return ret;
1308 } 1332 }
1309 - c1.dump(hs_bytes->c0c1 + 1); 1333 + if ((ret = c1.dump(hs_bytes->c0c1 + 1, 1536)) != ERROR_SUCCESS) {
  1334 + return ret;
  1335 + }
1310 1336
1311 // verify c1 1337 // verify c1
1312 bool is_valid; 1338 bool is_valid;
@@ -1335,7 +1361,7 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs @@ -1335,7 +1361,7 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs
1335 1361
1336 // verify s1s2 1362 // verify s1s2
1337 c1s1 s1; 1363 c1s1 s1;
1338 - if ((ret = s1.parse(hs_bytes->s0s1s2 + 1, c1.schema())) != ERROR_SUCCESS) { 1364 + if ((ret = s1.parse(hs_bytes->s0s1s2 + 1, 1536, c1.schema())) != ERROR_SUCCESS) {
1339 return ret; 1365 return ret;
1340 } 1366 }
1341 1367
@@ -1353,7 +1379,9 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs @@ -1353,7 +1379,9 @@ int SrsComplexHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrs
1353 return ret; 1379 return ret;
1354 } 1380 }
1355 1381
1356 - c2.dump(hs_bytes->c2); 1382 + if ((ret = c2.dump(hs_bytes->c2, 1536)) != ERROR_SUCCESS) {
  1383 + return ret;
  1384 + }
1357 if ((ret = io->write(hs_bytes->c2, 1536, &nsize)) != ERROR_SUCCESS) { 1385 if ((ret = io->write(hs_bytes->c2, 1536, &nsize)) != ERROR_SUCCESS) {
1358 srs_warn("complex handshake write c2 failed. ret=%d", ret); 1386 srs_warn("complex handshake write c2 failed. ret=%d", ret);
1359 return ret; 1387 return ret;
@@ -33,6 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -33,6 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 class ISrsProtocolReaderWriter; 33 class ISrsProtocolReaderWriter;
34 class SrsComplexHandshake; 34 class SrsComplexHandshake;
35 class SrsHandshakeBytes; 35 class SrsHandshakeBytes;
  36 +class SrsStream;
36 37
37 #ifdef SRS_AUTO_SSL 38 #ifdef SRS_AUTO_SSL
38 39
@@ -142,8 +143,8 @@ namespace _srs_internal @@ -142,8 +143,8 @@ namespace _srs_internal
142 143
143 // parse key block from c1s1. 144 // parse key block from c1s1.
144 // if created, user must free it by srs_key_block_free 145 // if created, user must free it by srs_key_block_free
145 - // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764  
146 - int parse(char* c1s1_key_bytes); 146 + // @stream contains c1s1_key_bytes the key start bytes
  147 + int parse(SrsStream* stream);
147 148
148 // free the block data create by 149 // free the block data create by
149 // srs_key_block_init or srs_key_block_parse 150 // srs_key_block_init or srs_key_block_parse
@@ -185,8 +186,8 @@ namespace _srs_internal @@ -185,8 +186,8 @@ namespace _srs_internal
185 186
186 // parse digest block from c1s1. 187 // parse digest block from c1s1.
187 // if created, user must free it by srs_digest_block_free 188 // if created, user must free it by srs_digest_block_free
188 - // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764  
189 - int parse(char* c1s1_digest_bytes); 189 + // @stream contains c1s1_digest_bytes the digest start bytes
  190 + int parse(SrsStream* stream);
190 191
191 // free the block data create by 192 // free the block data create by
192 // srs_digest_block_init or srs_digest_block_parse 193 // srs_digest_block_init or srs_digest_block_parse
@@ -220,12 +221,12 @@ namespace _srs_internal @@ -220,12 +221,12 @@ namespace _srs_internal
220 /** 221 /**
221 * copy to bytes. 222 * copy to bytes.
222 */ 223 */
223 - virtual void dump(c1s1* owner, char* _c1s1); 224 + virtual int dump(c1s1* owner, char* _c1s1, int size);
224 /** 225 /**
225 * server: parse the c1s1, discovery the key and digest by schema. 226 * server: parse the c1s1, discovery the key and digest by schema.
226 * use the c1_validate_digest() to valid the digest of c1. 227 * use the c1_validate_digest() to valid the digest of c1.
227 */ 228 */
228 - virtual int parse(char* _c1s1) = 0; 229 + virtual int parse(char* _c1s1, int size) = 0;
229 public: 230 public:
230 /** 231 /**
231 * client: create and sign c1 by schema. 232 * client: create and sign c1 by schema.
@@ -261,10 +262,10 @@ namespace _srs_internal @@ -261,10 +262,10 @@ namespace _srs_internal
261 /** 262 /**
262 * copy whole c1s1 to bytes. 263 * copy whole c1s1 to bytes.
263 */ 264 */
264 - virtual void copy_to(c1s1* owner, char* bytes, bool with_digest) = 0;  
265 - virtual void copy_time_version(char*& pp, c1s1* owner);  
266 - virtual void copy_key(char*& pp);  
267 - virtual void digest_key(char*& pp, bool with_digest); 265 + virtual int copy_to(c1s1* owner, char* bytes, int size, bool with_digest) = 0;
  266 + virtual void copy_time_version(SrsStream* stream, c1s1* owner);
  267 + virtual void copy_key(SrsStream* stream);
  268 + virtual void copy_digest(SrsStream* stream, bool with_digest);
268 }; 269 };
269 270
270 /** 271 /**
@@ -279,12 +280,9 @@ namespace _srs_internal @@ -279,12 +280,9 @@ namespace _srs_internal
279 virtual ~c1s1_strategy_schema0(); 280 virtual ~c1s1_strategy_schema0();
280 public: 281 public:
281 virtual srs_schema_type schema(); 282 virtual srs_schema_type schema();
282 - virtual int parse(char* _c1s1); 283 + virtual int parse(char* _c1s1, int size);
283 private: 284 private:
284 - /**  
285 - * copy whole c1s1 to bytes.  
286 - */  
287 - virtual void copy_to(c1s1* owner, char* bytes, bool with_digest); 285 + virtual int copy_to(c1s1* owner, char* bytes, int size, bool with_digest);
288 }; 286 };
289 287
290 /** 288 /**
@@ -299,12 +297,9 @@ namespace _srs_internal @@ -299,12 +297,9 @@ namespace _srs_internal
299 virtual ~c1s1_strategy_schema1(); 297 virtual ~c1s1_strategy_schema1();
300 public: 298 public:
301 virtual srs_schema_type schema(); 299 virtual srs_schema_type schema();
302 - virtual int parse(char* _c1s1); 300 + virtual int parse(char* _c1s1, int size);
303 private: 301 private:
304 - /**  
305 - * copy whole c1s1 to bytes.  
306 - */  
307 - virtual void copy_to(c1s1* owner, char* bytes, bool with_digest); 302 + virtual int copy_to(c1s1* owner, char* bytes, int size, bool with_digest);
308 }; 303 };
309 304
310 /** 305 /**
@@ -345,13 +340,13 @@ namespace _srs_internal @@ -345,13 +340,13 @@ namespace _srs_internal
345 /** 340 /**
346 * copy to bytes. 341 * copy to bytes.
347 */ 342 */
348 - virtual void dump(char* _c1s1); 343 + virtual int dump(char* _c1s1, int size);
349 /** 344 /**
350 * server: parse the c1s1, discovery the key and digest by schema. 345 * server: parse the c1s1, discovery the key and digest by schema.
351 * use the c1_validate_digest() to valid the digest of c1. 346 * use the c1_validate_digest() to valid the digest of c1.
352 * use the s1_validate_digest() to valid the digest of s1. 347 * use the s1_validate_digest() to valid the digest of s1.
353 */ 348 */
354 - virtual int parse(char* _c1s1, srs_schema_type _schema); 349 + virtual int parse(char* _c1s1, int size, srs_schema_type _schema);
355 public: 350 public:
356 /** 351 /**
357 * client: create and sign c1 by schema. 352 * client: create and sign c1 by schema.
@@ -425,11 +420,11 @@ namespace _srs_internal @@ -425,11 +420,11 @@ namespace _srs_internal
425 /** 420 /**
426 * copy to bytes. 421 * copy to bytes.
427 */ 422 */
428 - virtual void dump(char* _c2s2); 423 + virtual int dump(char* _c2s2, int size);
429 /** 424 /**
430 * parse the c2s2 425 * parse the c2s2
431 */ 426 */
432 - virtual void parse(char* _c2s2); 427 + virtual int parse(char* _c2s2, int size);
433 public: 428 public:
434 /** 429 /**
435 * create c2. 430 * create c2.