[2] [DFN[[CODE(URI)@en[[[ni:]]]]]] は、対象となる情報の[[ハッシュ値]]を使って[[識別]]する
[[URL scheme]] です。

;; [4] 「[CODE(URI)@en[[[ni]]]]」は Named Information を表します [SRC[>>3]]。

* 仕様書

[REFS[
- [3] [CITE@en[RFC 6920 - Naming Things with Hashes]] ([TIME[2014-06-02 05:17:24 +09:00]] 版) <http://tools.ietf.org/html/rfc6920>
- [30] [CITE[Named Information]] ([TIME[2014-01-30 17:45:21 +09:00]] 版) <http://www.iana.org/assignments/named-information/named-information.xhtml#uri-parameter>
]REFS]

* 構文

[6] [CODE(URI)@en[[[ni:]]]] [[URL]] は、 [[URL scheme]] の後に、
[CODE[[[//]]]]、 [[authority]]、 [CODE[[[/]]]]、
[[ダイジェストアルゴリズム]]、
[CODE[[[;]]]]、
[[ダイジェスト値]]、
[CODE[[[?]]]]、
[[query]]
が続きます。ただし [[authority]] と [CODE[[[?]]]] 以下は省略可能です。 [SRC[>>3]]

[FIG(railroad)[
= [CODE(URI)@en[[[ni:]][[//]]]]
= ?
== [[authority]]
= [CODE[[[/]]]]
= [[ダイジェストアルゴリズム]]
= [CODE[[[;]]]]
= [[ダイジェスト値]]
= ?
== [CODE[[[?]]]]
== 名前=値
== *
=== [CODE[[[&]]]]
=== 名前=値
]FIG]

[14] [[ダイジェストアルゴリズム]]と[[ダイジェスト値]]は、
どちらもそれぞれ1文字以上の [[RFC 3986]] [CODE(ABNF)@en[[[unreserved]]]]
でなければなりません [SRC[>>3]]。構文上[[パーセント符号化]]が認められていません。

[10] [[ダイジェストアルゴリズム]]と[[ダイジェスト値]]は、
この [[URL]] によって表される[[オブジェクト]]についての値です。
[[ダイジェストアルゴリズム]]は、 [[IANA]] に登録された名前を使って表します [SRC[>>3]]。

;; [28] バイナリ表現 (>>27) では[[ダイジェストアルゴリズム]]を
[[Suite ID]] という[[アルゴリズム]]に割り当てられた数値で表します。
[CODE(URI)@en[[[nih:]]]] では、文字列の名前と数値のどちらも認められています。
しかし [CODE(URI)@en[[[ni:]]]] では文字列しか認められていないようです。

[11] [[ダイジェスト値]]は、 [[RFC 4648]] [[base64url]] で[[符号化]]したもの
([[詰め文字]] [CODE[[[=]]]] なし) でなければ[['''なりません''']] [SRC[>>3]]。

* authority

[7] [[authority]] は、[[URL]] によって表される[[オブジェクト]]にアクセスするのを補助するものです
[SRC[>>3]]。

;; [18] [CODE(URI)@en[[[http:]]]] などの多くの [[URL scheme]] とは違って、
[[authority]] は [CODE(URI)@en[[[ni:]]]] [[URL]]
においては重要なものとはされていません。 [[authority]] の値に関わらず、
[[ダイジェスト]]の部分で [[URL]] によって識別されるものは決まります
([[ハッシュ値URLの比較]]を参照)。

[8] [[authority]] は省略可能です [SRC[>>3]]。その場合 [CODE(URI)@en[[[ni:]][[///]]]]
から始まる [[URL]] となります。 ([CODE[[[//]]]] は省略できません。)

[9] [[authority]] は [[RFC 3986]] の構文が参照されています [SRC[>>3]] が、
それ以上の制約や意味や処理モデルは定義されていません。

* query

[12] [[query]] は [[RFC 2616]] の [CODE(URI)@en[[[http:]]]] [[URL]]
のものと同様とされています [SRC[>>3]]。[CODE[名前=値&名前=値]]のような構文を指している [SRC[>>3]]
とありますが、 [[RFC 2616]] にはそのような規定がなく
(実際にはそのような構文は [[HTTP]] ではなく、 [[HTML]] で用いられている
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] のものです。)、
何が認められているのか曖昧となっています。

[15] [[query]] では[[パーセント符号化]]が認められています。特に[[非ASCII文字]]は、
[[UTF-8]] で[[パーセント符号化]]しなければ[['''なりません''']] [SRC[>>3]]。

[20] [[query]] は [CODE[[[&]]]] 区切りの名前と値の組の列として定義されていますが、
そのそれぞれのことを[DFN[[RUBYB[[[引数]]]@en[parameter]]]]や[DFN[[RUBYB[クエリー文字列属性]@en[query string attribute]]]]と呼ぶ [SRC[>>3]] ようです。

[19] [[query]] の解釈の詳細についてはまったく言及もありません。
[[引数]]の順序が重要なのか、未知の[[引数]]をどう扱うのか、
[[引数]]の名前の大文字と小文字を区別するのか、
同じ名前の[[引数]]を複数指定できるのかなどは不明です。

[21] [[引数]]は、 [[IANA]] に登録することになっています [SRC[>>3, >>30]]。
現在次の[[引数]]が存在しています。

[FIG(short list)[
- [CODE(URI)@en[[[ct]]]]
]FIG]

* 相対 URL

[16] [[相対URL]]として用いられることも想定されているようです。 [[RFC]] には次のような例があります。

[FIG(quote)[
[PRE(HTML code)[
        <base href="ni://example.com">
...
        <p>Please check <a href="sha-256;f4OxZX...">this document</a>.
]PRE]
]FIG]

;; [17] ところでこの [CODE(HTMLe)@en[[[base]]]] [CODE(HTMLa)@en[[[href]]]]
は >>6 の構文に適合していません。

* 比較

[5] [[ハッシュ値URLの比較]]を参照してください。

* 処理

[13] 実装は、 [[URL]] の送信、受信、処理に当たって [[URL]] と[[資源]]の対応関係の[RUBYB[整合性]@en[integrity]]を検査して構わない [SRC[>>3]]
とされています。ここでいう[[整合性]]が具体的に何を指しているのかはよくわかりません。

* HTTP URL への変換

[22] [CODE(URI)@en[[[ni:]]//[VAR[n-authority]]/alg;val?query-string]]
のような [CODE(URI)@en[[[ni:]]]] [[URL]] は、
[CODE(URI)@en[[[http:]]//[VAR[h-authority]][[/.well-known/ni]]/alg/val?query-string]]
のような [CODE(URI)@en[[[http:]]]] [[URL]] (や [CODE(URI)@en[[[https:]]]] [[URL]])
に変形できます [SRC[>>3]]。

[25] ここで [VAR[h-authority]] は、 [VAR[n-authority]] が空でなければ、
同じ値でなければ[['''なりません''']]。空の時は、[[応用]]の[[文脈]]により適当な値を設定できます。
[SRC[>>3]]

[EG[
[26] 例えば [[Webページ]]内なら、その[[起源]]と同じものとできます [SRC[>>3]]。
]EG]

[23] この変形は [CODE(URI)@en[[[ni:]]]] に対応した[[クライアント]]が使えない時にはいつでも利用できます
[SRC[>>3]]。しかし得られるデータが意図したものとは限りません [SRC[>>3]]。また、
[[HTTP]] から [CODE(URI)@en[[[ni:]]]] への逆の変形もできますが、
やはり意図したものになるとは限りません [SRC[>>3]]。

[24] [[応答]]は [CODE(HTTP)[[[3xx]]]] かもしれませんが、 [[HTTP]]
に従い正しく処理できなければ[['''なりません''']] [SRC[>>3]]。

* 応用

[33] 使っているところを見たことがないです。

[34] 聞いたことある?

* バイナリ形式

[27] [[RFC]] は、可変長の[[バイナリ形式]]も規定しています [SRC[>>3]]。

* 人間可読形式

[29] 姉妹 [[URL scheme]] として、[[人間可読]]と称する [CODE(URI)@en[[[nih:]]]] 
[[URL scheme]] が定義されています。

* 歴史

[1] [CITE@en[Subresource Integrity]]
( ([TIME[2014-03-15 05:47:19 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-SRI-20140318/>

[31] [CITE@en[''''''[''''''Integrity'''''']'''''' Revisit RFC6920 URIs for benefit of servers and Semantic  Web applications]]
([[Austin William Wright]] 著, [TIME[2015-03-10 15:23:19 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Mar/0048.html>

[FIG(quote)[
[FIGCAPTION[
[32] [CITE@en[hash-uri/README.md at master · hash-uri/hash-uri]]
( ([TIME[2016-10-08 20:55:23 +09:00]]))
<https://github.com/hash-uri/hash-uri/blob/master/README.md>
]FIGCAPTION]

> Uses uncommon URI syntax that could break many parsers (; path arguments). The "ni" (Named Info) term is less meaningful and overlaps with URNs (Uniform Resource Names), which could potentially lead to use for non-content addresses.

]FIG]

[35] [[SRI]] が逃げたのはやはり正しかった。 [[URL]] にすることの意味がなく、
逆に[[パーセント符号化]]とか要らぬ複雑性を持ち込むだけだからな。

[36] [[参照元にハッシュ値を埋め込む提案と失敗の歴史]]の1頁でした。