-
Notifications
You must be signed in to change notification settings - Fork 72
rpifwcrypto: Initial revision #139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+873
−1
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
cmake_minimum_required(VERSION 3.10...3.27) | ||
include(GNUInstallDirs) | ||
|
||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror") | ||
|
||
# Set project name | ||
project(rpifwcrypto) | ||
|
||
# Find GnuTLS package | ||
find_package(GnuTLS REQUIRED) | ||
|
||
option(BUILD_SHARED_LIBS "Build using shared libraries" ON) | ||
|
||
# Create the shared library | ||
add_library(rpifwcrypto rpifwcrypto.c) | ||
target_sources(rpifwcrypto PUBLIC rpifwcrypto.h) | ||
set_target_properties(rpifwcrypto PROPERTIES PUBLIC_HEADER rpifwcrypto.h) | ||
set_target_properties(rpifwcrypto PROPERTIES SOVERSION 0) | ||
|
||
# Create the executable | ||
add_executable(rpi-fw-crypto main.c) | ||
target_link_libraries(rpi-fw-crypto rpifwcrypto ${GNUTLS_LIBRARIES}) | ||
target_include_directories(rpi-fw-crypto PRIVATE ${GNUTLS_INCLUDE_DIRS}) | ||
|
||
# Install rules | ||
install(TARGETS rpi-fw-crypto RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) | ||
install(TARGETS rpifwcrypto | ||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
|
||
# rpifwcrypto | ||
|
||
The Raspberry Pi Firmware Cryptography service is a mailbox based API | ||
that allows a limited set of cryptographic operations to be performed | ||
by the firmware without exposing private keys to userspace. | ||
|
||
The initial implementation is designed to support PiConnect and | ||
provides an ECDSA P-256 SHA256 signature API. | ||
|
||
A SHA256 HMAC API is provided to provide basic support for derived keys | ||
instead of using the raw device unique private key | ||
e.g. HMAC(serial-number + EMMC CID) could be used for a LUKS passphrase. | ||
|
||
Although this service can be used via raw vcmailbox commands the | ||
recommended API is either the command line rpi-fw-crypto application | ||
or the librpifwcrypto.so shared library. | ||
|
||
**Build Instructions** | ||
Install prerequisites with "sudo apt install cmake libgnutls28-dev"" - you need at least version 3.10. | ||
|
||
- *mkdir build* | ||
- *cd build* | ||
- *cmake ..* | ||
- *make* | ||
- *sudo make install* | ||
|
||
**Usage** | ||
|
||
* rpi-fw-crypto -h (Displays usage instructions for all operations) | ||
* rpi-fw-crypto get-num-otp-keys (Returns the number of OTP key slots) | ||
* rpi-fw-crypto sign --in message.bin --key-id 1 --alg ec --out sig.bin (Signs message.bin with the device unique OTP key (id 1)) | ||
* rpi-fw-crypto get-key-status 1 (Gets the status of key-id 1) | ||
* rpi-fw-crypto set-key-status 1 LOCKED (Blocks the raw OTP read API on this key until the device is rebooted) | ||
* rpi-fw-crypto hmac --in message.bin --key-id 1 --out hmac.bin (Generates the SHA256 HMAC of message.bin and OTP key id 1) | ||
|
||
** Notes ** | ||
The device unique private key can be provisioned with the `rpi-otp-private-key` utility. | ||
This MUST be a raw ECDSA P-256 key and not just a random number. | ||
|
||
This service is not a hardware security module and the current implementation | ||
does not protect the key and/or OTP from being accessed directly with root level privileges. | ||
It just removes the need to expose the key to userspace (e.g. initramfs) scripts. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you're changing the default build for rpifwcrypto to shared libraries then you'll need to update the top-level README. And perhaps provide rpifwcrypto/README.md as well.