Signed-off-by: Martin Storsjö <martin@martin.st>
Samuel Pitoiset authored on 2012/07/05 20:05:46... | ... |
@@ -29,6 +29,9 @@ |
29 | 29 |
|
30 | 30 |
#define RTMP_HANDSHAKE_PACKET_SIZE 1536 |
31 | 31 |
|
32 |
+#define HMAC_IPAD_VAL 0x36 |
|
33 |
+#define HMAC_OPAD_VAL 0x5C |
|
34 |
+ |
|
32 | 35 |
/** |
33 | 36 |
* emulated Flash client version - 9.0.124.2 on Linux |
34 | 37 |
* @{ |
... | ... |
@@ -40,4 +43,18 @@ |
40 | 40 |
#define RTMP_CLIENT_VER4 2 |
41 | 41 |
/** @} */ //version defines |
42 | 42 |
|
43 |
+/** |
|
44 |
+ * Calculate HMAC-SHA2 digest for RTMP handshake packets. |
|
45 |
+ * |
|
46 |
+ * @param src input buffer |
|
47 |
+ * @param len input buffer length (should be 1536) |
|
48 |
+ * @param gap offset in buffer where 32 bytes should not be taken into account |
|
49 |
+ * when calculating digest (since it will be used to store that digest) |
|
50 |
+ * @param key digest key |
|
51 |
+ * @param keylen digest key length |
|
52 |
+ * @param dst buffer where calculated digest will be stored (32 bytes) |
|
53 |
+ */ |
|
54 |
+int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap, |
|
55 |
+ const uint8_t *key, int keylen, uint8_t *dst); |
|
56 |
+ |
|
43 | 57 |
#endif /* AVFORMAT_RTMP_H */ |
... | ... |
@@ -590,23 +590,8 @@ static int gen_bytes_read(URLContext *s, RTMPContext *rt, uint32_t ts) |
590 | 590 |
return ret; |
591 | 591 |
} |
592 | 592 |
|
593 |
-//TODO: Move HMAC code somewhere. Eventually. |
|
594 |
-#define HMAC_IPAD_VAL 0x36 |
|
595 |
-#define HMAC_OPAD_VAL 0x5C |
|
596 |
- |
|
597 |
-/** |
|
598 |
- * Calculate HMAC-SHA2 digest for RTMP handshake packets. |
|
599 |
- * |
|
600 |
- * @param src input buffer |
|
601 |
- * @param len input buffer length (should be 1536) |
|
602 |
- * @param gap offset in buffer where 32 bytes should not be taken into account |
|
603 |
- * when calculating digest (since it will be used to store that digest) |
|
604 |
- * @param key digest key |
|
605 |
- * @param keylen digest key length |
|
606 |
- * @param dst buffer where calculated digest will be stored (32 bytes) |
|
607 |
- */ |
|
608 |
-static int rtmp_calc_digest(const uint8_t *src, int len, int gap, |
|
609 |
- const uint8_t *key, int keylen, uint8_t *dst) |
|
593 |
+int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap, |
|
594 |
+ const uint8_t *key, int keylen, uint8_t *dst) |
|
610 | 595 |
{ |
611 | 596 |
struct AVSHA *sha; |
612 | 597 |
uint8_t hmac_buf[64+32] = {0}; |
... | ... |
@@ -663,9 +648,9 @@ static int rtmp_handshake_imprint_with_digest(uint8_t *buf) |
663 | 663 |
digest_pos += buf[i]; |
664 | 664 |
digest_pos = (digest_pos % 728) + 12; |
665 | 665 |
|
666 |
- ret = rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos, |
|
667 |
- rtmp_player_key, PLAYER_KEY_OPEN_PART_LEN, |
|
668 |
- buf + digest_pos); |
|
666 |
+ ret = ff_rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos, |
|
667 |
+ rtmp_player_key, PLAYER_KEY_OPEN_PART_LEN, |
|
668 |
+ buf + digest_pos); |
|
669 | 669 |
if (ret < 0) |
670 | 670 |
return ret; |
671 | 671 |
|
... | ... |
@@ -689,9 +674,9 @@ static int rtmp_validate_digest(uint8_t *buf, int off) |
689 | 689 |
digest_pos += buf[i + off]; |
690 | 690 |
digest_pos = (digest_pos % 728) + off + 4; |
691 | 691 |
|
692 |
- ret = rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos, |
|
693 |
- rtmp_server_key, SERVER_KEY_OPEN_PART_LEN, |
|
694 |
- digest); |
|
692 |
+ ret = ff_rtmp_calc_digest(buf, RTMP_HANDSHAKE_PACKET_SIZE, digest_pos, |
|
693 |
+ rtmp_server_key, SERVER_KEY_OPEN_PART_LEN, |
|
694 |
+ digest); |
|
695 | 695 |
if (ret < 0) |
696 | 696 |
return ret; |
697 | 697 |
|
... | ... |
@@ -771,13 +756,14 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt) |
771 | 771 |
} |
772 | 772 |
} |
773 | 773 |
|
774 |
- ret = rtmp_calc_digest(tosend + 1 + client_pos, 32, 0, rtmp_server_key, |
|
775 |
- sizeof(rtmp_server_key), digest); |
|
774 |
+ ret = ff_rtmp_calc_digest(tosend + 1 + client_pos, 32, 0, |
|
775 |
+ rtmp_server_key, sizeof(rtmp_server_key), |
|
776 |
+ digest); |
|
776 | 777 |
if (ret < 0) |
777 | 778 |
return ret; |
778 | 779 |
|
779 |
- ret = rtmp_calc_digest(clientdata, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0, |
|
780 |
- digest, 32, digest); |
|
780 |
+ ret = ff_rtmp_calc_digest(clientdata, RTMP_HANDSHAKE_PACKET_SIZE - 32, |
|
781 |
+ 0, digest, 32, digest); |
|
781 | 782 |
if (ret < 0) |
782 | 783 |
return ret; |
783 | 784 |
|
... | ... |
@@ -788,15 +774,15 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt) |
788 | 788 |
|
789 | 789 |
for (i = 0; i < RTMP_HANDSHAKE_PACKET_SIZE; i++) |
790 | 790 |
tosend[i] = av_lfg_get(&rnd) >> 24; |
791 |
- ret = rtmp_calc_digest(serverdata + 1 + server_pos, 32, 0, |
|
792 |
- rtmp_player_key, sizeof(rtmp_player_key), |
|
793 |
- digest); |
|
791 |
+ ret = ff_rtmp_calc_digest(serverdata + 1 + server_pos, 32, 0, |
|
792 |
+ rtmp_player_key, sizeof(rtmp_player_key), |
|
793 |
+ digest); |
|
794 | 794 |
if (ret < 0) |
795 | 795 |
return ret; |
796 | 796 |
|
797 |
- ret = rtmp_calc_digest(tosend, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0, |
|
798 |
- digest, 32, |
|
799 |
- tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32); |
|
797 |
+ ret = ff_rtmp_calc_digest(tosend, RTMP_HANDSHAKE_PACKET_SIZE - 32, 0, |
|
798 |
+ digest, 32, |
|
799 |
+ tosend + RTMP_HANDSHAKE_PACKET_SIZE - 32); |
|
800 | 800 |
if (ret < 0) |
801 | 801 |
return ret; |
802 | 802 |
|