pkixverify.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  5. */
  6. #include "pkix/pkixutil.h"
  7. namespace mozilla { namespace pkix {
  8. Result
  9. DigestSignedData(TrustDomain& trustDomain,
  10. const der::SignedDataWithSignature& signedData,
  11. /*out*/ uint8_t(&digestBuf)[MAX_DIGEST_SIZE_IN_BYTES],
  12. /*out*/ der::PublicKeyAlgorithm& publicKeyAlg,
  13. /*out*/ SignedDigest& signedDigest)
  14. {
  15. Reader signatureAlg(signedData.algorithm);
  16. Result rv = der::SignatureAlgorithmIdentifierValue(
  17. signatureAlg, publicKeyAlg, signedDigest.digestAlgorithm);
  18. if (rv != Success) {
  19. return rv;
  20. }
  21. if (!signatureAlg.AtEnd()) {
  22. return Result::ERROR_BAD_DER;
  23. }
  24. size_t digestLen;
  25. switch (signedDigest.digestAlgorithm) {
  26. case DigestAlgorithm::sha512: digestLen = 512 / 8; break;
  27. case DigestAlgorithm::sha384: digestLen = 384 / 8; break;
  28. case DigestAlgorithm::sha256: digestLen = 256 / 8; break;
  29. case DigestAlgorithm::sha1: digestLen = 160 / 8; break;
  30. MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
  31. }
  32. assert(digestLen <= sizeof(digestBuf));
  33. rv = trustDomain.DigestBuf(signedData.data, signedDigest.digestAlgorithm,
  34. digestBuf, digestLen);
  35. if (rv != Success) {
  36. return rv;
  37. }
  38. rv = signedDigest.digest.Init(digestBuf, digestLen);
  39. if (rv != Success) {
  40. return rv;
  41. }
  42. return signedDigest.signature.Init(signedData.signature);
  43. }
  44. Result
  45. VerifySignedDigest(TrustDomain& trustDomain,
  46. der::PublicKeyAlgorithm publicKeyAlg,
  47. const SignedDigest& signedDigest,
  48. Input signerSubjectPublicKeyInfo)
  49. {
  50. switch (publicKeyAlg) {
  51. case der::PublicKeyAlgorithm::ECDSA:
  52. return trustDomain.VerifyECDSASignedDigest(signedDigest,
  53. signerSubjectPublicKeyInfo);
  54. case der::PublicKeyAlgorithm::RSA_PKCS1:
  55. return trustDomain.VerifyRSAPKCS1SignedDigest(signedDigest,
  56. signerSubjectPublicKeyInfo);
  57. case der::PublicKeyAlgorithm::Uninitialized:
  58. assert(false);
  59. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  60. MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
  61. }
  62. }
  63. Result
  64. VerifySignedData(TrustDomain& trustDomain,
  65. const der::SignedDataWithSignature& signedData,
  66. Input signerSubjectPublicKeyInfo)
  67. {
  68. uint8_t digestBuf[MAX_DIGEST_SIZE_IN_BYTES];
  69. der::PublicKeyAlgorithm publicKeyAlg;
  70. SignedDigest signedDigest;
  71. Result rv = DigestSignedData(trustDomain, signedData, digestBuf,
  72. publicKeyAlg, signedDigest);
  73. if (rv != Success) {
  74. return rv;
  75. }
  76. return VerifySignedDigest(trustDomain, publicKeyAlg, signedDigest,
  77. signerSubjectPublicKeyInfo);
  78. }
  79. } } // namespace mozilla::pkix