fix #235, refine handshake, replace union with template method. 2.0.38.
正在显示
4 个修改的文件
包含
31 行增加
和
23 行删除
| @@ -485,7 +485,8 @@ Supported operating systems and hardware: | @@ -485,7 +485,8 @@ Supported operating systems and hardware: | ||
| 485 | * 2013-10-17, Created.<br/> | 485 | * 2013-10-17, Created.<br/> |
| 486 | 486 | ||
| 487 | ## History | 487 | ## History |
| 488 | -* v2.0, 2014-11-28, fix [#215](https://github.com/winlinvip/simple-rtmp-server/issues/215), for bug #215, add srs_rtmp_dump tool. 2.0.37. | 488 | +* v2.0, 2014-11-29, fix [#235](https://github.com/winlinvip/simple-rtmp-server/issues/235), refine handshake, replace union with template method. 2.0.38. |
| 489 | +* v2.0, 2014-11-28, fix [#215](https://github.com/winlinvip/simple-rtmp-server/issues/215), add srs_rtmp_dump tool. 2.0.37. | ||
| 489 | * v2.0, 2014-11-25, update PRIMARY, AUTHORS, CONTRIBUTORS rule. 2.0.32. | 490 | * v2.0, 2014-11-25, update PRIMARY, AUTHORS, CONTRIBUTORS rule. 2.0.32. |
| 490 | * v2.0, 2014-11-24, fix [#212](https://github.com/winlinvip/simple-rtmp-server/issues/212), support publish aac adts raw stream. 2.0.31. | 491 | * v2.0, 2014-11-24, fix [#212](https://github.com/winlinvip/simple-rtmp-server/issues/212), support publish aac adts raw stream. 2.0.31. |
| 491 | * v2.0, 2014-11-22, fix [#217](https://github.com/winlinvip/simple-rtmp-server/issues/217), remove timeout recv, support 7.5k+ 250kbps clients. 2.0.30. | 492 | * v2.0, 2014-11-22, fix [#217](https://github.com/winlinvip/simple-rtmp-server/issues/217), remove timeout recv, support 7.5k+ 250kbps clients. 2.0.30. |
| @@ -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 2 | 32 | #define VERSION_MAJOR 2 |
| 33 | #define VERSION_MINOR 0 | 33 | #define VERSION_MINOR 0 |
| 34 | -#define VERSION_REVISION 37 | 34 | +#define VERSION_REVISION 38 |
| 35 | // server info. | 35 | // server info. |
| 36 | #define RTMP_SIG_SRS_KEY "SRS" | 36 | #define RTMP_SIG_SRS_KEY "SRS" |
| 37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" | 37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" |
| @@ -514,7 +514,7 @@ namespace _srs_internal | @@ -514,7 +514,7 @@ namespace _srs_internal | ||
| 514 | return ret; | 514 | return ret; |
| 515 | } | 515 | } |
| 516 | 516 | ||
| 517 | - int c1s1_strategy::s1_create(c1s1* owner) | 517 | + int c1s1_strategy::s1_create(c1s1* owner, c1s1* c1) |
| 518 | { | 518 | { |
| 519 | int ret = ERROR_SUCCESS; | 519 | int ret = ERROR_SUCCESS; |
| 520 | 520 | ||
| @@ -528,8 +528,7 @@ namespace _srs_internal | @@ -528,8 +528,7 @@ namespace _srs_internal | ||
| 528 | // directly generate the public key. | 528 | // directly generate the public key. |
| 529 | // @see: https://github.com/winlinvip/simple-rtmp-server/issues/148 | 529 | // @see: https://github.com/winlinvip/simple-rtmp-server/issues/148 |
| 530 | int pkey_size = 128; | 530 | int pkey_size = 128; |
| 531 | - // TODO: FIXME: use c1 public key to calc the shared key. | ||
| 532 | - if ((ret = dh.copy_public_key(key.key, pkey_size)) != ERROR_SUCCESS) { | 531 | + if ((ret = dh.copy_shared_key(c1->get_key(), 128, key.key, pkey_size)) != ERROR_SUCCESS) { |
| 533 | srs_error("calc s1 key failed. ret=%d", ret); | 532 | srs_error("calc s1 key failed. ret=%d", ret); |
| 534 | return ret; | 533 | return ret; |
| 535 | } | 534 | } |
| @@ -827,7 +826,6 @@ namespace _srs_internal | @@ -827,7 +826,6 @@ namespace _srs_internal | ||
| 827 | return ret; | 826 | return ret; |
| 828 | } | 827 | } |
| 829 | 828 | ||
| 830 | - // TODO: FIXME: move to the right position. | ||
| 831 | c1s1::c1s1() | 829 | c1s1::c1s1() |
| 832 | { | 830 | { |
| 833 | payload = NULL; | 831 | payload = NULL; |
| @@ -835,21 +833,6 @@ namespace _srs_internal | @@ -835,21 +833,6 @@ namespace _srs_internal | ||
| 835 | c1s1::~c1s1() | 833 | c1s1::~c1s1() |
| 836 | { | 834 | { |
| 837 | srs_freep(payload); | 835 | srs_freep(payload); |
| 838 | - /* | ||
| 839 | - void c1s1::destroy_blocks() | ||
| 840 | - { | ||
| 841 | - if (schema == srs_schema_invalid) { | ||
| 842 | - return; | ||
| 843 | - } | ||
| 844 | - | ||
| 845 | - if (schema == srs_schema0) { | ||
| 846 | - block0.key.free(); | ||
| 847 | - block1.digest.free(); | ||
| 848 | - } else { | ||
| 849 | - block0.digest.free(); | ||
| 850 | - block1.key.free(); | ||
| 851 | - } | ||
| 852 | - }*/ | ||
| 853 | } | 836 | } |
| 854 | 837 | ||
| 855 | srs_schema_type c1s1::schema() | 838 | srs_schema_type c1s1::schema() |
| @@ -960,7 +943,7 @@ namespace _srs_internal | @@ -960,7 +943,7 @@ namespace _srs_internal | ||
| 960 | payload = new c1s1_strategy_schema1(); | 943 | payload = new c1s1_strategy_schema1(); |
| 961 | } | 944 | } |
| 962 | 945 | ||
| 963 | - return payload->s1_create(this); | 946 | + return payload->s1_create(this, c1); |
| 964 | } | 947 | } |
| 965 | 948 | ||
| 966 | int c1s1::s1_validate_digest(bool& is_valid) | 949 | int c1s1::s1_validate_digest(bool& is_valid) |
| @@ -245,8 +245,32 @@ namespace _srs_internal | @@ -245,8 +245,32 @@ namespace _srs_internal | ||
| 245 | virtual int c1_validate_digest(c1s1* owner, bool& is_valid); | 245 | virtual int c1_validate_digest(c1s1* owner, bool& is_valid); |
| 246 | /** | 246 | /** |
| 247 | * server: create and sign the s1 from c1. | 247 | * server: create and sign the s1 from c1. |
| 248 | + * // decode c1 try schema0 then schema1 | ||
| 249 | + * c1-digest-data = get-c1-digest-data(schema0) | ||
| 250 | + * if c1-digest-data equals to calc_c1_digest(c1, schema0) { | ||
| 251 | + * c1-key-data = get-c1-key-data(schema0) | ||
| 252 | + * schema = schema0 | ||
| 253 | + * } else { | ||
| 254 | + * c1-digest-data = get-c1-digest-data(schema1) | ||
| 255 | + * if c1-digest-data not equals to calc_c1_digest(c1, schema1) { | ||
| 256 | + * switch to simple handshake. | ||
| 257 | + * return | ||
| 258 | + * } | ||
| 259 | + * c1-key-data = get-c1-key-data(schema1) | ||
| 260 | + * schema = schema1 | ||
| 261 | + * } | ||
| 262 | + * | ||
| 263 | + * // generate s1 | ||
| 264 | + * random fill 1536bytes s1 | ||
| 265 | + * time = time() // c1[0-3] | ||
| 266 | + * version = [0x04, 0x05, 0x00, 0x01] // s1[4-7] | ||
| 267 | + * s1-key-data=shared_key=DH_compute_key(peer_pub_key=c1-key-data) | ||
| 268 | + * get c1s1-joined by specified schema | ||
| 269 | + * s1-digest-data = HMACsha256(c1s1-joined, FMSKey, 36) | ||
| 270 | + * copy s1-digest-data and s1-key-data to s1. | ||
| 271 | + * @param c1, to get the peer_pub_key of client. | ||
| 248 | */ | 272 | */ |
| 249 | - virtual int s1_create(c1s1* owner); | 273 | + virtual int s1_create(c1s1* owner, c1s1* c1); |
| 250 | /** | 274 | /** |
| 251 | * server: validate the parsed s1 schema | 275 | * server: validate the parsed s1 schema |
| 252 | */ | 276 | */ |
-
请 注册 或 登录 后发表评论