xref: /aosp_15_r20/external/libbrillo/brillo/data_encoding.h (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #ifndef LIBBRILLO_BRILLO_DATA_ENCODING_H_
6*1a96fba6SXin Li #define LIBBRILLO_BRILLO_DATA_ENCODING_H_
7*1a96fba6SXin Li 
8*1a96fba6SXin Li #include <string>
9*1a96fba6SXin Li #include <utility>
10*1a96fba6SXin Li #include <vector>
11*1a96fba6SXin Li 
12*1a96fba6SXin Li #include <brillo/brillo_export.h>
13*1a96fba6SXin Li #include <brillo/secure_blob.h>
14*1a96fba6SXin Li 
15*1a96fba6SXin Li namespace brillo {
16*1a96fba6SXin Li namespace data_encoding {
17*1a96fba6SXin Li 
18*1a96fba6SXin Li using WebParamList = std::vector<std::pair<std::string, std::string>>;
19*1a96fba6SXin Li 
20*1a96fba6SXin Li // Encode/escape string to be used in the query portion of a URL.
21*1a96fba6SXin Li // If |encodeSpaceAsPlus| is set to true, spaces are encoded as '+' instead
22*1a96fba6SXin Li // of "%20"
23*1a96fba6SXin Li BRILLO_EXPORT std::string UrlEncode(const char* data, bool encodeSpaceAsPlus);
24*1a96fba6SXin Li 
UrlEncode(const char * data)25*1a96fba6SXin Li inline std::string UrlEncode(const char* data) {
26*1a96fba6SXin Li   return UrlEncode(data, true);
27*1a96fba6SXin Li }
28*1a96fba6SXin Li 
29*1a96fba6SXin Li // Decodes/unescapes a URL. Replaces all %XX sequences with actual characters.
30*1a96fba6SXin Li // Also replaces '+' with spaces.
31*1a96fba6SXin Li BRILLO_EXPORT std::string UrlDecode(const char* data);
32*1a96fba6SXin Li 
33*1a96fba6SXin Li // Converts a list of key-value pairs into a string compatible with
34*1a96fba6SXin Li // 'application/x-www-form-urlencoded' content encoding.
35*1a96fba6SXin Li BRILLO_EXPORT std::string WebParamsEncode(const WebParamList& params,
36*1a96fba6SXin Li                                           bool encodeSpaceAsPlus);
37*1a96fba6SXin Li 
WebParamsEncode(const WebParamList & params)38*1a96fba6SXin Li inline std::string WebParamsEncode(const WebParamList& params) {
39*1a96fba6SXin Li   return WebParamsEncode(params, true);
40*1a96fba6SXin Li }
41*1a96fba6SXin Li 
42*1a96fba6SXin Li // Parses a string of '&'-delimited key-value pairs (separated by '=') and
43*1a96fba6SXin Li // encoded in a way compatible with 'application/x-www-form-urlencoded'
44*1a96fba6SXin Li // content encoding.
45*1a96fba6SXin Li BRILLO_EXPORT WebParamList WebParamsDecode(const std::string& data);
46*1a96fba6SXin Li 
47*1a96fba6SXin Li // Encodes binary data using base64-encoding.
48*1a96fba6SXin Li BRILLO_EXPORT std::string Base64Encode(const void* data, size_t size);
49*1a96fba6SXin Li 
50*1a96fba6SXin Li // Encodes binary data using base64-encoding and wraps lines at 64 character
51*1a96fba6SXin Li // boundary using LF as required by PEM (RFC 1421) specification.
52*1a96fba6SXin Li BRILLO_EXPORT std::string Base64EncodeWrapLines(const void* data, size_t size);
53*1a96fba6SXin Li 
54*1a96fba6SXin Li // Decodes the input string from Base64.
55*1a96fba6SXin Li BRILLO_EXPORT bool Base64Decode(const std::string& input, brillo::Blob* output);
56*1a96fba6SXin Li 
57*1a96fba6SXin Li // Helper wrappers to use std::string and brillo::Blob as binary data
58*1a96fba6SXin Li // containers.
Base64Encode(const brillo::Blob & input)59*1a96fba6SXin Li inline std::string Base64Encode(const brillo::Blob& input) {
60*1a96fba6SXin Li   return Base64Encode(input.data(), input.size());
61*1a96fba6SXin Li }
Base64EncodeWrapLines(const brillo::Blob & input)62*1a96fba6SXin Li inline std::string Base64EncodeWrapLines(const brillo::Blob& input) {
63*1a96fba6SXin Li   return Base64EncodeWrapLines(input.data(), input.size());
64*1a96fba6SXin Li }
Base64Encode(const std::string & input)65*1a96fba6SXin Li inline std::string Base64Encode(const std::string& input) {
66*1a96fba6SXin Li   return Base64Encode(input.data(), input.size());
67*1a96fba6SXin Li }
Base64EncodeWrapLines(const std::string & input)68*1a96fba6SXin Li inline std::string Base64EncodeWrapLines(const std::string& input) {
69*1a96fba6SXin Li   return Base64EncodeWrapLines(input.data(), input.size());
70*1a96fba6SXin Li }
Base64Decode(const std::string & input,std::string * output)71*1a96fba6SXin Li inline bool Base64Decode(const std::string& input, std::string* output) {
72*1a96fba6SXin Li   brillo::Blob blob;
73*1a96fba6SXin Li   if (!Base64Decode(input, &blob))
74*1a96fba6SXin Li     return false;
75*1a96fba6SXin Li   *output = std::string{blob.begin(), blob.end()};
76*1a96fba6SXin Li   return true;
77*1a96fba6SXin Li }
78*1a96fba6SXin Li 
79*1a96fba6SXin Li }  // namespace data_encoding
80*1a96fba6SXin Li }  // namespace brillo
81*1a96fba6SXin Li 
82*1a96fba6SXin Li #endif  // LIBBRILLO_BRILLO_DATA_ENCODING_H_
83