12
votes

Comment utiliser Cryptoapi dans le noyau Linux 2.6

Je cherche un peu de temps mais n'a pas trouvé à proximité de suffisamment de documentation / exemples sur la manière d'utiliser le cryptoapi fourni avec Linux dans la création de SysCalls / dans les terres de noyau.

Si quelqu'un sait une bonne source, faites-le moi savoir, j'aimerais savoir comment faire Sha1 / MD5 et Blowfish / AES dans l'espace du noyau uniquement.


0 commentaires

7 Réponses :


1
votes

Le meilleur endroit pour commencer est la documentation / crytpo dans les sources du noyau. DM-CRYPT est l'un des nombreux composants qui utilise probablement l'API du noyau Crypto et vous pouvez en parler pour avoir une idée de l'utilisation.


0 commentaires

6
votes

Il y a quelques endroits dans le noyau qui utilise le module Crypto: le système de fichiers Ecryptfs (Linux / fs / Ecryptfs /) et la pile sans fil 802.11 (Linux / pilotes / Stalging / RTL8187SE / IEEEE80211 /). Ces deux utilisent des AES, mais vous pourrez peut-être extrapoler ce que vous trouverez à MD5.


0 commentaires

1
votes

Comment faire SHA1 / MD5 et Blowfish / AES dans l'espace du noyau uniquement.

Exemple de données de hachage utilisant une dérivelle de deux éléments: xxx


0 commentaires

6
votes

Un autre bon exemple est de la source de noyau 2.6.18 dans Security / Seclvl.c

Remarque: vous pouvez modifier Crypto_tfm_req_may_sleep si nécessaire P>

static int
plaintext_to_sha1(unsigned char *hash, const char *plaintext, unsigned int len)
{
  struct crypto_tfm *tfm;
  struct scatterlist sg;
  if (len > PAGE_SIZE) {
    seclvl_printk(0, KERN_ERR, "Plaintext password too large (%d "
            "characters).  Largest possible is %lu "
            "bytes.\n", len, PAGE_SIZE);
    return -EINVAL;
  }
  tfm = crypto_alloc_tfm("sha1", CRYPTO_TFM_REQ_MAY_SLEEP);
  if (tfm == NULL) {
    seclvl_printk(0, KERN_ERR,
            "Failed to load transform for SHA1\n");
    return -EINVAL;
  }
  sg_init_one(&sg, (u8 *)plaintext, len);
  crypto_digest_init(tfm);
  crypto_digest_update(tfm, &sg, 1);
  crypto_digest_final(tfm, hash);
  crypto_free_tfm(tfm);
  return 0;
}


0 commentaires

11
votes
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/crypto.h>
#include <linux/err.h>
#include <linux/scatterlist.h>

#define SHA1_LENGTH     20

static int __init sha1_init(void)
{
    struct scatterlist sg;
    struct crypto_hash *tfm;
    struct hash_desc desc;
    unsigned char output[SHA1_LENGTH];
    unsigned char buf[10];
    int i;

    printk(KERN_INFO "sha1: %s\n", __FUNCTION__);

    memset(buf, 'A', 10);
    memset(output, 0x00, SHA1_LENGTH);

    tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);

    desc.tfm = tfm;
    desc.flags = 0;

    sg_init_one(&sg, buf, 10);
    crypto_hash_init(&desc);

    crypto_hash_update(&desc, &sg, 10);
    crypto_hash_final(&desc, output);

    for (i = 0; i < 20; i++) {
        printk(KERN_ERR "%d-%d\n", output[i], i);
    }

    crypto_free_hash(tfm);

    return 0;
}

static void __exit sha1_exit(void)
{
    printk(KERN_INFO "sha1: %s\n", __FUNCTION__);
}

module_init(sha1_init);
module_exit(sha1_exit);

MODULE_LICENSE("Dual MIT/GPL");
MODULE_AUTHOR("Me");

2 commentaires

Comment le compilez-vous ?? Je veux dire qu'est-ce que les libs dépendantes?


Ceci est un exemple de module de noyau et en tant que tel, ne dépend pas des bibliothèques, mais plutôt sur d'autres modules de noyau. DEPMOD calcule ces dépendances pour vous et ModProbe charge tout dans le bon ordre.



1
votes

une note critique:

Ne comparez jamais la valeur de retour de Crypto_alloc_hash fonction à NULL pour détecter l'échec.

Étapes:

Toujours utiliser is_err fonction à cet effet. La comparaison de null ne capture pas l'erreur, vous obtenez donc des défauts de segmentation plus tard.

Si Is_err retourne échouer, vous avez éventuellement un algorithme de crypto manquant compilé dans votre image de noyau (ou comme module). Assurez-vous d'avoir sélectionné l'algo crypto approprié. formulaire faire menoncefig .


0 commentaires

2
votes

Cryptodev-linux

https://github.com/cryptodev-linux/cryptodev-linux

Il est un module du noyau qui expose l'API Crypto du noyau vers l'espace utilisateur par / dev / Crypto .

SHA Exemple de calcul: https: // github .com / cryptodev-linux / cryptodev-linux / blob / da730106c2558c8e0c8e1b1b1812d32ef9574ab7 / examples / sha.c

Comme d'autres l'ont mentionné, le noyau ne semble pas exposer l'API Crypto s'userspace, ce qui est dommage car le noyau peut déjà utiliser du matériel natif accéléré des fonctions de chiffrement interne.

Opérations Crypto cryptodev supports: https: // GitHub. com / nmav / cryptodev-linux / blob / 383922cabeea7dca354415e8c590f8e932f4d7a8 / Crypto / cryptodev.h

Linux x86 opérations Crypto supports: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/crypto?id=refs/tags /v4.0


0 commentaires