MCPcopy Create free account
hub / github.com/containerd/imgcrypt / cryptChildren

Function cryptChildren

images/encryption/encryption.go:276–363  ·  view source on GitHub ↗

Encrypt or decrypt all the Children of a given descriptor

(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp, _ *ocispec.Platform)

Source from the content-addressed store, hash-verified

274
275// Encrypt or decrypt all the Children of a given descriptor
276func cryptChildren(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp, _ *ocispec.Platform) (ocispec.Descriptor, bool, error) {
277 children, err := images.Children(ctx, cs, desc)
278 if err != nil {
279 if errdefs.IsNotFound(err) {
280 return desc, false, nil
281 }
282 return ocispec.Descriptor{}, false, err
283 }
284
285 var newLayers []ocispec.Descriptor
286 var config ocispec.Descriptor
287 modified := false
288
289 for _, child := range children {
290 // we only encrypt child layers and have to update their parents if encryption happened
291 switch child.MediaType {
292 case images.MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig:
293 config = child
294 case images.MediaTypeDockerSchema2LayerGzip, images.MediaTypeDockerSchema2Layer,
295 ocispec.MediaTypeImageLayerGzip, ocispec.MediaTypeImageLayer,
296 ocispec.MediaTypeImageLayerZstd:
297 if cryptoOp == cryptoOpEncrypt && lf(child) {
298 nl, err := cryptLayer(ctx, cs, child, cc, cryptoOp)
299 if err != nil {
300 return ocispec.Descriptor{}, false, err
301 }
302 modified = true
303 newLayers = append(newLayers, nl)
304 } else {
305 newLayers = append(newLayers, child)
306 }
307 case encocispec.MediaTypeLayerGzipEnc, encocispec.MediaTypeLayerZstdEnc, encocispec.MediaTypeLayerEnc:
308 // this one can be decrypted but also its recipients list changed
309 if lf(child) {
310 nl, err := cryptLayer(ctx, cs, child, cc, cryptoOp)
311 if err != nil || cryptoOp == cryptoOpUnwrapOnly {
312 return ocispec.Descriptor{}, false, err
313 }
314 modified = true
315 newLayers = append(newLayers, nl)
316 } else {
317 newLayers = append(newLayers, child)
318 }
319 case images.MediaTypeDockerSchema2LayerForeign, images.MediaTypeDockerSchema2LayerForeignGzip, "application/vnd.in-toto+json":
320 // never encrypt/decrypt
321 newLayers = append(newLayers, child)
322 default:
323 return ocispec.Descriptor{}, false, fmt.Errorf("bad/unhandled MediaType %s in encryptChildren", child.MediaType)
324 }
325 }
326
327 if modified && len(newLayers) > 0 {
328 newManifest := ocispec.Manifest{
329 Versioned: specs.Versioned{
330 SchemaVersion: 2,
331 },
332 Config: config,
333 Layers: newLayers,

Callers 2

cryptManifestFunction · 0.85
cryptManifestListFunction · 0.85

Calls 1

cryptLayerFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…