/
and the canonical name of the encoding format.
*
* IMPORTANT: For backward compatibility, 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 key codec name.
* @return an instance of the keypair codec, or null
if none
* found.
*/
public static IKeyPairCodec 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 kpgName = name.substring(0, i);
String formatName = name.substring(i + 1);
return getInstance(kpgName, formatName);
}
/**
* Returns an instance of a keypair codec given the canonical name of the
* key-pair algorithm, and the name of the encoding format to use when
* externalizing the keys.
*
* @param name the case-insensitive key-pair algorithm name.
* @param format the name of the encoding format to use when externalizing the
* keys generated by the key-pair algorithm.
* @return an instance of the key-pair codec, or null
if none
* found.
*/
public static IKeyPairCodec getInstance(String name, String format)
{
int formatID = FormatUtil.getFormatID(format);
if (formatID == 0)
return null;
return getInstance(name, formatID);
}
/**
* Returns an instance of a keypair codec given the canonical name of the
* key-pair algorithm, and the identifier of the format to use when
* externalizing the keys.
*
* @param name the case-insensitive key-pair algorithm name.
* @param formatID the identifier of the format to use when externalizing the
* keys generated by the key-pair algorithm.
* @return an instance of the key-pair codec, or null
if none
* found.
*/
public static IKeyPairCodec 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);
case Registry.PKCS8_ENCODING_ID:
return getPKCS8Codec(name);
default:
return null;
}
}
/**
* Returns an instance of a keypair codec, given a key.
*
* @param key the key to encode.
* @return an instance of the keypair codec, or null
if none
* found.
*/
public static IKeyPairCodec getInstance(Key key)
{
if (key == null)
return null;
String format = key.getFormat();
int formatID = FormatUtil.getFormatID(format);
if (formatID == 0)
return null;
switch (formatID)
{
case Registry.RAW_ENCODING_ID:
return getRawCodec(key);
case Registry.X509_ENCODING_ID:
return getX509Codec(key);
case Registry.PKCS8_ENCODING_ID:
return getPKCS8Codec(key);
default:
return null;
}
}
/**
* Returns a {@link Set} of supported key-pair codec names.
*
* @return a {@link Set} of the names of supported key-pair codec (Strings).
*/
public static synchronized final Setnull
if none exists.
*/
private static IKeyPairCodec getRawCodec(String name)
{
IKeyPairCodec result = null;
if (name.equalsIgnoreCase(Registry.DSA_KPG)
|| name.equals(Registry.DSS_KPG))
result = new DSSKeyPairRawCodec();
else if (name.equalsIgnoreCase(Registry.RSA_KPG))
result = new RSAKeyPairRawCodec();
else if (name.equalsIgnoreCase(Registry.DH_KPG))
result = makeInstance("gnu.javax.crypto.key.dh.DHKeyPairRawCodec");
else if (name.equalsIgnoreCase(Registry.SRP_KPG))
result = makeInstance("gnu.javax.crypto.key.srp6.SRPKeyPairRawCodec");
return result;
}
/**
* @param name the trimmed name of a key-pair algorithm.
* @return a X.509 format codec for the designated key-pair algorithm, or
* null
if none exists.
*/
private static IKeyPairCodec getX509Codec(String name)
{
IKeyPairCodec result = null;
if (name.equalsIgnoreCase(Registry.DSA_KPG)
|| name.equals(Registry.DSS_KPG))
result = new DSSKeyPairX509Codec();
else if (name.equalsIgnoreCase(Registry.RSA_KPG))
result = new RSAKeyPairX509Codec();
else if (name.equalsIgnoreCase(Registry.DH_KPG))
result = makeInstance("gnu.javax.crypto.key.dh.DHKeyPairX509Codec");
return result;
}
/**
* @param name the trimmed name of a key-pair algorithm.
* @return a PKCS#8 format codec for the designated key-pair algorithm, or
* null
if none exists.
*/
private static IKeyPairCodec getPKCS8Codec(String name)
{
IKeyPairCodec result = null;
if (name.equalsIgnoreCase(Registry.DSA_KPG)
|| name.equals(Registry.DSS_KPG))
result = new DSSKeyPairPKCS8Codec();
else if (name.equalsIgnoreCase(Registry.RSA_KPG))
result = new RSAKeyPairPKCS8Codec();
else if (name.equalsIgnoreCase(Registry.DH_KPG))
result = makeInstance("gnu.javax.crypto.key.dh.DHKeyPairPKCS8Codec");
return result;
}
/**
* @param key a {@link Key} for which we want to return a Raw codec.
* @return the Raw codec corresponding to the key, or null
if
* none exists for this key.
*/
private static IKeyPairCodec getRawCodec(Key key)
{
IKeyPairCodec result = null;
if ((key instanceof DSSPublicKey) || (key instanceof DSSPrivateKey))
result = new DSSKeyPairRawCodec();
else if ((key instanceof GnuRSAPublicKey)
|| (key instanceof GnuRSAPrivateKey))
result = new RSAKeyPairRawCodec();
else if (matches(key, "gnu.javax.crypto.key.dh.GnuDHPublicKey")
|| matches(key, "gnu.javax.crypto.key.dh.GnuDHPrivateKey"))
result = makeInstance("gnu.javax.crypto.key.dh.DHKeyPairRawCodec");
else if (matches(key, "gnu.javax.crypto.key.srp6.SRPPublicKey")
|| matches(key, "gnu.javax.crypto.key.srp6.SRPPrivateKey"))
result = makeInstance("gnu.javax.crypto.key.srp6.SRPKeyPairRawCodec");
return result;
}
/**
* @param key a {@link Key} for which we want to return an X.509 codec.
* @return the X.509 codec corresponding to the key, or null
if
* none exists for this key.
*/
private static IKeyPairCodec getX509Codec(Key key)
{
IKeyPairCodec result = null;
if (key instanceof DSSPublicKey)
result = new DSSKeyPairX509Codec();
else if (key instanceof GnuRSAPublicKey)
result = new RSAKeyPairX509Codec();
return result;
}
/**
* @param key a {@link Key} for which we want to return a PKCS#8 codec.
* @return the PKCS#8 codec corresponding to the key, or null
if
* none exists for this key.
*/
private static IKeyPairCodec getPKCS8Codec(Key key)
{
IKeyPairCodec result = null;
if (key instanceof DSSPrivateKey)
result = new DSSKeyPairPKCS8Codec();
else if (key instanceof GnuRSAPrivateKey)
result = new RSAKeyPairPKCS8Codec();
return result;
}
}