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. P>
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. P>
7 Réponses :
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. P>
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. P>
Comment faire SHA1 / MD5 et Blowfish / AES dans l'espace du noyau uniquement. P>
Exemple de données de hachage utilisant une dérivelle de deux éléments: p>
xxx pré> blockQuote>
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; }
#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");
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.
une note critique: p>
Ne comparez jamais la valeur de retour de Étapes: P>
Toujours utiliser 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 Crypto_alloc_hash code> fonction à NULL pour détecter l'échec. p>
is_err code> fonction à cet effet. La comparaison de
null code> ne capture pas l'erreur, vous obtenez donc des défauts de segmentation plus tard. p>
faire menoncefig code>. p>
Cryptodev-linux strong> p>
https://github.com/cryptodev-linux/cryptodev-linux p>
Il est un module du noyau qui expose l'API Crypto du noyau vers l'espace utilisateur par SHA Exemple de calcul: https: // github .com / cryptodev-linux / cryptodev-linux / blob / da730106c2558c8e0c8e1b1b1812d32ef9574ab7 / examples / sha.c p>
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. P>
Opérations Crypto cryptodev supports: https: // GitHub. com / nmav / cryptodev-linux / blob / 383922cabeea7dca354415e8c590f8e932f4d7a8 / Crypto / cryptodev.h p>
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 p> / dev / Crypto code>. P>