src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java

Print this page
7191662: JCE providers should be located via ServiceLoader

*** 1,7 **** /* ! * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 25,35 **** package sun.security.ec; import java.util.*; import java.security.*; ! import sun.security.action.PutAllAction; /** * Provider class for the Elliptic Curve provider. * Supports EC keypair and parameter generation, ECDSA signing and * ECDH key agreement. --- 25,38 ---- package sun.security.ec; import java.util.*; import java.security.*; ! import java.util.regex.Pattern; ! import sun.security.util.CurveDB; ! import sun.security.util.NamedCurve; ! import sun.security.util.ECParameters; /** * Provider class for the Elliptic Curve provider. * Supports EC keypair and parameter generation, ECDSA signing and * ECDH key agreement.
*** 63,83 **** } catch (UnsatisfiedLinkError e) { useFullImplementation = false; } } public SunEC() { super("SunEC", 1.9d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)"); ! // if there is no security manager installed, put directly into ! // the provider. Otherwise, create a temporary map and use a ! // doPrivileged() call at the end to transfer the contents ! if (System.getSecurityManager() == null) { ! SunECEntries.putEntries(this, useFullImplementation); } else { ! Map<Object, Object> map = new HashMap<Object, Object>(); ! SunECEntries.putEntries(map, useFullImplementation); ! AccessController.doPrivileged(new PutAllAction(this, map)); } } } --- 66,273 ---- } catch (UnsatisfiedLinkError e) { useFullImplementation = false; } } + private static class ProviderService extends Provider.Service { + + ProviderService(Provider p, String type, String algo, String cn) { + super(p, type, algo, cn, null, null); + } + + ProviderService(Provider p, String type, String algo, String cn, + String[] aliases, HashMap<String, String> attrs) { + super(p, type, algo, cn, + (aliases == null? null : Arrays.asList(aliases)), attrs); + } + + @Override + public Object newInstance(Object ctrParamObj) + throws NoSuchAlgorithmException { + String type = getType(); + if (ctrParamObj != null) { + throw new InvalidParameterException + ("constructorParameter not used with " + type + " engines"); + } + + String algo = getAlgorithm(); + try { + if (type.equals("Signature")) { + boolean inP1363 = algo.endsWith("inP1363Format"); + if (inP1363) { + algo = algo.substring(0, algo.length() - 13); + } + if (algo.equals("SHA1withECDSA")) { + return (inP1363? new ECDSASignature.SHA1inP1363Format() : + new ECDSASignature.SHA1()); + } else if (algo.equals("SHA224withECDSA")) { + return (inP1363? new ECDSASignature.SHA224inP1363Format() : + new ECDSASignature.SHA224()); + } else if (algo.equals("SHA256withECDSA")) { + return (inP1363? new ECDSASignature.SHA256inP1363Format() : + new ECDSASignature.SHA256()); + } else if (algo.equals("SHA384withECDSA")) { + return (inP1363? new ECDSASignature.SHA384inP1363Format() : + new ECDSASignature.SHA384()); + } else if (algo.equals("SHA512withECDSA")) { + return (inP1363? new ECDSASignature.SHA512inP1363Format() : + new ECDSASignature.SHA512()); + } else if (algo.equals("NONEwithECDSA")) { + return (inP1363? new ECDSASignature.RawinP1363Format() : + new ECDSASignature.Raw()); + } + } else if (type.equals("KeyFactory")) { + if (algo.equals("EC")) { + return new ECKeyFactory(); + } + } else if (type.equals("AlgorithmParameters")) { + if (algo.equals("EC")) { + return new sun.security.util.ECParameters(); + } + } else if (type.equals("KeyPairGenerator")) { + if (algo.equals("EC")) { + return new ECKeyPairGenerator(); + } + } else if (type.equals("KeyAgreement")) { + if (algo.equals("ECDH")) { + return new ECDHKeyAgreement(); + } + } + } catch (Exception ex) { + throw new NoSuchAlgorithmException("Error constructing " + + type + " for " + algo + " using SunEC", ex); + } + throw new ProviderException("No impl for " + algo + + " " + type); + } + } + public SunEC() { super("SunEC", 1.9d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)"); + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + putEntries(useFullImplementation); + return null; + } + }); + } ! void putEntries(boolean useFullImplementation) { ! HashMap<String, String> ATTRS = new HashMap<>(3); ! ATTRS.put("ImplementedIn", "Software"); ! String ecKeyClasses = "java.security.interfaces.ECPublicKey" + ! "|java.security.interfaces.ECPrivateKey"; ! ATTRS.put("SupportedKeyClasses", ecKeyClasses); ! ATTRS.put("KeySize", "256"); ! ! /* ! * Key Factory engine ! */ ! putService(new ProviderService(this, "KeyFactory", ! "EC", "sun.security.ec.ECKeyFactory", ! new String[] { "EllipticCurve" }, ATTRS)); ! ! /* ! * Algorithm Parameter engine ! */ ! // "AlgorithmParameters.EC SupportedCurves" prop used by unit test ! boolean firstCurve = true; ! StringBuilder names = new StringBuilder(); ! Pattern nameSplitPattern = Pattern.compile(CurveDB.SPLIT_PATTERN); ! ! Collection<? extends NamedCurve> supportedCurves = ! CurveDB.getSupportedCurves(); ! for (NamedCurve namedCurve : supportedCurves) { ! if (!firstCurve) { ! names.append("|"); } else { ! firstCurve = false; } + + names.append("["); + + String[] commonNames = nameSplitPattern.split(namedCurve.getName()); + for (String commonName : commonNames) { + names.append(commonName.trim()); + names.append(","); } + names.append(namedCurve.getObjectId()); + names.append("]"); + } + + HashMap<String, String> apAttrs = new HashMap<>(ATTRS); + apAttrs.put("SupportedCurves", names.toString()); + + putService(new ProviderService(this, "AlgorithmParameters", + "EC", "sun.security.util.ECParameters", + new String[] { "EllipticCurve", "1.2.840.10045.2.1", "OID.1.2.840.10045.2.1" }, + apAttrs)); + + /* + * Register the algorithms below only when the full ECC implementation + * is available + */ + if (!useFullImplementation) { + return; + } + + /* + * Signature engines + */ + putService(new ProviderService(this, "Signature", + "NONEwithECDSA", "sun.security.ec.ECDSASignature$Raw", + null, ATTRS)); + putService(new ProviderService(this, "Signature", + "SHA1withECDSA", "sun.security.ec.ECDSASignature$SHA1", + new String[] { "1.2.840.10045.4.1", "OID.1.2.840.10045.4.1" }, + ATTRS)); + putService(new ProviderService(this, "Signature", + "SHA224withECDSA", "sun.security.ec.ECDSASignature$SHA224", + new String[] { "1.2.840.10045.4.3.1", "OID.1.2.840.10045.4.3.1"}, + ATTRS)); + putService(new ProviderService(this, "Signature", + "SHA256withECDSA", "sun.security.ec.ECDSASignature$SHA256", + new String[] { "1.2.840.10045.4.3.2", "OID.1.2.840.10045.4.3.2"}, + ATTRS)); + putService(new ProviderService(this, "Signature", + "SHA384withECDSA", "sun.security.ec.ECDSASignature$SHA384", + new String[] { "1.2.840.10045.4.3.3", "OID.1.2.840.10045.4.3.3" }, + ATTRS)); + putService(new ProviderService(this, "Signature", + "SHA512withECDSA", "sun.security.ec.ECDSASignature$SHA512", + new String[] { "1.2.840.10045.4.3.4", "OID.1.2.840.10045.4.3.4" }, + ATTRS)); + + putService(new ProviderService(this, "Signature", + "NONEwithECDSAinP1363Format", + "sun.security.ec.ECDSASignature$RawinP1363Format")); + putService(new ProviderService(this, "Signature", + "SHA1withECDSAinP1363Format", + "sun.security.ec.ECDSASignature$SHA1inP1363Format")); + putService(new ProviderService(this, "Signature", + "SHA224withECDSAinP1363Format", + "sun.security.ec.ECDSASignature$SHA224inP1363Format")); + putService(new ProviderService(this, "Signature", + "SHA256withECDSAinP1363Format", + "sun.security.ec.ECDSASignature$SHA256inP1363Format")); + putService(new ProviderService(this, "Signature", + "SHA384withECDSAinP1363Format", + "sun.security.ec.ECDSASignature$SHA384inP1363Format")); + putService(new ProviderService(this, "Signature", + "SHA512withECDSAinP1363Format", + "sun.security.ec.ECDSASignature$SHA512inP1363Format")); + + /* + * Key Pair Generator engine + */ + putService(new ProviderService(this, "KeyPairGenerator", + "EC", "sun.security.ec.ECKeyPairGenerator", + new String[] { "EllipticCurve" }, ATTRS)); + + /* + * Key Agreement engine + */ + putService(new ProviderService(this, "KeyAgreement", + "ECDH", "sun.security.ec.ECDHKeyAgreement", null, ATTRS)); + } }