Merge branch 'master' of github.com:winlinvip/simple-rtmp-server
正在显示
11 个修改的文件
包含
462 行增加
和
312 行删除
| @@ -167,6 +167,8 @@ See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-serv | @@ -167,6 +167,8 @@ See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-serv | ||
| 167 | * nginx v1.5.0: 139524 lines <br/> | 167 | * nginx v1.5.0: 139524 lines <br/> |
| 168 | 168 | ||
| 169 | ### History | 169 | ### History |
| 170 | +* v1.0, 2014-03-19, add vn/an for FFMPEG to drop video/audio for radio stream. | ||
| 171 | +* v1.0, 2014-03-19, refine handshake, client support coplex handshake, add utest. | ||
| 170 | * v1.0, 2014-03-16, support ARM([debian armhf, v7cpu](https://github.com/winlinvip/simple-rtmp-server/wiki/SrsLinuxArm)) with rtmp/ssl/hls/librtmp. | 172 | * v1.0, 2014-03-16, support ARM([debian armhf, v7cpu](https://github.com/winlinvip/simple-rtmp-server/wiki/SrsLinuxArm)) with rtmp/ssl/hls/librtmp. |
| 171 | * v1.0, 2014-03-12, finish utest for amf0 codec. | 173 | * v1.0, 2014-03-12, finish utest for amf0 codec. |
| 172 | * v1.0, 2014-03-06, add gperftools for mem leak detect, mem/cpu profile. | 174 | * v1.0, 2014-03-06, add gperftools for mem leak detect, mem/cpu profile. |
trunk/conf/full.conf
100644 → 100755
| @@ -291,6 +291,25 @@ vhost audio.transcode.vhost.com { | @@ -291,6 +291,25 @@ vhost audio.transcode.vhost.com { | ||
| 291 | } | 291 | } |
| 292 | } | 292 | } |
| 293 | } | 293 | } |
| 294 | +# disable video, transcode/copy audio. | ||
| 295 | +# for example, publish pure audio stream. | ||
| 296 | +vhost vn.transcode.vhost.com { | ||
| 297 | + transcode { | ||
| 298 | + enabled on; | ||
| 299 | + ffmpeg ./objs/ffmpeg/bin/ffmpeg; | ||
| 300 | + engine vn { | ||
| 301 | + enabled on; | ||
| 302 | + vcodec vn; | ||
| 303 | + acodec libaacplus; | ||
| 304 | + abitrate 45; | ||
| 305 | + asample_rate 44100; | ||
| 306 | + achannels 2; | ||
| 307 | + aparams { | ||
| 308 | + } | ||
| 309 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 310 | + } | ||
| 311 | + } | ||
| 312 | +} | ||
| 294 | # ffmpeg-copy(forward implements by ffmpeg). | 313 | # ffmpeg-copy(forward implements by ffmpeg). |
| 295 | # copy the video and audio to a new stream. | 314 | # copy the video and audio to a new stream. |
| 296 | vhost copy.transcode.vhost.com { | 315 | vhost copy.transcode.vhost.com { |
| @@ -333,6 +352,7 @@ vhost all.transcode.vhost.com { | @@ -333,6 +352,7 @@ vhost all.transcode.vhost.com { | ||
| 333 | # video encoder name. can be: | 352 | # video encoder name. can be: |
| 334 | # libx264: use h.264(libx264) video encoder. | 353 | # libx264: use h.264(libx264) video encoder. |
| 335 | # copy: donot encoder the video stream, copy it. | 354 | # copy: donot encoder the video stream, copy it. |
| 355 | + # vn: disable video output. | ||
| 336 | vcodec libx264; | 356 | vcodec libx264; |
| 337 | # video bitrate, in kbps | 357 | # video bitrate, in kbps |
| 338 | vbitrate 1500; | 358 | vbitrate 1500; |
| @@ -364,6 +384,7 @@ vhost all.transcode.vhost.com { | @@ -364,6 +384,7 @@ vhost all.transcode.vhost.com { | ||
| 364 | # audio encoder name. can be: | 384 | # audio encoder name. can be: |
| 365 | # libaacplus: use aac(libaacplus) audio encoder. | 385 | # libaacplus: use aac(libaacplus) audio encoder. |
| 366 | # copy: donot encoder the audio stream, copy it. | 386 | # copy: donot encoder the audio stream, copy it. |
| 387 | + # an: disable audio output. | ||
| 367 | acodec libaacplus; | 388 | acodec libaacplus; |
| 368 | # audio bitrate, in kbps. [16, 72] for libaacplus. | 389 | # audio bitrate, in kbps. [16, 72] for libaacplus. |
| 369 | abitrate 70; | 390 | abitrate 70; |
trunk/conf/srs.conf
100644 → 100755
| @@ -42,6 +42,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -42,6 +42,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 42 | #ifdef SRS_FFMPEG | 42 | #ifdef SRS_FFMPEG |
| 43 | 43 | ||
| 44 | #define SRS_ENCODER_COPY "copy" | 44 | #define SRS_ENCODER_COPY "copy" |
| 45 | +#define SRS_ENCODER_NO_VIDEO "vn" | ||
| 46 | +#define SRS_ENCODER_NO_AUDIO "an" | ||
| 45 | #define SRS_ENCODER_VCODEC "libx264" | 47 | #define SRS_ENCODER_VCODEC "libx264" |
| 46 | #define SRS_ENCODER_ACODEC "libaacplus" | 48 | #define SRS_ENCODER_ACODEC "libaacplus" |
| 47 | 49 | ||
| @@ -138,7 +140,13 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | @@ -138,7 +140,13 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | ||
| 138 | } | 140 | } |
| 139 | _transcoded_url.push_back(output); | 141 | _transcoded_url.push_back(output); |
| 140 | 142 | ||
| 141 | - if (vcodec != SRS_ENCODER_COPY) { | 143 | + if (vcodec == SRS_ENCODER_NO_VIDEO && acodec == SRS_ENCODER_NO_AUDIO) { |
| 144 | + ret = ERROR_ENCODER_VCODEC; | ||
| 145 | + srs_warn("video and audio disabled. ret=%d", ret); | ||
| 146 | + return ret; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + if (vcodec != SRS_ENCODER_COPY && vcodec != SRS_ENCODER_NO_VIDEO) { | ||
| 142 | if (vcodec != SRS_ENCODER_VCODEC) { | 150 | if (vcodec != SRS_ENCODER_VCODEC) { |
| 143 | ret = ERROR_ENCODER_VCODEC; | 151 | ret = ERROR_ENCODER_VCODEC; |
| 144 | srs_error("invalid vcodec, must be %s, actual %s, ret=%d", | 152 | srs_error("invalid vcodec, must be %s, actual %s, ret=%d", |
| @@ -182,7 +190,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | @@ -182,7 +190,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | ||
| 182 | } | 190 | } |
| 183 | } | 191 | } |
| 184 | 192 | ||
| 185 | - if (acodec != SRS_ENCODER_COPY) { | 193 | + if (acodec != SRS_ENCODER_COPY && acodec != SRS_ENCODER_NO_AUDIO) { |
| 186 | if (acodec != SRS_ENCODER_ACODEC) { | 194 | if (acodec != SRS_ENCODER_ACODEC) { |
| 187 | ret = ERROR_ENCODER_ACODEC; | 195 | ret = ERROR_ENCODER_ACODEC; |
| 188 | srs_error("invalid acodec, must be %s, actual %s, ret=%d", | 196 | srs_error("invalid acodec, must be %s, actual %s, ret=%d", |
| @@ -254,11 +262,15 @@ int SrsFFMPEG::start() | @@ -254,11 +262,15 @@ int SrsFFMPEG::start() | ||
| 254 | } | 262 | } |
| 255 | 263 | ||
| 256 | // video specified. | 264 | // video specified. |
| 265 | + if (vcodec != SRS_ENCODER_NO_VIDEO) { | ||
| 257 | params.push_back("-vcodec"); | 266 | params.push_back("-vcodec"); |
| 258 | params.push_back(vcodec); | 267 | params.push_back(vcodec); |
| 268 | + } else { | ||
| 269 | + params.push_back("-vn"); | ||
| 270 | + } | ||
| 259 | 271 | ||
| 260 | // the codec params is disabled when copy | 272 | // the codec params is disabled when copy |
| 261 | - if (vcodec != SRS_ENCODER_COPY) { | 273 | + if (vcodec != SRS_ENCODER_COPY && vcodec != SRS_ENCODER_NO_VIDEO) { |
| 262 | params.push_back("-b:v"); | 274 | params.push_back("-b:v"); |
| 263 | snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000); | 275 | snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000); |
| 264 | params.push_back(tmp); | 276 | params.push_back(tmp); |
| @@ -299,11 +311,15 @@ int SrsFFMPEG::start() | @@ -299,11 +311,15 @@ int SrsFFMPEG::start() | ||
| 299 | } | 311 | } |
| 300 | 312 | ||
| 301 | // audio specified. | 313 | // audio specified. |
| 314 | + if (acodec != SRS_ENCODER_NO_AUDIO) { | ||
| 302 | params.push_back("-acodec"); | 315 | params.push_back("-acodec"); |
| 303 | params.push_back(acodec); | 316 | params.push_back(acodec); |
| 317 | + } else { | ||
| 318 | + params.push_back("-an"); | ||
| 319 | + } | ||
| 304 | 320 | ||
| 305 | // the codec params is disabled when copy | 321 | // the codec params is disabled when copy |
| 306 | - if (acodec != SRS_ENCODER_COPY) { | 322 | + if (acodec != SRS_ENCODER_COPY && acodec != SRS_ENCODER_NO_AUDIO) { |
| 307 | params.push_back("-b:a"); | 323 | params.push_back("-b:a"); |
| 308 | snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000); | 324 | snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000); |
| 309 | params.push_back(tmp); | 325 | params.push_back(tmp); |
| @@ -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 "0" | 32 | #define VERSION_MAJOR "0" |
| 33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
| 34 | -#define VERSION_REVISION "21" | 34 | +#define VERSION_REVISION "22" |
| 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
| 36 | // server info. | 36 | // server info. |
| 37 | #define RTMP_SIG_SRS_KEY "srs" | 37 | #define RTMP_SIG_SRS_KEY "srs" |
| @@ -32,12 +32,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -32,12 +32,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 32 | #include <srs_protocol_utility.hpp> | 32 | #include <srs_protocol_utility.hpp> |
| 33 | #include <srs_protocol_rtmp.hpp> | 33 | #include <srs_protocol_rtmp.hpp> |
| 34 | 34 | ||
| 35 | +#ifdef SRS_SSL | ||
| 36 | + | ||
| 35 | using namespace srs; | 37 | using namespace srs; |
| 36 | 38 | ||
| 37 | -#ifdef SRS_SSL | 39 | +// for openssl_HMACsha256 |
| 40 | +#include <openssl/evp.h> | ||
| 41 | +#include <openssl/hmac.h> | ||
| 42 | +// for __openssl_generate_key | ||
| 43 | +#include <openssl/dh.h> | ||
| 38 | 44 | ||
| 39 | -// 68bytes FMS key which is used to sign the sever packet. | ||
| 40 | -u_int8_t srs::SrsGenuineFMSKey[] = { | 45 | +namespace srs |
| 46 | +{ | ||
| 47 | + // 68bytes FMS key which is used to sign the sever packet. | ||
| 48 | + u_int8_t SrsGenuineFMSKey[] = { | ||
| 41 | 0x47, 0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x20, | 49 | 0x47, 0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x20, |
| 42 | 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x46, 0x6c, | 50 | 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x46, 0x6c, |
| 43 | 0x61, 0x73, 0x68, 0x20, 0x4d, 0x65, 0x64, 0x69, | 51 | 0x61, 0x73, 0x68, 0x20, 0x4d, 0x65, 0x64, 0x69, |
| @@ -47,10 +55,10 @@ u_int8_t srs::SrsGenuineFMSKey[] = { | @@ -47,10 +55,10 @@ u_int8_t srs::SrsGenuineFMSKey[] = { | ||
| 47 | 0x2e, 0x00, 0xd0, 0xd1, 0x02, 0x9e, 0x7e, 0x57, | 55 | 0x2e, 0x00, 0xd0, 0xd1, 0x02, 0x9e, 0x7e, 0x57, |
| 48 | 0x6e, 0xec, 0x5d, 0x2d, 0x29, 0x80, 0x6f, 0xab, | 56 | 0x6e, 0xec, 0x5d, 0x2d, 0x29, 0x80, 0x6f, 0xab, |
| 49 | 0x93, 0xb8, 0xe6, 0x36, 0xcf, 0xeb, 0x31, 0xae | 57 | 0x93, 0xb8, 0xe6, 0x36, 0xcf, 0xeb, 0x31, 0xae |
| 50 | -}; // 68 | 58 | + }; // 68 |
| 51 | 59 | ||
| 52 | -// 62bytes FP key which is used to sign the client packet. | ||
| 53 | -u_int8_t srs::SrsGenuineFPKey[] = { | 60 | + // 62bytes FP key which is used to sign the client packet. |
| 61 | + u_int8_t SrsGenuineFPKey[] = { | ||
| 54 | 0x47, 0x65, 0x6E, 0x75, 0x69, 0x6E, 0x65, 0x20, | 62 | 0x47, 0x65, 0x6E, 0x75, 0x69, 0x6E, 0x65, 0x20, |
| 55 | 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x46, 0x6C, | 63 | 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x46, 0x6C, |
| 56 | 0x61, 0x73, 0x68, 0x20, 0x50, 0x6C, 0x61, 0x79, | 64 | 0x61, 0x73, 0x68, 0x20, 0x50, 0x6C, 0x61, 0x79, |
| @@ -59,12 +67,10 @@ u_int8_t srs::SrsGenuineFPKey[] = { | @@ -59,12 +67,10 @@ u_int8_t srs::SrsGenuineFPKey[] = { | ||
| 59 | 0x2E, 0x00, 0xD0, 0xD1, 0x02, 0x9E, 0x7E, 0x57, | 67 | 0x2E, 0x00, 0xD0, 0xD1, 0x02, 0x9E, 0x7E, 0x57, |
| 60 | 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, | 68 | 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, |
| 61 | 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE | 69 | 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE |
| 62 | -}; // 62 | 70 | + }; // 62 |
| 63 | 71 | ||
| 64 | -#include <openssl/evp.h> | ||
| 65 | -#include <openssl/hmac.h> | ||
| 66 | -int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest) | ||
| 67 | -{ | 72 | + int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest) |
| 73 | + { | ||
| 68 | HMAC_CTX ctx; | 74 | HMAC_CTX ctx; |
| 69 | 75 | ||
| 70 | HMAC_CTX_init(&ctx); | 76 | HMAC_CTX_init(&ctx); |
| @@ -81,20 +87,19 @@ int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, in | @@ -81,20 +87,19 @@ int srs::openssl_HMACsha256(const void* data, int data_size, const void* key, in | ||
| 81 | } | 87 | } |
| 82 | 88 | ||
| 83 | return ERROR_SUCCESS; | 89 | return ERROR_SUCCESS; |
| 84 | -} | 90 | + } |
| 85 | 91 | ||
| 86 | -#include <openssl/dh.h> | ||
| 87 | -#define RFC2409_PRIME_1024 \ | 92 | + #define RFC2409_PRIME_1024 \ |
| 88 | "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ | 93 | "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ |
| 89 | "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ | 94 | "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ |
| 90 | "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ | 95 | "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ |
| 91 | "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ | 96 | "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ |
| 92 | "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \ | 97 | "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \ |
| 93 | "FFFFFFFFFFFFFFFF" | 98 | "FFFFFFFFFFFFFFFF" |
| 94 | -int __openssl_generate_key( | ||
| 95 | - u_int8_t*& _private_key, u_int8_t*& _public_key, int32_t& size, | 99 | + int __openssl_generate_key( |
| 100 | + u_int8_t* _private_key, u_int8_t* _public_key, int32_t& size, | ||
| 96 | DH*& pdh, int32_t& bits_count, u_int8_t*& shared_key, int32_t& shared_key_length, BIGNUM*& peer_public_key | 101 | DH*& pdh, int32_t& bits_count, u_int8_t*& shared_key, int32_t& shared_key_length, BIGNUM*& peer_public_key |
| 97 | -){ | 102 | + ){ |
| 98 | int ret = ERROR_SUCCESS; | 103 | int ret = ERROR_SUCCESS; |
| 99 | 104 | ||
| 100 | //1. Create the DH | 105 | //1. Create the DH |
| @@ -182,9 +187,9 @@ int __openssl_generate_key( | @@ -182,9 +187,9 @@ int __openssl_generate_key( | ||
| 182 | } | 187 | } |
| 183 | 188 | ||
| 184 | return ret; | 189 | return ret; |
| 185 | -} | ||
| 186 | -int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | ||
| 187 | -{ | 190 | + } |
| 191 | + int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | ||
| 192 | + { | ||
| 188 | int ret = ERROR_SUCCESS; | 193 | int ret = ERROR_SUCCESS; |
| 189 | 194 | ||
| 190 | // Initialize | 195 | // Initialize |
| @@ -195,7 +200,7 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | @@ -195,7 +200,7 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | ||
| 195 | BIGNUM* peer_public_key = NULL; | 200 | BIGNUM* peer_public_key = NULL; |
| 196 | 201 | ||
| 197 | ret = __openssl_generate_key( | 202 | ret = __openssl_generate_key( |
| 198 | - (u_int8_t*&)_private_key, (u_int8_t*&)_public_key, size, | 203 | + (u_int8_t*)_private_key, (u_int8_t*)_public_key, size, |
| 199 | pdh, bits_count, shared_key, shared_key_length, peer_public_key | 204 | pdh, bits_count, shared_key, shared_key_length, peer_public_key |
| 200 | ); | 205 | ); |
| 201 | 206 | ||
| @@ -223,12 +228,12 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | @@ -223,12 +228,12 @@ int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | ||
| 223 | } | 228 | } |
| 224 | 229 | ||
| 225 | return ret; | 230 | return ret; |
| 226 | -} | 231 | + } |
| 227 | 232 | ||
| 228 | -// calc the offset of key, | ||
| 229 | -// the key->offset cannot be used as the offset of key. | ||
| 230 | -int srs_key_block_get_offset(key_block* key) | ||
| 231 | -{ | 233 | + // calc the offset of key, |
| 234 | + // the key->offset cannot be used as the offset of key. | ||
| 235 | + int srs_key_block_get_offset(key_block* key) | ||
| 236 | + { | ||
| 232 | int max_offset_size = 764 - 128 - 4; | 237 | int max_offset_size = 764 - 128 - 4; |
| 233 | 238 | ||
| 234 | int offset = 0; | 239 | int offset = 0; |
| @@ -239,11 +244,12 @@ int srs_key_block_get_offset(key_block* key) | @@ -239,11 +244,12 @@ int srs_key_block_get_offset(key_block* key) | ||
| 239 | offset += *pp++; | 244 | offset += *pp++; |
| 240 | 245 | ||
| 241 | return offset % max_offset_size; | 246 | return offset % max_offset_size; |
| 242 | -} | ||
| 243 | -// create new key block data. | ||
| 244 | -// if created, user must free it by srs_key_block_free | ||
| 245 | -void srs_key_block_init(key_block* key) | ||
| 246 | -{ | 247 | + } |
| 248 | + | ||
| 249 | + // create new key block data. | ||
| 250 | + // if created, user must free it by srs_key_block_free | ||
| 251 | + void srs_key_block_init(key_block* key) | ||
| 252 | + { | ||
| 247 | key->offset = (int32_t)rand(); | 253 | key->offset = (int32_t)rand(); |
| 248 | key->random0 = NULL; | 254 | key->random0 = NULL; |
| 249 | key->random1 = NULL; | 255 | key->random1 = NULL; |
| @@ -264,12 +270,13 @@ void srs_key_block_init(key_block* key) | @@ -264,12 +270,13 @@ void srs_key_block_init(key_block* key) | ||
| 264 | key->random1 = new char[key->random1_size]; | 270 | key->random1 = new char[key->random1_size]; |
| 265 | srs_random_generate(key->random1, key->random1_size); | 271 | srs_random_generate(key->random1, key->random1_size); |
| 266 | } | 272 | } |
| 267 | -} | ||
| 268 | -// parse key block from c1s1. | ||
| 269 | -// if created, user must free it by srs_key_block_free | ||
| 270 | -// @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764 | ||
| 271 | -int srs_key_block_parse(key_block* key, char* c1s1_key_bytes) | ||
| 272 | -{ | 273 | + } |
| 274 | + | ||
| 275 | + // parse key block from c1s1. | ||
| 276 | + // if created, user must free it by srs_key_block_free | ||
| 277 | + // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764 | ||
| 278 | + int srs_key_block_parse(key_block* key, char* c1s1_key_bytes) | ||
| 279 | + { | ||
| 273 | int ret = ERROR_SUCCESS; | 280 | int ret = ERROR_SUCCESS; |
| 274 | 281 | ||
| 275 | char* pp = c1s1_key_bytes + 764; | 282 | char* pp = c1s1_key_bytes + 764; |
| @@ -301,23 +308,24 @@ int srs_key_block_parse(key_block* key, char* c1s1_key_bytes) | @@ -301,23 +308,24 @@ int srs_key_block_parse(key_block* key, char* c1s1_key_bytes) | ||
| 301 | } | 308 | } |
| 302 | 309 | ||
| 303 | return ret; | 310 | return ret; |
| 304 | -} | ||
| 305 | -// free the block data create by | ||
| 306 | -// srs_key_block_init or srs_key_block_parse | ||
| 307 | -void srs_key_block_free(key_block* key) | ||
| 308 | -{ | 311 | + } |
| 312 | + | ||
| 313 | + // free the block data create by | ||
| 314 | + // srs_key_block_init or srs_key_block_parse | ||
| 315 | + void srs_key_block_free(key_block* key) | ||
| 316 | + { | ||
| 309 | if (key->random0) { | 317 | if (key->random0) { |
| 310 | srs_freepa(key->random0); | 318 | srs_freepa(key->random0); |
| 311 | } | 319 | } |
| 312 | if (key->random1) { | 320 | if (key->random1) { |
| 313 | srs_freepa(key->random1); | 321 | srs_freepa(key->random1); |
| 314 | } | 322 | } |
| 315 | -} | 323 | + } |
| 316 | 324 | ||
| 317 | -// calc the offset of digest, | ||
| 318 | -// the key->offset cannot be used as the offset of digest. | ||
| 319 | -int srs_digest_block_get_offset(digest_block* digest) | ||
| 320 | -{ | 325 | + // calc the offset of digest, |
| 326 | + // the key->offset cannot be used as the offset of digest. | ||
| 327 | + int srs_digest_block_get_offset(digest_block* digest) | ||
| 328 | + { | ||
| 321 | int max_offset_size = 764 - 32 - 4; | 329 | int max_offset_size = 764 - 32 - 4; |
| 322 | 330 | ||
| 323 | int offset = 0; | 331 | int offset = 0; |
| @@ -328,11 +336,12 @@ int srs_digest_block_get_offset(digest_block* digest) | @@ -328,11 +336,12 @@ int srs_digest_block_get_offset(digest_block* digest) | ||
| 328 | offset += *pp++; | 336 | offset += *pp++; |
| 329 | 337 | ||
| 330 | return offset % max_offset_size; | 338 | return offset % max_offset_size; |
| 331 | -} | ||
| 332 | -// create new digest block data. | ||
| 333 | -// if created, user must free it by srs_digest_block_free | ||
| 334 | -void srs_digest_block_init(digest_block* digest) | ||
| 335 | -{ | 339 | + } |
| 340 | + | ||
| 341 | + // create new digest block data. | ||
| 342 | + // if created, user must free it by srs_digest_block_free | ||
| 343 | + void srs_digest_block_init(digest_block* digest) | ||
| 344 | + { | ||
| 336 | digest->offset = (int32_t)rand(); | 345 | digest->offset = (int32_t)rand(); |
| 337 | digest->random0 = NULL; | 346 | digest->random0 = NULL; |
| 338 | digest->random1 = NULL; | 347 | digest->random1 = NULL; |
| @@ -353,12 +362,13 @@ void srs_digest_block_init(digest_block* digest) | @@ -353,12 +362,13 @@ void srs_digest_block_init(digest_block* digest) | ||
| 353 | digest->random1 = new char[digest->random1_size]; | 362 | digest->random1 = new char[digest->random1_size]; |
| 354 | srs_random_generate(digest->random1, digest->random1_size); | 363 | srs_random_generate(digest->random1, digest->random1_size); |
| 355 | } | 364 | } |
| 356 | -} | ||
| 357 | -// parse digest block from c1s1. | ||
| 358 | -// if created, user must free it by srs_digest_block_free | ||
| 359 | -// @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764 | ||
| 360 | -int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) | ||
| 361 | -{ | 365 | + } |
| 366 | + | ||
| 367 | + // parse digest block from c1s1. | ||
| 368 | + // if created, user must free it by srs_digest_block_free | ||
| 369 | + // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764 | ||
| 370 | + int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) | ||
| 371 | + { | ||
| 362 | int ret = ERROR_SUCCESS; | 372 | int ret = ERROR_SUCCESS; |
| 363 | 373 | ||
| 364 | char* pp = c1s1_digest_bytes; | 374 | char* pp = c1s1_digest_bytes; |
| @@ -389,33 +399,34 @@ int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) | @@ -389,33 +399,34 @@ int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes) | ||
| 389 | } | 399 | } |
| 390 | 400 | ||
| 391 | return ret; | 401 | return ret; |
| 392 | -} | ||
| 393 | -// free the block data create by | ||
| 394 | -// srs_digest_block_init or srs_digest_block_parse | ||
| 395 | -void srs_digest_block_free(digest_block* digest) | ||
| 396 | -{ | 402 | + } |
| 403 | + | ||
| 404 | + // free the block data create by | ||
| 405 | + // srs_digest_block_init or srs_digest_block_parse | ||
| 406 | + void srs_digest_block_free(digest_block* digest) | ||
| 407 | + { | ||
| 397 | if (digest->random0) { | 408 | if (digest->random0) { |
| 398 | srs_freepa(digest->random0); | 409 | srs_freepa(digest->random0); |
| 399 | } | 410 | } |
| 400 | if (digest->random1) { | 411 | if (digest->random1) { |
| 401 | srs_freepa(digest->random1); | 412 | srs_freepa(digest->random1); |
| 402 | } | 413 | } |
| 403 | -} | 414 | + } |
| 404 | 415 | ||
| 405 | -void __srs_time_copy_to(char*& pp, int32_t time) | ||
| 406 | -{ | 416 | + void __srs_time_copy_to(char*& pp, int32_t time) |
| 417 | + { | ||
| 407 | // 4bytes time | 418 | // 4bytes time |
| 408 | *(int32_t*)pp = time; | 419 | *(int32_t*)pp = time; |
| 409 | pp += 4; | 420 | pp += 4; |
| 410 | -} | ||
| 411 | -void __srs_version_copy_to(char*& pp, int32_t version) | ||
| 412 | -{ | 421 | + } |
| 422 | + void __srs_version_copy_to(char*& pp, int32_t version) | ||
| 423 | + { | ||
| 413 | // 4bytes version | 424 | // 4bytes version |
| 414 | *(int32_t*)pp = version; | 425 | *(int32_t*)pp = version; |
| 415 | pp += 4; | 426 | pp += 4; |
| 416 | -} | ||
| 417 | -void __srs_key_copy_to(char*& pp, key_block* key) | ||
| 418 | -{ | 427 | + } |
| 428 | + void __srs_key_copy_to(char*& pp, key_block* key) | ||
| 429 | + { | ||
| 419 | // 764bytes key block | 430 | // 764bytes key block |
| 420 | if (key->random0_size > 0) { | 431 | if (key->random0_size > 0) { |
| 421 | memcpy(pp, key->random0, key->random0_size); | 432 | memcpy(pp, key->random0, key->random0_size); |
| @@ -432,9 +443,9 @@ void __srs_key_copy_to(char*& pp, key_block* key) | @@ -432,9 +443,9 @@ void __srs_key_copy_to(char*& pp, key_block* key) | ||
| 432 | 443 | ||
| 433 | *(int32_t*)pp = key->offset; | 444 | *(int32_t*)pp = key->offset; |
| 434 | pp += 4; | 445 | pp += 4; |
| 435 | -} | ||
| 436 | -void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) | ||
| 437 | -{ | 446 | + } |
| 447 | + void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) | ||
| 448 | + { | ||
| 438 | // 732bytes digest block without the 32bytes digest-data | 449 | // 732bytes digest block without the 32bytes digest-data |
| 439 | // nbytes digest block part1 | 450 | // nbytes digest block part1 |
| 440 | *(int32_t*)pp = digest->offset; | 451 | *(int32_t*)pp = digest->offset; |
| @@ -456,14 +467,14 @@ void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) | @@ -456,14 +467,14 @@ void __srs_digest_copy_to(char*& pp, digest_block* digest, bool with_digest) | ||
| 456 | memcpy(pp, digest->random1, digest->random1_size); | 467 | memcpy(pp, digest->random1, digest->random1_size); |
| 457 | } | 468 | } |
| 458 | pp += digest->random1_size; | 469 | pp += digest->random1_size; |
| 459 | -} | 470 | + } |
| 460 | 471 | ||
| 461 | -/** | ||
| 462 | -* copy whole c1s1 to bytes. | ||
| 463 | -*/ | ||
| 464 | -void srs_schema0_copy_to(char* bytes, bool with_digest, | 472 | + /** |
| 473 | + * copy whole c1s1 to bytes. | ||
| 474 | + */ | ||
| 475 | + void srs_schema0_copy_to(char* bytes, bool with_digest, | ||
| 465 | int32_t time, int32_t version, key_block* key, digest_block* digest) | 476 | int32_t time, int32_t version, key_block* key, digest_block* digest) |
| 466 | -{ | 477 | + { |
| 467 | char* pp = bytes; | 478 | char* pp = bytes; |
| 468 | 479 | ||
| 469 | __srs_time_copy_to(pp, time); | 480 | __srs_time_copy_to(pp, time); |
| @@ -476,10 +487,10 @@ void srs_schema0_copy_to(char* bytes, bool with_digest, | @@ -476,10 +487,10 @@ void srs_schema0_copy_to(char* bytes, bool with_digest, | ||
| 476 | } else { | 487 | } else { |
| 477 | srs_assert(pp - bytes == 1536 - 32); | 488 | srs_assert(pp - bytes == 1536 - 32); |
| 478 | } | 489 | } |
| 479 | -} | ||
| 480 | -void srs_schema1_copy_to(char* bytes, bool with_digest, | 490 | + } |
| 491 | + void srs_schema1_copy_to(char* bytes, bool with_digest, | ||
| 481 | int32_t time, int32_t version, digest_block* digest, key_block* key) | 492 | int32_t time, int32_t version, digest_block* digest, key_block* key) |
| 482 | -{ | 493 | + { |
| 483 | char* pp = bytes; | 494 | char* pp = bytes; |
| 484 | 495 | ||
| 485 | __srs_time_copy_to(pp, time); | 496 | __srs_time_copy_to(pp, time); |
| @@ -492,46 +503,54 @@ void srs_schema1_copy_to(char* bytes, bool with_digest, | @@ -492,46 +503,54 @@ void srs_schema1_copy_to(char* bytes, bool with_digest, | ||
| 492 | } else { | 503 | } else { |
| 493 | srs_assert(pp - bytes == 1536 - 32); | 504 | srs_assert(pp - bytes == 1536 - 32); |
| 494 | } | 505 | } |
| 495 | -} | 506 | + } |
| 496 | 507 | ||
| 497 | -/** | ||
| 498 | -* c1s1 is splited by digest: | ||
| 499 | -* c1s1-part1: n bytes (time, version, key and digest-part1). | ||
| 500 | -* digest-data: 32bytes | ||
| 501 | -* c1s1-part2: (1536-n-32)bytes (digest-part2) | ||
| 502 | -*/ | ||
| 503 | -char* srs::srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest) | ||
| 504 | -{ | 508 | + /** |
| 509 | + * c1s1 is splited by digest: | ||
| 510 | + * c1s1-part1: n bytes (time, version, key and digest-part1). | ||
| 511 | + * digest-data: 32bytes | ||
| 512 | + * c1s1-part2: (1536-n-32)bytes (digest-part2) | ||
| 513 | + */ | ||
| 514 | + char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest) | ||
| 515 | + { | ||
| 505 | char* bytes = new char[1536 -32]; | 516 | char* bytes = new char[1536 -32]; |
| 506 | 517 | ||
| 507 | srs_schema0_copy_to(bytes, false, time, version, key, digest); | 518 | srs_schema0_copy_to(bytes, false, time, version, key, digest); |
| 508 | 519 | ||
| 509 | return bytes; | 520 | return bytes; |
| 510 | -} | 521 | + } |
| 511 | 522 | ||
| 512 | -/** | ||
| 513 | -* c1s1 is splited by digest: | ||
| 514 | -* c1s1-part1: n bytes (time, version and digest-part1). | ||
| 515 | -* digest-data: 32bytes | ||
| 516 | -* c1s1-part2: (1536-n-32)bytes (digest-part2 and key) | ||
| 517 | -*/ | ||
| 518 | -char* srs::srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key) | ||
| 519 | -{ | 523 | + /** |
| 524 | + * c1s1 is splited by digest: | ||
| 525 | + * c1s1-part1: n bytes (time, version and digest-part1). | ||
| 526 | + * digest-data: 32bytes | ||
| 527 | + * c1s1-part2: (1536-n-32)bytes (digest-part2 and key) | ||
| 528 | + */ | ||
| 529 | + char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key) | ||
| 530 | + { | ||
| 520 | char* bytes = new char[1536 -32]; | 531 | char* bytes = new char[1536 -32]; |
| 521 | 532 | ||
| 522 | srs_schema1_copy_to(bytes, false, time, version, digest, key); | 533 | srs_schema1_copy_to(bytes, false, time, version, digest, key); |
| 523 | 534 | ||
| 524 | return bytes; | 535 | return bytes; |
| 525 | -} | 536 | + } |
| 526 | 537 | ||
| 527 | -/** | ||
| 528 | -* compare the memory in bytes. | ||
| 529 | -*/ | ||
| 530 | -bool srs::srs_bytes_equals(void* pa, void* pb, int size) | ||
| 531 | -{ | 538 | + /** |
| 539 | + * compare the memory in bytes. | ||
| 540 | + */ | ||
| 541 | + bool srs_bytes_equals(void* pa, void* pb, int size) | ||
| 542 | + { | ||
| 532 | u_int8_t* a = (u_int8_t*)pa; | 543 | u_int8_t* a = (u_int8_t*)pa; |
| 533 | u_int8_t* b = (u_int8_t*)pb; | 544 | u_int8_t* b = (u_int8_t*)pb; |
| 534 | 545 | ||
| 546 | + if (!a && !b) { | ||
| 547 | + return true; | ||
| 548 | + } | ||
| 549 | + | ||
| 550 | + if (!a || !b) { | ||
| 551 | + return false; | ||
| 552 | + } | ||
| 553 | + | ||
| 535 | for(int i = 0; i < size; i++){ | 554 | for(int i = 0; i < size; i++){ |
| 536 | if(a[i] != b[i]){ | 555 | if(a[i] != b[i]){ |
| 537 | return false; | 556 | return false; |
| @@ -539,32 +558,32 @@ bool srs::srs_bytes_equals(void* pa, void* pb, int size) | @@ -539,32 +558,32 @@ bool srs::srs_bytes_equals(void* pa, void* pb, int size) | ||
| 539 | } | 558 | } |
| 540 | 559 | ||
| 541 | return true; | 560 | return true; |
| 542 | -} | 561 | + } |
| 543 | 562 | ||
| 544 | -c2s2::c2s2() | ||
| 545 | -{ | 563 | + c2s2::c2s2() |
| 564 | + { | ||
| 546 | srs_random_generate(random, 1504); | 565 | srs_random_generate(random, 1504); |
| 547 | srs_random_generate(digest, 32); | 566 | srs_random_generate(digest, 32); |
| 548 | -} | 567 | + } |
| 549 | 568 | ||
| 550 | -c2s2::~c2s2() | ||
| 551 | -{ | ||
| 552 | -} | 569 | + c2s2::~c2s2() |
| 570 | + { | ||
| 571 | + } | ||
| 553 | 572 | ||
| 554 | -void c2s2::dump(char* _c2s2) | ||
| 555 | -{ | 573 | + void c2s2::dump(char* _c2s2) |
| 574 | + { | ||
| 556 | memcpy(_c2s2, random, 1504); | 575 | memcpy(_c2s2, random, 1504); |
| 557 | memcpy(_c2s2 + 1504, digest, 32); | 576 | memcpy(_c2s2 + 1504, digest, 32); |
| 558 | -} | 577 | + } |
| 559 | 578 | ||
| 560 | -void c2s2::parse(char* _c2s2) | ||
| 561 | -{ | 579 | + void c2s2::parse(char* _c2s2) |
| 580 | + { | ||
| 562 | memcpy(random, _c2s2, 1504); | 581 | memcpy(random, _c2s2, 1504); |
| 563 | memcpy(digest, _c2s2 + 1504, 32); | 582 | memcpy(digest, _c2s2 + 1504, 32); |
| 564 | -} | 583 | + } |
| 565 | 584 | ||
| 566 | -int c2s2::c2_create(c1s1* s1) | ||
| 567 | -{ | 585 | + int c2s2::c2_create(c1s1* s1) |
| 586 | + { | ||
| 568 | int ret = ERROR_SUCCESS; | 587 | int ret = ERROR_SUCCESS; |
| 569 | 588 | ||
| 570 | char temp_key[OpensslHashSize]; | 589 | char temp_key[OpensslHashSize]; |
| @@ -584,10 +603,10 @@ int c2s2::c2_create(c1s1* s1) | @@ -584,10 +603,10 @@ int c2s2::c2_create(c1s1* s1) | ||
| 584 | memcpy(digest, _digest, 32); | 603 | memcpy(digest, _digest, 32); |
| 585 | 604 | ||
| 586 | return ret; | 605 | return ret; |
| 587 | -} | 606 | + } |
| 588 | 607 | ||
| 589 | -int c2s2::c2_validate(c1s1* s1, bool& is_valid) | ||
| 590 | -{ | 608 | + int c2s2::c2_validate(c1s1* s1, bool& is_valid) |
| 609 | + { | ||
| 591 | is_valid = false; | 610 | is_valid = false; |
| 592 | int ret = ERROR_SUCCESS; | 611 | int ret = ERROR_SUCCESS; |
| 593 | 612 | ||
| @@ -608,10 +627,10 @@ int c2s2::c2_validate(c1s1* s1, bool& is_valid) | @@ -608,10 +627,10 @@ int c2s2::c2_validate(c1s1* s1, bool& is_valid) | ||
| 608 | is_valid = srs_bytes_equals(digest, _digest, 32); | 627 | is_valid = srs_bytes_equals(digest, _digest, 32); |
| 609 | 628 | ||
| 610 | return ret; | 629 | return ret; |
| 611 | -} | 630 | + } |
| 612 | 631 | ||
| 613 | -int c2s2::s2_create(c1s1* c1) | ||
| 614 | -{ | 632 | + int c2s2::s2_create(c1s1* c1) |
| 633 | + { | ||
| 615 | int ret = ERROR_SUCCESS; | 634 | int ret = ERROR_SUCCESS; |
| 616 | 635 | ||
| 617 | char temp_key[OpensslHashSize]; | 636 | char temp_key[OpensslHashSize]; |
| @@ -631,10 +650,10 @@ int c2s2::s2_create(c1s1* c1) | @@ -631,10 +650,10 @@ int c2s2::s2_create(c1s1* c1) | ||
| 631 | memcpy(digest, _digest, 32); | 650 | memcpy(digest, _digest, 32); |
| 632 | 651 | ||
| 633 | return ret; | 652 | return ret; |
| 634 | -} | 653 | + } |
| 635 | 654 | ||
| 636 | -int c2s2::s2_validate(c1s1* c1, bool& is_valid) | ||
| 637 | -{ | 655 | + int c2s2::s2_validate(c1s1* c1, bool& is_valid) |
| 656 | + { | ||
| 638 | is_valid = false; | 657 | is_valid = false; |
| 639 | int ret = ERROR_SUCCESS; | 658 | int ret = ERROR_SUCCESS; |
| 640 | 659 | ||
| @@ -655,20 +674,20 @@ int c2s2::s2_validate(c1s1* c1, bool& is_valid) | @@ -655,20 +674,20 @@ int c2s2::s2_validate(c1s1* c1, bool& is_valid) | ||
| 655 | is_valid = srs_bytes_equals(digest, _digest, 32); | 674 | is_valid = srs_bytes_equals(digest, _digest, 32); |
| 656 | 675 | ||
| 657 | return ret; | 676 | return ret; |
| 658 | -} | 677 | + } |
| 659 | 678 | ||
| 660 | -// TODO: FIXME: move to the right position. | ||
| 661 | -c1s1::c1s1() | ||
| 662 | -{ | 679 | + // TODO: FIXME: move to the right position. |
| 680 | + c1s1::c1s1() | ||
| 681 | + { | ||
| 663 | schema = srs_schema_invalid; | 682 | schema = srs_schema_invalid; |
| 664 | -} | ||
| 665 | -c1s1::~c1s1() | ||
| 666 | -{ | 683 | + } |
| 684 | + c1s1::~c1s1() | ||
| 685 | + { | ||
| 667 | destroy_blocks(); | 686 | destroy_blocks(); |
| 668 | -} | 687 | + } |
| 669 | 688 | ||
| 670 | -char* c1s1::get_digest() | ||
| 671 | -{ | 689 | + char* c1s1::get_digest() |
| 690 | + { | ||
| 672 | srs_assert(schema != srs_schema_invalid); | 691 | srs_assert(schema != srs_schema_invalid); |
| 673 | 692 | ||
| 674 | if (schema == srs_schema0) { | 693 | if (schema == srs_schema0) { |
| @@ -676,10 +695,10 @@ char* c1s1::get_digest() | @@ -676,10 +695,10 @@ char* c1s1::get_digest() | ||
| 676 | } else { | 695 | } else { |
| 677 | return block0.digest.digest; | 696 | return block0.digest.digest; |
| 678 | } | 697 | } |
| 679 | -} | 698 | + } |
| 680 | 699 | ||
| 681 | -void c1s1::dump(char* _c1s1) | ||
| 682 | -{ | 700 | + void c1s1::dump(char* _c1s1) |
| 701 | + { | ||
| 683 | srs_assert(schema != srs_schema_invalid); | 702 | srs_assert(schema != srs_schema_invalid); |
| 684 | 703 | ||
| 685 | if (schema == srs_schema0) { | 704 | if (schema == srs_schema0) { |
| @@ -687,10 +706,10 @@ void c1s1::dump(char* _c1s1) | @@ -687,10 +706,10 @@ void c1s1::dump(char* _c1s1) | ||
| 687 | } else { | 706 | } else { |
| 688 | srs_schema1_copy_to(_c1s1, true, time, version, &block0.digest, &block1.key); | 707 | srs_schema1_copy_to(_c1s1, true, time, version, &block0.digest, &block1.key); |
| 689 | } | 708 | } |
| 690 | -} | 709 | + } |
| 691 | 710 | ||
| 692 | -int c1s1::parse(char* _c1s1, srs_schema_type _schema) | ||
| 693 | -{ | 711 | + int c1s1::parse(char* _c1s1, srs_schema_type _schema) |
| 712 | + { | ||
| 694 | int ret = ERROR_SUCCESS; | 713 | int ret = ERROR_SUCCESS; |
| 695 | 714 | ||
| 696 | if (_schema == srs_schema_invalid) { | 715 | if (_schema == srs_schema_invalid) { |
| @@ -733,10 +752,10 @@ int c1s1::parse(char* _c1s1, srs_schema_type _schema) | @@ -733,10 +752,10 @@ int c1s1::parse(char* _c1s1, srs_schema_type _schema) | ||
| 733 | schema = _schema; | 752 | schema = _schema; |
| 734 | 753 | ||
| 735 | return ret; | 754 | return ret; |
| 736 | -} | 755 | + } |
| 737 | 756 | ||
| 738 | -int c1s1::c1_create(srs_schema_type _schema) | ||
| 739 | -{ | 757 | + int c1s1::c1_create(srs_schema_type _schema) |
| 758 | + { | ||
| 740 | int ret = ERROR_SUCCESS; | 759 | int ret = ERROR_SUCCESS; |
| 741 | 760 | ||
| 742 | if (_schema == srs_schema_invalid) { | 761 | if (_schema == srs_schema_invalid) { |
| @@ -777,10 +796,10 @@ int c1s1::c1_create(srs_schema_type _schema) | @@ -777,10 +796,10 @@ int c1s1::c1_create(srs_schema_type _schema) | ||
| 777 | } | 796 | } |
| 778 | 797 | ||
| 779 | return ret; | 798 | return ret; |
| 780 | -} | 799 | + } |
| 781 | 800 | ||
| 782 | -int c1s1::c1_validate_digest(bool& is_valid) | ||
| 783 | -{ | 801 | + int c1s1::c1_validate_digest(bool& is_valid) |
| 802 | + { | ||
| 784 | is_valid = false; | 803 | is_valid = false; |
| 785 | int ret = ERROR_SUCCESS; | 804 | int ret = ERROR_SUCCESS; |
| 786 | 805 | ||
| @@ -801,10 +820,10 @@ int c1s1::c1_validate_digest(bool& is_valid) | @@ -801,10 +820,10 @@ int c1s1::c1_validate_digest(bool& is_valid) | ||
| 801 | } | 820 | } |
| 802 | 821 | ||
| 803 | return ret; | 822 | return ret; |
| 804 | -} | 823 | + } |
| 805 | 824 | ||
| 806 | -int c1s1::s1_validate_digest(bool& is_valid) | ||
| 807 | -{ | 825 | + int c1s1::s1_validate_digest(bool& is_valid) |
| 826 | + { | ||
| 808 | is_valid = false; | 827 | is_valid = false; |
| 809 | int ret = ERROR_SUCCESS; | 828 | int ret = ERROR_SUCCESS; |
| 810 | 829 | ||
| @@ -825,10 +844,10 @@ int c1s1::s1_validate_digest(bool& is_valid) | @@ -825,10 +844,10 @@ int c1s1::s1_validate_digest(bool& is_valid) | ||
| 825 | } | 844 | } |
| 826 | 845 | ||
| 827 | return ret; | 846 | return ret; |
| 828 | -} | 847 | + } |
| 829 | 848 | ||
| 830 | -int c1s1::s1_create(c1s1* c1) | ||
| 831 | -{ | 849 | + int c1s1::s1_create(c1s1* c1) |
| 850 | + { | ||
| 832 | int ret = ERROR_SUCCESS; | 851 | int ret = ERROR_SUCCESS; |
| 833 | 852 | ||
| 834 | if (c1->schema == srs_schema_invalid) { | 853 | if (c1->schema == srs_schema_invalid) { |
| @@ -882,10 +901,10 @@ int c1s1::s1_create(c1s1* c1) | @@ -882,10 +901,10 @@ int c1s1::s1_create(c1s1* c1) | ||
| 882 | srs_verbose("copy s1 key success."); | 901 | srs_verbose("copy s1 key success."); |
| 883 | 902 | ||
| 884 | return ret; | 903 | return ret; |
| 885 | -} | 904 | + } |
| 886 | 905 | ||
| 887 | -int c1s1::calc_s1_digest(char*& digest) | ||
| 888 | -{ | 906 | + int c1s1::calc_s1_digest(char*& digest) |
| 907 | + { | ||
| 889 | int ret = ERROR_SUCCESS; | 908 | int ret = ERROR_SUCCESS; |
| 890 | 909 | ||
| 891 | srs_assert(schema == srs_schema0 || schema == srs_schema1); | 910 | srs_assert(schema == srs_schema0 || schema == srs_schema1); |
| @@ -909,10 +928,10 @@ int c1s1::calc_s1_digest(char*& digest) | @@ -909,10 +928,10 @@ int c1s1::calc_s1_digest(char*& digest) | ||
| 909 | srs_verbose("digest calculated for s1"); | 928 | srs_verbose("digest calculated for s1"); |
| 910 | 929 | ||
| 911 | return ret; | 930 | return ret; |
| 912 | -} | 931 | + } |
| 913 | 932 | ||
| 914 | -int c1s1::calc_c1_digest(char*& digest) | ||
| 915 | -{ | 933 | + int c1s1::calc_c1_digest(char*& digest) |
| 934 | + { | ||
| 916 | int ret = ERROR_SUCCESS; | 935 | int ret = ERROR_SUCCESS; |
| 917 | 936 | ||
| 918 | srs_assert(schema == srs_schema0 || schema == srs_schema1); | 937 | srs_assert(schema == srs_schema0 || schema == srs_schema1); |
| @@ -936,10 +955,10 @@ int c1s1::calc_c1_digest(char*& digest) | @@ -936,10 +955,10 @@ int c1s1::calc_c1_digest(char*& digest) | ||
| 936 | srs_verbose("digest calculated for c1"); | 955 | srs_verbose("digest calculated for c1"); |
| 937 | 956 | ||
| 938 | return ret; | 957 | return ret; |
| 939 | -} | 958 | + } |
| 940 | 959 | ||
| 941 | -void c1s1::destroy_blocks() | ||
| 942 | -{ | 960 | + void c1s1::destroy_blocks() |
| 961 | + { | ||
| 943 | if (schema == srs_schema_invalid) { | 962 | if (schema == srs_schema_invalid) { |
| 944 | return; | 963 | return; |
| 945 | } | 964 | } |
| @@ -951,6 +970,7 @@ void c1s1::destroy_blocks() | @@ -951,6 +970,7 @@ void c1s1::destroy_blocks() | ||
| 951 | srs_digest_block_free(&block0.digest); | 970 | srs_digest_block_free(&block0.digest); |
| 952 | srs_key_block_free(&block1.key); | 971 | srs_key_block_free(&block1.key); |
| 953 | } | 972 | } |
| 973 | + } | ||
| 954 | } | 974 | } |
| 955 | 975 | ||
| 956 | #endif | 976 | #endif |
| @@ -1144,13 +1164,10 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs | @@ -1144,13 +1164,10 @@ int SrsComplexHandshake::handshake_with_client(SrsHandshakeBytes* hs_bytes, ISrs | ||
| 1144 | c2s2 c2; | 1164 | c2s2 c2; |
| 1145 | c2.parse(hs_bytes->c2); | 1165 | c2.parse(hs_bytes->c2); |
| 1146 | srs_verbose("complex handshake read c2 success."); | 1166 | srs_verbose("complex handshake read c2 success."); |
| 1167 | + | ||
| 1147 | // verify c2 | 1168 | // verify c2 |
| 1148 | - if ((ret = c2.c2_validate(&s1, is_valid)) != ERROR_SUCCESS || !is_valid) { | ||
| 1149 | - ret = ERROR_RTMP_HANDSHAKE; | ||
| 1150 | - srs_trace("verify c2 failed. ret=%d", ret); | ||
| 1151 | - return ret; | ||
| 1152 | - } | ||
| 1153 | - srs_verbose("verify c2 success."); | 1169 | + // never verify c2, for ffmpeg will failed. |
| 1170 | + // it's ok for flash. | ||
| 1154 | 1171 | ||
| 1155 | srs_trace("comple handshake with client success"); | 1172 | srs_trace("comple handshake with client success"); |
| 1156 | 1173 |
| @@ -97,6 +97,78 @@ namespace srs | @@ -97,6 +97,78 @@ namespace srs | ||
| 97 | int random1_size; | 97 | int random1_size; |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | + // the digest key generate size. | ||
| 101 | + #define OpensslHashSize 512 | ||
| 102 | + extern u_int8_t SrsGenuineFMSKey[]; | ||
| 103 | + extern u_int8_t SrsGenuineFPKey[]; | ||
| 104 | + int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest); | ||
| 105 | + int openssl_generate_key(char* _private_key, char* _public_key, int32_t size); | ||
| 106 | + | ||
| 107 | + // calc the offset of key, | ||
| 108 | + // the key->offset cannot be used as the offset of key. | ||
| 109 | + int srs_key_block_get_offset(key_block* key); | ||
| 110 | + | ||
| 111 | + // create new key block data. | ||
| 112 | + // if created, user must free it by srs_key_block_free | ||
| 113 | + void srs_key_block_init(key_block* key); | ||
| 114 | + | ||
| 115 | + // parse key block from c1s1. | ||
| 116 | + // if created, user must free it by srs_key_block_free | ||
| 117 | + // @c1s1_key_bytes the key start bytes, maybe c1s1 or c1s1+764 | ||
| 118 | + int srs_key_block_parse(key_block* key, char* c1s1_key_bytes); | ||
| 119 | + | ||
| 120 | + // free the block data create by | ||
| 121 | + // srs_key_block_init or srs_key_block_parse | ||
| 122 | + void srs_key_block_free(key_block* key); | ||
| 123 | + | ||
| 124 | + // calc the offset of digest, | ||
| 125 | + // the key->offset cannot be used as the offset of digest. | ||
| 126 | + int srs_digest_block_get_offset(digest_block* digest); | ||
| 127 | + | ||
| 128 | + // create new digest block data. | ||
| 129 | + // if created, user must free it by srs_digest_block_free | ||
| 130 | + void srs_digest_block_init(digest_block* digest); | ||
| 131 | + | ||
| 132 | + // parse digest block from c1s1. | ||
| 133 | + // if created, user must free it by srs_digest_block_free | ||
| 134 | + // @c1s1_digest_bytes the digest start bytes, maybe c1s1 or c1s1+764 | ||
| 135 | + int srs_digest_block_parse(digest_block* digest, char* c1s1_digest_bytes); | ||
| 136 | + | ||
| 137 | + // free the block data create by | ||
| 138 | + // srs_digest_block_init or srs_digest_block_parse | ||
| 139 | + void srs_digest_block_free(digest_block* digest); | ||
| 140 | + | ||
| 141 | + /** | ||
| 142 | + * copy whole c1s1 to bytes. | ||
| 143 | + */ | ||
| 144 | + void srs_schema0_copy_to(char* bytes, bool with_digest, | ||
| 145 | + int32_t time, int32_t version, key_block* key, digest_block* digest); | ||
| 146 | + void srs_schema1_copy_to(char* bytes, bool with_digest, | ||
| 147 | + int32_t time, int32_t version, digest_block* digest, key_block* key); | ||
| 148 | + | ||
| 149 | + /** | ||
| 150 | + * c1s1 is splited by digest: | ||
| 151 | + * c1s1-part1: n bytes (time, version, key and digest-part1). | ||
| 152 | + * digest-data: 32bytes | ||
| 153 | + * c1s1-part2: (1536-n-32)bytes (digest-part2) | ||
| 154 | + * @return a new allocated bytes, user must free it. | ||
| 155 | + */ | ||
| 156 | + char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest); | ||
| 157 | + | ||
| 158 | + /** | ||
| 159 | + * c1s1 is splited by digest: | ||
| 160 | + * c1s1-part1: n bytes (time, version and digest-part1). | ||
| 161 | + * digest-data: 32bytes | ||
| 162 | + * c1s1-part2: (1536-n-32)bytes (digest-part2 and key) | ||
| 163 | + * @return a new allocated bytes, user must free it. | ||
| 164 | + */ | ||
| 165 | + char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key); | ||
| 166 | + | ||
| 167 | + /** | ||
| 168 | + * compare the memory in bytes. | ||
| 169 | + */ | ||
| 170 | + bool srs_bytes_equals(void* pa, void* pb, int size); | ||
| 171 | + | ||
| 100 | /** | 172 | /** |
| 101 | * c1s1 schema0 | 173 | * c1s1 schema0 |
| 102 | * time: 4bytes | 174 | * time: 4bytes |
| @@ -236,41 +308,14 @@ namespace srs | @@ -236,41 +308,14 @@ namespace srs | ||
| 236 | */ | 308 | */ |
| 237 | virtual int s2_validate(c1s1* c1, bool& is_valid); | 309 | virtual int s2_validate(c1s1* c1, bool& is_valid); |
| 238 | }; | 310 | }; |
| 239 | - | ||
| 240 | - /** | ||
| 241 | - * compare the memory in bytes. | ||
| 242 | - */ | ||
| 243 | - bool srs_bytes_equals(void* pa, void* pb, int size); | ||
| 244 | - | ||
| 245 | - /** | ||
| 246 | - * c1s1 is splited by digest: | ||
| 247 | - * c1s1-part1: n bytes (time, version, key and digest-part1). | ||
| 248 | - * digest-data: 32bytes | ||
| 249 | - * c1s1-part2: (1536-n-32)bytes (digest-part2) | ||
| 250 | - * @return a new allocated bytes, user must free it. | ||
| 251 | - */ | ||
| 252 | - char* srs_bytes_join_schema0(int32_t time, int32_t version, key_block* key, digest_block* digest); | ||
| 253 | - | ||
| 254 | - /** | ||
| 255 | - * c1s1 is splited by digest: | ||
| 256 | - * c1s1-part1: n bytes (time, version and digest-part1). | ||
| 257 | - * digest-data: 32bytes | ||
| 258 | - * c1s1-part2: (1536-n-32)bytes (digest-part2 and key) | ||
| 259 | - * @return a new allocated bytes, user must free it. | ||
| 260 | - */ | ||
| 261 | - char* srs_bytes_join_schema1(int32_t time, int32_t version, digest_block* digest, key_block* key); | ||
| 262 | - | ||
| 263 | - // the digest key generate size. | ||
| 264 | - #define OpensslHashSize 512 | ||
| 265 | - extern u_int8_t SrsGenuineFMSKey[]; | ||
| 266 | - extern u_int8_t SrsGenuineFPKey[]; | ||
| 267 | - int openssl_HMACsha256(const void* data, int data_size, const void* key, int key_size, void* digest); | ||
| 268 | } | 311 | } |
| 269 | 312 | ||
| 270 | #endif | 313 | #endif |
| 271 | 314 | ||
| 272 | /** | 315 | /** |
| 273 | -* try complex handshake, if failed, fallback to simple handshake. | 316 | +* simple handshake. |
| 317 | +* user can try complex handshake first, | ||
| 318 | +* rollback to simple handshake if error ERROR_RTMP_TRY_SIMPLE_HS | ||
| 274 | */ | 319 | */ |
| 275 | class SrsSimpleHandshake | 320 | class SrsSimpleHandshake |
| 276 | { | 321 | { |
| @@ -36,6 +36,77 @@ ISrsThreadContext* _srs_context = new ISrsThreadContext(); | @@ -36,6 +36,77 @@ ISrsThreadContext* _srs_context = new ISrsThreadContext(); | ||
| 36 | SrsConfig* _srs_config = NULL; | 36 | SrsConfig* _srs_config = NULL; |
| 37 | SrsServer* _srs_server = NULL; | 37 | SrsServer* _srs_server = NULL; |
| 38 | 38 | ||
| 39 | +MockEmptyIO::MockEmptyIO() | ||
| 40 | +{ | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +MockEmptyIO::~MockEmptyIO() | ||
| 44 | +{ | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +bool MockEmptyIO::is_never_timeout(int64_t /*timeout_us*/) | ||
| 48 | +{ | ||
| 49 | + return true; | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +int MockEmptyIO::read_fully(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | ||
| 53 | +{ | ||
| 54 | + return ERROR_SUCCESS; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +int MockEmptyIO::write(const void* /*buf*/, size_t /*size*/, ssize_t* /*nwrite*/) | ||
| 58 | +{ | ||
| 59 | + return ERROR_SUCCESS; | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +void MockEmptyIO::set_recv_timeout(int64_t /*timeout_us*/) | ||
| 63 | +{ | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +int64_t MockEmptyIO::get_recv_timeout() | ||
| 67 | +{ | ||
| 68 | + return -1; | ||
| 69 | +} | ||
| 70 | + | ||
| 71 | +int64_t MockEmptyIO::get_recv_bytes() | ||
| 72 | +{ | ||
| 73 | + return -1; | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | +int MockEmptyIO::get_recv_kbps() | ||
| 77 | +{ | ||
| 78 | + return 0; | ||
| 79 | +} | ||
| 80 | + | ||
| 81 | +void MockEmptyIO::set_send_timeout(int64_t /*timeout_us*/) | ||
| 82 | +{ | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +int64_t MockEmptyIO::get_send_timeout() | ||
| 86 | +{ | ||
| 87 | + return 0; | ||
| 88 | +} | ||
| 89 | + | ||
| 90 | +int64_t MockEmptyIO::get_send_bytes() | ||
| 91 | +{ | ||
| 92 | + return 0; | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +int MockEmptyIO::get_send_kbps() | ||
| 96 | +{ | ||
| 97 | + return 0; | ||
| 98 | +} | ||
| 99 | + | ||
| 100 | +int MockEmptyIO::writev(const iovec */*iov*/, int /*iov_size*/, ssize_t* /*nwrite*/) | ||
| 101 | +{ | ||
| 102 | + return ERROR_SUCCESS; | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +int MockEmptyIO::read(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | ||
| 106 | +{ | ||
| 107 | + return ERROR_SUCCESS; | ||
| 108 | +} | ||
| 109 | + | ||
| 39 | // basic test and samples. | 110 | // basic test and samples. |
| 40 | VOID TEST(SampleTest, FastSampleInt64Test) | 111 | VOID TEST(SampleTest, FastSampleInt64Test) |
| 41 | { | 112 | { |
| @@ -34,4 +34,36 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -34,4 +34,36 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 34 | // we add an empty macro for upp to show the smart tips. | 34 | // we add an empty macro for upp to show the smart tips. |
| 35 | #define VOID | 35 | #define VOID |
| 36 | 36 | ||
| 37 | +#include <srs_protocol_io.hpp> | ||
| 38 | + | ||
| 39 | +class MockEmptyIO : public ISrsProtocolReaderWriter | ||
| 40 | +{ | ||
| 41 | +public: | ||
| 42 | + MockEmptyIO(); | ||
| 43 | + virtual ~MockEmptyIO(); | ||
| 44 | +// for protocol | ||
| 45 | +public: | ||
| 46 | + virtual bool is_never_timeout(int64_t timeout_us); | ||
| 47 | +// for handshake. | ||
| 48 | +public: | ||
| 49 | + virtual int read_fully(const void* buf, size_t size, ssize_t* nread); | ||
| 50 | + virtual int write(const void* buf, size_t size, ssize_t* nwrite); | ||
| 51 | +// for protocol | ||
| 52 | +public: | ||
| 53 | + virtual void set_recv_timeout(int64_t timeout_us); | ||
| 54 | + virtual int64_t get_recv_timeout(); | ||
| 55 | + virtual int64_t get_recv_bytes(); | ||
| 56 | + virtual int get_recv_kbps(); | ||
| 57 | +// for protocol | ||
| 58 | +public: | ||
| 59 | + virtual void set_send_timeout(int64_t timeout_us); | ||
| 60 | + virtual int64_t get_send_timeout(); | ||
| 61 | + virtual int64_t get_send_bytes(); | ||
| 62 | + virtual int get_send_kbps(); | ||
| 63 | + virtual int writev(const iovec *iov, int iov_size, ssize_t* nwrite); | ||
| 64 | +// for protocol/amf0/msg-codec | ||
| 65 | +public: | ||
| 66 | + virtual int read(const void* buf, size_t size, ssize_t* nread); | ||
| 67 | +}; | ||
| 68 | + | ||
| 37 | #endif | 69 | #endif |
| @@ -24,77 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -24,77 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | 24 | ||
| 25 | #include <srs_kernel_error.hpp> | 25 | #include <srs_kernel_error.hpp> |
| 26 | #include <srs_core_autofree.hpp> | 26 | #include <srs_core_autofree.hpp> |
| 27 | - | ||
| 28 | -MockEmptyIO::MockEmptyIO() | ||
| 29 | -{ | ||
| 30 | -} | ||
| 31 | - | ||
| 32 | -MockEmptyIO::~MockEmptyIO() | ||
| 33 | -{ | ||
| 34 | -} | ||
| 35 | - | ||
| 36 | -bool MockEmptyIO::is_never_timeout(int64_t /*timeout_us*/) | ||
| 37 | -{ | ||
| 38 | - return true; | ||
| 39 | -} | ||
| 40 | - | ||
| 41 | -int MockEmptyIO::read_fully(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | ||
| 42 | -{ | ||
| 43 | - return ERROR_SUCCESS; | ||
| 44 | -} | ||
| 45 | - | ||
| 46 | -int MockEmptyIO::write(const void* /*buf*/, size_t /*size*/, ssize_t* /*nwrite*/) | ||
| 47 | -{ | ||
| 48 | - return ERROR_SUCCESS; | ||
| 49 | -} | ||
| 50 | - | ||
| 51 | -void MockEmptyIO::set_recv_timeout(int64_t /*timeout_us*/) | ||
| 52 | -{ | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | -int64_t MockEmptyIO::get_recv_timeout() | ||
| 56 | -{ | ||
| 57 | - return -1; | ||
| 58 | -} | ||
| 59 | - | ||
| 60 | -int64_t MockEmptyIO::get_recv_bytes() | ||
| 61 | -{ | ||
| 62 | - return -1; | ||
| 63 | -} | ||
| 64 | - | ||
| 65 | -int MockEmptyIO::get_recv_kbps() | ||
| 66 | -{ | ||
| 67 | - return 0; | ||
| 68 | -} | ||
| 69 | - | ||
| 70 | -void MockEmptyIO::set_send_timeout(int64_t /*timeout_us*/) | ||
| 71 | -{ | ||
| 72 | -} | ||
| 73 | - | ||
| 74 | -int64_t MockEmptyIO::get_send_timeout() | ||
| 75 | -{ | ||
| 76 | - return 0; | ||
| 77 | -} | ||
| 78 | - | ||
| 79 | -int64_t MockEmptyIO::get_send_bytes() | ||
| 80 | -{ | ||
| 81 | - return 0; | ||
| 82 | -} | ||
| 83 | - | ||
| 84 | -int MockEmptyIO::get_send_kbps() | ||
| 85 | -{ | ||
| 86 | - return 0; | ||
| 87 | -} | ||
| 88 | - | ||
| 89 | -int MockEmptyIO::writev(const iovec */*iov*/, int /*iov_size*/, ssize_t* /*nwrite*/) | ||
| 90 | -{ | ||
| 91 | - return ERROR_SUCCESS; | ||
| 92 | -} | ||
| 93 | - | ||
| 94 | -int MockEmptyIO::read(const void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | ||
| 95 | -{ | ||
| 96 | - return ERROR_SUCCESS; | ||
| 97 | -} | 27 | +#include <srs_protocol_utility.hpp> |
| 98 | 28 | ||
| 99 | // verify the sha256 | 29 | // verify the sha256 |
| 100 | VOID TEST(HandshakeTest, OpensslSha256) | 30 | VOID TEST(HandshakeTest, OpensslSha256) |
| @@ -124,6 +54,37 @@ VOID TEST(HandshakeTest, OpensslSha256) | @@ -124,6 +54,37 @@ VOID TEST(HandshakeTest, OpensslSha256) | ||
| 124 | EXPECT_TRUE(srs_bytes_equals(digest, expect_digest, 32)); | 54 | EXPECT_TRUE(srs_bytes_equals(digest, expect_digest, 32)); |
| 125 | } | 55 | } |
| 126 | 56 | ||
| 57 | +// verify the dh key | ||
| 58 | +VOID TEST(HandshakeTest, DHKey) | ||
| 59 | +{ | ||
| 60 | + char pri_key[] = { | ||
| 61 | + 0x6e, 0x65, 0x69, 0x2d, 0x69, 0x2d, 0x69, 0x73, | ||
| 62 | + 0x6e, 0x69, 0x73, 0x6c, 0x65, 0x72, 0x69, 0x72, | ||
| 63 | + 0x76, 0x65, 0x72, 0x69, 0x77, 0x74, 0x2e, 0x6e, | ||
| 64 | + 0x72, 0x76, 0x72, 0x65, 0x72, 0x70, 0x72, 0x69, | ||
| 65 | + 0x69, 0x70, 0x72, 0x73, 0x6e, 0x65, 0x72, 0x72, | ||
| 66 | + 0x6e, 0x2d, 0x65, 0x74, 0x72, 0x6c, 0x69, 0x74, | ||
| 67 | + 0x69, 0x65, 0x40, 0x69, 0x69, 0x76, 0x77, 0x2d, | ||
| 68 | + 0x73, 0x65, 0x72, 0x72, 0x76, 0x73, 0x72, 0x2e, | ||
| 69 | + 0x2d, 0x76, 0x65, 0x31, 0x65, 0x6d, 0x6d, 0x73, | ||
| 70 | + 0x69, 0x73, 0x74, 0x2e, 0x74, 0x72, 0x65, 0x65, | ||
| 71 | + 0x72, 0x65, 0x2d, 0x74, 0x69, 0x31, 0x65, 0x2d, | ||
| 72 | + 0x6f, 0x77, 0x2e, 0x76, 0x77, 0x2d, 0x77, 0x72, | ||
| 73 | + 0x65, 0x65, 0x31, 0x74, 0x73, 0x70, 0x74, 0x6e, | ||
| 74 | + 0x72, 0x6e, 0x73, 0x6d, 0x2e, 0x69, 0x72, 0x2d, | ||
| 75 | + 0x65, 0x69, 0x77, 0x69, 0x76, 0x72, 0x77, 0x72, | ||
| 76 | + 0x32, 0x6e, 0x65, 0x6c, 0x2e, 0x2d, 0x6e, 0x69 | ||
| 77 | + }; | ||
| 78 | + | ||
| 79 | + char pub_key1[128]; | ||
| 80 | + openssl_generate_key(pri_key, pub_key1, 128); | ||
| 81 | + | ||
| 82 | + char pub_key2[128]; | ||
| 83 | + openssl_generate_key(pri_key, pub_key2, 128); | ||
| 84 | + | ||
| 85 | + EXPECT_FALSE(srs_bytes_equals(pub_key1, pub_key2, 128)); | ||
| 86 | +} | ||
| 87 | + | ||
| 127 | // flash will sendout a c0c1 encrypt by ssl. | 88 | // flash will sendout a c0c1 encrypt by ssl. |
| 128 | VOID TEST(HandshakeTest, VerifyFPC0C1) | 89 | VOID TEST(HandshakeTest, VerifyFPC0C1) |
| 129 | { | 90 | { |
| @@ -260,3 +221,19 @@ VOID TEST(HandshakeTest, ComplexHandshake) | @@ -260,3 +221,19 @@ VOID TEST(HandshakeTest, ComplexHandshake) | ||
| 260 | ASSERT_TRUE(is_valid); | 221 | ASSERT_TRUE(is_valid); |
| 261 | } | 222 | } |
| 262 | } | 223 | } |
| 224 | + | ||
| 225 | +VOID TEST(HandshakeTest, BytesEqual) | ||
| 226 | +{ | ||
| 227 | + char a1[] = { 0x01 }; | ||
| 228 | + char b1[] = { 0x02 }; | ||
| 229 | + char a2[] = { 0x01, 0x02 }; | ||
| 230 | + char b2[] = { 0x02, 0x03 }; | ||
| 231 | + | ||
| 232 | + EXPECT_TRUE(srs_bytes_equals(NULL, NULL, 0)); | ||
| 233 | + EXPECT_FALSE(srs_bytes_equals(a1, NULL, 1)); | ||
| 234 | + EXPECT_FALSE(srs_bytes_equals(NULL, a1, 1)); | ||
| 235 | + EXPECT_FALSE(srs_bytes_equals(a1, b1, 1)); | ||
| 236 | + EXPECT_TRUE(srs_bytes_equals(a1, a1, 1)); | ||
| 237 | + EXPECT_TRUE(srs_bytes_equals(a1, a2, 1)); | ||
| 238 | + EXPECT_FALSE(srs_bytes_equals(a1, b2, 1)); | ||
| 239 | +} |
| @@ -29,39 +29,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -29,39 +29,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 29 | */ | 29 | */ |
| 30 | #include <srs_utest.hpp> | 30 | #include <srs_utest.hpp> |
| 31 | 31 | ||
| 32 | -#include <srs_protocol_io.hpp> | ||
| 33 | #include <srs_protocol_rtmp.hpp> | 32 | #include <srs_protocol_rtmp.hpp> |
| 34 | #include <srs_protocol_handshake.hpp> | 33 | #include <srs_protocol_handshake.hpp> |
| 35 | using namespace srs; | 34 | using namespace srs; |
| 36 | 35 | ||
| 37 | -class MockEmptyIO : public ISrsProtocolReaderWriter | ||
| 38 | -{ | ||
| 39 | -public: | ||
| 40 | - MockEmptyIO(); | ||
| 41 | - virtual ~MockEmptyIO(); | ||
| 42 | -// for protocol | ||
| 43 | -public: | ||
| 44 | - virtual bool is_never_timeout(int64_t timeout_us); | ||
| 45 | -// for handshake. | ||
| 46 | -public: | ||
| 47 | - virtual int read_fully(const void* buf, size_t size, ssize_t* nread); | ||
| 48 | - virtual int write(const void* buf, size_t size, ssize_t* nwrite); | ||
| 49 | -// for protocol | ||
| 50 | -public: | ||
| 51 | - virtual void set_recv_timeout(int64_t timeout_us); | ||
| 52 | - virtual int64_t get_recv_timeout(); | ||
| 53 | - virtual int64_t get_recv_bytes(); | ||
| 54 | - virtual int get_recv_kbps(); | ||
| 55 | -// for protocol | ||
| 56 | -public: | ||
| 57 | - virtual void set_send_timeout(int64_t timeout_us); | ||
| 58 | - virtual int64_t get_send_timeout(); | ||
| 59 | - virtual int64_t get_send_bytes(); | ||
| 60 | - virtual int get_send_kbps(); | ||
| 61 | - virtual int writev(const iovec *iov, int iov_size, ssize_t* nwrite); | ||
| 62 | -// for protocol/amf0/msg-codec | ||
| 63 | -public: | ||
| 64 | - virtual int read(const void* buf, size_t size, ssize_t* nread); | ||
| 65 | -}; | ||
| 66 | - | ||
| 67 | #endif | 36 | #endif |
-
请 注册 或 登录 后发表评论