From ad3bd7796af611a03201097988711fa729138ac5 Mon Sep 17 00:00:00 2001 From: Werner Dittmann Date: Sun, 16 Oct 2011 07:31:50 +0000 Subject: [PATCH] New ZRTP library that supports trusted MitM/PBX feature and implement SRTCP handling. --- lib/installer-exclude/zrtp4j-light.jar | Bin 174522 -> 181719 bytes .../communicator/impl/neomedia/RawPacket.java | 64 +- .../transform/srtp/SRTCPCryptoContext.java | 648 ++++++++++++++++++ .../transform/srtp/SRTCPTransformer.java | 43 ++ .../transform/srtp/SRTPTransformEngine.java | 19 + ...Transformer.java => ZRTCPTransformer.java} | 38 +- .../transform/zrtp/ZRTPTransformEngine.java | 136 +++- 7 files changed, 906 insertions(+), 42 deletions(-) create mode 100644 src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPCryptoContext.java rename src/net/java/sip/communicator/impl/neomedia/transform/zrtp/{ZRTPCTransformer.java => ZRTCPTransformer.java} (58%) diff --git a/lib/installer-exclude/zrtp4j-light.jar b/lib/installer-exclude/zrtp4j-light.jar index e088c191e59d967a2c3ee3e723a83d1f1aff7ab7..f5485391a10ead0785521bf12f05ba40f57cb20e 100755 GIT binary patch delta 65314 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°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 CsvsHw delta 58359 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 eMa}%VKJafY8F467oz)NHhvATghu buffer.length) - { - byte[] newBuffer = new byte[length + offset + len]; - System.arraycopy(this.buffer, 0, newBuffer, 0, length+offset); + } + + // re-allocate internal buffer if it is too small + if ((this.length + len) > (buffer.length - this.offset)) { + byte[] newBuffer = new byte[this.length + len]; + System.arraycopy(this.buffer, this.offset, newBuffer, 0, this.length); + this.offset = 0; this.buffer = newBuffer; } - System.arraycopy(data, 0, buffer, length + offset, len); - this.length += len; + // append data + System.arraycopy(data, 0, this.buffer, this.length, len); + this.length = this.length + len; + } /** @@ -489,6 +510,16 @@ public int getSSRC() return (int)(readUnsignedIntAsLong(8) & 0xffffffff); } + /** + * Get RTCP SSRC from a RTCP packet + * + * @param pkt the source RTP packet + * @return RTP SSRC from source RTP packet + */ + public long GetRTCPSSRC() + { + return (int)(readUnsignedIntAsLong(4) & 0xffffffff); + } /** * Get RTP sequence number from a RTP packet * @@ -499,6 +530,17 @@ public int getSequenceNumber() return readUnsignedShortAsInt(2); } + /** + * Get SRTCP sequence number from a SRTCP packet + * + * @param pkt the source SRTCP packet + * @return SRTCP sequence num from source packet + */ + public int getSRTCPIndex(int authTagLen) + { + int offset = getLength() - (4 + authTagLen); + return readInt(offset); + } /** * Test whether if a RTP packet is padded * diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPCryptoContext.java b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPCryptoContext.java new file mode 100644 index 000000000..63e982db3 --- /dev/null +++ b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPCryptoContext.java @@ -0,0 +1,648 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + * + * + * Some of the code in this class is derived from ccRtp's SRTP implementation, + * which has the following copyright notice: + * + Copyright (C) 2004-2006 the Minisip Team + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +package net.java.sip.communicator.impl.neomedia.transform.srtp; + +import net.java.sip.communicator.impl.neomedia.*; + +import org.bouncycastle.crypto.digests.SHA1Digest; +import org.bouncycastle.crypto.macs.*; +import org.bouncycastle.crypto.params.KeyParameter; +import org.bouncycastle.crypto.params.ParametersForSkein; +import org.bouncycastle.crypto.BlockCipher; +import org.bouncycastle.crypto.Mac; + +import org.bouncycastle.crypto.engines.AESFastEngine; +import org.bouncycastle.crypto.engines.TwofishEngine; + + +/** + * SRTPCryptoContext class is the core class of SRTP implementation. + * There can be multiple SRTP sources in one SRTP session. And each SRTP stream + * has a corresponding SRTPCryptoContext object, identified by SSRC. In this + * way, different sources can be protected independently. + * + * SRTPCryptoContext class acts as a manager class and maintains all the + * information used in SRTP transformation. It is responsible for deriving + * encryption keys / salting keys / authentication keys from master keys. And + * it will invoke certain class to encrypt / decrypt (transform / reverse + * transform) RTP packets. It will hold a replay check db and do replay check + * against incoming packets. + * + * Refer to section 3.2 in RFC3711 for detailed description of cryptographic + * context. + * + * Cryptographic related parameters, i.e. encryption mode / authentication mode, + * master encryption key and master salt key are determined outside the scope + * of SRTP implementation. They can be assigned manually, or can be assigned + * automatically using some key management protocol, such as MIKEY (RFC3880) or + * Phil Zimmermann's ZRTP protocol. + * + * @author Bing SU (nova.su@gmail.com) + */ +public class SRTCPCryptoContext +{ + /** + * The replay check windows size + */ + private static final long REPLAY_WINDOW_SIZE = 64; + + /** + * RTCP SSRC of this cryptographic context + */ + private long ssrc; + + /** + * Master key identifier + */ + private byte[] mki; + + /** + * Index received so far + */ + private int receivedIndex = 0; + + /** + * Index sent so far + */ + private int sentIndex = 0; + + /** + * Bit mask for replay check + */ + private long replayWindow; + + /** + * Master encryption key + */ + private byte[] masterKey; + + /** + * Master salting key + */ + private byte[] masterSalt; + + /** + * Derived session encryption key + */ + private byte[] encKey; + + /** + * Derived session authentication key + */ + private byte[] authKey; + + /** + * Derived session salting key + */ + private byte[] saltKey; + + /** + * Encryption / Authentication policy for this session + */ + private final SRTPPolicy policy; + + /** + * The HMAC object we used to do packet authentication + */ + private Mac mac; // used for various HMAC computations + + // The symmetric cipher engines we need here + private BlockCipher cipher = null; + private BlockCipher cipherF8 = null; // used inside F8 mode only + + // implements the counter cipher mode for RTP according to RFC 3711 + private final SRTPCipherCTR cipherCtr = new SRTPCipherCTR(); + + // Here some fields that a allocated here or in constructor. The methods + // use these fields to avoid too many new operations + + private final byte[] tagStore; + private final byte[] ivStore = new byte[16]; + private final byte[] rbStore = new byte[4]; + + // this is some working store, used by some methods to avoid new operations + // the methods must use this only to store some reults for immediate processing + private final byte[] tempStore = new byte[100]; + + /** + * Construct an empty SRTPCryptoContext using ssrc. + * The other parameters are set to default null value. + * + * @param ssrc SSRC of this SRTPCryptoContext + */ + public SRTCPCryptoContext(long ssrcIn) + { + ssrc = ssrcIn; + mki = null; + masterKey = null; + masterSalt = null; + encKey = null; + authKey = null; + saltKey = null; + policy = null; + tagStore = null; + } + + /** + * Construct a normal SRTPCryptoContext based on the given parameters. + * + * @param ssrc + * the RTP SSRC that this SRTP cryptographic context protects. + * @param masterKey + * byte array holding the master key for this SRTP cryptographic + * context. Refer to chapter 3.2.1 of the RFC about the role of + * the master key. + * @param masterSalt + * byte array holding the master salt for this SRTP cryptographic + * context. It is used to computer the initialization vector that + * in turn is input to compute the session key, session + * authentication key and the session salt. + * @param policy + * SRTP policy for this SRTP cryptographic context, defined the + * encryption algorithm, the authentication algorithm, etc + */ + public SRTCPCryptoContext(long ssrcIn, + byte[] masterK, byte[] masterS, SRTPPolicy policyIn) + { + ssrc = ssrcIn; + mki = null; + + policy = policyIn; + + masterKey = new byte[policy.getEncKeyLength()]; + System.arraycopy(masterK, 0, masterKey, 0, policy + .getEncKeyLength()); + + masterSalt = new byte[policy.getSaltKeyLength()]; + System.arraycopy(masterS, 0, masterSalt, 0, policy + .getSaltKeyLength()); + + switch (policy.getEncType()) { + case SRTPPolicy.NULL_ENCRYPTION: + encKey = null; + saltKey = null; + break; + + case SRTPPolicy.AESCM_ENCRYPTION: + cipher = new AESFastEngine(); + encKey = new byte[this.policy.getEncKeyLength()]; + saltKey = new byte[this.policy.getSaltKeyLength()]; + + case SRTPPolicy.AESF8_ENCRYPTION: + cipherF8 = new AESFastEngine(); + break; + + case SRTPPolicy.TWOFISH_ENCRYPTION: + cipher = new TwofishEngine(); + encKey = new byte[this.policy.getEncKeyLength()]; + saltKey = new byte[this.policy.getSaltKeyLength()]; + + case SRTPPolicy.TWOFISHF8_ENCRYPTION: + cipherF8 = new TwofishEngine(); + break; + } + + switch (policy.getAuthType()) { + case SRTPPolicy.NULL_AUTHENTICATION: + authKey = null; + tagStore = null; + break; + + case SRTPPolicy.HMACSHA1_AUTHENTICATION: + mac = new HMac(new SHA1Digest()); + authKey = new byte[policy.getAuthKeyLength()]; + tagStore = new byte[mac.getMacSize()]; + break; + + case SRTPPolicy.SKEIN_AUTHENTICATION: + mac = new SkeinMac(); + authKey = new byte[policy.getAuthKeyLength()]; + tagStore = new byte[policy.getAuthTagLength()]; + break; + + default: + tagStore = null; + } + } + + /** + * Get the authentication tag length of this SRTP cryptographic context + * + * @return the authentication tag length of this SRTP cryptographic context + */ + public int getAuthTagLength() { + return policy.getAuthTagLength(); + } + + /** + * Get the MKI length of this SRTP cryptographic context + * + * @return the MKI length of this SRTP cryptographic context + */ + public int getMKILength() { + if (mki != null) { + return mki.length; + } else { + return 0; + } + } + + /** + * Get the SSRC of this SRTP cryptographic context + * + * @return the SSRC of this SRTP cryptographic context + */ + public long getSSRC() { + return ssrc; + } + + /** + * Transform a RTP packet into a SRTP packet. + * This method is called when a normal RTP packet ready to be sent. + * + * Operations done by the transformation may include: encryption, using + * either Counter Mode encryption, or F8 Mode encryption, adding + * authentication tag, currently HMC SHA1 method. + * + * Both encryption and authentication functionality can be turned off + * as long as the SRTPPolicy used in this SRTPCryptoContext is requires no + * encryption and no authentication. Then the packet will be sent out + * untouched. However this is not encouraged. If no SRTP feature is enabled, + * then we shall not use SRTP TransformConnector. We should use the original + * method (RTPManager managed transportation) instead. + * + * @param pkt the RTP packet that is going to be sent out + */ + public void transformPacket(RawPacket pkt) { + + boolean encrypt = false; + /* Encrypt the packet using Counter Mode encryption */ + if (policy.getEncType() == SRTPPolicy.AESCM_ENCRYPTION || + policy.getEncType() == SRTPPolicy.TWOFISH_ENCRYPTION) { + processPacketAESCM(pkt, sentIndex); + encrypt = true; + } + + /* Encrypt the packet using F8 Mode encryption */ + else if (policy.getEncType() == SRTPPolicy.AESF8_ENCRYPTION || + policy.getEncType() == SRTPPolicy.TWOFISHF8_ENCRYPTION) { + processPacketAESF8(pkt, sentIndex); + encrypt = true; + } + int index = 0; + if (encrypt) + index = sentIndex | 0x80000000; + + // Grow packet storage in one step + pkt.grow(4 + policy.getAuthTagLength()); + + // Authenticate the packet + // The authenticate method gets the index via parameter and stores + // it in network order in rbStore variable. + if (policy.getAuthType() != SRTPPolicy.NULL_AUTHENTICATION) { + authenticatePacket(pkt, index); + pkt.append(rbStore, 4); + pkt.append(tagStore, policy.getAuthTagLength()); + } + sentIndex++; + sentIndex &= ~0x80000000; // clear possible overflow + } + + /** + * Transform a SRTCP packet into a RTCP packet. + * This method is called when a SRTCP packet was received. + * + * Operations done by the this operation include: + * Authentication check, Packet replay check and decryption. + * + * Both encryption and authentication functionality can be turned off + * as long as the SRTPPolicy used in this SRTPCryptoContext requires no + * encryption and no authentication. Then the packet will be sent out + * untouched. However this is not encouraged. If no SRTCP feature is enabled, + * then we shall not use SRTP TransformConnector. We should use the original + * method (RTPManager managed transportation) instead. + * + * @param pkt the received RTCP packet + * @return true if the packet can be accepted + * false if authentication or replay check failed + */ + public boolean reverseTransformPacket(RawPacket pkt) { + + boolean decrypt = false; + int tagLength = policy.getAuthTagLength(); + int indexEflag = pkt.getSRTCPIndex(tagLength); + + if ((indexEflag & 0x80000000) == 0x80000000) + decrypt = true; + + int index = indexEflag & ~0x80000000; + + /* Replay control */ + if (!checkReplay(index)) { + return false; + + } + /* Authenticate the packet */ + if (policy.getAuthType() != SRTPPolicy.NULL_AUTHENTICATION) { + + // get original authentication data and store in tempStore + pkt.readRegionToBuff(pkt.getLength() - tagLength, tagLength, + tempStore); + + // Shrink packet to remove the authentication tag and index + // because this is part of authenicated data + pkt.shrink(tagLength + 4); + + // compute, then save authentication in tagStore + authenticatePacket(pkt, indexEflag); + + for (int i = 0; i < tagLength; i++) { + if ((tempStore[i] & 0xff) == (tagStore[i] & 0xff)) + continue; + else + return false; + } + } + + if (decrypt) { + /* Decrypt the packet using Counter Mode encryption */ + if (policy.getEncType() == SRTPPolicy.AESCM_ENCRYPTION + || policy.getEncType() == SRTPPolicy.TWOFISH_ENCRYPTION) { + processPacketAESCM(pkt, index); + } + + /* Decrypt the packet using F8 Mode encryption */ + else if (policy.getEncType() == SRTPPolicy.AESF8_ENCRYPTION + || policy.getEncType() == SRTPPolicy.TWOFISHF8_ENCRYPTION) { + processPacketAESF8(pkt, index); + } + } + update(index); + + return true; + } + + /** + * Perform Counter Mode AES encryption / decryption + * @param pkt the RTP packet to be encrypted / decrypted + */ + public void processPacketAESCM(RawPacket pkt, int index) { + long ssrc = pkt.GetRTCPSSRC(); + + /* Compute the CM IV (refer to chapter 4.1.1 in RFC 3711): + * + * k_s XX XX XX XX XX XX XX XX XX XX XX XX XX XX + * SSRC XX XX XX XX + * index XX XX XX XX + * ------------------------------------------------------XOR + * IV XX XX XX XX XX XX XX XX XX XX XX XX XX XX 00 00 + * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + */ + ivStore[0] = saltKey[0]; + ivStore[1] = saltKey[1]; + ivStore[2] = saltKey[2]; + ivStore[3] = saltKey[3]; + + // The shifts transform the ssrc and index into network order + ivStore[4] = (byte) (((ssrc >> 24) & 0xff) ^ this.saltKey[4]); + ivStore[5] = (byte) (((ssrc >> 16) & 0xff) ^ this.saltKey[5]); + ivStore[6] = (byte) (((ssrc >> 8) & 0xff) ^ this.saltKey[6]); + ivStore[7] = (byte) ((ssrc & 0xff) ^ this.saltKey[7]); + + ivStore[8] = saltKey[8]; + ivStore[9] = saltKey[9]; + + ivStore[10] = (byte) (((index >> 24) & 0xff) ^ this.saltKey[10]); + ivStore[11] = (byte) (((index >> 16) & 0xff) ^ this.saltKey[11]); + ivStore[12] = (byte) (((index >> 8) & 0xff) ^ this.saltKey[12]); + ivStore[13] = (byte) ((index & 0xff) ^ this.saltKey[13]); + + ivStore[14] = ivStore[15] = 0; + + // Encrypted part excludes fixed header (8 bytes) + final int payloadOffset = 8; + final int payloadLength = pkt.getLength() - payloadOffset; + + cipherCtr.process(cipher, pkt.getBuffer(), pkt.getOffset() + payloadOffset, + payloadLength, ivStore); + } + + /** + * Perform F8 Mode AES encryption / decryption + * + * @param pkt the RTP packet to be encrypted / decrypted + */ + public void processPacketAESF8(RawPacket pkt, int index) { + // byte[] iv = new byte[16]; + + // 4 bytes of the iv are zero + // the first byte of the RTP header is not used. + ivStore[0] = 0; + ivStore[1] = 0; + ivStore[2] = 0; + ivStore[3] = 0; + + // Need the encryption flag + index = index | 0x80000000; + + // set the index and the encrypt flag in network order into IV + ivStore[4] = (byte) (index >> 24); + ivStore[5] = (byte) (index >> 16); + ivStore[6] = (byte) (index >> 8); + ivStore[7] = (byte) index; + + // The fixed header follows and fills the rest of the IV + System.arraycopy(pkt.getBuffer(), pkt.getOffset(), ivStore, 8, 8); + + // Encrypted part excludes fixed header (8 bytes), index (4 bytes), and + // authentication tag (variable according to policy) + final int payloadOffset = 8; + final int payloadLength = pkt.getLength() - (4 + policy.getAuthTagLength()); + + SRTPCipherF8.process(cipher, pkt.getBuffer(), pkt.getOffset() + payloadOffset, + payloadLength, ivStore, encKey, saltKey, cipherF8); + } + + /** + * Authenticate a packet. + * + * Calculated authentication tag is stored in tagStore area. + * + * @param pkt the RTP packet to be authenticated + */ + private void authenticatePacket(RawPacket pkt, int index) { + + mac.update(pkt.getBuffer(), 0, pkt.getLength()); + // byte[] rb = new byte[4]; + rbStore[0] = (byte) (index >> 24); + rbStore[1] = (byte) (index >> 16); + rbStore[2] = (byte) (index >> 8); + rbStore[3] = (byte) index; + mac.update(rbStore, 0, rbStore.length); + mac.doFinal(tagStore, 0); + } + + /** + * Checks if a packet is a replayed on based on its sequence number. + * + * This method supports a 64 packet history relative the the given + * sequence number. + * + * Sequence Number is guaranteed to be real (not faked) through + * authentication. + * + * @param index index number of the SRTCP packet + * @return true if this sequence number indicates the packet is not a + * replayed one, false if not + */ + boolean checkReplay(int index) { + // compute the index of previously received packet and its + // delta to the new received packet + long delta = index - receivedIndex; + + if (delta > 0) { + /* Packet not yet received */ + return true; + } else { + if (-delta > REPLAY_WINDOW_SIZE) { + /* Packet too old */ + return false; + } else { + if (((this.replayWindow >> (-delta)) & 0x1) != 0) { + /* Packet already received ! */ + return false; + } else { + /* Packet not yet received */ + return true; + } + } + } + } + + /** + * Compute the initialization vector, used later by encryption algorithms, + * based on the label. + * + * @param label label specified for each type of iv + */ + private void computeIv(byte label) { + + for (int i = 0; i < 14; i++) { + ivStore[i] = masterSalt[i]; + } + ivStore[7] ^= label; + ivStore[14] = ivStore[15] = 0; + } + + /** + * Derives the srtcp session keys from the master key. + * + */ + public void deriveSrtcpKeys() { + // compute the session encryption key + byte label = 3; + computeIv(label); + + KeyParameter encryptionKey = new KeyParameter(masterKey); + cipher.init(true, encryptionKey); + cipherCtr.getCipherStream(cipher, encKey, policy.getEncKeyLength(), ivStore); + + if (authKey != null) { + label = 4; + computeIv(label); + cipherCtr.getCipherStream(cipher, authKey, policy.getAuthKeyLength(), ivStore); + + switch ((policy.getAuthType())) { + case SRTPPolicy.HMACSHA1_AUTHENTICATION: + KeyParameter key = new KeyParameter(authKey); + mac.init(key); + break; + + case SRTPPolicy.SKEIN_AUTHENTICATION: + // Skein MAC uses number of bits as MAC size, not just bytes + ParametersForSkein pfs = new ParametersForSkein(new KeyParameter(authKey), + ParametersForSkein.Skein512, tagStore.length*8); + mac.init(pfs); + break; + } + } + // compute the session salt + label = 5; + computeIv(label); + cipherCtr.getCipherStream(cipher, saltKey, policy.getSaltKeyLength(), ivStore); + + // As last step: initialize cipher with derived encryption key. + encryptionKey = new KeyParameter(encKey); + cipher.init(true, encryptionKey); + } + + + /** + * Update the SRTP packet index. + * + * This method is called after all checks were successful. + * + * @param index index number of the accepted packet + */ + private void update(int index) { + int delta = receivedIndex - index; + + /* update the replay bit mask */ + if( delta > 0 ){ + replayWindow = replayWindow << delta; + replayWindow |= 1; + } + else { + replayWindow |= ( 1 << delta ); + } + + receivedIndex = index; + } + + /** + * Derive a new SRTPCryptoContext for use with a new SSRC + * + * This method returns a new SRTPCryptoContext initialized with the data of + * this SRTPCryptoContext. Replacing the SSRC, Roll-over-Counter, and the + * key derivation rate the application cab use this SRTPCryptoContext to + * encrypt / decrypt a new stream (Synchronization source) inside one RTP + * session. + * + * Before the application can use this SRTPCryptoContext it must call the + * deriveSrtpKeys method. + * + * @param ssrc + * The SSRC for this context + * @return a new SRTPCryptoContext with all relevant data set. + */ + public SRTCPCryptoContext deriveContext(long ssrc) { + SRTCPCryptoContext pcc = null; + pcc = new SRTCPCryptoContext(ssrc, masterKey, + masterSalt, policy); + return pcc; + } +} diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPTransformer.java b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPTransformer.java index 876b5bb49..169aea29a 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPTransformer.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTCPTransformer.java @@ -6,6 +6,8 @@ */ package net.java.sip.communicator.impl.neomedia.transform.srtp; +import java.util.Hashtable; + import net.java.sip.communicator.impl.neomedia.*; import net.java.sip.communicator.impl.neomedia.transform.*; @@ -21,6 +23,13 @@ public class SRTCPTransformer implements PacketTransformer { + private SRTPTransformEngine engine; + + /** + * All the known SSRC's corresponding SRTCPCryptoContexts + */ + private Hashtable contexts; + /** * Constructs a SRTCPTransformer object * @@ -28,6 +37,8 @@ public class SRTCPTransformer */ public SRTCPTransformer(SRTPTransformEngine engine) { + this.engine = engine; + this.contexts = new Hashtable(); } /** @@ -41,6 +52,21 @@ public SRTCPTransformer(SRTPTransformEngine engine) */ public RawPacket transform(RawPacket pkt) { + long ssrc = pkt.GetRTCPSSRC(); + + SRTCPCryptoContext context = this.contexts + .get(new Long(ssrc)); + + if (context == null) { + context = this.engine.getDefaultContextControl().deriveContext(ssrc); + if (context != null) { + context.deriveSrtcpKeys(); + contexts.put(new Long(ssrc), context); + } + } + if (context != null) { + context.transformPacket(pkt); + } return pkt; } @@ -55,6 +81,23 @@ public RawPacket transform(RawPacket pkt) */ public RawPacket reverseTransform(RawPacket pkt) { + long ssrc = pkt.GetRTCPSSRC(); + SRTCPCryptoContext context = this.contexts.get(new Long(ssrc)); + + if (context == null) { + context = this.engine.getDefaultContextControl().deriveContext(ssrc); + if (context != null) { + context.deriveSrtcpKeys(); + this.contexts.put(new Long(ssrc), context); + } + } + + if (context != null) { + boolean validPacket = context.reverseTransformPacket(pkt); + if (!validPacket) { + return null; + } + } return pkt; } } diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPTransformEngine.java b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPTransformEngine.java index 48aedfb86..a69752c8b 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPTransformEngine.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPTransformEngine.java @@ -46,6 +46,12 @@ public class SRTPTransformEngine */ private SRTPCryptoContext defaultContext; + /** + * The default SRTPCryptoContext, which will be used to derive other + * contexts. + */ + private SRTCPCryptoContext defaultContextControl; + /** * Construct a SRTPTransformEngine based on given master encryption key, * master salt key and SRTP/SRTCP policy. @@ -71,6 +77,10 @@ public SRTPTransformEngine(byte[] masterKey, byte[] masterSalt, this.masterKey, this.masterSalt, this.srtpPolicy); + this.defaultContextControl = new SRTCPCryptoContext(0, + this.masterKey, + this.masterSalt, + this.srtpPolicy); } /** @@ -142,4 +152,13 @@ public SRTPCryptoContext getDefaultContext() { return this.defaultContext; } + + /** + * Get the default SRTPCryptoContext + * + * @return the default SRTPCryptoContext + */ + public SRTCPCryptoContext getDefaultContextControl() { + return this.defaultContextControl; + } } diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPCTransformer.java b/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTCPTransformer.java similarity index 58% rename from src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPCTransformer.java rename to src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTCPTransformer.java index dc854cae5..17f7a4435 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPCTransformer.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTCPTransformer.java @@ -14,15 +14,25 @@ * * @author Werner Dittmann */ -public class ZRTPCTransformer +public class ZRTCPTransformer implements PacketTransformer { + /** + * We support different SRTCP contexts for input and output traffic: + * + * Transform() uses the srtcpOut to perform encryption + * reverseTransform() uses srtcpIn to perform decryption + */ + private PacketTransformer srtcpIn = null; + + private PacketTransformer srtcpOut = null; + /** * Constructs a ZRTCPTransformer object * * @param engine The associated ZRTPTransformEngine object */ - public ZRTPCTransformer(ZRTPTransformEngine engine) + public ZRTCPTransformer(ZRTPTransformEngine engine) { } @@ -37,7 +47,10 @@ public ZRTPCTransformer(ZRTPTransformEngine engine) */ public RawPacket transform(RawPacket pkt) { - return pkt; + if (srtcpOut == null) { + return pkt; + } + return srtcpOut.transform(pkt); } /** @@ -51,6 +64,23 @@ public RawPacket transform(RawPacket pkt) */ public RawPacket reverseTransform(RawPacket pkt) { - return pkt; + if (srtcpIn == null) { + return pkt; + } + return srtcpIn.reverseTransform(pkt); + + } + /** + * @param srtcpIn the srtcpIn to set + */ + public void setSrtcpIn(PacketTransformer srtcpIn) { + this.srtcpIn = srtcpIn; + } + + /** + * @param srtcpOut the srtcpOut to set + */ + public void setSrtcpOut(PacketTransformer srtcpOut) { + this.srtcpOut = srtcpOut; } } diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java b/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java index b42f5f477..d4a1345e8 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java @@ -356,6 +356,10 @@ public void run() */ private boolean muted = false; + private boolean mitmMode = false; + + private ZRTCPTransformer zrtcpTransformer = null; + /** * Construct a ZRTPTransformEngine. * @@ -372,7 +376,7 @@ public ZRTPTransformEngine() */ public PacketTransformer getRTCPTransformer() { - return new ZRTPCTransformer(this); + return new ZRTCPTransformer(this); } /** @@ -503,7 +507,7 @@ public synchronized boolean initialize(String zidFilename, config.setStandardConfig(); } - zrtpEngine = new ZRtp(zf.getZid(), this, clientIdString, config); + zrtpEngine = new ZRtp(zf.getZid(), this, clientIdString, config, mitmMode); if (timeoutProvider == null) { @@ -796,6 +800,7 @@ public boolean srtpSecretsReady( srtpPolicy, srtpPolicy); srtpOutTransformer = engine.getRTPTransformer(); + zrtcpTransformer.setSrtcpOut(engine.getRTCPTransformer()); } else { @@ -810,6 +815,7 @@ public boolean srtpSecretsReady( .getKeyResponder(), secrets.getSaltResponder(), srtpPolicy, srtpPolicy); srtpOutTransformer = engine.getRTPTransformer(); + zrtcpTransformer.setSrtcpOut(engine.getRTCPTransformer()); } } @@ -831,6 +837,7 @@ public boolean srtpSecretsReady( .getKeyResponder(), secrets.getSaltResponder(), srtpPolicy, srtpPolicy); srtpInTransformer = engine.getRTPTransformer(); + zrtcpTransformer.setSrtcpIn(engine.getRTCPTransformer()); this.muted = false; } else @@ -846,6 +853,7 @@ public boolean srtpSecretsReady( .getKeyInitiator(), secrets.getSaltInitiator(), srtpPolicy, srtpPolicy); srtpInTransformer = engine.getRTPTransformer(); + zrtcpTransformer.setSrtcpIn(engine.getRTCPTransformer()); this.muted = false; } } @@ -979,7 +987,7 @@ public void zrtpNotSuppOther() * Zrtp ask for Enrollment. * @param info supplied info. */ - public void zrtpAskEnrollment(String info) + public void zrtpAskEnrollment(ZrtpCodes.InfoEnrollment info) { if (securityEventManager != null) { @@ -992,7 +1000,7 @@ public void zrtpAskEnrollment(String info) * @param info * @see gnu.java.zrtp.ZrtpCallback#zrtpInformEnrollment(java.lang.String) */ - public void zrtpInformEnrollment(String info) + public void zrtpInformEnrollment(ZrtpCodes.InfoEnrollment info) { if (securityEventManager != null) { @@ -1096,17 +1104,6 @@ public void setAuxSecret(byte[] data) zrtpEngine.setAuxSecret(data); } - - /** - * Sets the PBX secret data - * - * @param data The PBX secret data - */ - public void setPbxSecret(byte[] data) { - if (zrtpEngine != null) - zrtpEngine.setPbxSecret(data); - } - /** * Sets the client ID * @@ -1191,6 +1188,101 @@ public void acceptEnrollment(boolean accepted) zrtpEngine.acceptEnrollment(accepted); } + /** + * Get the commited SAS rendering algorithm for this ZRTP session. + * + * @return the commited SAS rendering algorithm + */ + public ZrtpConstants.SupportedSASTypes getSasType() { + if (zrtpEngine != null) + return zrtpEngine.getSasType(); + else + return null; + } + + /** + * Get the computed SAS hash for this ZRTP session. + * + * @return a refernce to the byte array that contains the full + * SAS hash. + */ + public byte[] getSasHash() { + if (zrtpEngine != null) + return zrtpEngine.getSasHash(); + else + return null; + } + + /** + * Send the SAS relay packet. + * + * The method creates and sends a SAS relay packet according to the ZRTP + * specifications. Usually only a MitM capable user agent (PBX) uses this + * function. + * + * @param sh the full SAS hash value + * @param render the SAS rendering algorithm + */ + public boolean sendSASRelayPacket(byte[] sh, ZrtpConstants.SupportedSASTypes render) { + if (zrtpEngine != null) + return zrtpEngine.sendSASRelayPacket(sh, render); + else + return false; + } + /** + * Check the state of the MitM mode flag. + * + * If true then this ZRTP session acts as MitM, usually enabled by a PBX + * based client (user agent) + * + * @return state of mitmMode + */ + public boolean isMitmMode() { + return mitmMode; + } + + /** + * Set the state of the MitM mode flag. + * + * If MitM mode is set to true this ZRTP session acts as MitM, usually + * enabled by a PBX based client (user agent). + * + * @param mitmMode defines the new state of the mitmMode flag + */ + public void setMitmMode(boolean mitmMode) { + this.mitmMode = mitmMode; + } + + /** + * Check the state of the enrollment mode. + * + * If true then we will set the enrollment flag (E) in the confirm + * packets and performs the enrollment actions. A MitM (PBX) enrollment service sets this flagstarted this ZRTP + * session. Can be set to true only if mitmMode is also true. + * @return status of the enrollmentMode flag. + */ + public boolean isEnrollmentMode() { + if (zrtpEngine != null) + return zrtpEngine.isEnrollmentMode(); + else + return false; + } + + /** + * Set the state of the enrollment mode. + * + * If true then we will set the enrollment flag (E) in the confirm + * packets and perform the enrollment actions. A MitM (PBX) enrollment + * service must sets this mode to true. + * + * Can be set to true only if mitmMode is also true. + * + * @param enrollmentMode defines the new state of the enrollmentMode flag + */ + public void setEnrollmentMode(boolean enrollmentMode) { + if (zrtpEngine != null) + zrtpEngine.setEnrollmentMode(enrollmentMode); + } /** * Sets signature data for the Confirm packets * @@ -1226,16 +1318,6 @@ public int getSignatureLength() return ((zrtpEngine != null) ? zrtpEngine.getSignatureLength() : 0); } - /** - * Sets the PBX enrollment flag (see chapter 8.3 of ZRTP standards) - * (The PBX part needs further development) - * @param yesNo The PBX enrollment flag - */ - public void setPBXEnrollment(boolean yesNo) - { - if (zrtpEngine != null) - zrtpEngine.setPBXEnrollment(yesNo); - } /** * Method called by the Zrtp class as result of a GoClear request from the @@ -1302,8 +1384,8 @@ public SecurityEventManager getUserCallback() * * @return the ZID data as byte array. */ - public byte[] getZid() + public byte[] getPeerZid() { - return ((zrtpEngine != null) ? zrtpEngine.getZid() : null); + return ((zrtpEngine != null) ? zrtpEngine.getPeerZid() : null); } }