libcamera: ipa_module: Load IPA module signature

Load the signature from the .sign file, if available, when loading the
IPA module information and store it in the IPAModule class.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart
2020-04-14 02:03:23 +03:00
parent 9893ff92c4
commit bf4049fd90
2 changed files with 33 additions and 0 deletions
+4
View File
@@ -7,7 +7,9 @@
#ifndef __LIBCAMERA_IPA_MODULE_H__
#define __LIBCAMERA_IPA_MODULE_H__
#include <stdint.h>
#include <string>
#include <vector>
#include <ipa/ipa_interface.h>
#include <ipa/ipa_module_info.h>
@@ -25,6 +27,7 @@ public:
bool isValid() const;
const struct IPAModuleInfo &info() const;
const std::vector<uint8_t> signature() const;
const std::string &path() const;
bool load();
@@ -38,6 +41,7 @@ public:
private:
struct IPAModuleInfo info_;
std::vector<uint8_t> signature_;
std::string libPath_;
bool valid_;
+29
View File
@@ -308,6 +308,20 @@ int IPAModule::loadIPAModuleInfo()
return -EINVAL;
}
/* Load the signature. Failures are not fatal. */
File sign{ libPath_ + ".sign" };
if (!sign.open(File::ReadOnly)) {
LOG(IPAModule, Debug)
<< "IPA module " << libPath_ << " is not signed";
return 0;
}
data = sign.map(0, -1, File::MapPrivate);
signature_.resize(data.size());
memcpy(signature_.data(), data.data(), data.size());
LOG(IPAModule, Debug) << "IPA module " << libPath_ << " is signed";
return 0;
}
@@ -339,6 +353,21 @@ const struct IPAModuleInfo &IPAModule::info() const
return info_;
}
/**
* \brief Retrieve the IPA module signature
*
* The IPA module signature is stored alongside the IPA module in a file with a
* '.sign' suffix, and is loaded when the IPAModule instance is created. This
* function returns the signature without verifying it. If the signature is
* missing, the returned vector will be empty.
*
* \return The IPA module signature
*/
const std::vector<uint8_t> IPAModule::signature() const
{
return signature_;
}
/**
* \brief Retrieve the IPA module path
*