I was just reminded of the risks of making assumptions. There's two separate implementations of AES strong encryption - WinZip AES and PKWare. I've been focused on the latter but we should recognize both types of headers.
I've pushed a bit more code that partially parses the PKWare headers. It's enough to identify the encryption and hash algorithms used but a lot is left unparsed. Bear On Fri, Sep 4, 2015 at 12:17 PM, Bear Giles <bgi...@coyotesong.com> wrote: > I just came across a press release that suggests that it is possible to > support AES encryption for zip files: > > > http://www.prnewswire.com/news-releases/pkware-announces-free-licensing-program-for-secure-ziptm-and-pkzip-reader-technologies-72382192.html > > (We might have discussed this several years ago...) > > Bear > > On Thu, Sep 3, 2015 at 10:12 PM, Bear Giles <bgi...@coyotesong.com> wrote: > >> I've forked at github.com/beargiles/commons-compress and committed some >> initial work - five new ExtraHeader classes, their registration, two test >> files and four unit tests. >> >> One test file uses certificate encryption and signature but does not >> encrypt filenames. The second test file uses certificate encryption and >> signature and encrypts filenames. I am using my Symantec certificate for >> bgi...@coyotesong.com and can verify that information is present with >> 'strings'. >> >> The results of the tests are a little confusing. The good: >> >> - the use of strong encryption is recognized >> - the substitution of an encrypted filenames is recognized. (recorded >> filename is 1, not LICENSE.txt). >> >> The bad: >> >> - I'm only seeing the headers loaded in one unit test. I don't know if >> the rest should be reading the headers or not so I don't know if I'm >> properly handling them or if they're quietly handled by the default handler. >> >> - one unit test blows up due to missing central directory (it's >> encrypted). >> >> I guess the next step is either finding a way to have the unit tests >> trigger reading the extra headers or confirm that it's not possible. >> >> Bear >> >> On Wed, Sep 2, 2015 at 3:58 PM, Bear Giles <bgi...@coyotesong.com> wrote: >> >>> Hi, I know that the implementation of the PKWARE AES crypto is subject >>> to license restrictions but is it possible to recognize the extension >>> fields so anyone scanning an unfamiliar file will at least know what the >>> extra field headers contain? >>> >>> I don't know if code to parse the contents (solely using the standard >>> JCE) would trigger export restrictions. This would NOT be decrypting the >>> data, just adding a thin layer of code to parse a standardized ASN.1 object. >>> >>> (BTW there are some other header types documented but except for a few I >>> don't know what they are.) >>> >>> The header IDs (per >>> https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) are: >>> >>> 0x0014 PKCS#7 Store for X.509 Certificates >>> 0x0015 X.509 Certificate ID and Signature for >>> individual file >>> 0x0016 X.509 Certificate ID for Central Directory >>> 0x0017 Strong Encryption Header >>> 0x0019 PKCS#7 Encryption Recipient Certificate List >>> >>> The definitions are: >>> >>> 4.5.9 -PKCS#7 Store for X.509 Certificates (0x0014): >>> >>> This field MUST contain information about each of the certificates >>> files may be signed with. When the Central Directory Encryption >>> feature is enabled for a ZIP file, this record will appear in >>> the Archive Extra Data Record, otherwise it will appear in the >>> first central directory record and will be ignored in any >>> other record. >>> >>> >>> Note: all fields stored in Intel low-byte/high-byte order. >>> >>> Value Size Description >>> ----- ---- ----------- >>> (Store) 0x0014 2 bytes Tag for this "extra" block type >>> TSize 2 bytes Size of the store data >>> TData TSize Data about the store >>> >>> >>> 4.5.10 -X.509 Certificate ID and Signature for individual file (0x0015): >>> >>> This field contains the information about which certificate in >>> the PKCS#7 store was used to sign a particular file. It also >>> contains the signature data. This field can appear multiple >>> times, but can only appear once per certificate. >>> >>> Note: all fields stored in Intel low-byte/high-byte order. >>> >>> Value Size Description >>> ----- ---- ----------- >>> (CID) 0x0015 2 bytes Tag for this "extra" block type >>> TSize 2 bytes Size of data that follows >>> TData TSize Signature Data >>> >>> 4.5.11 -X.509 Certificate ID and Signature for central directory >>> (0x0016): >>> >>> This field contains the information about which certificate in >>> the PKCS#7 store was used to sign the central directory structure. >>> When the Central Directory Encryption feature is enabled for a >>> ZIP file, this record will appear in the Archive Extra Data Record, >>> otherwise it will appear in the first central directory record. >>> >>> Note: all fields stored in Intel low-byte/high-byte order. >>> >>> Value Size Description >>> ----- ---- ----------- >>> (CDID) 0x0016 2 bytes Tag for this "extra" block type >>> TSize 2 bytes Size of data that follows >>> TData TSize Data >>> >>> 4.5.12 -Strong Encryption Header (0x0017): >>> >>> Value Size Description >>> ----- ---- ----------- >>> 0x0017 2 bytes Tag for this "extra" block type >>> TSize 2 bytes Size of data that follows >>> Format 2 bytes Format definition for this record >>> AlgID 2 bytes Encryption algorithm identifier >>> Bitlen 2 bytes Bit length of encryption key >>> Flags 2 bytes Processing flags >>> CertData TSize-8 Certificate decryption extra field data >>> (refer to the explanation for CertData >>> in the section describing the >>> Certificate Processing Method under >>> the Strong Encryption Specification) >>> >>> See the section describing the Strong Encryption Specification >>> for details. Refer to the section in this document entitled >>> "Incorporating PKWARE Proprietary Technology into Your Product" >>> for more information. >>> >>> 4.5.14 -PKCS#7 Encryption Recipient Certificate List (0x0019): >>> >>> This field MAY contain information about each of the certificates >>> used in encryption processing and it can be used to identify who is >>> allowed to decrypt encrypted files. This field should only appear >>> in the archive extra data record. This field is not required and >>> serves only to aid archive modifications by preserving public >>> encryption key data. Individual security requirements may dictate >>> that this data be omitted to deter information exposure. >>> >>> Note: all fields stored in Intel low-byte/high-byte order. >>> >>> Value Size Description >>> ----- ---- ----------- >>> (CStore) 0x0019 2 bytes Tag for this "extra" block type >>> TSize 2 bytes Size of the store data >>> TData TSize Data about the store >>> >>> TData: >>> >>> Value Size Description >>> ----- ---- ----------- >>> Version 2 bytes Format version number - must 0x0001 at this time >>> CStore (var) PKCS#7 data blob >>> >>> See the section describing the Strong Encryption Specification >>> for details. Refer to the section in this document entitled >>> "Incorporating PKWARE Proprietary Technology into Your Product" >>> for more information. >>> >>> >> >