Quelqu'un sait-il comment exposer les internes python 2.x _hashlib.pyd en utilisant ctypes? J'ai surtout besoin d'extraire la structure EVP_MD_CTX pour la sérialisation des objets HASH python.Exposer les internes de _hashlib.pyd pour EVP_MD_CTX?
2
A
Répondre
3
Le mappage des structures C à partir des fichiers d'en-tête (openssl/evp.h et _hashopenssl.c dans votre cas) est simple, mais n'est pas toujours portable sur différentes versions. Ici, il est pour mon environnement:
from ctypes import *
PyObject_HEAD = [
('ob_refcnt', c_size_t),
('ob_type', c_void_p),
]
class EVP_MD(Structure):
_fields_ = [
('type', c_int),
('pkey_type', c_int),
('md_size', c_int),
('flags', c_ulong),
('init', c_void_p),
('update', c_void_p),
('final', c_void_p),
('copy', c_void_p),
('cleanup', c_void_p),
('sign', c_void_p),
('verify', c_void_p),
('required_pkey_type', c_int*5),
('block_size', c_int),
('ctx_size', c_int),
]
class EVP_MD_CTX(Structure):
_fields_ = [
('digest', POINTER(EVP_MD)),
('engine', c_void_p),
('flags', c_ulong),
('md_data', POINTER(c_char)),
]
class EVPobject(Structure):
_fields_ = PyObject_HEAD + [
('name', py_object),
('ctx', EVP_MD_CTX),
]
Voici un exemple sur la façon de l'utiliser pour save and restore state of hash object:
import hashlib
hash = hashlib.md5('test')
print hash.hexdigest()
c_evp_obj = cast(c_void_p(id(hash)), POINTER(EVPobject)).contents
ctx = c_evp_obj.ctx
digest = ctx.digest.contents
state = ctx.md_data[:digest.ctx_size]
hash2 = hashlib.md5()
c_evp_obj = cast(c_void_p(id(hash2)), POINTER(EVPobject)).contents
ctx = c_evp_obj.ctx
digest = ctx.digest.contents
memmove(ctx.md_data, state, digest.ctx_size)
print hash2.hexdigest()
Questions connexes
- 1. L'utilisation de [assembly: System.Runtime.CompilerServices.InternalsVisibleTo ("System.Windows")] Pour exposer les propriétés internes
- 2. Quelles sont les options disponibles pour exposer un service WCF à plusieurs consommateurs de services internes?
- 3. Exposer des classes internes en s'obscurcissant avec ProGuard
- 4. Exposer les contrôles internes Propriété du contenu en tant que propriété [Contrôle de l'utilisateur]
- 5. Designer pour voir les internes?
- 6. Bon guide pour les internes de Linux?
- 7. WPF - exposer une Bindable ReadOnly propriété de dépendance et ajouter des valeurs internes
- 8. Intellij importation automatique pour les classes internes
- 9. Android App pour montrer les internes
- 10. modificateurs d'accès pour les classes internes
- 11. classes internes anonymes pour les boutons
- 12. Python alias d'utilisation pour les classes internes
- 13. Les profondeurs internes de PHP
- 14. Suivi du statut du travail Hadoop via l'interface Web? (Exposer Hadoop aux clients internes de l'entreprise)
- 15. Implémentation de l'interface REST pour exposer les nœuds Neo4j
- 16. Utilisation de WCF pour exposer le processus sous-jacent
- 17. Comment exposer les propriétés xaml?
- 18. Exposer les propriétés de l'indexeur à COM
- 19. Exposer des entités à l'extérieur de l'assemblage
- 20. Android: utilisation de la couverture personnalisée pour les enregistrements internes
- 21. Blocs de tags internes Vim pour les templates Django
- 22. Quels cadres de ruby sont appropriés pour les services internes?
- 23. Sécurisation de SharePoint pour les utilisateurs internes et externes
- 24. Comment définir la marge pour les contrôles internes de WrapPanel
- 25. Surcharger les méthodes internes protégées
- 26. En regardant les méthodes internes
- 27. API REST évolutives et rapides pour exposer les méthodes ORM
- 28. Quand utiliser les classes internes?
- 29. Où conserver les cours internes?
- 30. Les beans internes reçoivent ApplicationEvents?
Exactement ce que je avais besoin. Merci beaucoup :) – est
@est, attention: vous devrez suivre le code openssl, si vous restez avec cette solution: si EVP_MD/EVP_MD_CTX change dans le code openssl, votre code python va casser. Par exemple, le code ci-dessus ne fonctionnera pas avec toutes les versions d'openssl antérieures à openssl-0.9.7. – abbot
Merci d'avoir posté ce message. Pour le point de @ abbot, ce code nécessite une mise à jour sur Python 3.5+ et 2.7.13+ ('('ctx', EVP_MD_CTX)' devient '('ctx', POINTER (EVP_MD_CTX))'). J'ai fini par emballer une bibliothèque basée sur ceci et d'autres recettes: https://github.com/kislyuk/rehash – weaver