fix #148, simplify the RTMP handshake key generation. 0.9.191.
正在显示
3 个修改的文件
包含
43 行增加
和
79 行删除
@@ -208,6 +208,7 @@ Supported operating systems and hardware: | @@ -208,6 +208,7 @@ Supported operating systems and hardware: | ||
208 | * 2013-10-17, Created.<br/> | 208 | * 2013-10-17, Created.<br/> |
209 | 209 | ||
210 | ## History | 210 | ## History |
211 | +* v1.0, 2014-08-06, fix [#148](https://github.com/winlinvip/simple-rtmp-server/issues/148), simplify the RTMP handshake key generation. 0.9.191. | ||
211 | * v1.0, 2014-08-06, fix [#147](https://github.com/winlinvip/simple-rtmp-server/issues/147), support identify the srs edge. 0.9.190. | 212 | * v1.0, 2014-08-06, fix [#147](https://github.com/winlinvip/simple-rtmp-server/issues/147), support identify the srs edge. 0.9.190. |
212 | * <strong>v1.0, 2014-08-03, [1.0 mainline7(0.9.189)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline7) released. 57432 lines.</strong> | 213 | * <strong>v1.0, 2014-08-03, [1.0 mainline7(0.9.189)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline7) released. 57432 lines.</strong> |
213 | * v1.0, 2014-08-03, fix [#79](https://github.com/winlinvip/simple-rtmp-server/issues/79), fix the reload remove edge assert bug. 0.9.189. | 214 | * v1.0, 2014-08-03, fix [#79](https://github.com/winlinvip/simple-rtmp-server/issues/79), fix the reload remove edge assert bug. 0.9.189. |
@@ -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 "190" | 34 | +#define VERSION_REVISION "191" |
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" |
@@ -97,18 +97,9 @@ namespace _srs_internal | @@ -97,18 +97,9 @@ namespace _srs_internal | ||
97 | "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ | 97 | "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ |
98 | "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \ | 98 | "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" \ |
99 | "FFFFFFFFFFFFFFFF" | 99 | "FFFFFFFFFFFFFFFF" |
100 | - int __openssl_generate_key( | ||
101 | - u_int8_t* _private_key, u_int8_t* _public_key, int32_t& size, | ||
102 | - DH*& pdh, int32_t& bits_count, u_int8_t*& shared_key, int32_t& shared_key_length, BIGNUM*& peer_public_key | ||
103 | - ){ | 100 | + int __openssl_initialize_dh(DH* pdh, int32_t bits_count){ |
104 | int ret = ERROR_SUCCESS; | 101 | int ret = ERROR_SUCCESS; |
105 | 102 | ||
106 | - //1. Create the DH | ||
107 | - if ((pdh = DH_new()) == NULL) { | ||
108 | - ret = ERROR_OpenSslCreateDH; | ||
109 | - return ret; | ||
110 | - } | ||
111 | - | ||
112 | //2. Create his internal p and g | 103 | //2. Create his internal p and g |
113 | if ((pdh->p = BN_new()) == NULL) { | 104 | if ((pdh->p = BN_new()) == NULL) { |
114 | ret = ERROR_OpenSslCreateP; | 105 | ret = ERROR_OpenSslCreateP; |
@@ -119,7 +110,7 @@ namespace _srs_internal | @@ -119,7 +110,7 @@ namespace _srs_internal | ||
119 | return ret; | 110 | return ret; |
120 | } | 111 | } |
121 | 112 | ||
122 | - //3. initialize p, g and key length | 113 | + //3. initialize p and g |
123 | if (BN_hex2bn(&pdh->p, RFC2409_PRIME_1024) == 0) { | 114 | if (BN_hex2bn(&pdh->p, RFC2409_PRIME_1024) == 0) { |
124 | ret = ERROR_OpenSslParseP1024; | 115 | ret = ERROR_OpenSslParseP1024; |
125 | return ret; | 116 | return ret; |
@@ -137,74 +128,33 @@ namespace _srs_internal | @@ -137,74 +128,33 @@ namespace _srs_internal | ||
137 | ret = ERROR_OpenSslGenerateDHKeys; | 128 | ret = ERROR_OpenSslGenerateDHKeys; |
138 | return ret; | 129 | return ret; |
139 | } | 130 | } |
140 | - | ||
141 | - // CreateSharedKey | ||
142 | - if (pdh == NULL) { | ||
143 | - ret = ERROR_OpenSslGenerateDHKeys; | ||
144 | - return ret; | ||
145 | - } | ||
146 | - | ||
147 | - if (shared_key_length != 0 || shared_key != NULL) { | ||
148 | - ret = ERROR_OpenSslShareKeyComputed; | ||
149 | - return ret; | ||
150 | - } | ||
151 | - | ||
152 | - shared_key_length = DH_size(pdh); | ||
153 | - if (shared_key_length <= 0 || shared_key_length > 1024) { | ||
154 | - ret = ERROR_OpenSslGetSharedKeySize; | ||
155 | - return ret; | ||
156 | - } | ||
157 | - shared_key = new u_int8_t[shared_key_length]; | ||
158 | - memset(shared_key, 0, shared_key_length); | ||
159 | - | ||
160 | - peer_public_key = BN_bin2bn(_private_key, size, 0); | ||
161 | - if (peer_public_key == NULL) { | ||
162 | - ret = ERROR_OpenSslGetPeerPublicKey; | ||
163 | - return ret; | ||
164 | - } | ||
165 | - | ||
166 | - if (DH_compute_key(shared_key, peer_public_key, pdh) == -1) { | ||
167 | - ret = ERROR_OpenSslComputeSharedKey; | ||
168 | - return ret; | ||
169 | - } | ||
170 | - | ||
171 | - // CopyPublicKey | ||
172 | - if (pdh == NULL) { | ||
173 | - ret = ERROR_OpenSslComputeSharedKey; | ||
174 | - return ret; | ||
175 | - } | ||
176 | 131 | ||
177 | - int32_t keySize = BN_num_bytes(pdh->pub_key); | ||
178 | - if ((keySize <= 0) || (size <= 0) || (keySize > size)) { | ||
179 | - //("CopyPublicKey failed due to either invalid DH state or invalid call"); return ret; | ||
180 | - ret = ERROR_OpenSslInvalidDHState; | 132 | + return ret; |
133 | + } | ||
134 | + int __openssl_copy_key(DH* pdh, char* public_key, int32_t size) | ||
135 | + { | ||
136 | + int ret = ERROR_SUCCESS; | ||
137 | + | ||
138 | + int32_t bits_count = 1024; | ||
139 | + | ||
140 | + // 2. generate the g, p, private/public key. | ||
141 | + if ((ret = __openssl_initialize_dh(pdh, bits_count)) != ERROR_SUCCESS) { | ||
181 | return ret; | 142 | return ret; |
182 | } | 143 | } |
183 | - | ||
184 | - if (BN_bn2bin(pdh->pub_key, _public_key) != keySize) { | 144 | + |
145 | + // copy public key to bytes. | ||
146 | + srs_assert(BN_num_bytes(pdh->pub_key) == size); | ||
147 | + | ||
148 | + if (BN_bn2bin(pdh->pub_key, (unsigned char*)public_key) != size) { | ||
185 | //("Unable to copy key"); return ret; | 149 | //("Unable to copy key"); return ret; |
186 | - ret = ERROR_OpenSslCopyKey; | 150 | + ret = ERROR_OpenSslCopyKey; |
187 | return ret; | 151 | return ret; |
188 | } | 152 | } |
189 | 153 | ||
190 | return ret; | 154 | return ret; |
191 | } | 155 | } |
192 | - int openssl_generate_key(char* _private_key, char* _public_key, int32_t size) | 156 | + void __openssl_free(DH* pdh) |
193 | { | 157 | { |
194 | - int ret = ERROR_SUCCESS; | ||
195 | - | ||
196 | - // Initialize | ||
197 | - DH* pdh = NULL; | ||
198 | - int32_t bits_count = 1024; | ||
199 | - u_int8_t* shared_key = NULL; | ||
200 | - int32_t shared_key_length = 0; | ||
201 | - BIGNUM* peer_public_key = NULL; | ||
202 | - | ||
203 | - ret = __openssl_generate_key( | ||
204 | - (u_int8_t*)_private_key, (u_int8_t*)_public_key, size, | ||
205 | - pdh, bits_count, shared_key, shared_key_length, peer_public_key | ||
206 | - ); | ||
207 | - | ||
208 | if (pdh != NULL) { | 158 | if (pdh != NULL) { |
209 | if (pdh->p != NULL) { | 159 | if (pdh->p != NULL) { |
210 | BN_free(pdh->p); | 160 | BN_free(pdh->p); |
@@ -217,16 +167,25 @@ namespace _srs_internal | @@ -217,16 +167,25 @@ namespace _srs_internal | ||
217 | DH_free(pdh); | 167 | DH_free(pdh); |
218 | pdh = NULL; | 168 | pdh = NULL; |
219 | } | 169 | } |
170 | + } | ||
171 | + int openssl_generate_key(char* public_key, int32_t size) | ||
172 | + { | ||
173 | + int ret = ERROR_SUCCESS; | ||
220 | 174 | ||
221 | - if (shared_key != NULL) { | ||
222 | - delete[] shared_key; | ||
223 | - shared_key = NULL; | ||
224 | - } | 175 | + // Initialize |
176 | + DH* pdh = NULL; | ||
225 | 177 | ||
226 | - if (peer_public_key != NULL) { | ||
227 | - BN_free(peer_public_key); | ||
228 | - peer_public_key = NULL; | 178 | + //1. Create the DH |
179 | + if ((pdh = DH_new()) == NULL) { | ||
180 | + ret = ERROR_OpenSslCreateDH; | ||
181 | + return ret; | ||
229 | } | 182 | } |
183 | + | ||
184 | + // generate and copy key. | ||
185 | + ret = __openssl_copy_key(pdh, public_key, size); | ||
186 | + | ||
187 | + // cleanup | ||
188 | + __openssl_free(pdh); | ||
230 | 189 | ||
231 | return ret; | 190 | return ret; |
232 | } | 191 | } |
@@ -867,7 +826,9 @@ namespace _srs_internal | @@ -867,7 +826,9 @@ namespace _srs_internal | ||
867 | srs_key_block_init(&block0.key); | 826 | srs_key_block_init(&block0.key); |
868 | srs_digest_block_init(&block1.digest); | 827 | srs_digest_block_init(&block1.digest); |
869 | 828 | ||
870 | - if ((ret = openssl_generate_key(c1->block0.key.key, block0.key.key, 128)) != ERROR_SUCCESS) { | 829 | + // directly generate the public key. |
830 | + // @see: https://github.com/winlinvip/simple-rtmp-server/issues/148 | ||
831 | + if ((ret = openssl_generate_key(block0.key.key, 128)) != ERROR_SUCCESS) { | ||
871 | srs_error("calc s1 key failed. ret=%d", ret); | 832 | srs_error("calc s1 key failed. ret=%d", ret); |
872 | return ret; | 833 | return ret; |
873 | } | 834 | } |
@@ -875,7 +836,9 @@ namespace _srs_internal | @@ -875,7 +836,9 @@ namespace _srs_internal | ||
875 | srs_digest_block_init(&block0.digest); | 836 | srs_digest_block_init(&block0.digest); |
876 | srs_key_block_init(&block1.key); | 837 | srs_key_block_init(&block1.key); |
877 | 838 | ||
878 | - if ((ret = openssl_generate_key(c1->block1.key.key, block1.key.key, 128)) != ERROR_SUCCESS) { | 839 | + // directly generate the public key. |
840 | + // @see: https://github.com/winlinvip/simple-rtmp-server/issues/148 | ||
841 | + if ((ret = openssl_generate_key(block1.key.key, 128)) != ERROR_SUCCESS) { | ||
879 | srs_error("calc s1 key failed. ret=%d", ret); | 842 | srs_error("calc s1 key failed. ret=%d", ret); |
880 | return ret; | 843 | return ret; |
881 | } | 844 | } |
-
请 注册 或 登录 后发表评论