Snap for 8564071 from bb10d381ef0533f98ea197a6be57c19b2708eb60 to mainline-wifi-release
Change-Id: Ib07632283f3270560ba69e05c8e19dffbd2d32b1
diff --git a/Android.bp b/Android.bp
index b789f23..009de4c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -178,7 +178,7 @@
// Language and vendor related defaults
cc_defaults {
name: "nos_cc_defaults",
- clang: true,
+
cflags: [
"-pedantic",
"-Wall",
diff --git a/libnos_transport/transport.c b/libnos_transport/transport.c
index 85ba312..855b884 100644
--- a/libnos_transport/transport.c
+++ b/libnos_transport/transport.c
@@ -155,6 +155,10 @@
uint8_t data[STATUS_MAX_LENGTH];
} st;
int retries = CRC_RETRY_COUNT;
+
+ /* All unset fields will be 0. */
+ memset(out, 0, sizeof(*out));
+
while (retries--) {
/* Get the status from the device */
const uint32_t command = CMD_ID(ctx->app_id) | CMD_IS_READ | CMD_TRANSPORT;
@@ -163,9 +167,6 @@
return -1;
}
- /* All unset fields will be 0. */
- memset(out, 0, sizeof(*out));
-
/* Examine v0 fields */
out->status = le32toh(st.status.status);
out->reply_len = le16toh(st.status.reply_len);
@@ -295,7 +296,7 @@
/* Any further Writes needed to send all the args must set the MORE bit */
command |= CMD_MORE_TO_COME;
- args += ulen;
+ if (args) args += ulen;
arg_len -= ulen;
} while (arg_len);
diff --git a/nugget/include/app_nugget.h b/nugget/include/app_nugget.h
index 1ef9f31..f713299 100644
--- a/nugget/include/app_nugget.h
+++ b/nugget/include/app_nugget.h
@@ -414,6 +414,137 @@
* @errors APP_ERROR_BOGUS_ARGS
*/
+#define GSC_DEBUG_DUMP_VERSION 0
+struct gsc_debug_dump_msg {
+ uint8_t timestamp[6]; // Bottom 48 bits of system time; enough for 8 years @ 1 us
+ uint8_t channel; // log channel (task_id or system call)
+ uint8_t version; // gsc_debug_dump_msg struct version
+ uint32_t error_code; // error code
+ uint32_t reserved; // reserved for other useful log
+};
+
+#define DEBUG_MESSAGE_MAX_COUNT 64
+#define DEBUG_MESSAGE_BUFFER_SIZE (DEBUG_MESSAGE_MAX_COUNT * sizeof(struct gsc_debug_dump_msg))
+
+#define NUGGET_PARAM_DEBUG_DUMP 0x0016
+/*
+ * Get GSC debug message from 1KB ring buffer
+ *
+ * @param args <none>
+ * @param arg_len 0
+ * @param reply recent debug buffer output
+ * @param reply_len 1KB
+ */
+
+#define GSA_GSC_PAIRING_VERSION 0
+#define EC_P256_PUBLIC_KEY_SIZE 64
+#define EC_P256_PRIVATE_KEY_SIZE 32
+#define PSK_KEY_SIZE 32
+#define HAS_GSA_PUBKEY 0xa3
+struct gsa_gsc_pairing_persist_storage {
+ uint8_t version;
+ uint8_t has_gsa_public_key_provision;
+ uint8_t gsa_public_key[EC_P256_PUBLIC_KEY_SIZE];
+ uint8_t gsc_private_key[EC_P256_PRIVATE_KEY_SIZE];
+ uint8_t gsc_public_key[EC_P256_PUBLIC_KEY_SIZE];
+};
+
+#define GSA_GSC_PSK_VERSION 0
+#define HAS_GSA_GSC_PSK 0xa5
+struct gsa_gsc_psk_persist_storage {
+ uint8_t version;
+ uint8_t has_gsa_gsc_psk_provision;
+ uint8_t gsa_gsc_psk[PSK_KEY_SIZE];
+};
+
+#define NUGGET_PARAM_GSA_KEY_PROVISION 0x0017
+/*
+ * GSA key provision command
+ *
+ * @param args gsa unique public key
+ * @param arg_len 32
+ * @param reply gsc public key + sha256(pre-shared key)
+ * @param reply_len 64 + 32
+ */
+
+/**
+ * enum gsa_gsc_psk_state - GSA-GSC PSK state
+ * @GSA_GSC_PSK_STATE_UNKNOWN: Unknown state (initial state)
+ * @GSA_GSC_PSK_STATE_KEY_VERIFY_SUCCESS: GSA and GSC PSK match
+ * @GSA_GSC_PSK_STATE_KEY_MISMATCH: GSA and GSC PSK mismatch
+ * @GSA_GSC_PSK_STATE_GSA_INTERNAL_ERROR: GSA has internal error
+ * @GSA_GSC_PSK_STATE_GSA_HAS_NO_KEY: GSA has no PSK
+ * @GSA_GSC_PSK_STATE_GSA_CRYPTO_PRNG_FAIL: GSA crypto prng function fail
+ * @GSA_GSC_PSK_STATE_GSA_CRYPTO_HKDF_FAIL: GSA crypto HKDF function fail
+ * @GSA_GSC_PSK_STATE_GSA_CRYPTO_HMAC_FAIL: GSA crypto HMAC function fail
+ * @GSA_GSC_PSK_STATE_GSA_CRYPTO_DONE: GSA crypto operations complete
+ * @GSA_GSC_PSK_STATE_GSC_HAS_NO_KEY: GSC has no PSK
+ * @GSA_GSC_PSK_STATE_GSC_NOT_IN_BOOTLOADER: GSC is not in bootloader
+ * @GSA_GSC_PSK_STATE_GSC_INVALID_PARAMETER: GSC received invalid request data
+ * @GSA_GSC_PSK_STATE_GSC_INTERNAL_ERROR: GSC has internal error
+ * @GSA_GSC_PSK_STATE_GSC_CRYPTO_HKDF_FAIL: GSC crypto HKDF function fail
+ * @GSA_GSC_PSK_STATE_GSC_CRYPTO_HMAC_FAIL: GSC crypto HMAC function fail
+ * @GSA_GSC_PSK_STATE_GSC_EXCEED_MAX_RETRY_COUNT: exceed max psk verification retry count (100)
+ * @GSA_GSA_PSK_STATE_GSC_NOS_CALL_FAIL: GSC nos call fail
+ */
+enum gsa_gsc_psk_state {
+ GSA_GSC_PSK_STATE_UNKNOWN,
+ GSA_GSC_PSK_STATE_KEY_VERIFY_SUCCESS,
+ GSA_GSC_PSK_STATE_KEY_MISMATCH,
+ GSA_GSC_PSK_STATE_GSA_INTERNAL_ERROR,
+ GSA_GSC_PSK_STATE_GSA_HAS_NO_KEY,
+ GSA_GSC_PSK_STATE_GSA_CRYPTO_PRNG_FAIL,
+ GSA_GSC_PSK_STATE_GSA_CRYPTO_HKDF_FAIL,
+ GSA_GSC_PSK_STATE_GSA_CRYPTO_HMAC_FAIL,
+ GSA_GSC_PSK_STATE_GSA_CRYPTO_DONE,
+ GSA_GSC_PSK_STATE_GSC_HAS_NO_KEY,
+ GSA_GSC_PSK_STATE_GSC_NOT_IN_BOOTLOADER,
+ GSA_GSC_PSK_STATE_GSC_INVALID_PARAMETER,
+ GSA_GSC_PSK_STATE_GSC_INTERNAL_ERROR,
+ GSA_GSC_PSK_STATE_GSC_CRYPTO_HKDF_FAIL,
+ GSA_GSC_PSK_STATE_GSC_CRYPTO_HMAC_FAIL,
+ GSA_GSC_PSK_STATE_GSC_EXCEED_MAX_RETRY_COUNT,
+ GSA_GSA_PSK_STATE_GSC_NOS_CALL_FAIL,
+};
+
+#define VERIFY_PSK_REQ_HEADER_SIZE 17
+#define VERIFY_PSK_REQ_VERSION 0
+#define VERIFY_PSK_NONCE_SIZE 32
+#define VERIFY_PSK_HMAC_SIZE 32
+/**
+ * struct verify_psk_request - verify gsa-gsc pre-shared key request
+ * @version: struct verify_psk_request version
+ * @header: header of verify_psk_request
+ * @nonce: 12 bytes random number
+ * @gsa_psk_state: GSA pre-shared key state
+ * @hmac: hmac = HMAC-SHA256(key = derived-psk, data = version || header ||
+ * nonce || gsa_psk_state)
+ */
+struct verify_psk_request {
+ char header[VERIFY_PSK_REQ_HEADER_SIZE];
+ uint8_t version;
+ uint8_t nonce[VERIFY_PSK_NONCE_SIZE];
+ uint8_t gsa_psk_state;
+ uint8_t hmac[VERIFY_PSK_HMAC_SIZE];
+};
+
+#define VERIFY_SECURE_CHANNEL_RETRY_COUNT_VERSION 0
+struct secure_channel_retry_count_persist_storage {
+ uint8_t version;
+ uint8_t verify_psk_retry_count;
+ uint8_t reserved[2];
+};
+
+#define NUGGET_PARAM_VERIFY_GSA_GSC_PSK 0x0018
+/*
+ * Verify GSA GSC pre-shared key command
+ *
+ * @param args struct verify_psk_request
+ * @param arg_len 63 bytes
+ * @param reply psk verification result
+ * @param reply_len 1 bytes
+ */
+
/****************************************************************************/
/* Test related commands */
diff --git a/nugget/include/citadel_events.h b/nugget/include/citadel_events.h
index 3e3a33e..24babee 100644
--- a/nugget/include/citadel_events.h
+++ b/nugget/include/citadel_events.h
@@ -64,6 +64,7 @@
EVENT_REBOOTED = 2, // Device rebooted.
EVENT_UPGRADED = 3, // Device has upgraded.
EVENT_ALERT_V2 = 4, // Globalsec Alertv2 fired
+ EVENT_SEC_CH_STATE = 5, // Update GSA-GSC secure channel state.
};
/*
@@ -103,6 +104,9 @@
uint16_t temp_max;
uint32_t bus_err;
} alert_v2;
+ struct {
+ uint32_t state;
+ } sec_ch_state;
/* uninterpreted */
union {
diff --git a/nugget/proto/BUILD b/nugget/proto/BUILD
index 0b7219f..fc1df57 100644
--- a/nugget/proto/BUILD
+++ b/nugget/proto/BUILD
@@ -330,6 +330,7 @@
proto_library(
name = "nugget_app_avb_avb_proto",
+ visibility = ["//visibility:public"],
srcs = [
"nugget/app/avb/avb.proto",
],
@@ -341,6 +342,7 @@
proto_library(
name = "nugget_app_keymaster_keymaster_proto",
+ visibility = ["//visibility:public"],
srcs = [
"nugget/app/keymaster/keymaster.proto",
"nugget/app/keymaster/keymaster_defs.proto",
@@ -403,6 +405,7 @@
proto_library(
name = "nugget_app_weaver_weaver_proto",
+ visibility = ["//visibility:public"],
srcs = [
"nugget/app/weaver/weaver.proto",
],
@@ -414,6 +417,7 @@
proto_library(
name = "nugget_app_identity_identity_proto",
+ visibility = ["//visibility:public"],
srcs = [
"nugget/app/identity/identity.proto",
"nugget/app/identity/identity_defs.proto",
diff --git a/nugget/proto/nugget/app/avb/avb.proto b/nugget/proto/nugget/app/avb/avb.proto
index bc0c700..9aec71e 100644
--- a/nugget/proto/nugget/app/avb/avb.proto
+++ b/nugget/proto/nugget/app/avb/avb.proto
@@ -53,13 +53,16 @@
}
// GetState
-message GetStateRequest {}
+message GetStateRequest {
+ bool keysclear_reset = 1;
+}
message GetStateResponse {
uint64 version = 1;
bool bootloader = 2;
bool production = 3;
uint32 number_of_locks = 4;
bytes locks = 5;
+ bool keysclear_required = 6;
}
// Load
diff --git a/nugget/proto/nugget/app/identity/identity.proto b/nugget/proto/nugget/app/identity/identity.proto
index 10500cb..591a92a 100644
--- a/nugget/proto/nugget/app/identity/identity.proto
+++ b/nugget/proto/nugget/app/identity/identity.proto
@@ -56,6 +56,18 @@
rpc ICfinishRetrieval (ICfinishRetrievalRequest) returns (ICfinishRetrievalResponse);
rpc ICdeleteCredential (ICdeleteCredentialRequest) returns (ICdeleteCredentialResponse);
rpc ICproveOwnership (ICproveOwnershipRequest) returns (ICproveOwnershipResponse);
+ rpc GetSessionId (GetSessionIdRequest) returns (GetSessionIdResponse);
+ rpc SessionShutdown(SessionShutdownRequest) returns (SessionShutdownResponse);
+ rpc SessionInitialize (SessionInitializeRequest) returns (SessionInitializeResponse);
+ rpc SessionSetReaderEphemeralPublicKey (SessionSetReaderEphemeralPublicKeyRequest) returns (SessionSetReaderEphemeralPublicKeyResponse);
+ rpc SessionSetSessionTranscript (SessionSetSessionTranscriptRequest) returns (SessionSetSessionTranscriptResponse);
+}
+
+enum RequestType {
+ unknown = 0;
+ provision = 1;
+ presentation = 2;
+ session = 3;
}
// WICinitialize
@@ -92,6 +104,7 @@
bytes entryCounts = 2;
bytes docType = 3;
uint32 expectedProofOfProvisioningSize = 4;
+ bool supportInt32EntryCounts = 5;
}
message WICstartPersonalizationResponse{
Result result = 1;
@@ -150,6 +163,8 @@
bool testCredential = 1;
bytes docType = 2;
bytes encryptedCredentialKeys = 3;
+ uint32 oemHalVersion = 4;
+ uint32 sessionId = 5;
}
message ICinitializeResponse{
@@ -281,6 +296,7 @@
message ICstartRetrieveEntryValueResponse{
AccessResult accessCheckResult = 1;
+ uint32 sessionCookie = 2;
}
// ICretrieveEntryValue
@@ -289,6 +305,7 @@
string nameSpace = 2;
string name = 3;
bytes accessControlProfileIds = 4;
+ uint32 sessionCookie = 5;
}
message ICretrieveEntryValueResponse{
@@ -329,4 +346,51 @@
message ICproveOwnershipResponse{
Result result = 1;
bytes signatureOfToBeSigned = 2;
-}
\ No newline at end of file
+}
+
+// GetSessionId
+message GetSessionIdRequest{
+ RequestType requestType = 1;
+}
+
+message GetSessionIdResponse{
+ Result result = 1;
+ uint32 id = 2;
+}
+
+// SessionShutdown
+message SessionShutdownRequest{
+ RequestType requestType = 1;
+}
+
+message SessionShutdownResponse{
+ Result result = 1;
+}
+
+// SessionInitialize
+message SessionInitializeRequest{
+}
+
+message SessionInitializeResponse{
+ Result result = 1;
+ uint64 authChallenge = 2;
+ bytes ephemeralPrivateKey = 3;
+}
+
+// SessionSetReaderEphemeralPublicKey
+message SessionSetReaderEphemeralPublicKeyRequest{
+ bytes readerEphemeralPublicKey = 1;
+}
+
+message SessionSetReaderEphemeralPublicKeyResponse{
+ Result result = 1;
+}
+
+// SessionSetSessionTranscript
+message SessionSetSessionTranscriptRequest{
+ bytes sessionTranscript = 1;
+}
+
+message SessionSetSessionTranscriptResponse{
+ Result result = 1;
+}
diff --git a/nugget/proto/nugget/app/keymaster/keymaster.proto b/nugget/proto/nugget/app/keymaster/keymaster.proto
index e6fec75..67f464a 100644
--- a/nugget/proto/nugget/app/keymaster/keymaster.proto
+++ b/nugget/proto/nugget/app/keymaster/keymaster.proto
@@ -138,6 +138,17 @@
rpc VigoReleaseSecret(VigoReleaseSecretRequest)
returns (VigoReleaseSecretResponse);
+ /*
+ * pKVM implementation
+ */
+ rpc GetPerFactoryResetValue(GetPerFactoryResetValueRequest) returns (GetPerFactoryResetValueResponse);
+
+ /*
+ * RKP implementation
+ */
+ rpc GenerateRkpKey(GenerateRkpKeyRequest) returns (GenerateRkpKeyResponse);
+ rpc GenerateRkpCsr(GenerateRkpCsrRequest) returns (GenerateRkpCsrResponse);
+
// These are implemented with a enum, so new RPCs must be appended, and
// deprecated RPCs need placeholders.
}
@@ -546,6 +557,7 @@
bytes not_after = 6; // strftime('%y%m%d%H%M%SZ') [15 octects]
uint64 creation_time_ms = 7; // Rough current time (ms since epoch).
bool use_km_attest_key = 8;
+ bytes caller_issuer_subj_name = 9;
}
message IdentityStartAttestKeyResponse {
ErrorCode error_code = 1;
@@ -557,6 +569,7 @@
message IdentityFinishAttestKeyRequest {
OperationHandle handle = 1;
bool use_km_attest_key = 2;
+ KeyBlob caller_blob = 3;
}
message IdentityFinishAttestKeyResponse {
ErrorCode error_code = 1;
@@ -564,3 +577,37 @@
ChipFusing chip_fusing = 3;
bool nodelocked_ro = 4;
}
+
+// pKVM messages
+message GetPerFactoryResetValueRequest {
+ bool bootloader_only = 1;
+ bytes input = 2;
+}
+message GetPerFactoryResetValueResponse {
+ ErrorCode error_code = 1;
+ bytes output = 2;
+}
+
+// RKP messages
+message GenerateRkpKeyRequest{
+ bool test_mode = 1;
+ KeyParameters params = 2;
+ KeyBlob blob = 3;
+}
+message GenerateRkpKeyResponse{
+ ErrorCode error_code = 1;
+ bytes maced_public_key = 2;
+}
+
+message GenerateRkpCsrRequest{
+ bool test_mode = 1;
+ KeysToSign keys_to_sign = 2;
+ bytes endpoint_enc_cert_chain = 3;
+ bytes challenge = 4;
+}
+message GenerateRkpCsrResponse{
+ ErrorCode error_code = 1;
+ bytes keys_to_sign_mac = 2;
+ bytes device_info_blob = 3;
+ bytes protected_data_blob = 4;
+}
diff --git a/nugget/proto/nugget/app/keymaster/keymaster_defs.proto b/nugget/proto/nugget/app/keymaster/keymaster_defs.proto
index da597b1..66d1801 100644
--- a/nugget/proto/nugget/app/keymaster/keymaster_defs.proto
+++ b/nugget/proto/nugget/app/keymaster/keymaster_defs.proto
@@ -267,6 +267,10 @@
STORAGE_KEY_UNSUPPORTED = 81;
INCOMPATIBLE_MGF_DIGEST = 82;
UNSUPPORTED_MGF_DIGEST = 83;
+ INVALID_MAC = 84; // RKP specific.
+ PRODUCTION_KEY_IN_TEST_REQUEST = 85; // RKP specific.
+ TEST_KEY_IN_PRODUCTION_REQUEST = 86; // RKP specific.
+ INVALID_EEK = 87; // RKP specific.
};
enum SecurityLevel {
diff --git a/nugget/proto/nugget/app/keymaster/keymaster_types.options b/nugget/proto/nugget/app/keymaster/keymaster_types.options
index 02853bc..417e181 100644
--- a/nugget/proto/nugget/app/keymaster/keymaster_types.options
+++ b/nugget/proto/nugget/app/keymaster/keymaster_types.options
@@ -9,3 +9,4 @@
nugget.app.keymaster.VigoSecret.material max_size:32
nugget.app.keymaster.VigoSecret.iv max_size:16
nugget.app.keymaster.VigoSecret.tag max_size:16
+nugget.app.keymaster.KeysToSign.keys max_count:20
diff --git a/nugget/proto/nugget/app/keymaster/keymaster_types.proto b/nugget/proto/nugget/app/keymaster/keymaster_types.proto
index 4a66d4e..1a4c539 100644
--- a/nugget/proto/nugget/app/keymaster/keymaster_types.proto
+++ b/nugget/proto/nugget/app/keymaster/keymaster_types.proto
@@ -126,3 +126,11 @@
bytes iv = 2;
bytes tag = 3;
}
+
+message MacedKey{
+ bytes blob = 1;
+}
+
+message KeysToSign {
+ repeated MacedKey keys = 1;
+}