Skip to content

Commit 3690645

Browse files
authored
Merge pull request #654 from stevvooe/future-proof-digest-constraints
schema: allow compound algorithm specifiers in digests
2 parents 93f7ad5 + b52b2bf commit 3690645

File tree

8 files changed

+197
-87
lines changed

8 files changed

+197
-87
lines changed

descriptor.md

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,58 +57,71 @@ The following field keys are reserved and MUST NOT be used by other specificatio
5757
All other fields may be included in other OCI specifications.
5858
Extended _Descriptor_ field additions proposed in other OCI specifications SHOULD first be considered for addition into this specification.
5959

60-
## Digests and Verification
60+
## Digests
6161

6262
The _digest_ property of a Descriptor acts as a content identifier, enabling [content addressability](http://en.wikipedia.org/wiki/Content-addressable_storage).
6363
It uniquely identifies content by taking a [collision-resistant hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) of the bytes.
64-
If the digest can be communicated in a secure manner, one can retrieve the content from an insecure source, recalculate the digest independently, and be certain that the correct content was obtained.
64+
If the _digest_ can be communicated in a secure manner, one can verify content from an insecure source by recalculating the digest independently, ensuring the content has not been modified.
6565

66-
The value of the digest property is a string consisting of an _algorithm_ portion (the "algorithm identifier") and a _hex_ portion.
67-
The algorithm identifier specifies the cryptographic hash function used to calculate the digest; the hex portion is the lowercase hex-encoded result of the hash.
66+
The value of the `digest` property is a string consisting of an _algorithm_ portion and an _encoded_ portion.
67+
The _algorithm_ specifies the cryptographic hash function and encoding used for the digest; the _encoded_ portion contains the encoded result of the hash function.
6868

69-
The digest string MUST match the following grammar:
69+
A digest string MUST match the following grammar:
7070

7171
```
72-
digest := algorithm ":" hex
73-
algorithm := /[a-z0-9_+.-]+/
74-
hex := /[a-f0-9]+/
72+
digest := algorithm ":" encoded
73+
algorithm := algorithm-component [algorithm-separator algorithm-component]*
74+
algorithm-component := /[a-z0-9]+/
75+
algorithm-separator := /[+._-]/
76+
encoded := /[a-zA-Z0-9=_-]+/
7577
```
7678

7779
Some example digest strings include the following:
7880

79-
digest string | algorithm |
80-
------------------------------------------------------------------------|---------------------|
81-
sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b | [SHA-256](#sha-256) |
81+
digest | algorithm | Supported |
82+
--------------------------------------------------------------------------|---------------------|-----------|
83+
`sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b` | [SHA-256](#sha-256) | Yes |
84+
`sha512:401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b372742...` | [SHA-256](#sha-512) | Yes |
85+
`multihash+base58:QmRZxt2b1FVZPNqd8hsiykDL3TdBDeTSPX9Kv46HmX4Gx8` | Multihash | No |
86+
`sha256+b64u:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564` | SHA-256 with urlsafe base64 | No|
8287

83-
* Before consuming content targeted by a descriptor from untrusted sources, the byte content SHOULD be verified against the digest string.
84-
* Before calculating the digest, the size of the content SHOULD be verified to reduce hash collision space.
85-
* Heavy processing before calculating a hash SHOULD be avoided.
86-
* Implementations MAY employ [canonicalization](canonicalization.md) of the underlying content to ensure stable content identifiers.
88+
Please see [Registered Algorithms](#registered-identifiers) for a list of supported algorithms.
89+
90+
Implementations SHOULD allow digests that are unsupported to pass validation if they comply with the above grammar.
91+
While `sha256` will only use hex encoded digests, support for separators in _algorithm_ and alpha numeric in _encoded_ is included to allow for future extension of digest support.
92+
As an example, we can paramterize the encoding and algorithm as `multihash+base58:QmRZxt2b1FVZPNqd8hsiykDL3TdBDeTSPX9Kv46HmX4Gx8`, which would be considered valid but unsupported by this specification.
93+
94+
### Verification
95+
96+
Before consuming content targeted by a descriptor from untrusted sources, the byte content SHOULD be verified against the digest string.
97+
Before calculating the digest, the size of the content SHOULD be verified to reduce hash collision space.
98+
Heavy processing before calculating a hash SHOULD be avoided.
99+
Implementations MAY employ [canonicalization](canonicalization.md) of the underlying content to ensure stable content identifiers.
87100

88101
### Digest calculations
89102

90103
A _digest_ is calculated by the following pseudo-code, where `H` is the selected hash algorithm, identified by string `<alg>`:
91104
```
92105
let ID(C) = Descriptor.digest
93106
let C = <bytes>
94-
let D = '<alg>:' + EncodeHex(H(C))
107+
let D = '<alg>:' + Encode(H(C))
95108
let verified = ID(C) == D
96109
```
97110
Above, we define the content identifier as `ID(C)`, extracted from the `Descriptor.digest` field.
98111
Content `C` is a string of bytes.
99-
Function `H` returns the hash of `C` in bytes and is passed to function `EncodeHex` and prefixed with the algorithm to obtain the digest.
112+
Function `H` returns the hash of `C` in bytes and is passed to function `Encode` and prefixed with the algorithm to obtain the digest.
100113
The result `verified` is true if `ID(C)` is equal to `D`, confirming that `C` is the content identified by `D`.
101114
After verification, the following is true:
102115

103116
```
104-
D == ID(C) == '<alg>:' + EncodeHex(H(C))
117+
D == ID(C) == '<alg>:' + Encode(H(C))
105118
```
106119

107120
The _digest_ is confirmed as the content identifier by independently calculating the _digest_.
108121

109122
### Registered algorithms
110123

111-
While the _algorithm_ portion (the "algorithm identifier") of the digest string allows the use of a variety of cryptographic algorithms, compliant implementations SHOULD use [SHA-256](#sha-256).
124+
While the _algorithm_ component of the digest string allows the use of a variety of cryptographic algorithms, compliant implementations SHOULD use [SHA-256](#sha-256).
112125

113126
The following algorithm identifiers are currently defined by this specification:
114127

image-layout.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51 ./blobs/sha256/
5353
## Blobs
5454

5555
* Object names in the `blobs` subdirectories are composed of a directory for each hash algorithm, the children of which will contain the actual content.
56-
* A blob, referenced with digest `<alg>:<hex>` (per [descriptor](descriptor.md#digests-and-verification)), MUST have its content stored in a file under `blobs/<alg>/<hex>`.
57-
* The character set of the entry name for `<hex>` and `<alg>` MUST match the respective grammar elements described in [descriptor](descriptor.md#digests-and-verification).
56+
* A blob, referenced with digest `<alg>:<encoded>` (per [descriptor](descriptor.md#digests-and-verification)), MUST have its content stored in a file under `blobs/<alg>/<encoded>`.
57+
* The character set of the entry name for `<encoded>` and `<alg>` MUST match the respective grammar elements described in [descriptor](descriptor.md#digests-and-verification).
5858
* For example `sha256:5b` will map to the layout `blobs/sha256/5b`.
5959
* The blobs directory MAY contain blobs which are not referenced by any of the [refs](#indexjson-file).
6060
* The blobs directory MAY be missing referenced blobs, in which case the missing blobs SHOULD be fulfilled by an external blob store.

schema/content-descriptor.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"$ref": "defs.json#/definitions/int64"
1414
},
1515
"digest": {
16-
"description": "the cryptographic checksum digest of the object, in the pattern '<hash>:<hexadecimal digest>'",
16+
"description": "the cryptographic checksum digest of the object, in the pattern '<algorithm>:<encoded>'",
1717
"$ref": "defs-descriptor.json#/definitions/digest"
1818
},
1919
"urls": {

schema/defs-descriptor.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"pattern": "^[A-Za-z0-9][A-Za-z0-9!#$&-^_.+]{0,126}/[A-Za-z0-9][A-Za-z0-9!#$&-^_.+]{0,126}$"
88
},
99
"digest": {
10-
"description": "the cryptographic checksum digest of the object, in the pattern '<hash>:<hexadecimal digest>'",
10+
"description": "the cryptographic checksum digest of the object, in the pattern '<algorithm>:<encoded>'",
1111
"type": "string",
12-
"pattern": "^[a-z0-9_+.-]+:[a-f0-9]+$"
12+
"pattern": "^[a-z0-9]+(?:[+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+$"
1313
},
1414
"urls": {
1515
"description": "a list of urls from which this object may be downloaded",

schema/descriptor_test.go

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,6 @@ func TestDescriptor(t *testing.T) {
200200
"digest": "sha256:5B0BCABD1ED22E9FB1310CF6C2DEC7CDEF19F0AD69EFA1F392E94A4333501270"
201201
}
202202
`,
203-
fail: true,
204203
},
205204

206205
// expected success: valid URL entry
@@ -232,6 +231,66 @@ func TestDescriptor(t *testing.T) {
232231
`,
233232
fail: true,
234233
},
234+
{
235+
descriptor: `{
236+
"mediaType": "application/vnd.oci.image.config.v1+json",
237+
"size": 1470,
238+
"digest": "sha256+b64:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b"
239+
}`,
240+
},
241+
{
242+
descriptor: `{
243+
"mediaType": "application/vnd.oci.image.config.v1+json",
244+
"size": 1470,
245+
"digest": "sha256+b64:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b"
246+
}`,
247+
},
248+
{
249+
descriptor: `{
250+
"mediaType": "application/vnd.oci.image.config.v1+json",
251+
"size": 1470,
252+
"digest": "sha256+foo-bar:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b"
253+
}`,
254+
},
255+
{
256+
descriptor: `
257+
{
258+
"mediaType": "application/vnd.oci.image.config.v1+json",
259+
"size": 1470,
260+
"digest": "sha256.foo-bar:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b"
261+
}`,
262+
},
263+
{
264+
descriptor: `{
265+
"mediaType": "application/vnd.oci.image.config.v1+json",
266+
"size": 1470,
267+
"digest": "multihash+base58:QmRZxt2b1FVZPNqd8hsiykDL3TdBDeTSPX9Kv46HmX4Gx8"
268+
}`,
269+
},
270+
{
271+
// fail: repeated separators in algorithm
272+
descriptor: `{
273+
"mediaType": "application/vnd.oci.image.config.v1+json",
274+
"size": 1470,
275+
"digest": "sha256+foo+-b:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b"
276+
}`,
277+
fail: true,
278+
},
279+
{
280+
descriptor: `{
281+
"digest": "sha256+b64u:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564",
282+
"size": 1000000,
283+
"mediaType": "application/vnd.oci.image.config.v1+json"
284+
}`,
285+
},
286+
{
287+
// test for those who cannot use modulo arithmetic to recover padding.
288+
descriptor: `{
289+
"digest": "sha256+b64u.unknownlength:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564=",
290+
"size": 1000000,
291+
"mediaType": "application/vnd.oci.image.config.v1+json"
292+
}`,
293+
},
235294
} {
236295
r := strings.NewReader(tt.descriptor)
237296
err := schema.ValidatorMediaTypeDescriptor.Validate(r)

schema/fs.go

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ var _escData = map[string]*_escFile{
205205
"/config-schema.json": {
206206
local: "config-schema.json",
207207
size: 2771,
208-
modtime: 1489007060,
208+
modtime: 1489087148,
209209
compressed: `
210-
H4sIAAAJbogA/+RWQW/bPAy9+1cYbo9t/R2+U67dbgMyINh2KIZAsemEnSVqFD3MGPLfB8vJZtmym3XI
210+
H4sIAAAAAAAA/+RWQW/bPAy9+1cYbo9t/R2+U67dbgMyINh2KIZAsemEnSVqFD3MGPLfB8vJZtmym3XI
211211
aScDFB/f4xMl60eSplkJrmC0gmSyVZqtLZhHMqLQAKePZCrcpxsLBVZYKJ9118FuXXEArTrIQcSu8vzZ
212212
kbnvow/E+7xkVcn9f//nfeymx2F5hrhVnpMFU5zZnIf12TlqtYe88Pw9UloLHZZ2z1BIH7NMFlgQXLZK
213213
u3bSNCsYlED5KzCAOmE0fTkfr4i1km6lVAL3ghoyv3bsUzLVyIF4oVSYzcUBBQppGC7FkLs08+RFJHvg
@@ -222,40 +222,41 @@ b1D07fCyW0vviMlWxN4UcYpZ/Enjdtf+RQ3SGiZ/vj8oANpKu/UTMV9kR1SDMjPzGZ6y5MQwnZvwWfX7
222222

223223
"/content-descriptor.json": {
224224
local: "content-descriptor.json",
225-
size: 1091,
226-
modtime: 1489085976,
225+
size: 1085,
226+
modtime: 1493147571,
227227
compressed: `
228-
H4sIAAAJbogA/5yTwW7UMBCG73mKUVqpl27NoeIQVb3AnQPcEAevPY6nJLYZz6oE1HdHjrNsAoiFve2O
229-
/m/mm2j8vQFoLWbDlIRiaDto3yUMb2IQTQEZyi8MAm+XUGR4n9CQI6Nn4ra0uM7G46gL7kVSp9RTjmFX
230-
q3eRe2VZO9m9ule1dlU5skckd0rFhMEcJ+cZq2llf06vnEwJCxn3T2ik1hLHhCyEue2gLAbQjmhJf6jh
231-
Wvp9X/EIc640heigFBgdMgaDFlYzZvya0RXOosu7k9hd2fhKWXQUqPTO6jR9Zl9qizbTt3M+JQIUYD8J
232-
5v90+oMIBXl9v5Ww1GOWMxqGpySxZ508GTAezed8GKGyR63qclt0y9+kRZAD3Dx4nf1j9+Dxq7ZoaNTD
233-
Qj7eXPI1F+PNFgce8l920DBQFS1BcBxHePZkPIinvJjDqCfYI9j4HIaoLdpL7GaTjZsOIcr8RjaK/3ry
234-
NOoeV4ev1v0uEFzj1bNZXFvGLwdiLGIff30365vdnk4D8Kl5aX4EAAD//4LEuuxDBAAA
228+
H4sIAAAAAAAA/5yTwW7UMBCG73mKUVqpl27NoeIQVb3AnQPcEAevPY6nbGwznlW1oL47mniXJoAo3Vsy
229+
+r+Zz8n4RwfQe6yOqQjl1A/QfyiY3uUklhIy6BMmgffHUGb4WNBRIGdn4lpbXFYXcbKKR5EyGPNQc9q0
230+
6k3m0Xi2QTZvbk2rXTSO/AmpgzG5YHKnyXXGWtr4X9MbJ4eCSubtAzpptcK5IAth7QfQgwH0E3qyn1q4
231+
lf48r0SEOadNIQfQAmNAxuTQw2LGjF8yBuU8hrp5FrvRE18Yj4ESae9qnqfP7FNr0Vf6/pKPRoASbA+C
232+
9ZVOfxGhJG9v1xKeRqzygobjQ5E8si2RHLiI7mvdT9DYk1ZzuVZdfS1WBDnB1Z3djZlJ4nQ/3OmP9ejv
233+
r875jkfXlf+ed/Uf9hZ21BQ1CIHzBI+RXASJVI/OMNkDbBF8fky7bD36c+xmk5WbTSnLfDtWiv+77DTZ
234+
ERcrb5b9zhBc4s2zO7r2jN/2xKhin3+/McttXS9NB/Cle+p+BgAA///HjexwPQQAAA==
235235
`,
236236
},
237237

238238
"/defs-descriptor.json": {
239239
local: "defs-descriptor.json",
240-
size: 906,
241-
modtime: 1489085976,
240+
size: 922,
241+
modtime: 1493750367,
242242
compressed: `
243-
H4sIAAAJbogA/6STT2/TQBDF7/kUwzaih8Rx4YCEVVVC9M6hnKjSaro79k7x/tHuRCVU+e5obTdJi0Cg
244-
Hmx5RzPvze9p/TgDUIayThyFg1cNqEtq2XM5ZYiYhPWmxwQS4Esk/zl4QfaU4HIaCwmuImluWeOgsRxF
245-
9yqqgeIDoBwZxq/bSPsSgGJTXK1IzE1dh0heP3nkVUhdnbUlhzU77Kg2e9f6oLZ80pJRW2VJ7LtDPaII
246-
pQHv5vpT9Q2rn2fVx/Xh883J/G11c7tarB/Plu/ef9jV/9Y2V4PFbnRShjvKckz3IlyxBDpto4QuYbSs
247-
QVvS3/PGwTgLoYXSFO7uScsS2A/HCQBOzy1me9GcW/qBhjQ77KfJi9P/zGFEul2sqvWiucaqLayLF0Sb
248-
1Oe/8CD0PC5dGqFNwcGDZW1BLOeJAhxu4Y7AhAffBzRkft8UU8LtocxC7tj3z0wAqg3JYUldbRKrqb57
249-
hoHeB8Hn1/E1d+9Yb7/0PFFb9Ay1eXWfgz+pj36D2mG8GnYf31POs/LsZr8CAAD//1ayPsKKAwAA
243+
H4sIAAAAAAAA/6STX2/TMBTF3/spLl7FgDZN4QFp0Ria2DsP42lTV93ZN/Ed8R/ZrqYy9bsjJ1naFYFA
244+
PCSyj67Pub8b52kCIBRFGdgndlZUIK6oZst5F8FjSCw3LQZIDr56sl+cTciWAlwNx1yAa0+Sa5bYecx7
245+
09FFVJBzAIQhxfht62mUAASrnKpT8rEqS+fJyueMuHChKaPUZLBkgw2Vakwt927zZ6/Ue4uYAttmr3tM
246+
iUKHd3d7Wdxg8WNZnK32y1cn09fF3XoxWz0t5+8/fNyVf1c2FV3Erk8SihuK6ZDuaLhJE8iw9ck1Ab1m
247+
CVKT/B43Bvqz4GrIRe7+gWSaA9tuOwDA6Tm2jQuctLmozvOoFKmL03+cwMA1e/O5up0t1sVqVN6+q/L6
248+
srhZFmef1sVqdkS4CW38Ax9Cyz1ELoQ6OAOPmqWGpDkOVGBwC/cEyj3a1qEi9Wv/GAJu9zInMoe5vycF
249+
ELULBvNXEJvAYtB3LzDQWpfw5fX8n7t46Dc2PQ1UZz9FdVw8RGdPyoPfojTor7ve+/cw50l+dpOfAQAA
250+
//8aH/C2mgMAAA==
250251
`,
251252
},
252253

253254
"/defs.json": {
254255
local: "defs.json",
255256
size: 1670,
256-
modtime: 1489007060,
257+
modtime: 1489087148,
257258
compressed: `
258-
H4sIAAAJbogA/7STza6bMBCF9zzFyO2S9oJtbGDb7hMpy6oLSiaJq2AjY6RWEe9e8RNChFuJKneRgGc8
259+
H4sIAAAAAAAA/7STza6bMBCF9zzFyO2S9oJtbGDb7hMpy6oLSiaJq2AjY6RWEe9e8RNChFuJKneRgGc8
259260
3zmeMbcAgByxKa2qnTKa5EC+4klp1a8aaBs8grtY054vpnXgLgi7GvUXo12hNFo41FiqkyqLoTwceTOA
260261
5NBLABClXTqvAIj7XWOvprTDM9qhckhUSquqrUgOn2KaPsLFrykcUzkEu3Amx2IrmlEpfPA+vsIzuhVP
261262
Yy55ygT3aczJlZDgW4UyShmTNGIiTbiUIooij6Jn15N0+x/T8enQJFlxN8/GBxZJwtbozXPxoTnNeCYk
@@ -267,43 +268,43 @@ fIvD7in0ryMEy+fK1G6UfmdTE+tvpoL+1wV/AgAA//96IpqyhgYAAA==
267268

268269
"/image-index-schema.json": {
269270
local: "image-index-schema.json",
270-
size: 3157,
271-
modtime: 1489085976,
271+
size: 3151,
272+
modtime: 1493147606,
272273
compressed: `
273-
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
285286
`,
286287
},
287288

288289
"/image-layout-schema.json": {
289290
local: "image-layout-schema.json",
290-
size: 414,
291-
modtime: 1485388791,
291+
size: 439,
292+
modtime: 1489792109,
292293
compressed: `
293-
H4sIAAAJbogA/2yPwUrEMBCG732KIXq0TQVPue5pQdiD4EU8xHa2zWKTOJkKi/TdJZlWD91TmD/z8c3/
294-
UwGoHlNHLrILXhlQp4j+EDxb55HgONkB4dlew8zw0o04WfWQqfskgwE1Mkej9SUFX0vaBBp0T/bMdfuk
295-
JbsTzvUbkozWIaLvNlkqmGxrl8X1ZxELydeImQ0fF+zWLFKISOwwKQO5TTZkUi5+RUpSS/72bb9lA8IZ
296-
eEQ4HY6wMxdusycm54f/HP08KQNv6wygHpu2adU6v5d3qQCWcjDh1+wI+z/k1rlV5pbqNwAA//8bwMuB
297-
ngEAAA==
294+
H4sIAAAAAAAA/2yPQUvEMBCF7/0VQ/Sg4DYVPOW6pwVhD4IX8VDTaTvLNonJVFik/12SaRXRU5g38+W9
295+
91kBqA6TjRSYvFMG1DGg23vHLTmMcJjaAeGxvfiZ4cmOOLXqLlPXSQYDamQORutT8m4nau3joLvY9rxr
296+
HrRoV8JRtyHJaO0DOruZpYLJtaZsrM/FWEi+BMysfzuhXbUQfcDIhEkZyG2yQyYl8TPGJLVk97fth1yA
297+
74FHhOP+8LvyDbmy8JZ2EgZ6OuNtsS8fbrESR3LDj45unpSBl3UGUPd1UzdqnV/Lu1QAS2kS8X2miN03
298+
8l+PKnNL9RUAAP//k31n5bcBAAA=
298299
`,
299300
},
300301

301302
"/image-manifest-schema.json": {
302303
local: "image-manifest-schema.json",
303304
size: 921,
304-
modtime: 1489085976,
305+
modtime: 1489087148,
305306
compressed: `
306-
H4sIAAAJbogA/5ySMW8iMRCF+/0VI0MJ+O501bZXUZxSJEoTpXB2x7uDWNsZmygo4r9HtnHAkCKifTvv
307+
H4sIAAAAAAAA/5ySMW8iMRCF+/0VI0MJ+O501bZXUZxSJEoTpXB2x7uDWNsZmygo4r9HtnHAkCKifTvv
307308
zTdv/dEAiB59x+QCWSNaEHcOzT9rgiKDDOtJDQj/lSGNPsC9w440dSpNL6J97rsRJxWtYwiulXLjrVlm
308309
dWV5kD0rHZa//sqszbKP+mLxrZTWoenKVp9seVpSJJDTkSB7w95hdNuXDXZHzbF1yIHQixbiYQAiRzwi
309310
+3xclq9vfhjJgybc9uDzheghjAhpOZTlkPPgLQeC8qAMkAk4ICeKFH7bZbKG/Uort16tmcjQtJtEC39O

schema/image-index-schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"$ref": "defs.json#/definitions/int64"
3232
},
3333
"digest": {
34-
"description": "the cryptographic checksum digest of the object, in the pattern '<hash>:<hexadecimal digest>'",
34+
"description": "the cryptographic checksum digest of the object, in the pattern '<algorithm>:<encoded>'",
3535
"$ref": "defs-descriptor.json#/definitions/digest"
3636
},
3737
"urls": {

0 commit comments

Comments
 (0)