Skip to content
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

WIP: tpm2: Add RuntimeAttribute fips-140-3 to restrict TPM 2 (StateFo… #469

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
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
35 changes: 35 additions & 0 deletions man/man3/TPMLIB_SetProfile.pod
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ now. RSA key OBJECTs may be 4 bytes bigger while others are smaller now.

This I<StateFormatLevel> enabled the I<fips-host> attribute.

=item 8: (since v0.10)

This I<StateFormatLevel> enabled the I<fips-140-3> attribute.

=back

A user may specify the I<StateFormatLevel> when using the I<custom> profile.
Expand Down Expand Up @@ -280,6 +284,33 @@ keys

=back

=item B<fips-140-3>

This verb enables the following:

=over 2

=item * Prohibits raw RSA encryption and decryption

=item * Forbids SHA1 signature generation

=item * Forbids RSA < 2048 signature generation

=item * Forbids RSA < 2048 key generation

=item * Prevents derivation of ECC keys from derivation parent and for creation
of ephemeral keys

=item * Performs a pairwise consistency test on RSA keys and ECC signing keys

=item * Enables continous DRBG test

=back

Note that usage of the I<fips-140-3> verb does not translate into a claim that
the TPM 2 instance is FIPS-140-3 compliant but merely restricts the usage of
crypto algorithms by the TPM 2 following the above list.

=back

=head1 FIPS mode on the host
Expand Down Expand Up @@ -315,6 +346,10 @@ A profile should contain the following verbs for minimum key sizes:

=back

=over 4

=back

=head1 ERRORS

=over 4
Expand Down
7 changes: 7 additions & 0 deletions src/tpm2/RuntimeAttributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ static const struct {
7),
ATTRIBUTE("no-ecc-key-derivation", RUNTIME_ATTRIBUTE_NO_ECC_KEY_DERIVATION,
7),
ATTRIBUTE("fips-140-3", RUNTIME_ATTRIBUTE_NO_UNPADDED_ENCRYPTION |
RUNTIME_ATTRIBUTE_NO_SHA1_SIGNING |
RUNTIME_ATTRIBUTE_NO_SHA1_VERIFICATION |
RUNTIME_ATTRIBUTE_DRBG_CONTINOUS_TEST |
RUNTIME_ATTRIBUTE_PAIRWISE_CONSISTENCY_TEST |
RUNTIME_ATTRIBUTE_NO_ECC_KEY_DERIVATION,
8),
};

LIB_EXPORT void
Expand Down
2 changes: 1 addition & 1 deletion src/tpm2/RuntimeAttributes_fp.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
#ifndef RUNTIME_ATTRIBUTES_H
#define RUNTIME_ATTRIBUTES_H

#define NUM_ENTRIES_ATTRIBUTE_PROPERTIES 10
#define NUM_ENTRIES_ATTRIBUTE_PROPERTIES 11

#define RUNTIME_ATTRIBUTE_NO_UNPADDED_ENCRYPTION (1 << 0)
#define RUNTIME_ATTRIBUTE_NO_SHA1_SIGNING (1 << 1)
Expand Down
6 changes: 3 additions & 3 deletions src/tpm2/RuntimeProfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ static const struct RuntimeProfileDesc {
* This basically locks the name of the profile to the stateFormatLevel.
*/
unsigned int stateFormatLevel;
#define STATE_FORMAT_LEVEL_CURRENT 7
#define STATE_FORMAT_LEVEL_CURRENT 8
#define STATE_FORMAT_LEVEL_UNKNOWN 0 /* JSON didn't provide StateFormatLevel; this is only
allowed for the 'default' profile or when user
passed JSON via SetProfile() */
Expand Down Expand Up @@ -958,8 +958,8 @@ RuntimeProfileGetSeedCompatLevel(void)
case 1: /* profile runs on v0.9 */
return SEED_COMPAT_LEVEL_RSA_PRIME_ADJUST_FIX;

case 2 ... 7: /* profile runs on v0.10 */ {
MUST_BE(STATE_FORMAT_LEVEL_CURRENT == 7); // force update when this changes
case 2 ... 8: /* profile runs on v0.10 */ {
MUST_BE(STATE_FORMAT_LEVEL_CURRENT == 8); // force update when this changes
return SEED_COMPAT_LEVEL_LAST;
}

Expand Down
2 changes: 1 addition & 1 deletion tests/tpm2_setprofile.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static const struct {
.exp_profile =
"{\"ActiveProfile\":{"
"\"Name\":\"default-v1\","
"\"StateFormatLevel\":7,"
"\"StateFormatLevel\":8,"
"\"Commands\":\"0x11f-0x122,0x124-0x12e,0x130-0x140,0x142-0x159,"
"0x15b-0x15e,0x160-0x165,0x167-0x174,0x176-0x178,"
"0x17a-0x193,0x197,0x199-0x19c\","
Expand Down