Расшифровка каждого 1024-го блока не удалась - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь внедрить ридер в golang для расшифровки данных (предоставленных ридером) и проверки данных (hmac + sha256) одновременно.

Дешифрование полных данных одним блоком и проверка их правильности. Данные могут быть довольно большими, поэтому я не хочу их хранить в массиве данных.

Реализация ридера работает по большей части, но результат каждого 1024-го блока является неправильным.

func (r *mediaReader) Read(dst []byte) (n int, err error) {
if m := len(dst); m%r.cbc.BlockSize() != 0 {
    m = (m / r.cbc.BlockSize()) * r.cbc.BlockSize()
    dst = dst[:m]
}

n, err = r.limitedReader.Read(dst)

r.cbc.CryptBlocks(dst, dst)

tmp := r.fileLength - int64(n)
if tmp < 0 || err == io.EOF {
    n += int(tmp)
}
r.total += n

r.fileLength -= int64(n)
r.hash.Write(dst)
if r.fileLength <= 0 || err == io.EOF {
    //validate
    mac := make([]byte, 10)
    nn, rr := r.fullReader.Read(mac)
    if rr != nil {
        return n, rr
    }
    if nn != 10 {
        return n, fmt.Errorf("not enougth data remaining")
    }
    if !hmac.Equal(mac, r.hash.Sum(nil)) {
        return n, fmt.Errorf("invalid media hmac\n%v\n%v", r.hash.Sum(nil)[:10], mac)
    }
    //SUCCESS
    return n, io.EOF
}
return n, err
}

limitedReader использует fullReader и заканчивает на 10 байтов раньше, чем fullReader. Фрагмент создания mediaReader:

h := hmac.New(sha256.New, macKey)
h.Write(iv)

cbc := cipher.NewCBCDecrypter(block, iv)

media := &io.LimitedReader{R: fullReader, N: length - 10}

return &mediaReader{
    limitedReader: media,
    fullReader:    fullReader,
    hash:          h,
    fileLength:    fileLength,
    cbc:           cbc,
    total:         0,
}

Кто-нибудь понимает, что я делаю неправильно? Неправильные расшифрованные байты: 16384-16399; 1 *1024* 16 (размер блока AES); 16 неправильных байтов 32768-32783; 2 *1024* 16 (размер блока AES); 16 неправильных байтов 49152-49167; 3 *1024* 16 (размер блока AES); 16 неправильных байтов ...

Спасибо за вашу помощь!

...