Domanda

Saluti,

Come posso semplicemente codificare alcuni dati binari in un blob DER con codifica ASN.1? Sto utilizzando C / C ++, e immagino che dovrebbe essere possibile anteporre semplicemente il blob binario con qualche opportuno byte che indicano che i dati sono di tipo stringa ottetto ed è di una certa lunghezza (e in una sequenza di lunghezza 1 I indovinare).

Sfondo se siete interessati:

Perché voglio abusare ASN.1 in questo modo? Per un progetto di ricerca, ho bisogno di incorporare alcuni dati in una firma digitale che dispone di un associato un certificato X.509. (Sto usando createSignatureEx nella biblioteca cryptlib di Peter Gutmann per creare CMS / S / MIME-2/3 / PKCS- # 7 firme conformi se è importante. Non sto firmando i dati che voglio codificare, basta aggiungerlo come metadati alla firma di arricchirla.) Secondo la mia comprensione, le firme gravi con i dati di estensione arbitrari richiedono i dati di estensione per essere codificati usando ASN.1 DER. I miei dati è un blob binario ed è utile solo per la mia domanda, quindi non c'è alcun valore reale nel fare una corretta ASN.1 codifica di ogni parte dei miei dati. Ho figura con qualche lavoro ho potuto imparare ad usare asn1c per fare questo, ma sembra piuttosto complicato e sono in scadenza. Altrettanto importante, sembra inutile e sembra che questa informazione potrebbe essere utile ad altri sviluppatori che vogliono evitare il dolore di una corretta codifica ASN.1.

Grazie!

È stato utile?

Soluzione

Vorrei utilizzare il ASN.1 Compiler .

La gente abusano ASN.1, perché è un modo per codificare strutture di dati. Ogni volta che si dispone di un / C ++ programma C si lavora con una struttura di dati che i controlli dell'attaccante problemi come; buffer overflow e integer overflow, entrare in gioco. ASN.1 non è più insicura di quanto consente XML o JSON o diciamo bencode, in quanto questi sono tutti i punti possibili di guasto. Ci possono essere problemi con la libreria di codifica la sua auto, come questo vulnerabilità brutto Microsoft . Ma questa affermazione è vero a prescindere dal metodo di codifica utilizzato. ASN.1 è una grande scelta, perché il messaggio che ne risulta è estremamente piccolo ed è l'uso più efficiente dello spazio di qualsiasi metodo di codifica, che io sappia.

Altri suggerimenti

È possibile non solo aggiungere un blob di ASN.1 di un certificato X.509 e si aspettano che diventi parte del certificato. Il certificato è una sequenza di valori ASN.1, e come tale inizia con un tag SEQUENCE e lunghezza, che comprende tutti del certificato.

Se si desidera aggiungere un campo alla struttura del certificato (che probabilmente significa che non è più un certificato valido, ma potrebbe ancora essere una struttura ASN.1 valido) allora si dovrà modificare la lunghezza di quel allegando sequenza così come aggiungendo i vostri dati.

Sì, 04 08 01 23 45 67 89 ab cd ef è una codifica DER valida di una stringa di ottetto. Il 04, all'inizio è il tag per la stringa di ottetto e il 08 è la lunghezza della stringa. Si noti che le lunghezze fino a 127 sono codificati in un byte e che lunghezze grandi utilizzano una codifica più lungo.

Per una buona introduzione al ASN.1 - e soprattutto per il suo utilizzo nei messaggi crittografici - vedere "Guida di un laico a un sottoinsieme di ASN.1, BER e DER", che si dovrebbe essere in grado di trovare sul rsa.com sito.

Vorrei suggerire di utilizzare rapida DER e nutrire la sua routine di der_pack() con una descrizione della struttura che si può compilare con il suo compilatore asn2quickder. Se si tratta di una questione di usare una struttura standard si può probabilmente solo #include <quick-der/rfc5280> e utilizzare i suoi dati predefiniti.

È possibile utilizzare der_unpack() per l'estrazione con la stessa descrizione strutturale. Convaliderà aspetti strutturali, ma non dei vincoli che sintassi ASN.1 possono incorporare. intervalli di interi sono controllati quando si utilizzano le funzioni di utilità che ha messo e farli.

Mi dispiace essere spingere mia biblioteca onw; ma in realtà è stato scritto allo scopo di ASN.1 di facile accesso per (open source) C / C ++ e sviluppatori Python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top