| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 04:24:56 +08:00
										 |  |  | BIO_f_base64 - base64 BIO filter | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 23:10:59 +08:00
										 |  |  | =for openssl multiple includes | 
					
						
							| 
									
										
										
										
											2016-11-11 16:33:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  |  #include <openssl/bio.h> | 
					
						
							|  |  |  |  #include <openssl/evp.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-04 04:19:49 +08:00
										 |  |  |  const BIO_METHOD *BIO_f_base64(void); | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  | Base64 BIOs do not support BIO_gets() or BIO_puts(). | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-12 01:55:10 +08:00
										 |  |  | For writing, by default output is divided to lines of length 64 | 
					
						
							|  |  |  | characters and there is a newline at the end of output. | 
					
						
							|  |  |  | This behavior can be changed with B<BIO_FLAGS_BASE64_NO_NL> flag. | 
					
						
							| 
									
										
										
										
											2022-02-21 20:25:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | For reading, the first line of base64 content should be at most 1024 bytes long | 
					
						
							|  |  |  | including newline unless the flag B<BIO_FLAGS_BASE64_NO_NL> is set. | 
					
						
							|  |  |  | Subsequent input lines can be of any length (i.e., newlines may appear anywhere | 
					
						
							| 
									
										
										
										
											2022-07-12 01:55:10 +08:00
										 |  |  | in the input) and a newline at the end of input is not needed. | 
					
						
							| 
									
										
										
										
											2022-02-21 20:25:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | Also when reading, unless the flag B<BIO_FLAGS_BASE64_NO_NL> is set, initial | 
					
						
							|  |  |  | lines that contain non-base64 content (whitespace is tolerated and ignored) are | 
					
						
							|  |  |  | skipped, as are lines longer than 1024 bytes. | 
					
						
							|  |  |  | Decoding starts with the first line that is shorter than 1024 bytes (including | 
					
						
							|  |  |  | the newline) and consists of only (at least one) valid base64 characters plus | 
					
						
							|  |  |  | optional whitespace. | 
					
						
							|  |  |  | Decoding stops when base64 padding is encountered, a soft end-of-input | 
					
						
							|  |  |  | character (B<->, see L<EVP_DecodeUpdate(3)>) occurs as the first byte after a | 
					
						
							|  |  |  | complete group of 4 valid base64 characters is decoded, or when an error occurs | 
					
						
							|  |  |  | (e.g. due to input characters other than valid base64 or whitespace). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If decoding stops as a result of an error, the first L<BIO_read(3)> that | 
					
						
							|  |  |  | returns no decoded data will typically return a negative result, rather | 
					
						
							|  |  |  | than 0 (which indicates normal end of input). | 
					
						
							|  |  |  | However, a negative return value can also occur if the underlying BIO | 
					
						
							|  |  |  | supports retries, see L<BIO_should_read(3)> and L<BIO_set_mem_eof_return(3)>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | BIO_flush() on a base64 BIO that is being written through is | 
					
						
							|  |  |  | used to signal that no more data is to be encoded: this is used | 
					
						
							|  |  |  | to flush the final block through the BIO. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-12 01:55:10 +08:00
										 |  |  | The flag B<BIO_FLAGS_BASE64_NO_NL> can be set with BIO_set_flags(). | 
					
						
							| 
									
										
										
										
											2022-02-21 20:25:25 +08:00
										 |  |  | For writing, it causes all data to be written on one line without | 
					
						
							|  |  |  | newline at the end. | 
					
						
							| 
									
										
										
										
											2022-07-12 01:55:10 +08:00
										 |  |  | For reading, it removes all expectations on newlines in the input data. | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 NOTES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Because of the format of base64 encoding the end of the encoded | 
					
						
							|  |  |  | block cannot always be reliably determined. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 RETURN VALUES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BIO_f_base64() returns the base64 BIO method. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 EXAMPLES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Base64 encode the string "Hello World\n" and write the result | 
					
						
							|  |  |  | to standard output: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  BIO *bio, *b64; | 
					
						
							|  |  |  |  char message[] = "Hello World \n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  b64 = BIO_new(BIO_f_base64()); | 
					
						
							|  |  |  |  bio = BIO_new_fp(stdout, BIO_NOCLOSE); | 
					
						
							| 
									
										
										
										
											2014-07-03 10:42:40 +08:00
										 |  |  |  BIO_push(b64, bio); | 
					
						
							|  |  |  |  BIO_write(b64, message, strlen(message)); | 
					
						
							|  |  |  |  BIO_flush(b64); | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 10:42:40 +08:00
										 |  |  |  BIO_free_all(b64); | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | Read base64 encoded data from standard input and write the decoded | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | data to standard output: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-19 07:10:46 +08:00
										 |  |  |  BIO *bio, *b64, *bio_out; | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  |  char inbuf[512]; | 
					
						
							|  |  |  |  int inlen; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  b64 = BIO_new(BIO_f_base64()); | 
					
						
							|  |  |  |  bio = BIO_new_fp(stdin, BIO_NOCLOSE); | 
					
						
							|  |  |  |  bio_out = BIO_new_fp(stdout, BIO_NOCLOSE); | 
					
						
							| 
									
										
										
										
											2014-07-03 10:42:40 +08:00
										 |  |  |  BIO_push(b64, bio); | 
					
						
							| 
									
										
										
										
											2016-11-19 07:10:05 +08:00
										 |  |  |  while ((inlen = BIO_read(b64, inbuf, 512)) > 0) | 
					
						
							|  |  |  |      BIO_write(bio_out, inbuf, inlen); | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 10:42:40 +08:00
										 |  |  |  BIO_flush(bio_out); | 
					
						
							|  |  |  |  BIO_free_all(b64); | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 BUGS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | The hyphen character (B<->) is treated as an ad hoc soft end-of-input | 
					
						
							|  |  |  | character when it occurs at the start of a base64 group of 4 encoded | 
					
						
							|  |  |  | characters. | 
					
						
							| 
									
										
										
										
											2022-07-12 01:55:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | This heuristic works to detect the ends of base64 blocks in PEM or | 
					
						
							|  |  |  | multi-part MIME, provided there are no stray hyphens in the middle | 
					
						
							|  |  |  | input. | 
					
						
							|  |  |  | But it is just a heuristic, and sufficiently unusual input could produce | 
					
						
							|  |  |  | unexpected results. | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | There should perhaps be some way of specifying a test that the BIO can perform | 
					
						
							| 
									
										
										
										
											2000-09-11 09:04:09 +08:00
										 |  |  | to reliably determine EOF (for example a MIME boundary). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 22:43:33 +08:00
										 |  |  | It may be possible for L<BIO_read(3)> to return zero, rather than -1, even if | 
					
						
							|  |  |  | an error has been detected, more tests are needed to cover all the potential | 
					
						
							|  |  |  | error paths. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | L<BIO_read(3)>, | 
					
						
							|  |  |  | L<BIO_should_read(3)>, | 
					
						
							|  |  |  | L<BIO_set_mem_eof_return(3)>, | 
					
						
							|  |  |  | L<EVP_DecodeUpdate(3)>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-05 15:35:49 +08:00
										 |  |  | Copyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 21:04:44 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  | in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  | L<https://www.openssl.org/source/license.html>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =cut |