// parse digest block from c1s1. // if created, user must free it by srs_digest_block_free // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764 int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) { int ret = ERROR_SUCCESS; char* pp = c1s1_digest_bytes; digest->offset = __srs_stream_read_4bytes(pp); pp += sizeof(int32_t); 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]; memcpy(digest->random0, pp, digest->random0_size); } pp += digest->random0_size; memcpy(digest->digest, pp, sizeof(digest->digest)); pp += sizeof(digest->digest); digest->random1_size = 764 - 4 - offset - 32; if (digest->random1_size > 0) { digest->random1 = new char[digest->random1_size]; memcpy(digest->random1, pp, digest->random1_size); } return ret; }
// 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); } }