// create new digest block data. // if created, user must free it by srs_digest_block_free void srs_digest_block_init(digest_block* digest) { digest->offset = (int32_t)rand(); digest->random0 = NULL; digest->random1 = NULL; int offset = srs_digest_block_get_offset(digest); srs_assert(offset >= 0); digest->random0_size = offset; if (digest->random0_size > 0) { digest->random0 = new char[digest->random0_size]; srs_random_generate(digest->random0, digest->random0_size); snprintf(digest->random0, digest->random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); } srs_random_generate(digest->digest, sizeof(digest->digest)); digest->random1_size = 764 - 4 - offset - 32; if (digest->random1_size > 0) { digest->random1 = new char[digest->random1_size]; srs_random_generate(digest->random1, digest->random1_size); snprintf(digest->random1, digest->random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); } }
// create new key block data. // if created, user must free it by srs_key_block_free void srs_key_block_init(key_block* key) { key->offset = (int32_t)rand(); key->random0 = NULL; key->random1 = NULL; int offset = srs_key_block_get_offset(key); srs_assert(offset >= 0); key->random0_size = offset; if (key->random0_size > 0) { key->random0 = new char[key->random0_size]; srs_random_generate(key->random0, key->random0_size); snprintf(key->random0, key->random0_size, "%s", RTMP_SIG_SRS_HANDSHAKE); } srs_random_generate(key->key, sizeof(key->key)); key->random1_size = 764 - offset - 128 - 4; if (key->random1_size > 0) { key->random1 = new char[key->random1_size]; srs_random_generate(key->random1, key->random1_size); snprintf(key->random1, key->random1_size, "%s", RTMP_SIG_SRS_HANDSHAKE); } }
c2s2::c2s2() { srs_random_generate(random, 1504); int size = snprintf(random, 1504, "%s", RTMP_SIG_SRS_HANDSHAKE); srs_assert(++size < 1504); snprintf(random + 1504 - size, size, "%s", RTMP_SIG_SRS_HANDSHAKE); srs_random_generate(digest, 32); }
int MRtmpHandshake::use_simple_response(MTcpSocket & skt,char* c0c1) { int ret = ERROR_SUCCESS; char* s0s1s2 = new char[3073]; srs_random_generate(s0s1s2, 3073); mAutoFreeArray(char, s0s1s2); // plain text required. s0s1s2[0] = 0x03; int32_t t = time(NULL); memcpy(&s0s1s2[1],&t,4); memset(&s0s1s2[5],0,4); //set s2 memcpy(&s0s1s2[1537],&c0c1[1],1536); if ((ret = skt.write(s0s1s2, 3073)) < 0) { log_warn("simple handshake send s0s1s2 failed. ret=%d", ret); return ret; } log_verbose("simple handshake send s0s1s2 success."); char* c2 = new char[1536]; mAutoFreeArray(char, c2); if ((ret = skt.readFully(c2, 1536)) <= 0) { log_warn("simple handshake read c2 failed. ret=%d", ret); return ret; } return 0; }
int MRtmpHandshake::handshake_with_server_use_simple(MTcpSocket & skt) { int ret = ERROR_SUCCESS; // simple handshake char* c0c1 = new char[1537]; mAutoFreeArray(char, c0c1); srs_random_generate(c0c1, 1537); // plain text required. c0c1[0] = 0x03; int32_t t = time(NULL); memcpy(&c0c1[1],&t,4); memset(&c0c1[5],0,4); if ((ret = skt.write(c0c1, 1537)) < 0) { log_warn("write c0c1 failed. ret=%d", ret); return ret; } log_verbose("write c0c1 success."); char* s0s1 = new char[1537]; mAutoFreeArray(char, s0s1); if ((ret = skt.readFully(s0s1, 1537)) <= 0) { log_warn("simple handshake recv s0s1 failed. ret=%d", ret); return ret; } log_verbose("simple handshake recv s0s1 success."); // plain text required. if (s0s1[0] != 0x03) { ret = ERROR_RTMP_HANDSHAKE; log_warn("handshake failed, plain text required. ret=%d", ret); return ret; } char *c2 = &s0s1[1]; if ((ret = skt.write(c2, 1536)) != ERROR_SUCCESS) { log_warn("simple handshake write c2 failed. ret=%d", ret); return ret; } log_verbose("simple handshake write c2 success."); char* s2 = new char[1536]; mAutoFreeArray(char, s2); if ((ret = skt.readFully(s2, 1536)) <= 0) { log_warn("simple handshake recv s2 failed. ret=%d", ret); return ret; } log_verbose("simple handshake recv s2 success."); log_trace("simple handshake success."); return ret; }
// create new key block data. // if created, user must free it by srs_key_block_free void srs_key_block_init(key_block *key) { key->offset = (int32_t)rand(); key->random0 = NULL; key->random1 = NULL; int offset = srs_key_block_get_offset(key); mAssert(offset >= 0); key->random0_size = offset; if (key->random0_size > 0) { key->random0 = new char[key->random0_size]; srs_random_generate(key->random0, key->random0_size); } srs_random_generate(key->key, sizeof(key->key)); key->random1_size = 764 - offset - 128 - 4; if (key->random1_size > 0) { key->random1 = new char[key->random1_size]; srs_random_generate(key->random1, key->random1_size); } }
c2s2::c2s2() { srs_random_generate(random, 1504); srs_random_generate(digest, 32); }