| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 20:23:55 +08:00
										 |  |  | OSSL_DECODER_from_data, | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | OSSL_DECODER_from_bio, | 
					
						
							| 
									
										
										
										
											2020-09-14 17:35:07 +08:00
										 |  |  | OSSL_DECODER_from_fp | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | - Routines to perform a decoding | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  #include <openssl/decoder.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  int OSSL_DECODER_from_bio(OSSL_DECODER_CTX *ctx, BIO *in); | 
					
						
							|  |  |  |  int OSSL_DECODER_from_fp(OSSL_DECODER_CTX *ctx, FILE *fp); | 
					
						
							| 
									
										
										
										
											2020-10-05 20:23:55 +08:00
										 |  |  |  int OSSL_DECODER_from_data(OSSL_DECODER_CTX *ctx, const unsigned char **pdata, | 
					
						
							|  |  |  |                             size_t *pdata_len); | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Feature availability macros: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item OSSL_DECODER_from_fp() is only available when B<OPENSSL_NO_STDIO> | 
					
						
							|  |  |  | is undefined. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 20:23:55 +08:00
										 |  |  | OSSL_DECODER_from_data() runs the decoding process for the context I<ctx>, | 
					
						
							|  |  |  | with input coming from I<*pdata>, I<*pdata_len> bytes long.  Both I<*pdata> | 
					
						
							|  |  |  | and I<*pdata_len> must be non-NULL.  When OSSL_DECODER_from_data() returns, | 
					
						
							|  |  |  | I<*pdata> is updated to point at the location after what has been decoded, | 
					
						
							|  |  |  | and I<*pdata_len> to have the number of remaining bytes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 17:35:07 +08:00
										 |  |  | OSSL_DECODER_from_bio() runs the decoding process for the context I<ctx>, | 
					
						
							|  |  |  | with the input coming from the B<BIO> I<in>.  Should it make a difference, | 
					
						
							|  |  |  | it's recommended to have the BIO set in binary mode rather than text mode. | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | OSSL_DECODER_from_fp() does the same thing as OSSL_DECODER_from_bio(), | 
					
						
							|  |  |  | except that the input is coming from the B<FILE> I<fp>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 RETURN VALUES | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 20:03:19 +08:00
										 |  |  | OSSL_DECODER_from_bio(), OSSL_DECODER_from_data() and OSSL_DECODER_from_fp() | 
					
						
							|  |  |  | return 1 on success, or 0 on failure. | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 EXAMPLES | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-16 01:31:34 +08:00
										 |  |  | To decode an RSA key encoded with PEM from a bio: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  OSSL_DECODER_CTX *dctx; | 
					
						
							|  |  |  |  EVP_PKEY *pkey = NULL; | 
					
						
							|  |  |  |  const char *format = "PEM";   /* NULL for any format */ | 
					
						
							|  |  |  |  const char *structure = NULL; /* any structure */ | 
					
						
							|  |  |  |  const char *keytype = "RSA";  /* NULL for any key */ | 
					
						
							|  |  |  |  const unsigned char *pass = "my password"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, format, structure, | 
					
						
							|  |  |  |                                       keytype, | 
					
						
							|  |  |  |                                       OSSL_KEYMGMT_SELECT_KEYPAIR, | 
					
						
							|  |  |  |                                       NULL, NULL); | 
					
						
							|  |  |  |  if (dctx == NULL) { | 
					
						
							|  |  |  |      /* error: no suitable potential decoders found */ | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |  if (pass != NULL) | 
					
						
							|  |  |  |      OSSL_DECODER_CTX_set_passphrase(dctx, pass, strlen(pass)); | 
					
						
							|  |  |  |  if (OSSL_DECODER_from_bio(dctx, bio)) { | 
					
						
							|  |  |  |      /* pkey is created with the decoded data from the bio */ | 
					
						
							|  |  |  |  } else { | 
					
						
							|  |  |  |      /* decoding failure */ | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |  OSSL_DECODER_CTX_free(dctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To decode an EC key encoded with DER from a buffer: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  OSSL_DECODER_CTX *dctx; | 
					
						
							|  |  |  |  EVP_PKEY *pkey = NULL; | 
					
						
							|  |  |  |  const char *format = "DER";   /* NULL for any format */ | 
					
						
							|  |  |  |  const char *structure = NULL; /* any structure */ | 
					
						
							|  |  |  |  const char *keytype = "EC";   /* NULL for any key */ | 
					
						
							|  |  |  |  const unsigned char *pass = NULL | 
					
						
							|  |  |  |  const unsigned char *data = buffer; | 
					
						
							|  |  |  |  size_t datalen = sizeof(buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, format, structure, | 
					
						
							|  |  |  |                                       keytype, | 
					
						
							|  |  |  |                                       OSSL_KEYMGMT_SELECT_KEYPAIR | 
					
						
							|  |  |  |                                       | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS, | 
					
						
							|  |  |  |                                       NULL, NULL); | 
					
						
							|  |  |  |  if (dctx == NULL) { | 
					
						
							|  |  |  |      /* error: no suitable potential decoders found */ | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |  if (pass != NULL) | 
					
						
							|  |  |  |      OSSL_DECODER_CTX_set_passphrase(dctx, pass, strlen(pass)); | 
					
						
							|  |  |  |  if (OSSL_DECODER_from_data(dctx, &data, &datalen)) { | 
					
						
							|  |  |  |      /* pkey is created with the decoded data from the buffer */ | 
					
						
							|  |  |  |  } else { | 
					
						
							|  |  |  |      /* decoding failure */ | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |  OSSL_DECODER_CTX_free(dctx); | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | L<provider(7)>, L<OSSL_DECODER_CTX(3)> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The functions described here were added in OpenSSL 3.0. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-07 16:59:15 +08:00
										 |  |  | Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-08-17 03:25:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							|  |  |  | 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 |