Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 8 additions & 16 deletions rules/signing.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -275,13 +275,13 @@ def _presigning_artifacts(ctx, opentitantool, src, manifest, ecdsa_key, rsa_key,
if spx_key:
if spx_domain.lower() == "prehashedsha256":
spxmsg = digest
rev = spx_key.config.get("byte-reversal-bug", "false")
fmt = "Sha256HashReversed" if rev == "true" else "Sha256Hash"
signing_directives.append(struct(
command = "spx-sign",
id = None,
label = spx_key.name,
# TODO(#25870): Set `little_endian` appropriately.
little_endian = True,
format = "Sha256Hash",
format = fmt,
domain = spx_domain,
output = "{}.spx_sig".format(basename),
input = "{}.digest".format(basename),
Expand All @@ -306,7 +306,6 @@ def _presigning_artifacts(ctx, opentitantool, src, manifest, ecdsa_key, rsa_key,
command = "spx-sign",
id = None,
label = spx_key.name,
little_endian = False,
format = "PlainText",
domain = spx_domain,
output = "{}.spx_sig".format(basename),
Expand Down Expand Up @@ -375,15 +374,7 @@ def _local_sign(ctx, tool, digest, ecdsa_key, rsa_key, spxmsg = None, spx_key =
fail("Expected either KeyInfo or KeySetInfo; got neither")
spx_sig = ctx.actions.declare_file(paths.replace_extension(spxmsg.basename, ".spx_sig"))
domain = spx_key.config.get("domain", "Pure")

# TODO(#25870): Currently, opentitantool emits SHA256 digests in byte-reversed order,
# so for proper creation of PrehashedSha256 signatures, we need to reverse the input.
# The ROM erroneously uses the reversed representation, so when "byte-reversal-bug" is
# true, we should not reverse the bytes (since they're already reversed).
# This logic will change when we fix opentitantool to emit in the correct order.
rev = "true" if domain.lower() == "prehashedsha256" else "false"
if spx_key.config.get("byte-reversal-bug") == "true":
rev = "false"
rev = spx_key.config.get("byte-reversal-bug", "false")
ctx.actions.run(
outputs = [spx_sig],
inputs = [spxmsg, private_key],
Expand All @@ -392,7 +383,7 @@ def _local_sign(ctx, tool, digest, ecdsa_key, rsa_key, spxmsg = None, spx_key =
"--quiet",
"spx",
"sign",
"--input-bytes-reversed={}".format(rev),
"--spx-hash-reversal-bug={}".format(rev),
"--domain={}".format(domain),
"--output={}".format(spx_sig.path),
spxmsg.path,
Expand Down Expand Up @@ -469,10 +460,11 @@ def _hsmtool_sign(ctx, tool, digest, ecdsa_key, rsa_key, spxmsg = None, spx_key
if spxmsg and spx_key:
domain = spx_key.config.get("domain", "Pure")
if domain.lower() == "prehashedsha256":
rev = spx_key.config.get("byte-reversal-bug", "false")
fmt = "sha256-hash-reversed" if rev == "true" else "sha256-hash"
args = [
# TODO(#25870): Set `little-endian` appropriately.
"--little-endian",
"--format=sha256-hash",
"--format={}".format(fmt),
"--domain={}".format(domain),
]
else:
Expand Down
19 changes: 19 additions & 0 deletions signing/softhsm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,22 @@ softhsm2-util --init-token --label fake_keys --so-pin officer_pin --pin 123456 -
```

Where `softhsm-util` is one of the binaries emitted by the `@softhsm2//:softhsm2` target.

## Keys

The softhsm instance contains a few keys needed for testing. These were
imported with hsmtool.

```
export HSMTOOL_MODULE=bazel-out/k8-fastbuild/bin/external/softhsm2/softhsm2/lib/softhsm/libsofthsm2.so
export HSMTOOL_SPX_MODULE=pkcs11-ef
export SOFTHSM2_CONF=signing/softhsm/softhsm.conf

hsmtool -t fake_keys -u user -p 123456 \
ecdsa import --label fake_app_prod_ecdsa \
sw/device/silicon_creator/lib/ownership/keys/fake/app_prod_ecdsa_p256.der

hsmtool -t fake_keys -u user -p 123456 \
spx import --label fake_app_prod_spx \
sw/device/silicon_creator/lib/ownership/keys/fake/app_prod_spx.pem
```
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
10 changes: 10 additions & 0 deletions sw/device/silicon_creator/lib/ownership/keys/fake/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,16 @@ filegroup(
srcs = ["app_dev_ecdsa_p256.pub.der"],
)

filegroup(
name = "app_spx_prod",
srcs = ["app_prod_spx.pem"],
)

filegroup(
name = "app_spx_prod_pub",
srcs = ["app_prod_spx.pub.pem"],
)

key_ecdsa(
name = "app_prod_ecdsa",
method = "local",
Expand Down
7 changes: 3 additions & 4 deletions sw/host/hsmtool/src/commands/ecdsa/sign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct Sign {
label: Option<String>,
#[arg(short, long, default_value = "sha256-hash", help=SignData::HELP)]
format: SignData,
/// Reverse the input data and result (for little-endian targets).
/// Reverse the result (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
#[arg(short, long)]
Expand All @@ -51,9 +51,8 @@ impl Dispatch for Sign {
let object = helper::find_one_object(session, &attrs)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.prepare(KeyType::Ec, &data, self.little_endian)?;
let data = self.format.prepare(KeyType::Ec, &data)?;

let mechanism = self.format.mechanism(KeyType::Ec)?;
let mut result = session.sign(&mechanism, object, &data)?;
if self.little_endian {
Expand Down
6 changes: 2 additions & 4 deletions sw/host/hsmtool/src/commands/ecdsa/verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct Verify {
label: Option<String>,
#[arg(short, long, default_value = "sha256-hash", help=SignData::HELP)]
format: SignData,
/// Reverse the input data and result (for little-endian targets).
/// Reverse the result (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
/// The signature is at the given byte range of the input file.
Expand All @@ -51,9 +51,7 @@ impl Dispatch for Verify {
let object = helper::find_one_object(session, &attrs)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.prepare(KeyType::Ec, &data, self.little_endian)?;
let data = self.format.prepare(KeyType::Ec, &data)?;
let mechanism = self.format.mechanism(KeyType::Ec)?;
let mut signature = if let Some(filename) = &self.signature {
std::fs::read(filename)?
Expand Down
6 changes: 2 additions & 4 deletions sw/host/hsmtool/src/commands/rsa/sign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct Sign {
label: Option<String>,
#[arg(short, long, default_value = "sha256-hash", help=SignData::HELP)]
format: SignData,
/// Reverse the input data and result (for little-endian targets).
/// Reverse the result (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
#[arg(short, long)]
Expand All @@ -51,9 +51,7 @@ impl Dispatch for Sign {
let object = helper::find_one_object(session, &attrs)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.prepare(KeyType::Rsa, &data, self.little_endian)?;
let data = self.format.prepare(KeyType::Rsa, &data)?;
let mechanism = self.format.mechanism(KeyType::Rsa)?;
let mut result = session.sign(&mechanism, object, &data)?;
if self.little_endian {
Expand Down
6 changes: 2 additions & 4 deletions sw/host/hsmtool/src/commands/rsa/verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct Verify {
label: Option<String>,
#[arg(short, long, default_value = "sha256-hash", help=SignData::HELP)]
format: SignData,
/// Reverse the input data and result (for little-endian targets).
/// Reverse the result (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
/// The signature is at the given byte range of the input file.
Expand All @@ -51,9 +51,7 @@ impl Dispatch for Verify {
let object = helper::find_one_object(session, &attrs)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.prepare(KeyType::Rsa, &data, self.little_endian)?;
let data = self.format.prepare(KeyType::Rsa, &data)?;
let mechanism = self.format.mechanism(KeyType::Rsa)?;
let mut signature = if let Some(filename) = &self.signature {
std::fs::read(filename)?
Expand Down
7 changes: 1 addition & 6 deletions sw/host/hsmtool/src/commands/spx/sign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ pub struct Sign {
label: Option<String>,
#[arg(short, long, default_value = "plain-text", help=SignData::HELP)]
format: SignData,
/// Reverse the input data (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
/// The SPHINCS+ signing domain.
#[arg(short = 'd', long, default_value = "pure")]
domain: SpxDomain,
Expand All @@ -45,9 +42,7 @@ impl Dispatch for Sign {
let _token = hsm.token.as_deref().ok_or(HsmError::SessionRequired)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.spx_prepare(self.domain, &data, self.little_endian)?;
let data = self.format.spx_prepare(self.domain, &data)?;
let result = spx.sign(self.label.as_deref(), self.id.as_deref(), &data)?;
std::fs::write(&self.output, &result)?;
Ok(Box::<BasicResult>::default())
Expand Down
7 changes: 1 addition & 6 deletions sw/host/hsmtool/src/commands/spx/verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ pub struct Verify {
label: Option<String>,
#[arg(short, long, default_value = "plain-text", help=SignData::HELP)]
format: SignData,
/// Reverse the input data (for little-endian targets).
#[arg(short = 'r', long)]
little_endian: bool,
/// The SPHINCS+ signing domain.
#[arg(short = 'd', long, default_value = "pure")]
domain: SpxDomain,
Expand All @@ -44,9 +41,7 @@ impl Dispatch for Verify {
let _token = hsm.token.as_deref().ok_or(HsmError::SessionRequired)?;

let data = std::fs::read(&self.input)?;
let data = self
.format
.spx_prepare(self.domain, &data, self.little_endian)?;
let data = self.format.spx_prepare(self.domain, &data)?;
let signature = std::fs::read(&self.signature)?;
let result = spx.verify(self.label.as_deref(), self.id.as_deref(), &data, &signature)?;
Ok(Box::new(BasicResult {
Expand Down
Loading
Loading