On Tue, Dec 03, 2002 at 03:10:26PM +0100, Stephen Henson via RT wrote: > What do you mean "buggy behaviour"? OpenSSL ASN1 code expects a complete > structure only and should produce an error if it is incomplete, at least at ^^^^^^^^^^^^^^^^^^^^^^^ exactly
I mean that OpenSSL not produce any error! My colleague sent some easy example, that demonstrates this bug. (example is attached again) -- Zito
#include <stdio.h> #include <openssl/ssl.h> #include <openssl/err.h> #include <openssl/bio.h> #include <openssl/asn1t.h> #include <openssl/asn1.h> typedef struct { // ASN1 structure for message ASN1_INTEGER *cislo; // integer number ASN1_IA5STRING *str; // text } ZPRAVA; ASN1_SEQUENCE(ZPRAVA) = { ASN1_SIMPLE(ZPRAVA, cislo, ASN1_INTEGER), ASN1_SIMPLE(ZPRAVA, str, ASN1_IA5STRING) } ASN1_SEQUENCE_END(ZPRAVA) IMPLEMENT_ASN1_FUNCTIONS(ZPRAVA) // macro for BIO reading ZPRAVA #define d2i_ZPRAVA_bio(b, zprava) (ZPRAVA*) ASN1_d2i_bio((char *(*)()) ZPRAVA_new,\ (char *(*)()) d2i_ZPRAVA, (b), (unsigned char **)(zprava)) ZPRAVA *read_ZPRAVA_bio(BIO *io, ZPRAVA **z) { // there are two posibilities, how to read return d2i_ZPRAVA_bio(io, z); // return ASN1_item_d2i_bio(ASN1_ITEM_rptr(ZPRAVA), io, z); } void write_der_file(ZPRAVA *z, char *fn, int size) { int len; unsigned char *dd; FILE *f; dd = NULL; // converting to DER format according len = i2d_ZPRAVA(z, &dd); // the examples from man pages if (len < 0) exit(1); if ((size >= 0) && (size < len)) // if size is positive dd[size] = '\0'; // dd is shortered to size f = fopen(fn, "w"); fputs((char *) dd, f); // writting to a file fclose(f); } int main(int argc, char *agv[]) { ZPRAVA *z, *z1, *z2; // ASN1 structures BIO *io; // BIO object SSL_library_init(); SSL_load_error_strings(); z = ZPRAVA_new(); // creating a structure and filling ASN1_INTEGER_set(z->cislo, 123); ASN1_STRING_set(z->str, "aaaaaaaaaaaaaaaaaaaa", 20); write_der_file(z, "test1.der", -1); // writting structure to a file io = BIO_new_file("test1.der", "r"); // opening BIO z1 = ZPRAVA_new(); read_ZPRAVA_bio(io, &z1); // reading from BIO // printing to stdout fprintf(stdout, "ASN1\nCislo: %ld\nText: %s\n\n", ASN1_INTEGER_get(z1->cislo), (char *) ASN1_STRING_data(z1->str)); BIO_free(io); write_der_file(z, "test2.der", 10); // writting incomplete structure ERR_clear_error(); // clearing an error queue io = BIO_new_file("test2.der", "r"); // opening BIO z2 = ZPRAVA_new(); read_ZPRAVA_bio(io, &z2); // reading from BIO ERR_print_errors_fp(stdout); // writing errors to stderr // printing to stdout fprintf(stdout, "ASN1\nCislo: %ld\nText: %s\n\n", ASN1_INTEGER_get(z2->cislo), (char *) ASN1_STRING_data(z2->str)); BIO_free(io); return 0; }