ToTLVCert.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2023 Project CHIP Authors
  3. * All rights reserved.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include "ToTLVCert.h"
  19. #include <credentials/CHIPCert.h>
  20. #include <lib/support/Base64.h>
  21. constexpr const char kBase64Header[] = "base64:";
  22. constexpr size_t kBase64HeaderLen = ArraySize(kBase64Header) - 1;
  23. CHIP_ERROR ToBase64(const chip::ByteSpan & input, std::string & outputAsPrefixedBase64)
  24. {
  25. chip::Platform::ScopedMemoryBuffer<char> base64String;
  26. base64String.Alloc(kBase64HeaderLen + BASE64_ENCODED_LEN(input.size()) + 1);
  27. VerifyOrReturnError(base64String.Get() != nullptr, CHIP_ERROR_NO_MEMORY);
  28. auto encodedLen = chip::Base64Encode(input.data(), static_cast<uint16_t>(input.size()), base64String.Get() + kBase64HeaderLen);
  29. if (encodedLen)
  30. {
  31. memcpy(base64String.Get(), kBase64Header, kBase64HeaderLen);
  32. encodedLen = static_cast<uint16_t>(encodedLen + kBase64HeaderLen);
  33. }
  34. base64String.Get()[encodedLen] = '\0';
  35. outputAsPrefixedBase64 = std::string(base64String.Get(), encodedLen);
  36. return CHIP_NO_ERROR;
  37. }
  38. CHIP_ERROR ToTLVCert(const chip::ByteSpan & derEncodedCertificate, std::string & tlvCertAsPrefixedBase64)
  39. {
  40. uint8_t chipCertBuffer[chip::Credentials::kMaxCHIPCertLength];
  41. chip::MutableByteSpan chipCertBytes(chipCertBuffer);
  42. ReturnErrorOnFailure(chip::Credentials::ConvertX509CertToChipCert(derEncodedCertificate, chipCertBytes));
  43. ReturnErrorOnFailure(ToBase64(chipCertBytes, tlvCertAsPrefixedBase64));
  44. return CHIP_NO_ERROR;
  45. }