/
and the canonical name of the encoding format.
*
* When the encoding format name is missing, the Raw encoding format is
* assumed. When this is the case the trailing forward slash is discarded from
* the name.
*
* @param name the case-insensitive, possibly composed, signature codec name.
* @return an instance of the signaturecodec, or null
if none
* found.
*/
public static ISignatureCodec getInstance(String name)
{
if (name == null)
return null;
name = name.trim();
if (name.length() == 0)
return null;
if (name.startsWith("/"))
return null;
if (name.endsWith("/"))
return getInstance(name.substring(0, name.length() - 1),
Registry.RAW_ENCODING_ID);
int i = name.indexOf("/");
if (i == - 1)
return getInstance(name, Registry.RAW_ENCODING_ID);
String sigName = name.substring(0, i);
String formatName = name.substring(i + 1);
return getInstance(sigName, formatName);
}
/**
* Returns an instance of a signature codec given the canonical name of the
* signature algorithm, and that of the encoding format.
*
* @param name the case-insensitive signature algorithm name.
* @param format the name of the format to use when encodigng/decoding
* signatures generated by the named algorithm.
* @return an instance of the signature codec, or null
if none
* found.
*/
public static ISignatureCodec getInstance(String name, String format)
{
int formatID = FormatUtil.getFormatID(format);
if (formatID == 0)
return null;
return getInstance(name, formatID);
}
/**
* Returns an instance of a signature codec given the canonical name of the
* signature algorithm, and the identifier of the format to use when
* encoding/decoding signatures generated by that algorithm.
*
* @param name the case-insensitive signature algorithm name.
* @param formatID the identifier of the format to use when encoding /
* decoding signatures generated by the designated algorithm.
* @return an instance of the signature codec, or null
if none
* found.
*/
public static ISignatureCodec getInstance(String name, int formatID)
{
if (name == null)
return null;
name = name.trim();
switch (formatID)
{
case Registry.RAW_ENCODING_ID:
return getRawCodec(name);
case Registry.X509_ENCODING_ID:
return getX509Codec(name);
default:
return null;
}
}
/**
* Returns a {@link Set} of supported signature codec names.
*
* @return a {@link Set} of the names of supported signature codec (Strings).
*/
public static synchronized final Setnull
if none exists.
*/
private static ISignatureCodec getRawCodec(String name)
{
ISignatureCodec result = null;
if (name.equalsIgnoreCase(Registry.DSA_SIG)
|| name.equalsIgnoreCase(Registry.DSS_SIG))
result = new DSSSignatureRawCodec();
else
{
name = name.toLowerCase();
if (name.startsWith(Registry.RSA_PKCS1_V1_5_SIG))
result = new RSAPKCS1V1_5SignatureRawCodec();
else if (name.startsWith(Registry.RSA_PSS_SIG))
result = new RSAPSSSignatureRawCodec();
}
return result;
}
/**
* @param name the trimmed name of a signature algorithm.
* @return a X.509 format codec for the designated signature algorithm, or
* null
if none exists.
*/
private static ISignatureCodec getX509Codec(String name)
{
ISignatureCodec result = null;
if (name.equalsIgnoreCase(Registry.DSA_SIG)
|| name.equalsIgnoreCase(Registry.DSS_SIG))
result = new DSSSignatureX509Codec();
else
{
name = name.toLowerCase();
if (name.startsWith(Registry.RSA_PKCS1_V1_5_SIG))
result = new RSAPKCS1V1_5SignatureX509Codec();
}
return result;
}
}