| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/gcm_driver/crypto/encryption_header_parsers.h" | 5 #include "components/gcm_driver/crypto/encryption_header_parsers.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 parser.value(); | 49 parser.value(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 if (name_value_map.size()) | 52 if (name_value_map.size()) |
| 53 output->push_back(name_value_map); | 53 output->push_back(name_value_map); |
| 54 } | 54 } |
| 55 | 55 |
| 56 return true; | 56 return true; |
| 57 } | 57 } |
| 58 | 58 |
| 59 // TODO(peter): Generalize a base64url implementation. | |
| 60 // See https://tools.ietf.org/html/rfc4648#section-5 | |
| 61 bool Base64DecodeUrlSafe(const std::string& input, std::string* output) { | |
| 62 if (input.find_first_of("+/") != std::string::npos) | |
| 63 return false; | |
| 64 | |
| 65 // Add padding. | |
| 66 size_t padded_size = (input.size() + 3) - (input.size() + 3) % 4; | |
| 67 std::string padded_input(input); | |
| 68 padded_input.resize(padded_size, '='); | |
| 69 | |
| 70 // Convert to standard base64 alphabet. | |
| 71 base::ReplaceChars(padded_input, "-", "+", &padded_input); | |
| 72 base::ReplaceChars(padded_input, "_", "/", &padded_input); | |
| 73 | |
| 74 return base::Base64Decode(padded_input, output); | |
| 75 } | |
| 76 | |
| 77 // Parses the "salt" field of the Encryption header. Must be a base64url | 59 // Parses the "salt" field of the Encryption header. Must be a base64url |
| 78 // encoded string that decodes to a string exactly 16 bytes in length. | 60 // encoded string that decodes to a string exactly 16 bytes in length. |
| 79 bool ParseSalt(const std::string& value, std::string* output) { | 61 bool ParseSalt(const std::string& value, std::string* output) { |
| 80 std::string decoded_value; | 62 std::string decoded_value; |
| 81 if (!Base64DecodeUrlSafe(value, &decoded_value)) | 63 if (!Base64DecodeUrlSafe(value, &decoded_value)) |
| 82 return false; | 64 return false; |
| 83 | 65 |
| 84 if (decoded_value.size() != 16) | 66 if (decoded_value.size() != 16) |
| 85 return false; | 67 return false; |
| 86 | 68 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 if (!Base64DecodeUrlSafe(dh_iter->second, &value.dh)) | 171 if (!Base64DecodeUrlSafe(dh_iter->second, &value.dh)) |
| 190 return false; | 172 return false; |
| 191 } | 173 } |
| 192 | 174 |
| 193 result->push_back(value); | 175 result->push_back(value); |
| 194 } | 176 } |
| 195 | 177 |
| 196 return true; | 178 return true; |
| 197 } | 179 } |
| 198 | 180 |
| 181 // TODO(peter): Generalize a base64url implementation. |
| 182 // See https://tools.ietf.org/html/rfc4648#section-5 |
| 183 bool Base64DecodeUrlSafe(const std::string& input, std::string* output) { |
| 184 if (input.find_first_of("+/") != std::string::npos) |
| 185 return false; |
| 186 |
| 187 // Add padding. |
| 188 size_t padded_size = (input.size() + 3) - (input.size() + 3) % 4; |
| 189 std::string padded_input(input); |
| 190 padded_input.resize(padded_size, '='); |
| 191 |
| 192 // Convert to standard base64 alphabet. |
| 193 base::ReplaceChars(padded_input, "-", "+", &padded_input); |
| 194 base::ReplaceChars(padded_input, "_", "/", &padded_input); |
| 195 |
| 196 return base::Base64Decode(padded_input, output); |
| 197 } |
| 198 |
| 199 } // namespace gcm | 199 } // namespace gcm |
| OLD | NEW |