On Thu January 1 2009, Frank B. Brokken wrote: > Hi Mike, > > Thanks for your postings in reply to my base64 decoding problem. I must admit > that I saw your first posting only after sending out the reply to William, so > let's correct that here :-) > > In your last posting you wrote: > > > Are you stripping the bytes that might appear in the stream > > that do not represent encoded characters or a part of the count? > > That's an interesting thought. I assumed that when BIO_f_base64 decodes it is > expecting the information it has originally encoded. The man-page states: > > BIO_f_base64() returns the base64 BIO method. This is a filter BIO that > base64 encodes any data written through it and decodes any data read > through it. > > So, f_base64 writes a newline after 64 encoded chars. When I remove the > newline chars following your suggestion I get no output at all. Maybe that's > kind of weird too, but at least it matches my assumtion that the way base64 > writes information is the way it expects it back. But your remark did put me > onto some useful track: base64's output suggests that its output should be > read in chunks of 64 bytes. OK so far, but when I do that repeatedly on the > same base64 and mem object conversion fails after one or two blocks. The > following code, however, works fine: > > int main() > { > while (true) > { > char inbuf[65]; > BIO *b64 = BIO_new(BIO_f_base64()); > BIO *mem = BIO_new(BIO_s_mem()); > BIO *bio = BIO_push(b64, mem); > int inlen; > > if ((inlen = fread(inbuf, 1, 65, stdin)) <= 0) > break; > > BIO_write(mem, inbuf, inlen); > > inlen = BIO_read(bio, inbuf, 48); > if (inlen > 0) > fwrite(inbuf, inlen, 1, stderr); > > BIO_free_all(bio); > } > } > > Note that I renew f_base64 and s_mem at each new block of 65 bytes. Here I use > `65' and `48', but you could multiply these values by any integral factor `x', > e.g., using x = 15 and then x * 65 and x * 48. The program works fine for any > positive x. The main problems I have with the above code (irrespective of the > factor used) is that I have to renew the f_base64 and s_mem objects at each > new read-cycle and that I dislike magic numbers. I'm willing to accept the > latter, considering that `x * 65' and `x * 48' are inherent elements of the > base64 decoding, but I would be very interested in knowing how to re-use > rather than re-new the f_base64 and s_mem objects. > > > > ... there must be a more > > > systematic way to handle my problem.... > > > > There is, I posted the link to one such solution. Have you read it? > > Yes, by now I have. It doesn't solve the problem though: the posted solution > `hand-decodes' base64 encoded information instead of using the > ssl-functions. I'm sure I can do that, too, but my original plan was (and > still is) to use the available ssl-functions for that. Thanks for showing me > the link, though. I appreciate it, but completely missed your posting when > writing my previous posting. >
It was reading through that link that reminded me of the bytes in the stream in addition to the encoded bytes. Maybe it will bring something else to mind. Whatever is happening, is probably 'obvious' once you spot it. ;) It does seem a little unusual that the routines are written to be destructive. Oh, well, might just be the way they needed to be written. > > Is this a homework assignment? > > :-) Great remark! No it isn't. One day I could make it into an assignment for > my students, though ;-) But no: for now I'm just interested in applying the > facilities offered by the openssl library to my own programs. > Might even call it a history lesson. base64 encoding was the answer to serial lines that where not 7-bit clean. Encourages the students to think about 'why'. > BTW: It's highly unlikely that I'll be able to reply to any new postings to > this thread for the coming 3 weeks. Please don't take silence from me > during that period for impoliteness or lack of interest. > Not a problem. Mike > Cheers, > ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List openssl-users@openssl.org Automated List Manager majord...@openssl.org