C ++ Tweetnacl hacher un fichier sans lire le fichier entier en mémoire

J’utilise tweetnacl pour générer des hachages sha512 de chaînes et de fichiers. Pour les chaînes, cela fonctionne assez bien, mais je ne sais pas comment le faire avec des fichiers.

La signature de la fonction est

extern "C" int crypto_hash(u8 *out, const u8 *m, u64 n); 

où u8 est du type char non signé et u64 est du type long longtemps. Pour une chaîne, on peut l’utiliser comme ça

 ssortingng s("Hello"); unsigned char h[64]; crypto_hash(h, (unsigned char *)s.c_str(), s.size()); 

Cela fonctionne très bien pour une chaîne et de petits fichiers, mais si je veux créer un hachage pour un gros fichier, il n’est pas viable et utilise trop de mémoire. Je cherche une solution pour lire le fichier octet par octet et le passer comme pointeur de caractères non-conforme à cette fonction. Quelqu’un a-t-il une idée de comment y parvenir?

PS Désolé pour le mauvais anglais. pss J’utilise tweetnacl à cause de sa petite taille et je n’ai besoin que de la fonction de hachage.

Je vous suggérerais d’utiliser une implémentation différente, que vous pouvez alimenter de manière incrémentielle en morceaux.

Celui-ci par exemple . Comme la licence est bsd et que le code est C sans dépendances, vous pouvez copier / coller uniquement les 3 fonctions dont vous avez besoin sans importer une bibliothèque entière (quelle que soit sa taille) dans votre projet.

Le cycle de vie va comme:

  • sha256_init(&ctx)

  • lire à plusieurs resockets des blocs d’un fichier et les alimenter dans sha256_update(&ctx, buff, buffLen)

  • quand EOF, récupérez votre résumé en utilisant sha256_final(&ctx, digestHere)

Le moyen le plus simple consiste probablement à utiliser un fichier mappé en mémoire . Cela vous permet d’ouvrir un fichier et de le mapper dans la mémoire virtuelle. Vous pouvez alors traiter le fichier sur le disque comme s’il était en mémoire et le système d’exploitation chargera les pages selon les besoins.

Donc, dans votre cas, ouvrez votre fichier et utilisez mmap() pour le mapper en mémoire. Ensuite, vous pouvez passer le pointeur dans votre fonction crypto_hash() et laisser le système d’exploitation faire le travail.

Notez qu’il existe des réserves quant à la taille du fichier par rapport à la mémoire virtuelle.

Pour différentes plateformes:

  • Boost Interprocess
  • macOS et mmap
  • Linux et mmap
  • Windows .NET MemoryMappedFile