kmsp11/util/string_utils.cc (58 lines of code) (raw):
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "kmsp11/util/string_utils.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "kmsp11/util/errors.h"
namespace cloud_kms::kmsp11 {
absl::Status CryptokiStrCopy(std::string_view src, absl::Span<uint8_t> dest,
char pad_char) {
if (src.length() > dest.length()) {
return NewError(
absl::StatusCode::kOutOfRange,
absl::StrFormat("\"%s\".length()=%d, want <= dest.length()=%d", src,
src.length(), dest.length()),
CKR_FUNCTION_FAILED, SOURCE_LOCATION);
}
uint8_t* pos = std::copy(src.begin(), src.end(), dest.begin());
std::fill(pos, dest.end(), pad_char);
return absl::OkStatus();
}
std::string MarshalBigNum(const BIGNUM* value) {
std::string s;
s.resize(BN_num_bytes(value));
BN_bn2bin(value, reinterpret_cast<uint8_t*>(s.data()));
return s;
}
std::string MarshalBool(bool value) { return std::string(1, value); }
std::string MarshalDate(absl::Time value) {
return absl::FormatTime("%E4Y%m%d", value, absl::UTCTimeZone());
}
std::string MarshalULong(unsigned long int value) {
return std::string(reinterpret_cast<const char*>(&value),
sizeof(unsigned long int));
}
std::string MarshalULongList(absl::Span<const unsigned long int> value) {
return std::string(reinterpret_cast<const char*>(value.data()),
value.size() * sizeof(unsigned long int));
}
absl::StatusOr<std::string> ExtractKeyId(std::string_view version_name) {
std::vector<std::string> parts = absl::StrSplit(version_name, '/');
if (parts.size() != 10 || parts[0] != "projects" || parts[2] != "locations" ||
parts[4] != "keyRings" || parts[6] != "cryptoKeys" ||
parts[8] != "cryptoKeyVersions") {
return NewInternalError(
absl::StrCat("invalid CryptoKeyVersion name: ", version_name),
SOURCE_LOCATION);
}
return parts[7];
}
absl::StatusOr<std::string> ExtractLocationName(
std::string_view key_ring_name) {
std::vector<std::string> parts = absl::StrSplit(key_ring_name, '/');
if (parts.size() != 6 || parts[0] != "projects" || parts[2] != "locations" ||
parts[4] != "keyRings") {
return NewInternalError(
absl::StrCat("invalid KeyRing name: ", key_ring_name), SOURCE_LOCATION);
}
return absl::StrJoin(absl::Span<std::string>(parts.data(), 4), "/");
}
} // namespace cloud_kms::kmsp11