Question

Bonjour,

Comment puis-je encoder simplement des données binaires dans un blob codé DER ASN.1? J'utilise C / C ++, et je dis qu'il devrait être possible de préfixer simplement le blob binaire avec certains appropriés octets qui signifient que les données sont de chaîne d'octets de type et d'une longueur donnée (et dans une séquence de longueur 1 I deviner).

Arrière-plan si vous êtes intéressé:

Pourquoi est-ce que je veux abuser ASN.1 de cette façon? Pour un projet de recherche, je dois intégrer des données dans une signature numérique qui a un associé un certificat X.509. (J'utilise createSignatureEx dans la bibliothèque de cryptlib de Peter Gutmann pour créer CMS / S / MIME-2/3 / PKCS- # 7 signatures conformes si ce qui compte. Je ne suis pas signer les données que je veux encoder, simplement l'ajouter sous forme de métadonnées à la signature de l'enrichir.) Selon ma compréhension, les signatures sérieuses avec des données d'extension arbitraires exigent les données d'extension à coder en utilisant DER ASN.1. Mes données est un blob binaire et est utile à ma demande, donc il n'y a pas de valeur réelle à faire bon codage ASN.1 de chaque partie de mes données. Je figure avec un travail que je pourrais apprendre à utiliser asn1c pour le faire, mais il semble assez compliqué et je suis sur le délai. Tout aussi important, il semble que cette information inutile et il semble que pourrait être utile à d'autres développeurs qui veulent éviter la douleur de codage correct ASN.1.

Merci!

Était-ce utile?

La solution

J'utiliser le ASN.1 compilateur .

Les gens abusent ASN.1 parce qu'il est un moyen d'encoder des structures de données. Chaque fois que vous avez un C / C ++ programme de travail avec une structure de données que les contrôles attaquant des problèmes tels que; dépassements de tampon et entier déborde, entrent en jeu. ASN.1 est plus précaire que XML permet de dire ou JSON ou bencode, car ce sont tous les points susceptibles d'échec. Il peut y avoir des problèmes avec la bibliothèque codant pour son auto, comme celui-ci méchant vulnérabilité Microsoft . Mais cette affirmation est vraie quelle que soit la méthode de codage que vous utilisez. ASN.1 est un excellent choix parce que le message résultant est extrêmement faible et il est le plus efficace de l'espace l'utilisation d'une méthode de codage que je connaisse.

Autres conseils

Vous ne pouvez pas simplement ajouter un blob de ASN.1 à un certificat X.509 et attendre pour faire partie du certificat. Le certificat est une SEQUENCE ASN.1 des valeurs, et en tant que tel, il commence par une balise de séquence et une longueur qui englobe l'ensemble du certificat.

Si vous voulez ajouter un champ à la structure du certificat (qui signifie sans doute qu'il ne soit plus un certificat valide, mais il pourrait encore être une structure ASN.1 valide), alors vous devrez changer la longueur de cette séquence enfermant ainsi que vos données annexant.

Oui, 04 08 01 23 45 67 89 ef ab cd est un codage DER valide d'une chaîne d'octets. Le 04 au début est la balise pour octuor à cordes et le 08 est la longueur de la chaîne. On notera que des longueurs allant jusqu'à 127 sont codés sur un octet et que de plus grandes longueurs utilisent un codage plus.

Pour une bonne introduction à ASN.1 - et en particulier à son utilisation dans des messages cryptographiques - voir « Guide du Layman à une partie de ASN.1, BER et DER », que vous devriez être en mesure de trouver sur le le site rsa.com.

Je suggère d'utiliser rapide DER et nourrir sa routine der_pack() avec une description de la structure que vous pouvez compiler avec son compilateur asn2quickder. Si c'est une question d'utiliser une structure standard, vous pouvez probablement #include <quick-der/rfc5280> et utiliser ses données prédéfinies.

Vous pouvez utiliser der_unpack() pour le déballage avec la même description structurelle. Il validera les aspects structurels, mais pas les contraintes qui syntaxes ASN.1 peuvent incorporer. plages entières sont vérifiées lorsque vous utilisez les fonctions utilitaires qui put et les obtenir.

Désolé pour être pousser ma bibliothèque onw; mais il a été écrit dans le but de ASN.1 facilement accessible pour les (open source) C / C ++ et les développeurs Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top