65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
// Package speck implements (parts of) the Speck block cipher as defined in
|
|
// https://eprint.iacr.org/2013/404.pdf.
|
|
package speck
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.omicron.one/playground/cryptography/cipher"
|
|
"git.omicron.one/playground/cryptography/cipher/speck/impl"
|
|
)
|
|
|
|
type SpeckParameters int
|
|
|
|
const (
|
|
Speck3264 = iota + 1
|
|
Speck4872
|
|
Speck4896
|
|
Speck6496
|
|
Speck64128
|
|
Speck9696
|
|
Speck96144
|
|
Speck128128
|
|
Speck128192
|
|
Speck128256
|
|
)
|
|
|
|
var keySizes = []int{
|
|
0, // unused
|
|
8, // Speck3264
|
|
9, // Speck4872
|
|
12, // Speck4896
|
|
12, // Speck6496
|
|
16, // Speck64128
|
|
12, // Speck9696
|
|
18, // Speck96144
|
|
16, // Speck128128
|
|
24, // Speck128192
|
|
32, // Speck128256
|
|
}
|
|
|
|
// New creates a new speck block cipher context.
|
|
// Returns the created block cipher or an error.
|
|
func New(key []byte, param SpeckParameters) (cipher.Block, error) {
|
|
if param <= 0 || int(param) >= len(keySizes) {
|
|
panic("Invalid parameters")
|
|
}
|
|
keySize := keySizes[param]
|
|
if len(key) != keySize {
|
|
return nil, cipher.ErrInvalidKeyLength
|
|
}
|
|
switch param {
|
|
case Speck3264:
|
|
return nil, fmt.Errorf("Not implemented")
|
|
case Speck4872, Speck4896:
|
|
return nil, fmt.Errorf("Not implemented")
|
|
case Speck6496, Speck64128:
|
|
return nil, fmt.Errorf("Not implemented")
|
|
case Speck9696, Speck96144:
|
|
return nil, fmt.Errorf("Not implemented")
|
|
case Speck128128, Speck128192, Speck128256:
|
|
return impl.New128(key)
|
|
}
|
|
panic("unreachable")
|
|
}
|