You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.6 KiB
51 lines
1.6 KiB
package ige |
|
|
|
import ( |
|
"crypto/cipher" |
|
"errors" |
|
) |
|
|
|
// ErrInvalidIV is displayed as the panic message if the initialization vector |
|
// passed to NewIGEEncrypter or NewIGEDecrypter doesn't fulfill the length |
|
// requirements for IGE. |
|
// |
|
// IGE uses a two step xor process, so the first initialization vector is the |
|
// first half, and the second initialization vector is the second half. This |
|
// requires the initialization vector to be twice as long as the block size. |
|
var ErrInvalidIV = errors.New("iv length must be: (block size * 2)") |
|
|
|
// IGE satisfies the cipher.BlockMode interface from the crypto/cipher package. |
|
type IGE interface { |
|
// BlockSize returns the mode's block size. |
|
BlockSize() int |
|
// CryptBlocks encrypts or decrypts a number of blocks based on the |
|
// underlying cipher.Block passed to NewIGEEncrypter or NewIGEDecrypter |
|
// (usually from crypto/aes). |
|
CryptBlocks(dst, src []byte) |
|
} |
|
|
|
type ige struct { |
|
block cipher.Block |
|
iv []byte |
|
} |
|
|
|
func newIGE(b cipher.Block, iv []byte) *ige { |
|
i := &ige{b, make([]byte, len(iv))} |
|
copy(i.iv, iv) |
|
return i |
|
} |
|
|
|
func checkIV(b cipher.Block, iv []byte) error { |
|
// the initialization vector needs to contain b.Blocksize()*2 bytes because |
|
// ige uses a two step xor process, and iv[:16] corresponds to the first iv |
|
// while iv[16:] corresponds to the second iv |
|
// |
|
// the original ige paper described the first iv as a random block and the |
|
// second iv as its encrypted counterpart, however, we're copying the |
|
// openssl implementation and therefore both ivs are supplied by the user |
|
if len(iv) != b.BlockSize()*2 { |
|
return ErrInvalidIV |
|
} |
|
|
|
return nil |
|
}
|
|
|