https://cr.openjdk.java.net/~weijun/8217375/webrev.02 uploaded. There are still 
several trailing spaces and I've removed them.

I just ran a test job: SignTwice.java failed on Windows with `failed to clean 
up files after test`. Most likely a file is not closed.

The src change looks good. In fact, I am wondering if we need to support 
ManifestDigester.get(MF_MAIN_ATTRS, b) at all. Is it possible we miss a coding 
error because of it?

I'll take a look at the tests.

Thanks,
Max

> On Jun 30, 2019, at 7:38 PM, Philipp Kunz <philipp.k...@paratix.ch> wrote:
> 
> Hi John, Max, and everyone
> 
> Finally found some time again for this, please excuse the delay.
> 
> Even though I think adding a keyalg parameter next to genkeypair is a 
> different topic, it should not do any harm, and I added it.
> 
> I find your proposal for how to print the manifests good. I preferred to 
> display \n as well because I would otherwise think it was not there sooner or 
> later and confuse myself. In that context also, I intentionally did not add 
> an echoManifest method overload with a String parameter because it could and 
> I believe also actually would confuse filenames and manifests both 
> represented as String. Only a few times 
> "Utils.echoManifest(Utils.readJarManifestBytes(" occurs which might be more 
> verbose than necessary. I have also some doubts that all manifest are 
> actually valid UTF-8. More fine-tuning might be desired.
> 
> I also found running jarsigner slow which is why I suggested adding it as a 
> tool like jar and others in a different thread and which was not accepted 
> then. As for PreserveRawManifestEntryAndDigest, there is use of 
> sun.security.tools.jarsigner.Main.main or run. Using 
> sun.security.tools.jarsigner.Main re-uses loading of the keystore while 
> avoiding another JVM which I believe to be almost perfect apart from the API 
> used not looking very public. Also in terms of performance I think it should 
> be equivalent to JarSigner::sign. When the output should be caputered, there 
> is no way without another JVM (without the jarsigner tool).
> 
> DigestDontIgnoreCase.getManifestBytes could reformat the manifest: agreed and 
> changed accordingly. Now Utils.readJarManifestBytes. Note that it does not 
> use a Manifest like before with JarFile.getManifest.
> 
> EmptyIndividualSectionName.testNameEmptyTrusted: I honestly have no clue how 
> this can be made to work. That is at least what I remember from when I wrote 
> it half a year ago. We might as well come eventually to the conclusion that 
> such a test is not necessary. The idea seems to be to invoke 
> getTrustedAttributes("") on a manifest but it is not public. Help appreciated.
> 
> About the several TODOs, FIXMEs, and FIXED_8217375: The tests in the patch 
> have to be "kind of calibrated" to make sure things don't change with the 
> patch that should not. Ideally these tests would have existed before but the 
> have not. The tests that make sure that some cases still work the same now 
> also contain some changes. In a usual case one would let the tests of a patch 
> run against the old impl and see what has failed before, then apply the main 
> source part of the patch and see something fixed, and not touching any other 
> test guarantees that nothing else changes. In this particular case I found 
> that not working. It is also not possible to create an independent patch with 
> tests only because the tests closely relate to the patch. My idea was that 
> all the FIXMEs and TODOs are removed before actually commiting the patch, 
> after someone has confirmed that all the tests run fine against the previous 
> impl which should make sure certain behavior has not changed. One of the 
> tests does not even compile without the impl changes. After everyone has 
> agreed that there are enough tests to make sure nothing changed by accident, 
> we can remove those FIXMEs and TODOs and have then to pay close attention 
> that no tests are removed or changed anymore. For tracking such changes, git 
> would be an option, but in this case I figured I could not use it myself 
> because I thought I should create a patch against the head branch and you 
> could not see my branches anyway but maybe someone of you can create a branch 
> and share it with me. In any case, the result should be only one commit 
> ending up in the head branch (tip). If that sounds complicated it's what I 
> encountered too. If someone has a better idea how to deal with it, please let 
> me know.
> 
> backwars - backwards - changed
> 
> ManifestSigester - ManifestDigester - changed
> 
> att - attr - changed
> 
> Paths.get - Path.of - changed
> 
> MainAttributesConfused.java - It is not necessary that a file with that name 
> exists in order to show the effect. The signature gets confused if a manifest 
> section exists. Such a section would be created when signing a jar file that 
> contains a file with that name. I don't remember if I actually tried it with 
> a file but testAddManifestMainAttributesSection shows that and how the patch 
> makes a difference. Do you think another test should be created which signs a 
> file with that name?
> 
> PreserveRawManifestEntryAndDigest.java - I hope with the improved manifest 
> encoding (\r and \n) on the console that an output overflow does not happen 
> anymore. I remember having tried to reduce the number of tests as much as 
> possible and justifyable already. I don't currently see a promising approach 
> as how to substantially simplify it, hence, any hint appreciated, or I might 
> come back to optimization at some later point. For now I was able to simplify 
> getExpectedJarSignerOutputUpdatedContentNotValidatedBySignerA even though I 
> would have preferred to be able to utilize OutputAnalyzer. I think to 
> remember that verifying a jar file by opening it in verifying mode verifies 
> all signers and in this case there is only one valid.
> 
> Thanks for offering to look into the change in OutputAnalyzer.java because 
> alternative would include/increase copy-paste.
> 
> And from the other mail:
> 
> ManifestDigester.java: if (!findSection(0, pos)) throw new 
> IllegalStateException - moved exception back to JarSigner.SignatureFile.
> 
> removed redundant 696 mfCreated = true;
> 
> "You added a new check. Do you mean if the signer is the same then the SF 
> will be rewritten anyway and there is no need to retain old MANIFEST.MF 
> bytes?" - Yes, exactly. Added isBlockOrSF around line 900. See also 
> WasSignedByOtherSigner test.
> 
> "MainAttributesConfused.java, PreserveRawManifestEntryAndDigest.java, 
> RemoveDifferentKeyAlgBlockFile.java, and SectionNameContinuedVsLineBreak.java 
> fail on Windows because a JarFile object is not closed. You might want to use 
> try-with-resources on them." - Hope I got them all.
> 
> About tests timing out, I haven't encountered that but of course it has to 
> run quick enough also on other machines. Before going into too much 
> optimization I would appreciate and prefer to either get some (however remote 
> or informal) confirmation that the set of test cases is appropriate or to get 
> rid of superfluous tests before making them faster. Even more important is 
> probably before anything else if the tests currently present are sufficient 
> or if some test case has slipped and is still missing.
> 
> One last note for now concerning Compatibility test. I hope it currently 
> demonstrates what I think it should, verify jar signatures between jdk 
> versions while preserving behavior with default parameters. The code itself 
> requires probably a major clean-up before it can really be merged. I tried 
> not to change more than necessary for now but it does not look now in an as 
> good shape as how I originally encountered it. I'm also still thinking about 
> Max's suggestion to add another test with a jarfile commited along with the 
> tests to check compatibility but could still not yet convince myself that 
> this would be comprehensive enough to replace the Compatibility additions. On 
> the other hand, these compatibility test extensions have slightly more or 
> different scope than the remainder of the patch, I guess, and leave some room 
> for opinions and interpretation. Ideally, compatibility would have been 
> covered with tests before and breaking signatures with increasing the 
> manifest line width would have been noticed earlier. In my opinion there 
> still is no better time than now to add such tests. At least we should make 
> us confident not to break anything again this time.
> 
> Thank you very much for all the good points. I appreciate all your input and 
> find it very valuable.
> 
> Regards,
> Philipp
> 
> 
> 
> 
> 
> On Fri, 2019-06-21 at 11:32 +0800, Weijun Wang wrote:
>> The tests.
>> 
>> - For all:
>> 
>> We are thinking about removing default value for -keyalg for "keytool 
>> -genkeypair" some day, so it will be better to add an explicit "-keyalg RSA" 
>> or "-keyalg EC" now.
>> 
>> There are several tests printing out the manifest in a sequence of 
>> "[[0]=83='S', ...". While it is precise, I find it not very easy to check. 
>> How about we just print out the string format but for each "\r" we just 
>> print "\r" literally and keep printing "\n" with a new line,  like this:
>> 
>> Signature-Version: 1.0\r
>> Created-By: 13-internal (Oracle Corporation)\r
>> SHA-256-Digest-Manifest: Pxklci7ELW1zzSh2jZ+oz7TPR0WK2uTsAIiHar1m6Eo=\r
>> SHA-256-Digest-Manifest-Main-Attributes: ETfvdTNx3yN/ClSZz20wR0SM9ta8H7O\r
>>  E7U0F4uZ9JV8=\r
>> \r
>> Name: abc\r
>> SHA-256-Digest: uTZ8UM3iJLPtl8W7+NEC/AC2auI7LP2Gu53ajj6jLgg=\r
>> \r
>> 
>> If you find running jarsigner slow, is the JarSigner::sign API any better? 
>> The verify side can also usually be replaced with open the file and read 
>> everything inside unless you want to grab certain outputs, but those can 
>> also be done with JarEntry::getSigners.
>> 
>> - DigestDontIgnoreCase.java:
>> 
>> getManifestBytes(). This could reformat the manifest (I understand it's 
>> irrelevant in this test), you can just return
>> 
>>    jf.getInputStream(jf.getJarEntry(JarFile.MANIFEST_NAME)).readAllBytes()
>> 
>> - EmptyIndividualSectionName.java:
>> 
>> Are you going to do something around testNameEmptyTrusted()?
>> 
>> - FindHeaderEndVsManifestDigesterFindFirstSection.java:
>> 
>> Several TODO and FIXME.
>> 
>> 52: typo: backwars-
>> 
>> 76: No need to maintain FIXED_8217375 anymore
>> 
>> 229: Typo: ManifestSigester
>> 
>> - InsufficientSectionDelimiter.java:
>> 
>> We usually abbreviate "attribute" to "attr" instead of "att".
>> 
>> We usually use Path.of() instead of Paths.get() these days.
>> 
>> - MainAttributesConfused.java:
>> 
>> Have you tried adding a file named "Manifest-Main-Attributes" into a jar and 
>> see if it would mess up anything?
>> 
>> - PreserveRawManifestEntryAndDigest.java:
>> 
>> This test is running for a long time. The output is also quite big and you 
>> can see "Output overflow" inside which means if there is a failure it might 
>> not show. Is it possible to simplify it? 
>> 
>> getExpectedJarSignerOutputUpdatedContentNotValidatedBySignerA(). The output 
>> might change often. If you only focus on several lines, it's better to check 
>> them with OutputAnalyzer::shouldMatch***. We can always manually construct 
>> an OutputAnalyzer object.
>> 
>> - DigestInput.java and FindSection.java:
>> 
>> static final boolean FIXED_8217375 = true;
>> 
>> Is this still needed?
>> 
>> - OutputAnalyzer.java:
>> 
>> This is a shared utility class and you changed the behavior. It might be 
>> correct (start matching *after* the from line) but I cannot be sure if it 
>> would break anything. I'll ask people about it.
>> 
>> Thanks,
>> Max
>> 
>> 
>> 
>> 
>> 
>>> 
>>> On Jun 11, 2019, at 3:08 PM, Weijun Wang <
>>> weijun.w...@oracle.com
>>> > wrote:
>>> 
>>> Hi Philipp,
>>> 
>>> I'll start reviewing this code change. Since this is a P3 bug fix, we still 
>>> have a month's time (before RDP 2 starts on 7/18) to work on it.
>>> 
>>> Also, I've included John as a reviewer. He is the author of the 
>>> Compatibility.java test.
>>> 
>>> Thanks,
>>> Max
>>> 
>>> 
>>>> 
>>>> On May 23, 2019, at 9:49 AM, Weijun Wang <
>>>> weijun.w...@oracle.com
>>>> > wrote:
>>>> 
>>>> Hi Philipp,
>>>> 
>>>> I've just uploaded your patch to
>>>> 
>>>> 
>>>> http://cr.openjdk.java.net/~weijun/8217375/webrev.01/
>>> 
>>> 
>>> 
>> 
>> 
>> 
> <8217375-jarsignerbreaksexistingsignatures-20190630.patch>

Reply via email to