マニフェストフォーマット

0. アーカイブ署名

この仕様では、アーカイブファイルの形式を指定しません。階層パスをサポートするすべての形式が受入可能です。この仕様でアーカイブに追加されたファイルは、アーカイブ内の普通のファイルとしてディレクトリに置かれます。

マニフェストファイルのすべての URL 識別子は RFC 1738、Uniform Resource Locators に記述されている URL 構文に従います。加えて、マニフェストの階層パスは RFC 1738 の URL 構文との一貫性のために「/」(フォーワードスラッシュ) を区切り文字として使用します。

1. この方式をとった理由

2. アーカイブのファイル名

アーカイブはパスツリーの上位レベルに META-INF/ ディレクトリを作成することによって、署名されます。ほかのパス名が先行する「/」を含む場合、先行する「/」をとります(すなわち、/META-INF/)。

アーカイブ内に次のパス名を持ったマニフェストファイルが 1 つだけあります。

  META-INF/MANIFEST.MF

署名ファイルは次の形式のパス名を持ちます。

  META-INF/x.SF
文字列 x は文字 A-Z 0-9 およびダッシュまたはアンダースコアだけを含みます。x は 8 文字を超えてはなりません。

ファイル名内の非 ASCII 文字のエンコーディング (サポートされていれば) は、この仕様ではなくアーカイブ形式またはほかの規則によって定義されます。しかし、META-INF ディレクトリのファイル名は上記に制限されます。

名前 META-INF、MANIFEST.MF およびファイルタイプ .SF は、大文字で生成されますが 、大文字と小文字どちらでも認識はされます。

3. 名前-値ペアおよびセクション

ほとんどのケースで、マニフェストファイルまたは署名ファイルに含まれる情報は、RFC822 で規定されるいわゆる「名前: 値」ペアとして表されます。

名前-値ペアのグループを「セクション」と呼びます。セクションはほかのセクションと空白行で分けられます。

バイナリデータは、どの形式であれベース 64 で表されます。行の長さが 72 バイ トを超えるようなバイナリデータについては継続が必要です。バイナリデータの例はダイジェストおよび署名です。

実装によっては、65535 バイトまでのヘッダ値がサポートされます。

仕様:

  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.

4. マニフェストファイル

マニフェストファイルは、アーカイブ自体の中に存在するファイルのリストからなります。アーカイブ内のすべてのファイルをマニフェストにリストする必要はありませんが、署名するすべてのファイルはリストする必要があります。マニフェストファイル自体はリストしないでください。

最低でも次のような標準のバージョン番号を含む予備のセクションが、ファイルの上部に表示されます。

  Manifest-Version: 1.0
オプションで、使用するのに必要なバージョンを指定できます。
  Required-Version: 1.0
もし、Version: が Required-Version より大きい場合、拡張を使用します。

マニフェストファイルはアーカイブ内の様々なファイルのエントリであるセクションからなります。

ヘッダ自身の多くはこの使用で規定されていません。必要なものは次のとおりです。

  Name: dirpath/whatever.class
  Digest-Algorithms: (list of algorithms)
  (algorithm)-Digest: (base-64 representation of digest)

Name: ヘッダはアーカイブ内で署名されているファイルへの相対パス、もしくは、アーカイブ外の絶対 URL 参照データを含みます。

マニフェストファイルの例:

  Manifest-Version: 1.0

  Name: common/class1.class
  Digest-Algorithms: MD5
  MD5-Digest: (base64 representation of MD5 digest)

  Name: common/class2.class
  Digest-Algorithms: MD5, SHA
  MD5-Digest: (base64 representation of MD5 digest)
  SHA-Digest: (base64 representation of SHA digest)

仕様:

  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 Digest-Algorithms is a comma-separated-list:

  comma-separated-list: +headerchar "," *whitespace comma-separated-list
                      | +headerchar

5. 署名指示

各署名者は、署名ファイルによって表わされます。

少くとも、次のような標準のバージョン番号を含む開始セクションが、ファイルの先頭に表示されます。

  Signature-Version: 1.0
署名者が供給する情報で特定のパス名に固有のものでない情報は、この予備ヘッダに入っている必要があります。

このファイルの主要な部分は、マニフェストファイルと同様な形式です。この目的は、マニフェストの所有者 (通常、このアーカイブの生成者) ではなく署名者の提供するヘッダへの埋め込みを許すことです。

署名ファイルは、基本的には名前のリストであるセクションからなります。この名前はすべてマニフェストファイルに存在する必要があります。余分なヘッダをここに入れることができます。ダイジェストもまた存在しますが、これはマニフェストファイル内のエントリのダイジェストです。

マニフェストファイルに表示されるが署名ファイルには表示されないパスまたは URL は、計算に使用されません。これによってアーカイブのサブセットに署名できます。

Name: だけが必須です。

ファイルの有効化:

マニフェストが最初に分析されるとき、署名が最初に検証されます。この検証結果を効率化のために記録できます。これは実際のアーカイブファイルでなく、署名自身を検証するだけです。

ファイルを検証するためには、署名ファイルのダイジェスト値をマニフェストファイルの対応するエントリから計算したダイジェスト値と比較します。次に、マニフェストファイルのダイジェストの値 を Name: ヘッダ内で参照される (相対パスまたは URL) 実際のデータに対して計算されるダイジェストと比較します。

署名ファイルの例:

  Signature-Version: 1.0

  Name: common/class1.class
  Digest-Algorithms: MD5
  MD5-Digest: (base64 representation of MD5 digest)

  Name: common/class2.class
  Digest-Algorithms: MD5
  MD5-Digest: (base64 representation of MD5 digest)

仕様:

  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.

Magic キーワード

与えられたマニフェストエントリ上で署名を有効化するための別の要件は、そのエントリのマニフェストエントリ内の Magic キーペア値の値を検証者が理解することです。

Magic キーはオプションですが、分解者はそのエントリの署名を検証する場合、エントリの Magic キーの値を理解する必要があります。

キー Magic の値は、コンマで区切られたコンテキスト固有の文字列のセットです。コンマの前後の空白は無視されます。大文字小文字も無視されます。magic キーワードの正確な意味はアプリケーション固有なものです。これらのキーワードには、マニフェストエントリに含まれるハッシュ値の計算方法が入っており、そのため署名の正しい検証には欠くことのできないものです。このキーワードは、動的または埋め込みコンテンツ、多国語ドキュメント用の複数ハッシュなどに使用します。

次に、潜在的に Magic が使われる例を 2 つ示します。

	Name: http://www.scripts.com/index#script1
	Digest-Algorithms: SHA
	SHA-Digest: (base64 representation of SHA hash)
	Magic: JavaScript, Dynamic
	Name: http://www.tourist.com/guide.html
	Digest-Algorithms: SHA
	SHA-Digest: (base64 representation of SHA hash)
	SHA-Digest-French: (base64 representation of SHA hash)
	SHA-Digest-German: (base64 representation of SHA hash)
	Magic: Multilingual

最初の例では、これら Magic の値は http 問い合わせの結果がドキュメント自身ではなく、ドキュメントに埋め込まれたスクリプトであり、またそのスクリプトが動的に生成されるということを示します。この 2 つの情報は、マニフェストのハッシュ値と比較し、有効な署名と比較するハッシュ値の計算方法を示します。

第 2 の例では、Magic 値は検索されたドキュメントの内容は特定の言語であるという合意を示し、検証のためのハッシュ値は検索されたドキュメントを記述する言語に依存することを示します。

6. デジタル署名

この仕様のデジタル署名は .SF (署名指示) ファイルの署名済みバージョンです。これらはバイナリファイルであり、人間が解釈することは意図されていません。

デジタル署名ファイルは .SF ファイルと同じファイル名を持ちますが、異なる拡張子を持っています。拡張子はデジタル署名の型によって変化します。

  .RSA      (PKCS7 signature, MD5 + RSA)
  .DSA      (PKCS7 signature, DSA)
  .PGP      (Pretty Good Privacy Signature)
外部署名データをサポートしないこれらの形式については、ファイルは .SF ファイルの署名済みコピーからなります。あるデータは重複する可能性があるため、検証者は 2 つのファイルを比較する必要があります。

外部データをサポートする形式は、.SF ファイルを参照するか、暗示的な参照によって計算を実行します。

各 .SF ファイルは複数のデジタル署名を持つ可能性がありますが、これらの署名は同じ正当なエンティティによって生成される必要があります。

ファイルタイプは 1 から 3 個の「英数字」文字です。認識できないファイルタイプは明確に無視される必要があります。

7. 注

分解する前に:

ヘッダ:

バージョン:

順番付:

行の長さ:

エラー:

制限:

署名者:

アルゴリズム:

7. 謝辞

この仕様の著者は次の方々です。

Thomas Dell (tdell@netscape.com)
Netscape Corporation

David Hopwood (david.hopwood@lady-margaret-hall.oxford.ac.uk)
Oxford University

Dave Brown (brown@eng.sun.com)
Benjamin Renaud (br@eng.sun.com)
David Connelly (dac@eng.sun.com)
Sun Microsystems, Inc.


Copyright © 1996 Netscape Corporation All rights reserved.
Copyright © 1996 Sun Microsystems, Inc.
Distribution: Unlimited.

java-security@java.sun.com