X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost28147%2Fcfb.go;fp=gost28147%2Fcfb.go;h=dfcd8f7b7f9812ea3f23c52a34580cf3f6a8d8f8;hb=c07494bbd559b9d00f391e28cfd070e18afe9900;hp=0000000000000000000000000000000000000000;hpb=107600dede989f0cc479b5a72c5f97e174307154;p=gogost.git diff --git a/gost28147/cfb.go b/gost28147/cfb.go new file mode 100644 index 0000000..dfcd8f7 --- /dev/null +++ b/gost28147/cfb.go @@ -0,0 +1,80 @@ +// GoGOST -- Pure Go GOST cryptographic functions library +// Copyright (C) 2015-2019 Sergey Matveev +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package gost28147 + +type CFBEncrypter struct { + c *Cipher + iv []byte +} + +func (c *Cipher) NewCFBEncrypter(iv []byte) *CFBEncrypter { + if len(iv) != BlockSize { + panic("iv length is not equal to blocksize") + } + encrypter := CFBEncrypter{c: c, iv: make([]byte, BlockSize)} + copy(encrypter.iv, iv) + return &encrypter +} + +func (c *CFBEncrypter) XORKeyStream(dst, src []byte) { + var n int + i := 0 +MainLoop: + for { + c.c.Encrypt(c.iv, c.iv) + for n = 0; n < BlockSize; n++ { + if i*BlockSize+n == len(src) { + break MainLoop + } + c.iv[n] ^= src[i*BlockSize+n] + dst[i*BlockSize+n] = c.iv[n] + } + i++ + } + return +} + +type CFBDecrypter struct { + c *Cipher + iv []byte +} + +func (c *Cipher) NewCFBDecrypter(iv []byte) *CFBDecrypter { + if len(iv) != BlockSize { + panic("iv length is not equal to blocksize") + } + decrypter := CFBDecrypter{c: c, iv: make([]byte, BlockSize)} + copy(decrypter.iv, iv) + return &decrypter +} + +func (c *CFBDecrypter) XORKeyStream(dst, src []byte) { + var n int + i := 0 +MainLoop: + for { + c.c.Encrypt(c.iv, c.iv) + for n = 0; n < BlockSize; n++ { + if i*BlockSize+n == len(src) { + break MainLoop + } + dst[i*BlockSize+n] = c.iv[n] ^ src[i*BlockSize+n] + c.iv[n] = src[i*BlockSize+n] + } + i++ + } + return +}