(ctx context.Context, req *Request)
| 209 | } |
| 210 | |
| 211 | func (e encryptedConnection) Request(ctx context.Context, req *Request) ([]byte, error) { |
| 212 | folderKey, ok := e.folderKeys.get(req.Folder) |
| 213 | if !ok { |
| 214 | return e.conn.Request(ctx, req) |
| 215 | } |
| 216 | fileKey := e.keyGen.FileKey(req.Name, folderKey) |
| 217 | |
| 218 | // Encrypt / adjust the request parameters. |
| 219 | |
| 220 | encSize := req.Size |
| 221 | if encSize < minPaddedSize { |
| 222 | // Make a request for minPaddedSize data instead of the smaller |
| 223 | // block. We'll chop of the extra data later. |
| 224 | encSize = minPaddedSize |
| 225 | } |
| 226 | encSize += blockOverhead |
| 227 | encName := encryptName(req.Name, folderKey) |
| 228 | encOffset := req.Offset + int64(req.BlockNo*blockOverhead) |
| 229 | encHash := encryptBlockHash(req.Hash, req.Offset, fileKey) |
| 230 | |
| 231 | // Perform that request, getting back an encrypted block. |
| 232 | |
| 233 | encReq := &Request{ |
| 234 | ID: req.ID, |
| 235 | Folder: req.Folder, |
| 236 | Name: encName, |
| 237 | Offset: encOffset, |
| 238 | Size: encSize, |
| 239 | Hash: encHash, |
| 240 | BlockNo: req.BlockNo, |
| 241 | } |
| 242 | bs, err := e.conn.Request(ctx, encReq) |
| 243 | if err != nil { |
| 244 | return nil, err |
| 245 | } |
| 246 | |
| 247 | // Return the decrypted block (or an error if it fails decryption) |
| 248 | |
| 249 | bs, err = DecryptBytes(bs, fileKey) |
| 250 | if err != nil { |
| 251 | return nil, err |
| 252 | } |
| 253 | return bs[:req.Size], nil |
| 254 | } |
| 255 | |
| 256 | func (e encryptedConnection) DownloadProgress(ctx context.Context, dp *DownloadProgress) { |
| 257 | if _, ok := e.folderKeys.get(dp.Folder); !ok { |
nothing calls this directly
no test coverage detected