// 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);
 }
예제 #4
0
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;
}
예제 #5
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;
}
예제 #6
0
// 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);
 }