From d4c2aa1e8e084385df9822a5469c741c3fa703f6 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 8 Aug 2014 11:34:17 +0800 Subject: [PATCH] add __openssl_compute_key to calc the shared key --- trunk/src/kernel/srs_kernel_error.hpp | 2 ++ trunk/src/rtmp/srs_protocol_handshake.cpp | 31 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 724cd828f..f071883db 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -129,6 +129,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_OpenSslSha256Final 2035 #define ERROR_OpenSslSha256EvpDigest 2036 #define ERROR_OpenSslSha256DigestSize 2037 +#define ERROR_OpenSslGetPeerPublicKey 2038 +#define ERROR_OpenSslComputeSharedKey 2039 // // system control message, // not an error, but special control logic. diff --git a/trunk/src/rtmp/srs_protocol_handshake.cpp b/trunk/src/rtmp/srs_protocol_handshake.cpp index ef0ea3572..10f3a5a85 100644 --- a/trunk/src/rtmp/srs_protocol_handshake.cpp +++ b/trunk/src/rtmp/srs_protocol_handshake.cpp @@ -202,6 +202,37 @@ namespace _srs_internal return ret; } + int __openssl_compute_key(DH* pdh, const char* peer_pub_key, int ppk_size, char* secret) + { + int ret = ERROR_SUCCESS; + + int32_t bits_count = 1024; + + // 2. generate the g, p, private/public key. + if ((ret = __openssl_initialize_dh(pdh, bits_count)) != ERROR_SUCCESS) { + return ret; + } + + // copy public key to bytes. + srs_assert(BN_num_bytes(pdh->pub_key) == ppk_size); + + BIGNUM* ppk = NULL; + if ((ppk = BN_bin2bn((const unsigned char*)peer_pub_key, ppk_size, 0)) == NULL) { + ret = ERROR_OpenSslGetPeerPublicKey; + return ret; + } + + // if failed, donot return, do cleanup. + if (DH_compute_key((unsigned char*)secret, ppk, pdh) < 0) { + ret = ERROR_OpenSslComputeSharedKey; + } + + if (ppk) { + BN_free(ppk); + } + + return ret; + } void __openssl_free(DH* pdh) { if (pdh != NULL) {