Frage zu base64 Kodierung / OpenSSL Api



  • Hallo Forum!

    Zur Zeit bastel ich ein wenig an einem Mail Client und versuche momentan, Anhänge zu implementieren. Für die base64 Kodierung verwende ich die OpenSSL API. Es scheint jedoch noch nicht 100%ig zu klappen.

    Als Testanhang dient ein Bild, welches ich mir vorab zu Überprüfungszwecken per Thunderbird geschickt habe. Vergleiche ich den Quelltext der Mail, die ich von meinem Programm aus verschicke, mit dem der Mail, die ich per Thunderbird verschickt habe, fällt auf, dass die base64 Kodierung der funktionierenden Variante (Thunderbird) um genau 8 Zeichen längere Zeilen hat. Hier die ersten drei Zeilen der Datei in base64:

    Thunderbird

    /9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABABAgAUAAAA
    rAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgBAwABAAAAAgAAADIB
    AgAUAAAA3AAAABMCAwABAAAAAgAAAGmHBAABAAAA8AAAAAwPAAAgICAgICAgICAgICAgICAg
    

    Mein Programm

    /9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABAB
    AgAUAAAArAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgB
    AwABAAAAAgAAADIBAgAUAAAA3AAAABMCAwABAAAAAgAAAGmHBAABAAAA8AAAAAwP
    

    Die restlichen Dinge wie korrekte MIME-Formatierung und boundaries scheinen alle in Ordnung zu sein. In der Tat zeigt Thunderbird den Anhang als solchen auch zunächst an, nur bei anschließendem Versuch, diesen zu entschlüsseln, kommt es dann zu Fehlern.

    Der Code, mit dem ich die base64 Kodierung durchführe, sieht wie folgt aus und orientiert sich exakt an den Beispielen, die man hierzu u.a. in der OpenSSL Doku finden wird:

    long size;
    FILE *f = fopen(argv[2], "rb");
    BIO *bio, *b64;
    
    /* get file size */
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
    
    /* read in file */
    char file[size+1];  
    fread(file, size, 1, f); 
    
    /* base64 encode the file */
    int enc_size = 4*ceil((double) (size+1)/ 3); 
    b64_buffer = (char *) malloc (enc_size+1);
    FILE *s = fmemopen(b64_buffer, enc_size+1, "w");
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_fp(s, BIO_NOCLOSE);
    bio = BIO_push(b64, bio);
    BIO_write(bio, file, size);
    BIO_flush(bio);
    BIO_free_all(bio);
    fclose(s);
    

    Vielleicht vergesse ich irgendetwas und es kennt sich der ein oder andere genau mit dieser Problematik aus? Würde mich über jegliche Hilfe freuen. Gruß!



  • Hallo per,

    die Länge der einzelnen Zeilen sollte keinen Unterschied machen, sofern die Inhalte gleich sind (s.a. Base64).
    Passt denn das Ende des Base64-codierten Texts (einige Implementierungen haben Probleme mit der korrekten Umsetzung damit, d.h. Anhängen der '='-Zeichen).



  • Ok. Wenn es nicht an den Zeilendarstellungen liegen dürfte, schätze ich, dass ich eventuell an anderer Stelle nicht ganz Protokoll-konform arbeite. Ich werde mal ein wenig genauer nach anderen Ursachen Ausschau halten und zur Not einfach den Code ausführlicher zitieren.

    EDIT: Und ja, das Ende stimmt mit dem funktionierenden Quelltext überein (bis auf den Zeilenumbruch, versteht sich).

    Thunderbird

    47VftYgTyAOPzouFhzW5OOMnPeoJbIMS5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VN
    b3e9vQAUFH//2Q==
    
    --------------050000040908070009030908--
    

    Meins

    MGMVUXDHg+lOkiV0BCknODQIz5LQxuVA47VftYgTyAOPzouFhzW5OOMnPeoJbIMS
    5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VNb3e9vQAUFH//2Q==
    
    ---------------088970564400596--
    


  • So. Da ich weiterhin keinen Grund sehe, weshalb mein Anhang nicht korrekt entschlüsselt werden sollte, zitiere ich folgend einmal die wichtigen Infos aus meiner Mail. Da hieraus auch ersichtlich werden sollte, welche Informationen an den Server geschickt werden, dürften wir um den Quellcode in diesem Falle herumkommen. So spannend ist der schließlich nicht. Dort, wo Sternchen stehen, wurden sensible Daten unkenntlich gemacht, und eckige Klammern deuten eine Auslassung an. Offensichtliches.

    [...]
    
    Date: Sat, 13 Apr 2013  14:22:13 +0000
    From: *** <***>
    MIME-Version: 1.0
    To: <***>
    Subject: fifth test
    Content-Type: multipart/mixed; boundary="---------------088970564400596"
    
    [...]
    
    This is a multi-part message in MIME format.
    ---------------088970564400596
    Content-Type: text/plain; charset=ISO-8859-15; format=flowed
    Content-Transfer-Encoding: 8bit
    
    this is test.
    
    ---------------088970564400596
    Content-Type: image/jpeg; name="***.JPG"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="***.JPG"
    
    /9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABAB
    AgAUAAAArAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgB
    
    [...]
    
    MGMVUXDHg+lOkiV0BCknODQIz5LQxuVA47VftYgTyAOPzouFhzW5OOMnPeoJbIMS
    5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VNb3e9vQAUFH//2Q==
    
    ---------------088970564400596--
    

    Vielleicht wird dem einen oder anderen hieraus ersichtlich, wo der Fehler liegen könnte! Danke schonmal für jede Hilfe!


Anmelden zum Antworten