/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.impl.protocol.jabber.extensions.jingle;
import ch.imvs.sdes4j.srtp.*;
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
/**
* The element containing details about an encryption algorithm that could be
* used during a jingle session.
*
* @author Emil Ivov
* @author Vincent Lucas
*/
public class CryptoPacketExtension
extends AbstractPacketExtension
{
/**
* The name of the "crypto" element.
*/
public static final String ELEMENT_NAME = "crypto";
/**
* The namespace for the "crypto" element.
* It it set to "not null" only for Gtalk SDES support (may be set to null
* once gtalk supports jingle).
*/
public static final String NAMESPACE = "urn:xmpp:jingle:apps:rtp:1";
/**
* The name of the 'crypto-suite' argument.
*/
public static final String CRYPTO_SUITE_ATTR_NAME = "crypto-suite";
/**
* The name of the 'key-params' argument.
*/
public static final String KEY_PARAMS_ATTR_NAME = "key-params";
/**
* The name of the 'session-params' argument.
*/
public static final String SESSION_PARAMS_ATTR_NAME = "session-params";
/**
* The name of the 'tag' argument.
*/
public static final String TAG_ATTR_NAME = "tag";
/**
* Creates a new {@link CryptoPacketExtension} instance with the proper
* element name and namespace.
*/
public CryptoPacketExtension()
{
super(NAMESPACE, ELEMENT_NAME);
}
/**
* Creates a new {@link CryptoPacketExtension} instance with the proper
* element name and namespace and initialises it with the parameters
* contained by the cryptoAttribute.
*
* @param cryptoAttribute The cryptoAttribute containing the crypto-suite,
* key-params, session-params and key information.
*/
public CryptoPacketExtension(SrtpCryptoAttribute cryptoAttribute)
{
this();
initialize(cryptoAttribute);
}
/**
* Initialises it with the parameters contained by the cryptoAttribute.
*
* @param cryptoAttribute The cryptoAttribute containing the crypto-suite,
* key-params, session-params and key information.
*/
private void initialize(SrtpCryptoAttribute cryptoAttribute)
{
// Encode the tag element.
this.setTag(Integer.toString(cryptoAttribute.getTag()));
// Encode the crypto-suite element.
this.setCryptoSuite(cryptoAttribute.getCryptoSuite().encode());
// Encode the key-params element.
this.setKeyParams(cryptoAttribute.getKeyParamsString());
// Encode the session-params element (optional).
String sessionParamsString = cryptoAttribute.getSessionParamsString();
if (sessionParamsString != null)
{
this.setSessionParams(sessionParamsString);
}
}
/**
* Sets the value of the crypto-suite attribute: an identifier that
* describes the encryption and authentication algorithms.
*
* @param cryptoSuite a String that describes the encryption and
* authentication algorithms.
*/
public void setCryptoSuite(String cryptoSuite)
{
super.setAttribute(CRYPTO_SUITE_ATTR_NAME, cryptoSuite);
}
/**
* Returns the value of the crypto-suite attribute.
*
* @return a String that describes the encryption and
* authentication algorithms.
*/
public String getCryptoSuite()
{
return getAttributeAsString(CRYPTO_SUITE_ATTR_NAME);
}
/**
* Returns if the current crypto suite equals the one given in parameter.
*
* @param cryptoSuite a String that describes the encryption and
* authentication algorithms.
*
* @return True if the current crypto suite equals the one given in
* parameter. False, otherwise.
*/
public boolean equalsCryptoSuite(String cryptoSuite)
{
String currentCryptoSuite = this.getCryptoSuite();
return CryptoPacketExtension.equalsStrings(
currentCryptoSuite,
cryptoSuite);
}
/**
* Sets the value of the key-params attribute that provides one or
* more sets of keying material for the crypto-suite in question).
*
* @param keyParams a String that provides one or more sets of
* keying material for the crypto-suite in question.
*/
public void setKeyParams(String keyParams)
{
super.setAttribute(KEY_PARAMS_ATTR_NAME, keyParams);
}
/**
* Returns the value of the key-params attribute.
*
* @return a String that provides one or more sets of keying
* material for the crypto-suite in question).
*/
public String getKeyParams()
{
return getAttributeAsString(KEY_PARAMS_ATTR_NAME);
}
/**
* Returns if the current key params equals the one given in parameter.
*
* @param keyParams a String that provides one or more sets of
* keying material for the crypto-suite in question.
*
* @return True if the current key params equals the one given in
* parameter. False, otherwise.
*/
public boolean equalsKeyParams(String keyParams)
{
String currentKeyParams = this.getKeyParams();
return CryptoPacketExtension.equalsStrings(
currentKeyParams,
keyParams);
}
/**
* Sets the value of the session-params attribute that provides
* transport-specific parameters for SRTP negotiation.
*
* @param sessionParams a String that provides transport-specific
* parameters for SRTP negotiation.
*/
public void setSessionParams(String sessionParams)
{
super.setAttribute(SESSION_PARAMS_ATTR_NAME, sessionParams);
}
/**
* Returns the value of the session-params attribute.
*
* @return a String that provides transport-specific parameters
* for SRTP negotiation.
*/
public String getSessionParams()
{
return getAttributeAsString(SESSION_PARAMS_ATTR_NAME);
}
/**
* Returns if the current session params equals the one given in parameter.
*
* @param sessionParams a String that provides transport-specific
* parameters for SRTP negotiation.
*
* @return True if the current session params equals the one given in
* parameter. False, otherwise.
*/
public boolean equalsSessionParams(String sessionParams)
{
String currentSessionParams = this.getSessionParams();
return CryptoPacketExtension.equalsStrings(
currentSessionParams,
sessionParams);
}
/**
* Sets the value of the tag attribute: a decimal number used as
* an identifier for a particular crypto element.
*
* @param tag a String containing a decimal number used as an
* identifier for a particular crypto element.
*/
public void setTag(String tag)
{
super.setAttribute(TAG_ATTR_NAME, tag);
}
/**
* Returns the value of the tag attribute.
*
* @return a String containing a decimal number used as an
* identifier for a particular crypto element.
*/
public String getTag()
{
return getAttributeAsString(TAG_ATTR_NAME);
}
/**
* Returns if the current tag equals the one given in parameter.
*
* @param tag a String containing a decimal number used as an
* identifier for a particular crypto element.
*
* @return True if the current tag equals the one given in parameter. False,
* otherwise.
*/
public boolean equalsTag(String tag)
{
String currentTag = this.getTag();
return CryptoPacketExtension.equalsStrings(
currentTag,
tag);
}
/**
* Returns a SrtpCryptoAttribute corresponding to this
* CryptoPAcketExtension.
*
* @return A SrtpCryptoAttribute corresponding to this
* CryptoPAcketExtension.
*/
public SrtpCryptoAttribute toSrtpCryptoAttribute()
{
// Creaates the new SrtpCryptoAttribute.
return SrtpCryptoAttribute.create(
this.getTag(),
this.getCryptoSuite(),
this.getKeyParams(),
this.getSessionParams());
}
/**
* Returns if the first String equals the second one.
*
* @param string1 A String to be compared with the second one.
* @param string2 A String to be compared with the fisrt one.
*
* @return True if both strings are null, or if they represent the same
* sequane of characters. False, otherwise.
*/
private static boolean equalsStrings(String string1, String string2)
{
return (
((string1 == null) && (string2 == null))
|| string1.equals(string2)
);
}
/**
* Returns if the current CryptoPacketExtension equals the one given in
* parameter.
*
* @param obj an object which might be an instance of CryptoPacketExtension.
*
* @return True if the object in parameter is a CryptoPAcketExtension with
* all fields (crypto-suite, key-params, session-params and tag)
* corresponding to the current one. False, otherwsise.
*/
@Override
public boolean equals(Object obj)
{
if(obj instanceof CryptoPacketExtension)
{
CryptoPacketExtension crypto = (CryptoPacketExtension) obj;
return (
crypto.equalsCryptoSuite(this.getCryptoSuite())
&& crypto.equalsKeyParams(this.getKeyParams())
&& crypto.equalsSessionParams(this.getSessionParams())
&& crypto.equalsTag(this.getTag())
);
}
return false;
}
}