[Oisf-devel] [PATCH 1/3] Add ASN.1 parser for X509 certificates (in DER format)
Victor Julien
victor at inliniac.net
Tue Nov 1 08:34:39 UTC 2011
On 10/25/2011 02:10 PM, Pierre Chifflier wrote:
> +const Asn1Generic * Asn1DerGet(const Asn1Generic *top, const uint8_t *seq_index, const uint32_t seqsz)
> +{
> + const Asn1Generic * Node;
Our style is to use all lowercase for variable names. Side note, we
should write a style guide :)
> +
> +#ifndef __DECODE_DER_GET_H__
> +#define __DECODE_DER_GET_H__
Minor, but can you update this to __UTIL_DECODE_DER_GET_H__ to fully
reflect the filename?
> +static Asn1Generic * DecodeAsn1DerPrintableString(const unsigned char *buffer, uint32_t max_size, uint8_t depth)
> +{
> + const unsigned char *d_ptr = buffer;
> + uint32_t length, numbytes;
> + uint32_t i;
> + Asn1Generic *a;
> + unsigned char c;
> +
> + d_ptr++;
> +
> + /* total sequence length */
> + c = d_ptr[0];
> + if ((c & (1<<7))>>7 == 0) { /* short form 8.1.3.4 */
> + length = c;
> + d_ptr++;
> + } else { /* long form 8.1.3.5 */
> + numbytes = c & 0x7f;
> + length = 0;
> + d_ptr++;
> + for (i=0; i<numbytes; i++) {
> + length = length<<8 | d_ptr[0];
> + d_ptr++;
> + }
> + }
> + if (length > max_size) {
> + SCLogWarning(SC_ERR_ALPARSER, "printable-string length too big for data at depth %d\n", depth);
> + return NULL;
> + }
> +
> + a = Asn1GenericNew();
> + if (a == NULL)
> + return NULL;
> + a->type = ASN1_PRINTSTRING;
> + a->strlen = length;
> + a->str = SCMalloc(length+1);
> + if (a->str == NULL) {
> + SCFree(a);
> + return NULL;
> + }
> + strncpy(a->str, (const char*)d_ptr, length);
Please use strlcpy.
> +Asn1Generic * DecodeDer(const unsigned char *buffer, uint32_t size)
> +{
> + const unsigned char *d_ptr = buffer;
> + uint32_t d_length, numbytes;
> + Asn1Generic *cert;
> + uint8_t c;
> + uint32_t i;
> +
> + /* Check that buffer is an ASN.1 structure (basic checks) */
> + if (d_ptr[0] != 0x30 && d_ptr[1] != 0x82) { /* Sequence */
> + SCLogWarning(SC_ERR_ALPARSER, "Invalid ASN.1 structure: not a sequence\n");
> + return NULL;
> + }
> + c = d_ptr[1];
> + if ((c & (1<<7))>>7 != 1) {
> + SCLogWarning(SC_ERR_ALPARSER, "Invalid ASN.1 structure: first byte of length: bit 8 is not 1 (See 8.1.3.5)\n");
> + return NULL;
> + }
> + numbytes = c & 0x7f;
> + d_length = 0;
> + d_ptr += 2;
> + for (i=0; i<numbytes; i++) {
> + d_length = d_length<<8 | d_ptr[0];
> + d_ptr++;
> + }
> + if (d_length+(d_ptr-buffer) != size) {
> + SCLogWarning(SC_ERR_ALPARSER, "Invalid ASN.1 structure: size of top-level sequence does not match length\n");
Please don't issue errors/warnings based on malformed traffic. I know we
have a few of those currently but these are scheduled for removal as
well. Btw, no newline should be at the end of these macro calls.
Cheers,
Victor
--
---------------------------------------------
Victor Julien
http://www.inliniac.net/
PGP: http://www.inliniac.net/victorjulien.asc
---------------------------------------------
More information about the Oisf-devel
mailing list