We have 3 places checking for an algorithm now: 1. If CurveDB does not know a curve, you won't be able to create parameters.
2. There is a ECKeyPairGenerator::isSupported 3. The native lib For a curve name rejected on each place, is there any behavior change? Another thing: Even after the native lib is disabled, I think we can still create AlgorithmParameters and use KeyFactory to load a key when the curve is not supported, right? If the user has BouncyCastle in the provider list, I hope the Signature provider choosing fallback still works and a BC Signature object will be used when initialized with such a key. Thanks, Max > On Mar 4, 2020, at 3:42 AM, Anthony Scarpino <anthony.scarp...@oracle.com> > wrote: > > On 3/3/20 11:18 AM, Sean Mullan wrote: >> On 3/3/20 1:42 PM, Anthony Scarpino wrote: >>> On 3/3/20 8:34 AM, Sean Mullan wrote: >>>> Wouldn't it be better to throw an Exception when you call >>>> Signature.initSign/Verify() and KeyAgreement.init() rather than waiting >>>> until you sign/verify or generateSecret? This way you bail out early >>>> before you start processing data. >>>> >>>> Also, throwing a ProviderException (a RuntimeException) could be a >>>> behavioral change that an application may not be prepared for. We have >>>> never done a very good job of documenting when ProviderException can be >>>> thrown by the JCE APIs, however. But we should think about this and >>>> whether maybe you want to throw InvalidKeyException instead which is >>>> already specified in the throws clause of the init methods. In any case it >>>> should be documented as a potential compatibility issue in the CSR. >>> >>> >>> Unfortunately curve support decisions are not made until the library is >>> accessed. You will notice the checks that call native are not until the >>> operation is starting, like engineSign(). If an unsupported curve is used >>> in the existing code, this is where the error is generated from. The native >>> code does generate an InvalidAlgorithmParameterException. I had chose >>> ProviderException because it was a provider support change. I had thought >>> about IAPE, but choose a bit more drastic action. That said, I'm fine with >>> using IAPE. >> Hmm, but engineSign, engineVerify, engineGenerateSecret don't throw IAPE. > > The native code throws it and it's wrapped in a SignatureException. > > For generateKeyPair() the existing code threw a ProviderException because the > method doesn't specify any exceptions. That probably pushed me toward > ProviderException in other cases too. > >> I think it should probably be the same behavior as if the library did not >> exist. What do we throw now if the library has been removed? > > Maybe you missed one paragraph below? Without the library in the existing > code we never got past getInstance() because those algorithms like > SHA256withECDSA were not available. After Max's verify change, they are now. > >>> If one was to remove libsunec, the existing code disables algorithms like >>> SHA256withECDSA which makes it easier to separate native from java >>> implementations. But that is not true anymore with the java implementation >>> supporting the NIST curves. Some of these same decisions affect both >>> property disabling and library removal. >>> >>> In the past we have had similar Signature discussions before about when >>> Signature.setParameter() being called before or after init(). I have to >>> wonder if the original provider design followed the same logic where errors >>> are generated later in the process. Also there are some decisions in this >>> provider that look similar to SunPKCS11 as both wait until the last moment >>> to ask the native library. >>> >>>> >>>> Did you consider documenting the system property in the API javadocs for >>>> Signature, KeyPairGenerator, KeyAgreement? I realize this is specific to >>>> the SunEC provider, but this would help users know how to enable the >>>> system property (on the hopefully rare case) they get an exception and >>>> still want to use one of these curves. It could be something like: >>>> >>>> @implNote By default, the SunEC provider throws ...Exception if the key is >>>> using a legacy curve. Set the {@systemProperty jdk.sunec.disableNative} to >>>> {@code false} to disable this behavior. >>>> >>> >>> I don't think putting in the API about one particular provider >>> implementation detail is a proper place. I think this belongs in release >>> notes, and maybe the provider doc. >> Yeah, I am kind of on the fence about that myself as I don't necessarily >> want to clutter the APIs with provider-specific stuff, but OTOH, most of the >> security-related system properties *are* provider-specific, so we lose the >> nice feature of seeing how different system properties affect existing APIs >> while you are reading the javadoc. But, I think we probably need to decide >> on a more general policy for documenting provider-specific system properties >> first. So I guess we can hold off on this for now. >> --Sean >>>> --Sean >>>> >>>> On 3/2/20 7:40 PM, Anthony Scarpino wrote: >>>>> Hi >>>>> >>>>> I need a review of the CSR and webrev for disabling by default the native >>>>> SunEC curves from the API. With the recent verification changes in >>>>> JDK-8237218, SunJCE is long dependent on the native code for verifying >>>>> the constant-time curves. This disabling can be undone with setting a >>>>> system property, jdk.sunec.disableNative. I'm doing a simultaneous review >>>>> as changes for one will likely affect the other. >>>>> >>>>> CSR: https://bugs.openjdk.java.net/browse/JDK-8238911 >>>>> webrev: https://cr.openjdk.java.net/~ascarpino/8237219/ >>>>> >>>>> The curves affected are: >>>>> secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, >>>>> secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, >>>>> sect113r1, sect113r2, sect131r1, sect131r2, sect163k1, sect163r1, >>>>> sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, >>>>> sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, X9.62 >>>>> c2tnb191v1, X9.62 c2tnb191v2, X9.62 c2tnb191v3, X9.62 c2tnb239v1, X9.62 >>>>> c2tnb239v2, X9.62 c2tnb239v3, X9.62 c2tnb359v1, X9.62 c2tnb431r1, X9.62 >>>>> prime192v2, X9.62 prime192v3, X9.62 prime239v1, X9.62 prime239v2, X9.62 >>>>> prime239v3, brainpoolP256r1 brainpoolP320r1, brainpoolP384r1, >>>>> brainpoolP512r1 >>>>> >>>>> Tony