| 733 | } |
| 734 | |
| 735 | int JLSRTP::extractAuthenticationTag(std::vector<unsigned char> srtp_packet, std::vector<unsigned char> &hash) |
| 736 | { |
| 737 | int retVal = -1; |
| 738 | std::vector<unsigned char>::iterator it = srtp_packet.begin(); |
| 739 | int authtag_pos = 0; |
| 740 | |
| 741 | assert(!_session_auth_key.empty()); |
| 742 | if (!_session_auth_key.empty()) |
| 743 | { |
| 744 | switch (_active_crypto) |
| 745 | { |
| 746 | case PRIMARY_CRYPTO: |
| 747 | { |
| 748 | switch (_primary_crypto.hmac_algorithm) |
| 749 | { |
| 750 | case HMAC_SHA1_80: |
| 751 | if (srtp_packet.size() >= JLSRTP_AUTHENTICATION_TAG_SIZE_SHA1_80) |
| 752 | { |
| 753 | authtag_pos = srtp_packet.size() - 10; |
| 754 | std::advance(it, authtag_pos); |
| 755 | hash.assign(it, srtp_packet.end()); // Fetch trailing 10 bytes (80 bits / 8 bits/byte = 10 bytes) |
| 756 | retVal = 0; |
| 757 | } |
| 758 | else |
| 759 | { |
| 760 | retVal = -2; |
| 761 | } |
| 762 | break; |
| 763 | |
| 764 | case HMAC_SHA1_32: |
| 765 | if (srtp_packet.size() >= JLSRTP_AUTHENTICATION_TAG_SIZE_SHA1_32) |
| 766 | { |
| 767 | authtag_pos = srtp_packet.size() - 4; |
| 768 | std::advance(it, authtag_pos); |
| 769 | hash.assign(it, srtp_packet.end()); // Fetch trailing 4 bytes (32 bits / 8 bits/byte = 4 bytes) |
| 770 | retVal = 0; |
| 771 | } |
| 772 | else |
| 773 | { |
| 774 | retVal = -2; |
| 775 | } |
| 776 | break; |
| 777 | |
| 778 | default: |
| 779 | // Unrecognized input value -- NO-OP... |
| 780 | retVal = -3; |
| 781 | break; |
| 782 | } |
| 783 | } |
| 784 | break; |
| 785 | |
| 786 | case SECONDARY_CRYPTO: |
| 787 | { |
| 788 | switch (_secondary_crypto.hmac_algorithm) |
| 789 | { |
| 790 | case HMAC_SHA1_80: |
| 791 | if (srtp_packet.size() >= JLSRTP_AUTHENTICATION_TAG_SIZE_SHA1_80) |
| 792 | { |