Am Freitag, 24. November 2017, 17:10:59 CET schrieb Dmitry Vyukov:
Hi Dmitry,
> That's more-or-less what I did. Here:
>
> var allAlgs = map[int][]algDesc{
> ALG_AEAD: []algDesc{
> // templates:
> {"authencesn", []int{ALG_HASH, ALG_BLKCIPHER}},
> {"gcm", []int{ALG_CIPHER}},
>
> ALG_AEAD means that all of these names produce ALG_AEAD as the result.
> Names that has arguments after them (authencesn, gcm) are templates,
> and the list of arguments denote number and types of arguments for the
> template.
>
> So here authencesn is a template that produces AEAD and has 2
> arguments: first is ALG_HASH, second is ALG_BLKCIPHER.
> Similarly, gsm is template that produces AEAD and has 1 argument of type
> CIPHER.
>
> ...
> // algorithms:
> {"gcm(aes)", nil},
> {"__gcm-aes-aesni", nil},
>
> If second value is nil, that's a complete algorithm (also of type
> AEAD). I pulled in all registered implementations, so the contain the
> specialized implementations like "gcm(aes)", but note that gsm is also
> described as template above so fuzzer can use other inner ALG_CIPHER
> algorithms with gsm.
Thanks for the clarification -- as said, I am not very fluent in GO yet. :-)
>
> > Start another test where you arbitrarily mix-n-match templates and ciphers
> > or even bogus names, NULL, etc.
> >
> >
> > One word of warning: some cipher names may look like templates, but they
> > are not: gcm(aes) in arch/x86/crypto/ is a complete cipher and not
> > consisting of templates. Thus, I would always use the driver names
> > (gcm-aes-aesni for the given example) to ensure you test exactly the
> > cipher you had in mind.
> I've pulled all registered algs from kernel with the following code:
>
> void crypto_dumb(void)
> {
> struct crypto_alg *alg;
> const char *type;
>
> down_write(&crypto_alg_sem);
> list_for_each_entry(alg, &crypto_alg_list, cra_list) {
> pr_err("name=%s driver=%s async=%d type=%d\n",
> alg->cra_name, alg->cra_driver_name,
> !!(alg->cra_flags & CRYPTO_ALG_ASYNC),
> alg->cra_flags & CRYPTO_ALG_TYPE_MASK);
> }
> up_write(&crypto_alg_sem);
> }
I would not obtain the list from a running kernel. Many ciphers are
implemented in modules that are loaded on demand (or sometimes even manually).
This list therefore is not complete per definition. Thus, I would rather grep
through the code and search for cra_driver_name.
And once you get to templates, it is even more imperative to grep the code:
Only full ciphers are listed in the given list. A template itself is never a
cipher and will not show up there. Only once a template is combined into a
full cipher, it will be registered in the list at runtime.
Note, the traversed list is what forms /proc/crypto.
Thus, after a boot, you will not see, say, rfc4106(gcm(aes)) in /proc/crypto
(or that list). But after one allocation of that cipher, it suddenly pops up
in /proc/crypto or that list.
>
> so I've got these "gcm(aes)" as well. Which is why you see
> {"gcm(aes)", nil} in algorithms section.
>
> However, the name was actually "__gcm-aes-aesni", not "gcm-aes-aesni".
> But kernel does not let me allocate neither of them (EINVAL in both
> cases).
Very good. Please leave such test, because they must not be allocatable.
Ciao
Stephan