Updated webrev at https://cr.openjdk.java.net/~weijun/8244565/webrev.03.
I've inlined more methods that is only called once and inside the same method. Thanks, Max > On May 28, 2020, at 9:16 AM, Weijun Wang <weijun.w...@oracle.com> wrote: > > > >> On May 28, 2020, at 8:46 AM, Valerie Peng <valerie.p...@oracle.com> wrote: >> >> Hi Max, >> >> I like this new structure better. Much easier to understand. Most of the >> changes are technical debt that's accumulated inside PKCS8Key class. >> >> A few notable differences which I am not so sure about are >> >> - the encodedKey is returned by getEncoded() directly w/o cloning, and > > Too bad. I'll fix. > >> >> - the protected parseKeyBits() method being made private. I wonder if the >> parseKeyBits() method should be made abstract so it's more obvious that the >> subclasses needs to parse the key bytes into algorithm-specific components. > > Or how about I just inline parseKeyBits in those child classes into their > constructors? I don't think the child class will forget it. Otherwise, why > write a child class? > > Thanks, > Max > >> >> Thanks, >> Valerie >> On 5/26/2020 5:54 PM, Weijun Wang wrote: >>> Can you please take a look (not a review) at an updated webrev at >>> http://cr.openjdk.java.net/~weijun/8244565/webrev.02/? It contains the code >>> to inspect the extra fields. I haven't deal with the "..." here yet. >>> >>> However, when I tried to consolidate the DER parsing into one place, I've >>> made more and more changes everywhere. The major change now is a base >>> constructor PKCS8Key(byte[]) and subclass constructors that call it and no >>> more protected parseKeyBits(). Although I don't think there is any >>> technical error here but at the end of the day I'm asking myself if this is >>> too much code change for such a simple bug. >>> >>> Do you like the overall structure? If yes, I'll continue this way. >>> Otherwise, I can restrict the change only inside PKCS8Key. >>> >>> Thanks, >>> Max >>> >>> >>>> On May 27, 2020, at 7:14 AM, Valerie Peng <valerie.p...@oracle.com> wrote: >>>> >>>> I suppose we can allow trailing data to conform to "..." then. >>>> >>>> But the "[[2: publicKey [1] PublicKey OPTIONAL ]]," line mean that the >>>> publicKey should not be present for V1? This should be checked? >>>> >>>> Valerie >>>> >>>> On 5/25/2020 9:02 PM, Weijun Wang wrote: >>>>> The new definition at https://tools.ietf.org/html/rfc5958 shows, >>>>> >>>>> OneAsymmetricKey ::= SEQUENCE { >>>>> version Version, >>>>> privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, >>>>> privateKey PrivateKey, >>>>> attributes [0] Attributes OPTIONAL, >>>>> ..., >>>>> [[2: publicKey [1] PublicKey OPTIONAL ]], >>>>> ... >>>>> } >>>>> >>>>> According to >>>>> https://www.ibm.com/support/pages/what-does-string-three-elipses-mean-asn1: >>>>> >>>>> The string "..." in ASN.1 is called an extension marker. The extension >>>>> marker, >>>>> ellipsis, is an indication that extension additions are expected. It >>>>> makes no >>>>> statement as to how such additions should be handled. However they >>>>> shall not be >>>>> treated as an error during the decoding process. >>>>> >>>>> So there might be more fields in the future. Do you still insist we need >>>>> more validation? >>>>> >>>>> Thanks, >>>>> Max >>>>> >>>>> >>>>>> On May 20, 2020, at 1:37 PM, Valerie Peng <valerie.p...@oracle.com> >>>>>> wrote: >>>>>> >>>>>> >>>>>> True, the current handling of the extra bytes in parseKey() and decode() >>>>>> are kind of opposite, one does not allow any extra bytes but the other >>>>>> ignores all. The trailing bytes may look harmless but simply ignores it >>>>>> may open up something unexpected. >>>>>> >>>>>> Given that this is key related class, I think it's important to do >>>>>> reasonable validation even though we currently do not use these trailing >>>>>> bytes. It'd also be good if the handling can be consistent regardless of >>>>>> the call path. >>>>>> >>>>>> Thanks, >>>>>> Valerie >>>>>> On 5/18/2020 9:36 PM, Weijun Wang wrote: >>>>>>>> On May 19, 2020, at 1:41 AM, Valerie Peng <valerie.p...@oracle.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hi Max, >>>>>>>> >>>>>>>> I saw in the bug description that handling and parsing of the public >>>>>>>> key will be resolved in a separate enhancement which is fine with me. >>>>>>>> >>>>>>>> In addition to relaxing the PKCS8 version check to accept 1, the >>>>>>>> current webrev does not check for the trailing bytes and its validity. >>>>>>>> Perhaps we should consider adding necessary checks to ensure spec >>>>>>>> conformance? Perhaps some utility method like: (This includes basic >>>>>>>> checks plus checks for multiple attributes and version 1 w/ public >>>>>>>> key. ) >>>>>>>> >>>>>>>> private static void checkTrailingBytes(DerInputStream derIn, int >>>>>>>> version) >>>>>>>> throws IOException { >>>>>>>> boolean hasAttributes = false; >>>>>>>> boolean hasPublicKey = false; >>>>>>>> while (derIn.available () != 0) { >>>>>>>> // check for OPTIONAL attributes and/or publicKey >>>>>>>> DerValue tmp = derIn.getDerValue(); >>>>>>>> if (tmp.isContextSpecific((byte)0) && !hasAttributes) { >>>>>>>> // OPTIONAL attributes not supported yet >>>>>>>> // discard for now and move on >>>>>>>> hasAttributes = true; >>>>>>>> } else if (version == V2 && tmp.isContextSpecific((byte)1) >>>>>>>> && >>>>>>>> !hasPublicKey) { >>>>>>>> // OPTIONAL v2 public key not supported yet >>>>>>>> // discard for now and move on >>>>>>>> hasPublicKey = true; >>>>>>>> } else { >>>>>>>> throw new IOException ("illegal encoding in private >>>>>>>> key"); >>>>>>>> } >>>>>>>> } >>>>>>>> } >>>>>>> I wonder if this is necessary. The extra bytes are quite harmless, and >>>>>>> we didn't check it in decode(). >>>>>>> >>>>>>>> Besides the encoding parsing check above, maybe V1, V2 can be made >>>>>>>> private static? >>>>>>> OK. >>>>>>> >>>>>>>> I noticed that the PKCS8Key class has a block of code under the >>>>>>>> comments "Try again using JDK1.1-style...", however the provider >>>>>>>> property "PrivateKey.PKCS#8.<alg>" seems long gone? Without these >>>>>>>> property, this block of code seems useless and probably should be >>>>>>>> cleaned up as well. >>>>>>> Yes. >>>>>>> >>>>>>>> As for the test, the existing comments for the EXPECTED bytes are off >>>>>>>> and plain misleading. Could you please fix them or at least remove >>>>>>>> them. For example, the comment of "integer 3" should be associated >>>>>>>> with "0x02, 0x01, 0x03," bytes instead of "0x01, 0x02, 0x02,". In the >>>>>>>> updated test, NEW_ENCODED_KEY_INTS is PKCS8 v1 key and >>>>>>>> NEW_ENCODED_KEY_INTS_2 is PKCS8 v2 key w/ public key. Since the >>>>>>>> version value is always at index 4, we can either clone the existing >>>>>>>> bytes or directly override the version value in NEW_ENCODED_KEY_INTS >>>>>>>> or NEW_ENCODED_KEY_INTS_2 to add additional negative tests, e.g. >>>>>>>> encoding w/ the version value 2 (anything besides the allowed 0 and >>>>>>>> 1), version value 0 w/ trailing public key. It'd be nice to test >>>>>>>> version 1 w/ trailing bytes w/ invalid tag value as well. >>>>>>> If you still want checkTrailingBytes, then yes. >>>>>>> >>>>>>> Thanks, >>>>>>> Max >>>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>> Valerie >>>>>>>> >>>>>>>> >>>>>>>> On 5/13/2020 5:16 PM, Valerie Peng wrote: >>>>>>>>> I will take a look. >>>>>>>>> >>>>>>>>> Valerie >>>>>>>>> >>>>>>>>> On 5/8/2020 3:39 AM, Weijun Wang wrote: >>>>>>>>>> Found an existing test I can update. Webrev updated at >>>>>>>>>> >>>>>>>>>> http://cr.openjdk.java.net/~weijun/8244565/webrev.01/ >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Max >>>>>>>>>> >>>>>>>>>>> On May 8, 2020, at 5:41 PM, Weijun Wang <weijun.w...@oracle.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> Please take a review at >>>>>>>>>>> >>>>>>>>>>> http://cr.openjdk.java.net/~weijun/8244565/webrev.00/ >>>>>>>>>>> >>>>>>>>>>> Now we accepts a PKCS8 file with version being 0 or 1. The >>>>>>>>>>> publicKey and attributes are still not parsed. >>>>>>>>>>> >>>>>>>>>>> I also take this chance to make some format change. >>>>>>>>>>> >>>>>>>>>>> There is no regression test and I'll add one. I can generate a >>>>>>>>>>> PKCS8 key and then modify the version from 0 to 1 and try to read >>>>>>>>>>> it. Or I can find a PKCS8 generated by some other tool and embed it >>>>>>>>>>> the test to read it. Please advise which is better. >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Max >>>>>>>>>>> >