Hi,
After my previous post concerning Crypto Java/Crypto: Encrypt your message simply with Cipher, I would expose a useful class to list the providers and algo available.
The provider org.bouncycastle.jce.provider.BouncyCastleProvider needs the adding of the bcprov-jdk15on-147.jar library to the classpath.
Then, it’s necessary to add the BC provider via the code:
1 | Security.addProvider( new BouncyCastleProvider()); |
See the Java ™ Cryptography Architecture Sun Providers Documentation : http://javasearch.developpez.com/sun/j2se/1.6.0/technotes/guides/security/SunProviders.html
Note: The Java Cryptography Extension (JCE) provider included with J2SE 1.4.x does not support RSA encryption. Because the XML Encryption defined by WS-Security is typically based on RSA encryption, in order to use WS-Security to encrypt SOAP messages you must download and install a JCE provider that supports RSA encryption.
RSA is public-key encryption technology developed by RSA Data Security, Inc. The acronym stands for Rivest, Shamir, and Adelman, the inventors of the technology.
Read the http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html and
Installing Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File
ProvidersList
001 | package com.ho.crypto.test2; |
003 | import java.security.Provider; |
004 | import java.security.Security; |
005 | import java.util.ArrayList; |
006 | import java.util.Iterator; |
007 | import java.util.List; |
009 | import org.bouncycastle.jce.provider.BouncyCastleProvider; |
011 | public class ProvidersList { |
013 | public static void listProviders() { |
014 | Provider[] providers = Security.getProviders(); |
015 | System.out.println( "Providers list" ); |
016 | for ( int i = 0 ; i < providers.length; i++) { |
017 | System.out.println( " " + (i + 1 ) + ": " + providers[i].toString()); |
019 | System.out.println(); |
022 | public static void detailledListProviders() { |
023 | Provider[] providers = Security.getProviders(); |
024 | System.out.println( "Detailled providers list" ); |
025 | for ( int i = 0 ; i < providers.length; i++) { |
026 | System.out.println( " [" + (i + 1 ) + "] " + providers[i].getName() + " v" + providers[i].getVersion() + ": " + providers[i].getInfo()); |
028 | Iterator<Provider.Service> services = getServices(providers[i]).iterator(); |
030 | String str = providers[i].getName() + ": " ; |
031 | while (services.hasNext()) { |
032 | Provider.Service service = services.next(); |
033 | System.out.print( " - " + service.toString().replace(str, "" ).replace( "aliases" , " aliases" ).replace( |
034 | "attributes" , " attributes" )); |
037 | System.out.println(); |
040 | public static void providerDetails(String providerName) { |
041 | Provider provider = Security.getProvider(providerName); |
042 | if (provider == null ) { |
043 | System.err.println( "Unknown provider '" + providerName + "'" ); |
046 | System.out.println(provider.getName() + " v" + provider.getVersion() + ": " + provider.getInfo()); |
048 | Iterator<Provider.Service> services = getServices(provider).iterator(); |
049 | while (services.hasNext()) { |
050 | Provider.Service service = services.next(); |
051 | System.out.println( " - " + service.getType() + " " + service.getAlgorithm() + " -> " + service.getClassName()); |
052 | String alias = getAlias(service); |
054 | System.out.println( " Alias : " + alias + "." ); |
056 | System.out.println(); |
059 | public static void providerDetails(String providerName, String type) { |
060 | Provider provider = Security.getProvider(providerName); |
061 | if (provider == null ) { |
062 | System.err.println( "Unknown provider '" + providerName + "'" ); |
065 | System.out.println(type + " for " + provider.getName() + " v" + provider.getVersion() + ": " + provider.getInfo()); |
067 | Iterator<Provider.Service> services = getServices(provider).iterator(); |
068 | while (services.hasNext()) { |
069 | Provider.Service service = services.next(); |
070 | if (service.getType().equalsIgnoreCase(type)) { |
071 | System.out.println( " - " + service.getAlgorithm() + " -> " + service.getClassName()); |
072 | String alias = getAlias(service); |
074 | System.out.println( " Alias : " + alias + "." ); |
077 | System.out.println(); |
080 | private static List<Provider.Service> getServices(Provider provider) { |
081 | List<Provider.Service> input = new ArrayList<Provider.Service>(); |
082 | List<Provider.Service> output = new ArrayList<Provider.Service>(); |
083 | Iterator<Provider.Service> services = provider.getServices().iterator(); |
084 | while (services.hasNext()) { |
085 | Provider.Service service = services.next(); |
088 | while (!input.isEmpty()) { |
090 | for ( int j = i + 1 ; j < input.size(); j++) { |
091 | if (isGreater(input.get(i), input.get(j))) { |
095 | output.add(input.remove(i)); |
100 | private static boolean isGreater(Provider.Service s1, Provider.Service s2) { |
101 | if (s1.getType().compareTo(s2.getType()) == 0 ) |
102 | return (s1.getAlgorithm().compareTo(s2.getAlgorithm()) > 0 ); |
103 | return (s1.getType().compareTo(s2.getType()) > 0 ); |
106 | private static String getAlias(Provider.Service service) { |
107 | String toString = service.toString(); |
108 | if (toString.contains( "aliases: [" )) { |
109 | return toString.substring(toString.indexOf( "aliases: [" ) + 10 , toString.indexOf( "]" )); |
114 | public static void main(String[] args) { |
116 | Security.addProvider( new BouncyCastleProvider()); |
120 | detailledListProviders(); |
TEST 1 : list all providers available
1 | Security.addProvider( new BouncyCastleProvider()); |
… results could be:
Depending of JDK used, several implementations of providers exist:
1: SUN version 1.6 (from Java 1.1)
2: SunRsaSign version 1.5 (from Java 1.3)
3: SunJSSE version 1.6 (from Java 1.4)
4: SunJCE version 1.6 (from Java 5)
5: SunJGSS version 1.0
6: SunSASL version 1.5
7: XMLDSig version 1.0
8: SunPCSC version 1.6 (from Java 6)
9: BC version 1.47
With jdk7.0 the provider SunEC.
TEST 2 : list the detailled classes algo, generator, cipher available for all providers
1 | Security.addProvider( new BouncyCastleProvider()); |
3 | detailledListProviders(); |
… results could be:
Detailled providers list
[1] SUN v1.6: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
- AlgorithmParameterGenerator.DSA -> sun.security.provider.DSAParameterGenerator
attributes: {ImplementedIn=Software, KeySize=1024}
...
[2] SunRsaSign v1.5: Sun RSA signature provider
- KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory
aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator
aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA
aliases: [1.2.840.113549.1.1.2, OID.1.2.840.113549.1.1.2]
attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
...
[3] SunJSSE v1.6: Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
- KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory
aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- KeyManagerFactory.NewSunX509 -> com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$X509
- KeyManagerFactory.SunX509 -> com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509
- KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator
aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- KeyStore.PKCS12 -> com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore
- SSLContext.Default -> com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl
- SSLContext.SSL -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- SSLContext.SSLv3 -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- SSLContext.TLS -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- SSLContext.TLSv1 -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA
aliases: [1.2.840.113549.1.1.2, OID.1.2.840.113549.1.1.2]
- Signature.MD5andSHA1withRSA -> com.sun.net.ssl.internal.ssl.RSASignature
- Signature.MD5withRSA -> sun.security.rsa.RSASignature$MD5withRSA
aliases: [1.2.840.113549.1.1.4, OID.1.2.840.113549.1.1.4]
- Signature.SHA1withRSA -> sun.security.rsa.RSASignature$SHA1withRSA
aliases: [1.2.840.113549.1.1.5, OID.1.2.840.113549.1.1.5, 1.3.14.3.2.29, OID.1.3.14.3.2.29]
- TrustManagerFactory.PKIX -> com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$PKIXFactory
aliases: [SunPKIX, X509, X.509]
- TrustManagerFactory.SunX509 -> com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$SimpleFactory
[4] SunJCE v1.6: SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
- AlgorithmParameterGenerator.DiffieHellman -> com.sun.crypto.provider.DHParameterGenerator
aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1]
- AlgorithmParameters.AES -> com.sun.crypto.provider.AESParameters
aliases: [Rijndael]
- AlgorithmParameters.Blowfish -> com.sun.crypto.provider.BlowfishParameters
- AlgorithmParameters.DES -> com.sun.crypto.provider.DESParameters
...
[5] SunJGSS v1.0: Sun (Kerberos v5, SPNEGO)
- GssApiMechanism.1.2.840.113554.1.2.2 -> sun.security.jgss.krb5.Krb5MechFactory
- GssApiMechanism.1.3.6.1.5.5.2 -> sun.security.jgss.spnego.SpNegoMechFactory
[6] SunSASL v1.5: Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
- SaslClientFactory.CRAM-MD5 -> com.sun.security.sasl.ClientFactoryImpl
- SaslClientFactory.DIGEST-MD5 -> com.sun.security.sasl.digest.FactoryImpl
- SaslClientFactory.EXTERNAL -> com.sun.security.sasl.ClientFactoryImpl
- SaslClientFactory.GSSAPI -> com.sun.security.sasl.gsskerb.FactoryImpl
- SaslClientFactory.PLAIN -> com.sun.security.sasl.ClientFactoryImpl
- SaslServerFactory.CRAM-MD5 -> com.sun.security.sasl.ServerFactoryImpl
- SaslServerFactory.DIGEST-MD5 -> com.sun.security.sasl.digest.FactoryImpl
- SaslServerFactory.GSSAPI -> com.sun.security.sasl.gsskerb.FactoryImpl
[7] XMLDSig v1.0: XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
- KeyInfoFactory.DOM -> org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory
- TransformService.http://www.w3.org/2000/09/xmldsig#base64 -> org.jcp.xml.dsig.internal.dom.DOMBase64Transform
aliases: [BASE64]
attributes: {MechanismType=DOM}
...
[8] SunPCSC v1.6: Sun PC/SC provider
- TerminalFactory.PC/SC -> sun.security.smartcardio.SunPCSC$Factory
[9] BC v1.47: BouncyCastle Security Provider v1.47
- AlgorithmParameterGenerator.1.2.840.113549.3.2 -> org.bouncycastle.jcajce.provider.symmetric.RC2$AlgParamGen
- AlgorithmParameterGenerator.AES -> org.bouncycastle.jcajce.provider.symmetric.AES$AlgParamGen
aliases: [2.16.840.1.101.3.4.2, 2.16.840.1.101.3.4.22, 2.16.840.1.101.3.4.42, 2.16.840.1.101.3.4.1.2, 2.16.840.1.101.3.4.1.22, 2.16.840.1.101.3.4.1.42]
...
TEST 3 : list the detailled classes algo, generator, cipher available for BC provider
1 | Security.addProvider( new BouncyCastleProvider()); |
… results could be:
BC v1.47: BouncyCastle Security Provider v1.47
- AlgorithmParameterGenerator 1.2.840.113549.3.2 -> org.bouncycastle.jcajce.provider.symmetric.RC2$AlgParamGen
- AlgorithmParameterGenerator AES -> org.bouncycastle.jcajce.provider.symmetric.AES$AlgParamGen
Alias : 2.16.840.1.101.3.4.2, 2.16.840.1.101.3.4.22, 2.16.840.1.101.3.4.42, 2.16.840.1.101.3.4.1.2, 2.16.840.1.101.3.4.1.22, 2.16.840.1.101.3.4.1.42.
...
TEST 4 : list the detailled classes cipher available for BC provider
1 | Security.addProvider( new BouncyCastleProvider()); |
3 | providerDetails( "BC" , "Cipher" ); |
… results could be:
Cipher for BC v1.47: BouncyCastle Security Provider v1.47
- 1.2.392.200011.61.1.1.1.2 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$CBC
- 1.2.392.200011.61.1.1.1.3 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$CBC
- 1.2.392.200011.61.1.1.1.4 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$CBC
- 1.2.410.200004.1.4 -> org.bouncycastle.jcajce.provider.symmetric.SEED$CBC
- 1.2.643.2.2.21 -> org.bouncycastle.jcajce.provider.symmetric.GOST28147$CBC
...
TEST 5 : list the detailled classes KeyGenerator available for BC provider
1 | Security.addProvider( new BouncyCastleProvider()); |
3 | providerDetails( "BC" , "KeyGenerator" ); |
… results could be:
KeyGenerator for BC v1.47: BouncyCastle Security Provider v1.47
- 1.2.392.200011.61.1.1.1.2 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen128
- 1.2.392.200011.61.1.1.1.3 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen192
- 1.2.392.200011.61.1.1.1.4 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen256
- 1.2.392.200011.61.1.1.3.2 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen128
- 1.2.392.200011.61.1.1.3.3 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen192
- 1.2.392.200011.61.1.1.3.4 -> org.bouncycastle.jcajce.provider.symmetric.Camellia$KeyGen256
- 1.2.410.200004.1.4 -> org.bouncycastle.jcajce.provider.symmetric.SEED$KeyGen
- 1.2.410.200004.7.1.1.1 -> org.bouncycastle.jcajce.provider.symmetric.SEED$KeyGen
- 1.2.840.113549.3.2 -> org.bouncycastle.jcajce.provider.symmetric.RC2$KeyGenerator
- 1.2.840.113549.3.7 -> org.bouncycastle.jcajce.provider.symmetric.DESede$KeyGenerator3
- 2.16.840.1.101.3.4.1.1 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen128
- 2.16.840.1.101.3.4.1.2 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen128
- 2.16.840.1.101.3.4.1.21 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen192
- 2.16.840.1.101.3.4.1.22 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen192
- 2.16.840.1.101.3.4.1.23 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen192
- 2.16.840.1.101.3.4.1.24 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen192
- 2.16.840.1.101.3.4.1.25 -> org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen192
...
Complete results : tests_providers_list_results.txt
Best regards,
Huseyin OZVEREN
Related