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

Function cryptLayer

images/encryption/encryption.go:190–248  ·  view source on GitHub ↗

cryptLayer handles the changes due to encryption or decryption of a layer

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

Source from the content-addressed store, hash-verified

188
189// cryptLayer handles the changes due to encryption or decryption of a layer
190func cryptLayer(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, cryptoOp cryptoOp) (ocispec.Descriptor, error) {
191 var (
192 resultReader io.Reader
193 newDesc ocispec.Descriptor
194 encLayerFinalizer ocicrypt.EncryptLayerFinalizer
195 )
196
197 dataReader, err := cs.ReaderAt(ctx, desc)
198 if err != nil {
199 return ocispec.Descriptor{}, err
200 }
201 defer dataReader.Close()
202
203 if cryptoOp == cryptoOpEncrypt {
204 newDesc, resultReader, encLayerFinalizer, err = encryptLayer(cc, dataReader, desc)
205 } else {
206 newDesc, resultReader, err = decryptLayer(cc, dataReader, desc, cryptoOp == cryptoOpUnwrapOnly)
207 }
208 if err != nil || cryptoOp == cryptoOpUnwrapOnly {
209 return ocispec.Descriptor{}, err
210 }
211
212 newDesc.Annotations = ocicrypt.FilterOutAnnotations(desc.Annotations)
213
214 // some operations, such as changing recipients, may not touch the layer at all
215 if resultReader != nil {
216 var ref string
217 // If we have the digest, write blob with checks
218 haveDigest := newDesc.Digest.String() != ""
219 if haveDigest {
220 ref = fmt.Sprintf("layer-%s", newDesc.Digest.String())
221 } else {
222 ref = fmt.Sprintf("blob-%d-%d", rand.Int(), rand.Int())
223 }
224
225 if haveDigest {
226 if err := content.WriteBlob(ctx, cs, ref, resultReader, newDesc); err != nil {
227 return ocispec.Descriptor{}, fmt.Errorf("failed to write config: %w", err)
228 }
229 } else {
230 newDesc.Digest, newDesc.Size, err = ingestReader(ctx, cs, ref, resultReader)
231 if err != nil {
232 return ocispec.Descriptor{}, err
233 }
234 }
235 }
236
237 // After performing encryption, call finalizer to get annotations
238 if encLayerFinalizer != nil {
239 annotations, err := encLayerFinalizer()
240 if err != nil {
241 return ocispec.Descriptor{}, fmt.Errorf("error getting annotations from encLayer finalizer: %w", err)
242 }
243 for k, v := range annotations {
244 newDesc.Annotations[k] = v
245 }
246 }
247 return newDesc, err

Callers 1

cryptChildrenFunction · 0.85

Calls 3

encryptLayerFunction · 0.85
decryptLayerFunction · 0.85
ingestReaderFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…