This proposal does not specify the format of the archive file. Any format supporting hierarchical paths is acceptable. Files added to the archive for this proposal will be kept in a directory as ordinary files in the archive.
Archives are signed by creating a "META-INF/" directory at the top level of the path tree. A leading "/" is acceptable if other pathnames contain a leading "/" (ie, "/META-INF/").
There is exactly one manifest file in the archive, with pathname
META-INF/MANIFEST.MF
Signature files have pathnames of the form
META-INF/x.SFfor some string x containing only the characterse A-Z 0-9 and dash or underscore. x must not be more than 8 characters.
The encoding of non-ASCII characters in filenames (if they are supported) is defined by the archive format or some other convention, not by this specification. But filenames in the META-INF directory are restricted as above.
The names "META-INF", "MANIFEST.MF", and the filetype ".SF" should be generated as uppercase, but recognized in any case.
In most cases, information contained within the manifest file or signature files is represented as so-called "name: value" pairs inspired by the RFC822 standard.
Groups of name-value pairs are known as a "section". Sections are separated from other sections by empty lines.
Binary data of any form is represented as base64. Continuations are required for binary data which causes line length to exceed 72 bytes. Examples of binary data are hashes and signatures.
Implementations shall support header values of up to 65535 bytes.
section: *header +newline
nonempty-section: +header +newline
newline: CR LF
| LF
| CR (not followed by LF)
; That 'not followed by LF' probably requires some minor
; ugliness in the parser. Sorry.
header: alphanum *headerchar ":" SPACE *otherchar newline
*continuation
continuation: SPACE *otherchar newline
; RFC822 has +(SPACE | TAB), but this way continuation lines
; never get mangled.
alphanum: {"A"-"Z"} | {"a"-"z"} | {"0"-"9"}
headerchar: alphanum | "-" | "_"
otherchar: any Unicode character except NUL, CR and LF
; Also: To prevent mangling of files sent via straight e-mail, no
; header will start with the four letters "From".
; When version numbering is used:
number: {"0"-"9"}+
; The number needn't be, e.g. 1.11 is considered to be later
; than 1.9. Both major and minor versions must be 3 digits or less.
A preliminary section appears at the top of the file containing, at minimum, this standard's version number.
Manifest-Version: 1.0Optionally, a version required for use may be specified:
Required-Version: 1.0If Version: is higher than Required-Version, extensions may be used.
The manifest file consists of sections which are entries for various files in the archive.
Many of the headers themselves are not covered by this specification. The following are required:
Name: dirpath/whatever.class Hash-Algorithms: (list of algorithms) (algorithm)-Hash: (base-64 representation of hash)The "Name:" header shall contain a relative path to the file being signed within the archive, OR an absolute URL referencing data outside the archive.
Manifest-Version: 1.0 Name: common/class1.class Hash-Algorithms: MD5 MD5-Hash: (base64 representation of MD5 hash) Name: common/class2.class Hash-Algorithms: MD5, SHA MD5-Hash: (base64 representation of MD5 hash) SHA-Hash: (base64 representation of SHA hash)
manifest-file: "Manifest-Version: 1.0" newline
manifest-start
*manifest-entry
manifest-start: section
; Optional header is
; Required-Version: number "." number
;
; Required-Version indicates that only tools of the given version
; or later can be used to manipulate the file.
; The value of Hash-Algorithms is a comma-separated-list:
comma-separated-list: +headerchar "," *whitespace comma-separated-list
| +headerchar
Each signer is represented by a signature file.
A preliminary section appears at the top of the file containing, at minimum, this standard's version number.
Signature-Version: 1.0Information supplied by the signer but not specific to any particular pathname should be included in this preliminary header.
The major part of the file is similar form to the manifest file. The purpose here is to allow "policy" to be embedded in headers supplied by the signer rather than the manifest owner (who is normally the person who generated the archive.)
Signature files consist of sections which are essentially lists of names, all of which must be present in the manifest file. Extra headers may be included here. A hash is also present, but this is a hash of the entry in the manifest file.
Paths or URL's appearing in the manifest file but not in the signature file are not used in calculation. This allows subsets of the archive to be signed.
Only the Name: is required.
The signature is first verified when the manifest is first parsed. This verification can be remembered, for efficiency. This only validates the signature directions themselves, not the actual archive files.
To validate a file, a hash value in the signature file is compared against a hash calculated against the corresponding entry in the manifest file. Then, a hash value in the manifest file is compared against a hash calculated against the actual data referenced in the "Name:" header -- relative path or URL.
Example signature file: Signature-Version: 1.0 Name: common/class1.class Hash-Algorithms: MD5 MD5-Hash: (base64 representation of MD5 hash) Name: common/class2.class Hash-Algorithms: MD5 MD5-Hash: (base64 representation of MD5 hash)
signature-file: "Signature-Version: 1.0" newline
signature-start
*signature-entry
signature-end
signature-start: section
; Optional header is
; Required-Version: number "." number
; This has the same meaning as in manifest-start.
; The only required header is Name. Its format is the same
; as in a manifest-entry.
Digital signature files have the same filename as the .SF file but different extension. The extension varies depending on the type of digital signature.
.RSA (PKCS7 signature, MD5 + RSA) .DSA (PKCS7 signature, DSA) .PGP (Pretty Good Privacy Signature)For those formats that do not support external signed data, the file shall consist of a signed copy of the .SF file. Thus some data may be duplicated and a verifier ought to compare the two files.
Formats that support external data either reference the ".SF" file, or perform calculations on it with implicit reference.
Each .SF file may have multiple digital signatures, but those signatures ought to be generated by the same legal entity.
Filetypes may be 1 to 3 "alphanum" characters. Filetypes unrecognized must obviously be ignored.