static void process_ldap_search_request(struct Ferret *ferret, struct NetFrame *frame, const unsigned char *px, unsigned length, struct LDAP *ldap) { unsigned offset = 0; UNUSEDPARM(ferret); asn1_string(frame, px, length, &offset, &ldap->basedn, &ldap->basedn_length); ldap->scope = asn1_enumerated(frame, px, length, &offset); ldap->dereference = asn1_enumerated(frame, px, length, &offset); ldap->size_limit = asn1_integer(frame, px, length, &offset); ldap->time_limit = asn1_integer(frame, px, length, &offset); ldap->attribute_only = asn1_boolean(frame, px, length, &offset); process_ldap_filter(frame, px, length, &offset, &ldap->filter); }
/** * build issuerAndSerialNumber object */ chunk_t pkcs7_build_issuerAndSerialNumber(certificate_t *cert) { identification_t *issuer = cert->get_issuer(cert); x509_t *x509 = (x509_t*)cert; return asn1_wrap(ASN1_SEQUENCE, "cm", issuer->get_encoding(issuer), asn1_integer("c", x509->get_serial(x509))); }
END_TEST /******************************************************************************* * integer */ START_TEST(test_asn1_integer) { typedef struct { chunk_t b; chunk_t c; } testdata_t; chunk_t b0 = chunk_from_chars(0x02, 0x01, 0x00); chunk_t b1 = chunk_from_chars(0x02, 0x01, 0x7f); chunk_t b2 = chunk_from_chars(0x02, 0x02, 0x00, 0x80); chunk_t c0 = chunk_empty; chunk_t c1 = chunk_from_chars(0x7f); chunk_t c2 = chunk_from_chars(0x80); chunk_t c3 = chunk_from_chars(0x00, 0x80); testdata_t test[] = { { b0, c0 }, { b1, c1 }, { b2, c2 }, { b2, c3 } }; chunk_t a = chunk_empty; int i; for (i = 0; i < countof(test); i++) { a = asn1_integer("c", test[i].c); ck_assert(chunk_equals(a, test[i].b)); chunk_free(&a); a = asn1_integer("m", chunk_clone(test[i].c)); ck_assert(chunk_equals(a, test[i].b)); chunk_free(&a); } }
void process_ldap(struct Ferret *ferret, struct NetFrame *frame, const unsigned char *px, unsigned length) { unsigned offset=0; unsigned outer_length; struct LDAP ldap[1]; if (ferret) return; memset(ldap, 0, sizeof(ldap[0])); /* tag */ if (asn1_tag(px, length, &offset) != 0x30) return; /* length */ outer_length = asn1_length(frame, px, length, &offset); if (length > outer_length + offset) length = outer_length + offset; /* Version */ ldap->message_id = asn1_integer(frame, px, length, &offset); /* PDU */ ldap->message_type = asn1_tag(px, length, &offset); outer_length = asn1_length(frame, px, length, &offset); if (length > outer_length + offset) length = outer_length + offset; switch (ldap->message_type) { case 0x63: process_ldap_search_request(ferret, frame, px+offset, length-offset, ldap); break; default: FRAMERR_BADVAL(frame, "ldap", ldap->message_type); break; } }