Hi,

We’ve published another webrev for review.

Issue: https://bugs.openjdk.java.net/browse/JDK-8132734
JEP 238: https://bugs.openjdk.java.net/browse/JDK-8047305
Webrev: http://cr.openjdk.java.net/~psandoz/multiversion-jar/jar-webrev/ 

This one addresses the issues regarding CodeSigners, Certificates, 
verification, and other security issues raised in the last round, including 
whether third party verification is a supported use case.  I also partially 
fixed a nitpick involving performance while searching for versioned entries, by 
putting in a cache for previously searched entries.  And I found a way around 
the issue with windows being unable to delete jar files accessed through URL’s 
in one test.

Steve

> On Oct 21, 2015, at 12:54 AM, Wang Weijun <weijun.w...@oracle.com> wrote:
> 
>> On Oct 21, 2015, at 3:17 PM, Xueming Shen <xueming.s...@oracle.com> wrote:
>> 
>> We might want to bring in Max to take a look if what I said is really a 
>> supported use scenario.
> 
> I haven't read Steve's latest code change. I will read if you think it's 
> necessary.
> 
> First, I think we agree that the multi-release jar file feature is only 
> making use of the existing jar file format and does not intend to introduce 
> any change to its specification. This means a JarFile signed by one JDK 
> release should be verified by another JDK release.
> 
> Ok, the next question is, should it modify the JarFile API? I hope not, 
> because the JarFile API is the single entry we access a JarFile when we want 
> to sign or verify it. I hope there is a brand new API for a multi-versioned 
> jar file, probably a child class of JarFile, so that no matter you call 
> getJarEntry() or entries() on it, you always get the versioned one and the 
> unrelated ones are completely invisible.
> 
> If this is not OK, maybe we can rename the current JarFile to RawJarFile and 
> name the new API JarFile. Signing and verification will work on RawJarFile.
> 
> Not sure if it's easy.
> 
> --Max

> On Oct 21, 2015, at 12:17 AM, Xueming Shen <xueming.s...@oracle.com> wrote:
> 
> Hi Steve,
> 
> The reifiedEntry() approach probably can help the default JarVerifier work as 
> expected, but if I read the
> code correctly  I doubt you can get the expected CodSigner[] and 
> Certificatte[] result from a "versioned"
> JarFileEntry, after having read all bytes from the input stream (obtained via 
> jzf.getInputStream(JarFileEntry)),
> as the JarEntry spec suggests,. As we are passing the "reified" entry into 
> the VerifierStream alone, without
> any reference to the original jar file entry.  It seems impossible for the 
> original jar file entry can trace back to
> the corresponding certificates and code signers. This might be fixed by 
> passing in the original entry together
> into the JarVerifier, but I doubt we might have a bigger issue here. I 
> suspect with this approach an external
> verifier will have no easy way to verify the digit signature of the jar entry 
> via java.security APIs. I would assume
> this is doable right now with current JarFile APIs, via a JarFile object, a 
> Manifest and a target JarEntry. The external
> can get the signature via name -> manifest->attributes->signature (basically 
> just consider to move the
> JarVerifier and couple sun.security.util classes out and use it as user 
> code)... but with this implementation
> the name now  is the root entry, but the bytes you can read from the stream 
> is from the versioned one.
> We might want to bring in Max to take a look if what I said is really a 
> supported use scenario. I might be
> wrong, not a security expert :-)
> 
> Btw, for a "normal" JarEntry/ZipEntry (not a JarFileEntry), shouldn't the 
> getInputStream(ze) simply return
> the stream for the root entry? The current implementation of getJarEntry(ze) 
> does not seem right, as it
> returns a "versioned" JarFileEntry. I don't think you want to pass this one 
> into VerifierStream directly,
> right? Again, I think it might be desired (at least the spec is not updated 
> to say anything about "version")
> to simply return the input stream for the root entry.
> 
> One more "nitpick". searchForVersionedEntry() now lookups the versioned 
> candidate via super.getEntry()
> from version to BASE_VERSION, if the version is the latest version 9, the 
> base is 0, we are basically doing
> this search for each non-versioned-entry inside this multi-release-jar file 9 
> times everytime when the entry
> is asked. In worse case scenario, a multi-release-jar, with huge number of 
> entries with a small portion are
> versioned to 9, and you are iterating it via "entries". Each lookup might be 
> cheap, but it might be worth
> considering adding some optimization.
> 
> Best,
> Sherman

Reply via email to