// ExtractDecryptInfo iterates through the header using recipientKey and // attempts to decrypt any DecryptInfoEntry using the provided ephemeral key. // If unsuccessful after iterating through all decryptInfo objects, returns ErrCannotDecrypt. func (hdr *miniLockv1Header) ExtractDecryptInfo(recipientKey *taber.Keys) (nonce []byte, DI *DecryptInfoEntry, err error) { var ( ephemKey *taber.Keys encDI []byte nonceS string ) ephemKey = new(taber.Keys) ephemKey.Public = hdr.Ephemeral if err != nil { return nil, nil, err } // Look for a DI we can decrypt with recipientKey // TODO: Make this concurrent! for nonceS, encDI = range hdr.DecryptInfo { nonce, err := base64.StdEncoding.DecodeString(nonceS) if err != nil { return nil, nil, err } DI, err = DecryptDecryptInfo(encDI, nonce, ephemKey, recipientKey) if err == ErrCannotDecrypt { continue } else if err != nil { return nil, nil, err } recipID, err := recipientKey.EncodeID() if err != nil { return nil, nil, err } if DI.RecipientID != recipID { return nil, nil, ErrBadRecipient } return nonce, DI, nil } return nil, nil, ErrCannotDecrypt }