xref: /reactos/sdk/include/reactos/libs/mbedtls/pem.h (revision cbda039f)
1 /**
2  * \file pem.h
3  *
4  * \brief Privacy Enhanced Mail (PEM) decoding
5  */
6 /*
7  *  Copyright The Mbed TLS Contributors
8  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9  *
10  *  This file is provided under the Apache License 2.0, or the
11  *  GNU General Public License v2.0 or later.
12  *
13  *  **********
14  *  Apache License 2.0:
15  *
16  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
17  *  not use this file except in compliance with the License.
18  *  You may obtain a copy of the License at
19  *
20  *  http://www.apache.org/licenses/LICENSE-2.0
21  *
22  *  Unless required by applicable law or agreed to in writing, software
23  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
24  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25  *  See the License for the specific language governing permissions and
26  *  limitations under the License.
27  *
28  *  **********
29  *
30  *  **********
31  *  GNU General Public License v2.0 or later:
32  *
33  *  This program is free software; you can redistribute it and/or modify
34  *  it under the terms of the GNU General Public License as published by
35  *  the Free Software Foundation; either version 2 of the License, or
36  *  (at your option) any later version.
37  *
38  *  This program is distributed in the hope that it will be useful,
39  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
40  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
41  *  GNU General Public License for more details.
42  *
43  *  You should have received a copy of the GNU General Public License along
44  *  with this program; if not, write to the Free Software Foundation, Inc.,
45  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
46  *
47  *  **********
48  */
49 #ifndef MBEDTLS_PEM_H
50 #define MBEDTLS_PEM_H
51 
52 #if !defined(MBEDTLS_CONFIG_FILE)
53 #include "config.h"
54 #else
55 #include MBEDTLS_CONFIG_FILE
56 #endif
57 
58 #include <stddef.h>
59 
60 /**
61  * \name PEM Error codes
62  * These error codes are returned in case of errors reading the
63  * PEM data.
64  * \{
65  */
66 #define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT          -0x1080  /**< No PEM header or footer found. */
67 #define MBEDTLS_ERR_PEM_INVALID_DATA                      -0x1100  /**< PEM string is not as expected. */
68 #define MBEDTLS_ERR_PEM_ALLOC_FAILED                      -0x1180  /**< Failed to allocate memory. */
69 #define MBEDTLS_ERR_PEM_INVALID_ENC_IV                    -0x1200  /**< RSA IV is not in hex-format. */
70 #define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG                   -0x1280  /**< Unsupported key encryption algorithm. */
71 #define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED                 -0x1300  /**< Private key password can't be empty. */
72 #define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH                 -0x1380  /**< Given private key password does not allow for correct decryption. */
73 #define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE               -0x1400  /**< Unavailable feature, e.g. hashing/encryption combination. */
74 #define MBEDTLS_ERR_PEM_BAD_INPUT_DATA                    -0x1480  /**< Bad input parameters to function. */
75 /* \} name */
76 
77 #ifdef __cplusplus
78 extern "C" {
79 #endif
80 
81 #if defined(MBEDTLS_PEM_PARSE_C)
82 /**
83  * \brief       PEM context structure
84  */
85 typedef struct mbedtls_pem_context
86 {
87     unsigned char *buf;     /*!< buffer for decoded data             */
88     size_t buflen;          /*!< length of the buffer                */
89     unsigned char *info;    /*!< buffer for extra header information */
90 }
91 mbedtls_pem_context;
92 
93 /**
94  * \brief       PEM context setup
95  *
96  * \param ctx   context to be initialized
97  */
98 void mbedtls_pem_init( mbedtls_pem_context *ctx );
99 
100 /**
101  * \brief       Read a buffer for PEM information and store the resulting
102  *              data into the specified context buffers.
103  *
104  * \param ctx       context to use
105  * \param header    header string to seek and expect
106  * \param footer    footer string to seek and expect
107  * \param data      source data to look in (must be nul-terminated)
108  * \param pwd       password for decryption (can be NULL)
109  * \param pwdlen    length of password
110  * \param use_len   destination for total length used (set after header is
111  *                  correctly read, so unless you get
112  *                  MBEDTLS_ERR_PEM_BAD_INPUT_DATA or
113  *                  MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is
114  *                  the length to skip)
115  *
116  * \note            Attempts to check password correctness by verifying if
117  *                  the decrypted text starts with an ASN.1 sequence of
118  *                  appropriate length
119  *
120  * \return          0 on success, or a specific PEM error code
121  */
122 int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer,
123                      const unsigned char *data,
124                      const unsigned char *pwd,
125                      size_t pwdlen, size_t *use_len );
126 
127 /**
128  * \brief       PEM context memory freeing
129  *
130  * \param ctx   context to be freed
131  */
132 void mbedtls_pem_free( mbedtls_pem_context *ctx );
133 #endif /* MBEDTLS_PEM_PARSE_C */
134 
135 #if defined(MBEDTLS_PEM_WRITE_C)
136 /**
137  * \brief           Write a buffer of PEM information from a DER encoded
138  *                  buffer.
139  *
140  * \param header    The header string to write.
141  * \param footer    The footer string to write.
142  * \param der_data  The DER data to encode.
143  * \param der_len   The length of the DER data \p der_data in Bytes.
144  * \param buf       The buffer to write to.
145  * \param buf_len   The length of the output buffer \p buf in Bytes.
146  * \param olen      The address at which to store the total length written
147  *                  or required (if \p buf_len is not enough).
148  *
149  * \note            You may pass \c NULL for \p buf and \c 0 for \p buf_len
150  *                  to request the length of the resulting PEM buffer in
151  *                  `*olen`.
152  *
153  * \note            This function may be called with overlapping \p der_data
154  *                  and \p buf buffers.
155  *
156  * \return          \c 0 on success.
157  * \return          #MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL if \p buf isn't large
158  *                  enough to hold the PEM buffer. In  this case, `*olen` holds
159  *                  the required minimum size of \p buf.
160  * \return          Another PEM or BASE64 error code on other kinds of failure.
161  */
162 int mbedtls_pem_write_buffer( const char *header, const char *footer,
163                       const unsigned char *der_data, size_t der_len,
164                       unsigned char *buf, size_t buf_len, size_t *olen );
165 #endif /* MBEDTLS_PEM_WRITE_C */
166 
167 #ifdef __cplusplus
168 }
169 #endif
170 
171 #endif /* pem.h */
172