func()

in v3/internal/aes_cbc.go [61:108]


func (reader *cbcEncryptReader) Read(data []byte) (int, error) {
	n, err := reader.src.Read(data)
	reader.size += n
	blockSize := reader.encrypter.BlockSize()
	reader.buf.Write(data[:n])

	if err == io.EOF {
		b := make([]byte, getSliceSize(blockSize, reader.buf.Len(), len(data)))
		n, err = reader.buf.Read(b)
		if err != nil && err != io.EOF {
			return n, err
		}
		// The buffer is now empty, we can now pad the data
		if reader.buf.Len() == 0 {
			b, err = reader.padder.Pad(b[:n], reader.size)
			if err != nil {
				return n, err
			}
			n = len(b)
			err = io.EOF
		}
		// We only want to encrypt if we have read anything
		if n > 0 {
			reader.encrypter.CryptBlocks(data, b)
		}
		return n, err
	}

	if err != nil {
		return n, err
	}

	if size := reader.buf.Len(); size >= blockSize {
		nBlocks := size / blockSize
		if size > len(data) {
			nBlocks = len(data) / blockSize
		}

		if nBlocks > 0 {
			b := make([]byte, nBlocks*blockSize)
			n, _ = reader.buf.Read(b)
			reader.encrypter.CryptBlocks(data, b[:n])
		}
	} else {
		n = 0
	}
	return n, nil
}