summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/base64.h
blob: 58e48a8c33281e792686faf01f442ef7cfcd879b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup RTEMSImplBase64
 *
 * @brief This header file provides the interfaces of the
 *   @ref RTEMSImplBase64.
 */

/*
 * Copyright (C) 2020, 2024 embedded brains GmbH & Co. KG
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _RTEMS_BASE64_H
#define _RTEMS_BASE64_H

#include <rtems/dev/io.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup RTEMSImplBase64 Base64 Encoding and Decoding
 *
 * @ingroup RTEMSImpl
 *
 * @brief This group contains support functions for base64 and base64url
 *   encoding and decoding.
 *
 * @{
 */

/**
 * @brief Maps a 6-bit integer to the corresponding base64 encoding.
 */
extern const uint8_t _Base64_Encoding[ 64 ];

/**
 * @brief Maps a 6-bit integer to the corresponding base64url encoding.
 */
extern const uint8_t _Base64url_Encoding[ 64 ];

/**
 * @brief Outputs the source buffer in base64 encoding.
 *
 * After word length of output characters produced by the encoding a word break
 * is produced.
 *
 * @param put_char is the put character function used to output the encoded
 *   source buffer.
 *
 * @param arg is the argument passed to the put character function.
 *
 * @param src is the pointer to the source buffer begin.
 *
 * @param srclen is the length of the source buffer in bytes.
 *
 * @param wordbreak is the word break string.
 *
 * @param wordlen is the word length in bytes.  If the word length is less than
 *   four, then a word length of four will be used.
 *
 * @return Returns the count of output characters.
 */
int _Base64_Encode(
  IO_Put_char  put_char,
  void        *arg,
  const void  *src,
  size_t       len,
  const char  *wordbreak,
  int          wordlen
);

/**
 * @brief Outputs the source buffer in base64url encoding.
 *
 * After word length of output characters produced by the encoding a word break
 * is produced.
 *
 * @param put_char is the put character function used to output the encoded
 *   source buffer.
 *
 * @param arg is the argument passed to the put character function.
 *
 * @param src is the pointer to the source buffer begin.
 *
 * @param srclen is the length of the source buffer in bytes.
 *
 * @param wordbreak is the word break string.
 *
 * @param wordlen is the word length in bytes.  If the word length is less than
 *   four, then a word length of four will be used.
 *
 * @return Returns the count of output characters.
 */
int _Base64url_Encode(
  IO_Put_char  put_char,
  void        *arg,
  const void  *src,
  size_t       len,
  const char  *wordbreak,
  int          wordlen
);

/**
 * @brief Represents the base64 and base64url decoder state.
 */
typedef enum {
  BASE64_DECODE_STATE_0,
  BASE64_DECODE_STATE_1,
  BASE64_DECODE_STATE_2,
  BASE64_DECODE_STATE_3
} Base64_Decode_state;

/**
 * @brief Contains the base64 and base64url decoder control.
 */
typedef struct {
  Base64_Decode_state state;
  uint8_t            *target;
  const uint8_t      *target_end;
} Base64_Decode_control;

/**
 * @brief Maps a 7-bit character to the associated 6-bit integer as defined by
 *   the base64 or base64url encoding or a special value.
 */
extern const uint8_t _Base64_Decoding[ 128 ];

/**
 * @brief Initializes the base64 decoder.
 *
 * @param[out] self is the base64 decoder control to initialize.
 *
 * @param[out] target is the base address of the target area for decoding.
 *
 * @param target_size is the size in bytes of the target area for decoding.
 */
void _Base64_Decode_initialize(
  Base64_Decode_control *self,
  uint8_t               *target,
  size_t                 target_size
);

/**
 * @brief Represents the base64 and base64url decoder status.
 */
typedef enum {
  BASE64_DECODE_SUCCESS,
  BASE64_DECODE_OVERFLOW,
  BASE64_DECODE_INVALID_INPUT
} Base64_Decode_status;

/**
 * @brief Decodes the character.
 *
 * The decoder accepts base64 and base64url encodings.  White space is ignored.
 *
 * @param[in, out] self is the base64 decoder control.
 *
 * @param ch is the character to decode.
 */
Base64_Decode_status _Base64_Decode(
  Base64_Decode_control *self,
  char                   ch
);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _RTEMS_BASE64_H */