blob: d1b7d66b5a494cd315e32a46690a7b5046063406 [file] [log] [blame]
// Copyright 2017 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package linux
import (
"math/rand"
"github.com/google/syzkaller/prog"
)
func (arch *arch) generateSockaddrAlg(g *prog.Gen, typ0 prog.Type, old prog.Arg) (
arg prog.Arg, calls []*prog.Call) {
typ := typ0.(*prog.StructType)
family := g.GenerateArg(typ.Fields[0], &calls)
// There is very little point in generating feat/mask,
// because that can only fail otherwise correct bind.
feat := prog.MakeConstArg(typ.Fields[2], 0)
mask := prog.MakeConstArg(typ.Fields[3], 0)
if g.NOutOf(1, 1000) {
feat = g.GenerateArg(typ.Fields[2], &calls).(*prog.ConstArg)
mask = g.GenerateArg(typ.Fields[3], &calls).(*prog.ConstArg)
}
algType, algName := generateAlgName(g.Rand())
// Extend/truncate type/name to their fixed sizes.
algTypeData := fixedSizeData(algType, typ.Fields[1].Size())
algNameData := fixedSizeData(algName, typ.Fields[4].Size())
arg = prog.MakeGroupArg(typ, []prog.Arg{
family,
prog.MakeDataArg(typ.Fields[1], algTypeData),
feat,
mask,
prog.MakeDataArg(typ.Fields[4], algNameData),
})
return
}
func (arch *arch) generateAlgName(g *prog.Gen, typ prog.Type, old prog.Arg) (
arg prog.Arg, calls []*prog.Call) {
return generateAlgNameStruct(g, typ, allTypes[g.Rand().Intn(len(allTypes))].typ)
}
func (arch *arch) generateAlgAeadName(g *prog.Gen, typ prog.Type, old prog.Arg) (
arg prog.Arg, calls []*prog.Call) {
return generateAlgNameStruct(g, typ, ALG_AEAD)
}
func (arch *arch) generateAlgHashName(g *prog.Gen, typ prog.Type, old prog.Arg) (
arg prog.Arg, calls []*prog.Call) {
return generateAlgNameStruct(g, typ, ALG_HASH)
}
func (arch *arch) generateAlgBlkcipherhName(g *prog.Gen, typ prog.Type, old prog.Arg) (
arg prog.Arg, calls []*prog.Call) {
return generateAlgNameStruct(g, typ, ALG_BLKCIPHER)
}
func generateAlgNameStruct(g *prog.Gen, typ0 prog.Type, algTyp int) (arg prog.Arg, calls []*prog.Call) {
typ := typ0.(*prog.StructType)
algName := generateAlg(g.Rand(), algTyp)
algNameData := fixedSizeData(algName, typ.Fields[0].Size())
arg = prog.MakeGroupArg(typ, []prog.Arg{
prog.MakeDataArg(typ.Fields[0], algNameData),
})
return
}
func generateAlgName(rnd *rand.Rand) (string, string) {
typ := allTypes[rnd.Intn(len(allTypes))]
name := generateAlg(rnd, typ.typ)
return typ.name, name
}
func generateAlg(rnd *rand.Rand, typ int) string {
algs := allAlgs[typ]
alg := algs[rnd.Intn(len(algs))]
return generateAlgImpl(rnd, alg)
}
func generateAlgImpl(rnd *rand.Rand, alg algDesc) string {
args := ""
if len(alg.args) != 0 {
args += "("
for i, a := range alg.args {
if i != 0 {
args += ","
}
args += generateAlg(rnd, a)
}
args += ")"
}
return alg.name + args
}
func fixedSizeData(str string, sz uint64) []byte {
return append([]byte(str), make([]byte, sz)...)[:sz]
}
type algType struct {
name string
typ int
}
type algDesc struct {
name string
args []int
}
const (
ALG_CIPHER = iota
ALG_BLKCIPHER
ALG_AEAD
ALG_HASH
ALG_RNG
)
var allTypes = []algType{
{"aead", ALG_AEAD},
{"skcipher", ALG_BLKCIPHER},
{"hash", ALG_HASH},
{"rng", ALG_RNG},
}
var allAlgs = map[int][]algDesc{
ALG_AEAD: {
// templates:
{"authenc", []int{ALG_HASH, ALG_BLKCIPHER}},
{"authencesn", []int{ALG_HASH, ALG_BLKCIPHER}},
{"ccm", []int{ALG_CIPHER}},
{"ccm_base", []int{ALG_BLKCIPHER, ALG_HASH}},
{"echainiv", []int{ALG_AEAD}},
{"gcm", []int{ALG_CIPHER}},
{"gcm_base", []int{ALG_BLKCIPHER, ALG_HASH}},
{"pcrypt", []int{ALG_AEAD}},
{"rfc4106", []int{ALG_AEAD}},
{"rfc4309", []int{ALG_AEAD}},
{"rfc4543", []int{ALG_AEAD}},
{"rfc7539", []int{ALG_BLKCIPHER, ALG_HASH}},
{"rfc7539esp", []int{ALG_BLKCIPHER, ALG_HASH}},
{"seqiv", []int{ALG_AEAD}},
// algorithms:
{"aegis128", nil},
{"aegis128-aesni", nil},
{"aegis128-generic", nil},
{"aegis128l", nil},
{"aegis128l-aesni", nil},
{"aegis128l-generic", nil},
{"aegis256", nil},
{"aegis256-aesni", nil},
{"aegis256-generic", nil},
{"ccm-aes-ce", nil},
{"gcm(aes)", nil},
{"gcm-aes-ce", nil},
{"gcm_base(ctr(aes-aesni),ghash-generic)", nil},
{"generic-gcm-aesni", nil},
{"morus1280", nil},
{"morus1280-avx2", nil},
{"morus1280-generic", nil},
{"morus1280-sse2", nil},
{"morus640", nil},
{"morus640-generic", nil},
{"morus640-sse2", nil},
{"rfc4106(gcm(aes))", nil},
{"rfc4106-gcm-aesni", nil},
},
ALG_BLKCIPHER: {
// templates:
{"adiantum", []int{ALG_BLKCIPHER, ALG_CIPHER, ALG_HASH}},
{"adiantum", []int{ALG_BLKCIPHER, ALG_CIPHER}},
{"cbc", []int{ALG_CIPHER}},
{"cfb", []int{ALG_CIPHER}},
{"cryptd", []int{ALG_BLKCIPHER}},
{"ctr", []int{ALG_CIPHER}},
{"cts", []int{ALG_BLKCIPHER}},
{"ecb", []int{ALG_CIPHER}},
{"fpu", []int{ALG_BLKCIPHER}},
{"kw", []int{ALG_CIPHER}},
{"lrw", []int{ALG_BLKCIPHER}},
{"lrw", []int{ALG_CIPHER}},
{"ofb", []int{ALG_CIPHER}},
{"pcbc", []int{ALG_CIPHER}},
{"rfc3686", []int{ALG_BLKCIPHER}},
{"xts", []int{ALG_BLKCIPHER}},
{"xts", []int{ALG_CIPHER}},
// algorithms:
{"cbc(aes)", nil},
{"cbc(aes-aesni)", nil},
{"cbc(blowfish)", nil},
{"cbc(camellia)", nil},
{"cbc(cast5)", nil},
{"cbc(cast6)", nil},
{"cbc(des3_ede)", nil},
{"cbc(serpent)", nil},
{"cbc(twofish)", nil},
{"cbc-aes-aesni", nil},
{"cbc-aes-ce", nil},
{"cbc-aes-neon", nil},
{"cbc-blowfish-asm", nil},
{"cbc-camellia-aesni", nil},
{"cbc-camellia-aesni-avx2", nil},
{"cbc-camellia-asm", nil},
{"cbc-cast5-avx", nil},
{"cbc-cast6-avx", nil},
{"cbc-des3_ede-asm", nil},
{"cbc-serpent-avx", nil},
{"cbc-serpent-avx2", nil},
{"cbc-serpent-sse2", nil},
{"cbc-twofish-3way", nil},
{"cbc-twofish-avx", nil},
{"chacha20", nil},
{"chacha20-generic", nil},
{"chacha20-neon", nil},
{"chacha20-simd", nil},
{"ctr(aes)", nil},
{"ctr(aes-aesni)", nil},
{"ctr(blowfish)", nil},
{"ctr(camellia)", nil},
{"ctr(cast5)", nil},
{"ctr(cast6)", nil},
{"ctr(des3_ede)", nil},
{"ctr(serpent)", nil},
{"ctr(twofish)", nil},
{"ctr-aes-aesni", nil},
{"ctr-aes-ce", nil},
{"ctr-aes-neon", nil},
{"ctr-aes-neonbs", nil},
{"ctr-blowfish-asm", nil},
{"ctr-camellia-aesni", nil},
{"ctr-camellia-aesni-avx2", nil},
{"ctr-camellia-asm", nil},
{"ctr-cast5-avx", nil},
{"ctr-cast6-avx", nil},
{"ctr-des3_ede-asm", nil},
{"ctr-serpent-avx", nil},
{"ctr-serpent-avx2", nil},
{"ctr-serpent-sse2", nil},
{"ctr-twofish-3way", nil},
{"ctr-twofish-avx", nil},
{"ecb(aes)", nil},
{"ecb(arc4)", nil},
{"ecb(arc4)-generic", nil},
{"ecb(blowfish)", nil},
{"ecb(camellia)", nil},
{"ecb(cast5)", nil},
{"ecb(cast6)", nil},
{"ecb(cipher_null)", nil},
{"ecb(des3_ede)", nil},
{"ecb(serpent)", nil},
{"ecb(twofish)", nil},
{"ecb-aes-aesni", nil},
{"ecb-aes-ce", nil},
{"ecb-aes-neon", nil},
{"ecb-blowfish-asm", nil},
{"ecb-camellia-aesni", nil},
{"ecb-camellia-aesni-avx2", nil},
{"ecb-camellia-asm", nil},
{"ecb-cast5-avx", nil},
{"ecb-cast6-avx", nil},
{"ecb-cipher_null", nil},
{"ecb-des3_ede-asm", nil},
{"ecb-serpent-avx", nil},
{"ecb-serpent-avx2", nil},
{"ecb-serpent-sse2", nil},
{"ecb-twofish-3way", nil},
{"ecb-twofish-avx", nil},
{"fpu(pcbc(aes))", nil},
{"fpu(pcbc(aes-aesni))", nil},
{"lrw(camellia)", nil},
{"lrw(cast6)", nil},
{"lrw(serpent)", nil},
{"lrw(twofish)", nil},
{"lrw-camellia-aesni", nil},
{"lrw-camellia-aesni-avx2", nil},
{"lrw-camellia-asm", nil},
{"lrw-cast6-avx", nil},
{"lrw-serpent-avx", nil},
{"lrw-serpent-avx2", nil},
{"lrw-serpent-sse2", nil},
{"lrw-twofish-3way", nil},
{"lrw-twofish-avx", nil},
{"pcbc(aes)", nil},
{"pcbc(aes-aesni)", nil},
{"pcbc-aes-aesni", nil},
{"salsa20", nil},
{"salsa20-asm", nil},
{"salsa20-generic", nil},
{"xchacha12", nil},
{"xchacha12-generic", nil},
{"xchacha12-neon", nil},
{"xchacha12-simd", nil},
{"xchacha20", nil},
{"xchacha20-generic", nil},
{"xchacha20-neon", nil},
{"xchacha20-simd", nil},
{"xts(aes)", nil},
{"xts(camellia)", nil},
{"xts(cast6)", nil},
{"xts(serpent)", nil},
{"xts(twofish)", nil},
{"xts-aes-aesni", nil},
{"xts-aes-ce", nil},
{"xts-aes-neon", nil},
{"xts-camellia-aesni", nil},
{"xts-camellia-aesni-avx2", nil},
{"xts-camellia-asm", nil},
{"xts-cast6-avx", nil},
{"xts-serpent-avx", nil},
{"xts-serpent-avx2", nil},
{"xts-serpent-sse2", nil},
{"xts-twofish-3way", nil},
{"xts-twofish-avx", nil},
},
ALG_CIPHER: {
{"aes", nil},
{"aes-aesni", nil},
{"aes-arm64", nil},
{"aes-asm", nil},
{"aes-ce", nil},
{"aes-fixed-time", nil},
{"aes-generic", nil},
{"anubis", nil},
{"anubis-generic", nil},
{"arc4", nil},
{"arc4-generic", nil},
{"blowfish", nil},
{"blowfish-asm", nil},
{"blowfish-generic", nil},
{"camellia", nil},
{"camellia-asm", nil},
{"camellia-generic", nil},
{"cast5", nil},
{"cast5-generic", nil},
{"cast6", nil},
{"cast6-generic", nil},
{"cipher_null", nil},
{"cipher_null-generic", nil},
{"des", nil},
{"des-generic", nil},
{"des3_ede", nil},
{"des3_ede-asm", nil},
{"des3_ede-generic", nil},
{"fcrypt", nil},
{"fcrypt-generic", nil},
{"khazad", nil},
{"khazad-generic", nil},
{"seed", nil},
{"seed-generic", nil},
{"serpent", nil},
{"serpent-generic", nil},
{"sm4", nil},
{"sm4-ce", nil},
{"sm4-generic", nil},
{"tea", nil},
{"tea-generic", nil},
{"tnepres", nil},
{"tnepres-generic", nil},
{"twofish", nil},
{"twofish-asm", nil},
{"twofish-generic", nil},
{"xeta", nil},
{"xeta-generic", nil},
{"xtea", nil},
{"xtea-generic", nil},
},
ALG_HASH: {
// templates:
{"cbcmac", []int{ALG_CIPHER}},
{"cmac", []int{ALG_CIPHER}},
{"cryptd", []int{ALG_HASH}},
{"hmac", []int{ALG_HASH}},
{"mcryptd", []int{ALG_HASH}},
{"vmac", []int{ALG_CIPHER}},
{"vmac64", []int{ALG_CIPHER}},
{"xcbc", []int{ALG_CIPHER}},
// algorithms:
{"cbcmac-aes-ce", nil},
{"cbcmac-aes-neon", nil},
{"cmac-aes-ce", nil},
{"cmac-aes-neon", nil},
{"crc32", nil},
{"crc32-generic", nil},
{"crc32-pclmul", nil},
{"crc32c", nil},
{"crc32c-generic", nil},
{"crc32c-intel", nil},
{"crct10dif", nil},
{"crct10dif-arm64-ce", nil},
{"crct10dif-generic", nil},
{"crct10dif-pclmul", nil},
{"digest_null", nil},
{"digest_null-generic", nil},
{"ghash", nil},
{"ghash-ce", nil},
{"ghash-clmulni", nil},
{"ghash-generic", nil},
{"md4", nil},
{"md4-generic", nil},
{"md5", nil},
{"md5-generic", nil},
{"michael_mic", nil},
{"michael_mic-generic", nil},
{"nhpoly1305", nil},
{"nhpoly1305-avx2", nil},
{"nhpoly1305-generic", nil},
{"nhpoly1305-neon", nil},
{"nhpoly1305-sse2", nil},
{"poly1305", nil},
{"poly1305-generic", nil},
{"poly1305-simd", nil},
{"rmd128", nil},
{"rmd128-generic", nil},
{"rmd160", nil},
{"rmd160-generic", nil},
{"rmd256", nil},
{"rmd256-generic", nil},
{"rmd320", nil},
{"rmd320-generic", nil},
{"sha1", nil},
{"sha1-avx", nil},
{"sha1-avx2", nil},
{"sha1-ce", nil},
{"sha1-generic", nil},
{"sha1-ni", nil},
{"sha1-ssse3", nil},
{"sha1_mb", nil},
{"sha224", nil},
{"sha224-arm64", nil},
{"sha224-arm64-neon", nil},
{"sha224-avx", nil},
{"sha224-avx2", nil},
{"sha224-ce", nil},
{"sha224-generic", nil},
{"sha224-ni", nil},
{"sha224-ssse3", nil},
{"sha256", nil},
{"sha256-arm64", nil},
{"sha256-arm64-neon", nil},
{"sha256-avx", nil},
{"sha256-avx2", nil},
{"sha256-ce", nil},
{"sha256-generic", nil},
{"sha256-ni", nil},
{"sha256-ssse3", nil},
{"sha256_mb", nil},
{"sha3-224", nil},
{"sha3-224-ce", nil},
{"sha3-224-generic", nil},
{"sha3-256", nil},
{"sha3-256-ce", nil},
{"sha3-256-generic", nil},
{"sha3-384", nil},
{"sha3-384-ce", nil},
{"sha3-384-generic", nil},
{"sha3-512", nil},
{"sha3-512-ce", nil},
{"sha3-512-generic", nil},
{"sha384", nil},
{"sha384-arm64", nil},
{"sha384-avx", nil},
{"sha384-avx2", nil},
{"sha384-ce", nil},
{"sha384-generic", nil},
{"sha384-ssse3", nil},
{"sha512", nil},
{"sha512-arm64", nil},
{"sha512-avx", nil},
{"sha512-avx2", nil},
{"sha512-ce", nil},
{"sha512-generic", nil},
{"sha512-ssse3", nil},
{"sha512_mb", nil},
{"sm3", nil},
{"sm3-ce", nil},
{"sm3-generic", nil},
{"streebog256", nil},
{"streebog256-generic", nil},
{"streebog512", nil},
{"streebog512-generic", nil},
{"tgr128", nil},
{"tgr128-generic", nil},
{"tgr160", nil},
{"tgr160-generic", nil},
{"tgr192", nil},
{"tgr192-generic", nil},
{"wp256", nil},
{"wp256-generic", nil},
{"wp384", nil},
{"wp384-generic", nil},
{"wp512", nil},
{"wp512-generic", nil},
{"xcbc-aes-ce", nil},
{"xcbc-aes-neon", nil},
},
ALG_RNG: {
{"ansi_cprng", nil},
{"drbg_nopr_ctr_aes128", nil},
{"drbg_nopr_ctr_aes192", nil},
{"drbg_nopr_ctr_aes256", nil},
{"drbg_nopr_hmac_sha1", nil},
{"drbg_nopr_hmac_sha256", nil},
{"drbg_nopr_hmac_sha384", nil},
{"drbg_nopr_hmac_sha512", nil},
{"drbg_nopr_sha1", nil},
{"drbg_nopr_sha256", nil},
{"drbg_nopr_sha384", nil},
{"drbg_nopr_sha512", nil},
{"drbg_pr_ctr_aes128", nil},
{"drbg_pr_ctr_aes192", nil},
{"drbg_pr_ctr_aes256", nil},
{"drbg_pr_hmac_sha1", nil},
{"drbg_pr_hmac_sha256", nil},
{"drbg_pr_hmac_sha384", nil},
{"drbg_pr_hmac_sha512", nil},
{"drbg_pr_sha1", nil},
{"drbg_pr_sha256", nil},
{"drbg_pr_sha384", nil},
{"drbg_pr_sha512", nil},
{"jitterentropy_rng", nil},
{"stdrng", nil},
},
}