Dynamically Recreatable Key (DRKey) Infrastructure
This document describes the Dynamically Recreatable Key (DRKey) infrastructure.
Overview
The DRKey protocol enables routers and end hosts to derive cryptographic symmetric keys on the fly from a single local secret.
DRKey is used for the following systems:
SCION Packet Authenticator Option (SPAO)
COLIBRI
EPIC
In the DRKey system, the key establishment is offloaded to the Control Service (CS). Control services exchange top-level keys that will be used afterwards to derive lower level keys locally. The DRKey system leverages efficient key derivation and pseudorandom functions to derive keys in the hierarchy from top to bottom.
The first secret in the hierarchy (\(SV_A\)) is derived from a long-term master_secret
,
using a key derivation function.
For the rest of the derivations, DRKey utilizes pseudorandom functions, which are more efficient.
Informally, key derivation functions output a cryptographic key indistinguishable from
a random key if the secret is unknown for the attacker.
In contrast, the security of pseudorandom functions relies on the input being a uniformly
random secret.
Notation
Notation |
Description |
---|---|
\(KDF_{K}(X)\) |
key derivation function using key K and taking X as an input |
\(PRF_K (X)\) |
pseudorandom function using key K and taking X as an input |
\(A\) |
Autonomous system (identified by the pair ISD and AS number) |
\(H_A\) |
end host (identified by its address) |
\(CS_A\) |
Control service located in AS A |
\(SV_A\) |
AS A’s local secret value |
Derivation scheme
We define two types of derivation: the Protocol-specific derivation derivation and the Generic-protocol derivation. Both of them leverage the 4-level derivation scheme.
4-level derivation
Secret value (Level 0)
Each AS locally derives one \(SV_A^{protocol}\) per protocol and epoch. This secret value is renewed at every epoch and it is only shared with trustworthy entities that require to derive keys on the fly for the specified protocol.
AS-AS (Level 1)
The AS-AS
key is derived locally in the AS \(A\) CS (\(CS_A\)) and exchanged
with remote CS. More specifically \(CS_A\) shares \(K_{A,B}\) with
\(CS_B\).
host-AS (Level 2)
The host-AS
key is derived using the Level 1 symmetric key.
It is intended to be used as an intermediate derivation allowing the node holding this
key to derive Level 3 keys locally.
Therefore, the key \(K_{A:H_A,B}\) is only available to \(A:H_A\) and trusted
infrastructure.
AS-host (Level 2)
The AS-host
key is also derived using the Level 1 symmetric key,
however this key is intended to be used for communication.
In this case, the key \(K_{A,B:H_B}\) is shared between \(AS_A\) trusted nodes
and \(B:H_B\).
host-host (Level 3)
The host-host
key is derived in \(H_A\) and \(CS_B\) using the host-AS
key. This key
is available to both hosts \(H_A\) and \(H_B\).
Protocol-specific derivation
Identifier |
Derivation |
Name |
---|---|---|
\(SV_A^{protocol}\) |
\(KDF(input)\) |
Secret value (Level 0) |
\(K_{A,B}^{protocol}\) |
\(PRF_{SV_A^{protocol}}(type||B)\) |
AS-AS key (Level 1) |
\(K_{A,B:H_B}^{protocol}\) |
\(PRF_{K_{A,B}^{protocol}}(type||len/type(H_B)||H_B)\) |
AS-host key (Level 2) |
\(K_{A:H_A,B}^{protocol}\) |
\(PRF_{K_{A,B}^{protocol}}(type||len/type(H_A)||H_A)\) |
host-AS key (Level 2) |
\(K_{A:H_A,B:H_B}^{protocol}\) |
\(PRF_{K_{A:H_A,B}^{protocol}}(type||len/type(H_B)||H_B)\) |
host-host key (Level 3) |
The SV computation is local, thus the AS is free to compute it as desired as long as
it outputs a cryptographic key indistinguishable from a random key for an attacker.
We suggest to use the PBKDF2 as KDF function and set input
to:
input = "len(master_secret) || master_secret || protocol || epoch_begin || epoch_end"
.
The key notation states for which entity the key derivation must be efficient. The term in the left identifies the key issuer (the fast side in the derivation), whereas the right term identifies the key subject (the slow side in the derivation). For example, \(K_{A,B:H_B}\) can be used in both communication directions, but it is directly derivable by \(AS_A\), whereas the \(AS_B\) requires to contact \(CS_A\) to fetch the intermediate Level 1 key.
Generic-protocol derivation
Identifier |
Derivation |
Name |
---|---|---|
\(SV_A\) |
\(KDF(input)\) |
Secret value (Level 0) |
\(K_{A,B}\) |
\(PRF_{SV_A}(type||B)\) |
AS-AS key (Level 1) |
\(K_{A,B:H_B}^{protocol}\) |
\(PRF_{K_{A,B}}(type||protocol||len/type(H_B)||H_B)\) |
AS-host key (Level 2) |
\(K_{A:H_A,B}^{protocol}\) |
\(PRF_{K_{A,B}}(type||protocol||len/type(H_A)||H_A)\) |
host-AS key (Level 2) |
\(K_{A:H_A,B:H_B}^{protocol}\) |
\(PRF_{K_{A:H_A,B}^{protocol}}(type||len/type(H_B)||H_B)\) |
host-host key (Level 3) |
This derivation scheme allows applications to define “niche” protocols. By including the protocol in the Level 2 derivation input.
PRF derivation specification
- type
1 byte field identifying the derivation type (
AS-AS
,AS-host
,host-AS
andhost-host
). This enables domain separation among computed keys. For instance, it outputs (with high probability) \(K_{A:H_A,B} ≠ K_{A,B:H_B}\) when \(H_A==H_B\).- protocol
2 byte field used in the PRF derivation for Lvl2 generic-protocol derivations to identify the concrete protocol.
- ISD-AS address
This field is present in Lvl1 derivations and follows the format in SCION Address Header.
- host length/type
This field is present in Lvl2/3 derivations and follows the format for the DT/DL field in SCION Common Header.
- host address
This field is present in Lvl2/3 derivations and follows the format in SCION Address Header.
DRKey uses AES-CBC MAC as PRF. The MAC is computed over the following fields:
type (1 byte)
protocol in Lvl2 generic-protocol derivations (2 bytes)
ISD-AS address in Lvl1 derivations (8 bytes)
Host type/length in Lvl2/3 derivations (4-bit, padded to 1 byte)
Host address in Lvl2/3 derivations (variable size).
The derivation using CBC MAC is safe since all fields are of a fixed size, except for the host address whose length is prepended.
Key Validity time
Epochs
An epoch is an interval between a starting and ending point in time. The epoch length can be chosen by a given AS and can change over time, however, epochs must not overlap. Thus, a secret value is associated with exactly one epoch.
Every AS can define different epoch lengths for each protocol-specific 0th level key.
Defining a reasonable lower bound for the epoch length used in DRKey is necessary to avoid nonsensical scenarios. This value is globally set to 6 minutes.
The upper bound for the epoch length is defined to 3 days, looking for a trade-off between efficiency and security.
Note
These bounds might be changed in the future in case a more suitable values are found.
Grace period
We define a short overlapping period in which the protocol accepts packets with the key
for the previous epoch i-1 and also for the current one i. This period should be
ideally as short as possible, although long enough to allow using the same key for
single packet request/response use cases (e.g. a few seconds). Thus, we set
GRACE_PERIOD = 5 seconds
.
Prefetching period
ASes will be allowed to prefetch keys some time before the key for the current epoch expires. This period must be long enough to allow every remote AS to attempt the key prefetching enough times to be successful even in the presence of failures. However, this period should not be too long, since the issuer AS is not assumed to carry out any changes once it has issued keys for a given epoch (e.g. modifying SV epoch duration, rotating the master secret, etc.).
We suggest globally setting PREFETCHING_PERIOD = 30 minutes
.
Note
Whether ASes are allowed to request/serve keys for past epochs is up for discussion.
Key establishment
Level 1 key establishment
The Level 1 key establishment occurs between CSes located in different ASes. The subject-AS on the slow side (i.e. the AS requesting the key) will establish a TLS secure connection with the issuer-AS on the fast side (i.e. the AS serving the key). Both parties identify each other by using the CP-PKI infrastructure.
The Level 1 key request message contains the validTime
that specifies for what time the requested
key must be valid (it implicitly specifies the epoch for which the key will be valid)
and the protocol_id
.
The Level 1 key response includes the symmetric key along with the epoch
for which this key will be valid.
The protocol_id
is either set to GENERIC = 0
to request Lvl1 keys that will be derived according to
the generic-protocol
hierarchy or to the protocol number for the protocol-specific
derivation.
Level 0/2/3 key establishment
Even though Level 0/2/3 key exchange happens within the same AS (i.e. intra-AS communication), the protocol should establish a secure channel. This would avoid that hosts in the AS can eavesdrop on symmetric keys that are not intended for them.
The CS will only respond to the specific request if the requesting host is authorized to receive the requested key. This is especially important in the Level 0 key case since only trustworthy nodes should be authorized to receive this key.
The Level 0 key request contains the validTime
and the specific protocol_id
.
The CS responds with the SV and the epoch for which this key will be valid.
The Level 2/3 key request includes the validTime
and the necessary host and AS
information (depending on the key type).
The server responds with the symmetric key and the epoch.
The protocol_id
in Lvl2/3 requests is always set to the final protocol identifier.
The key service will choose between the protocol-specific
derivation, if it exists, or
the generic-protocol
derivation, otherwise.
Spreading Level 1 key requests
Shared symmetric keys are short-lived to avoid explicit key revocation. In order
to avoid peaks in the requests for Level 1 keys derived from a given SV, every requesting
CS (i.e. the CS on the slow side) SHOULD wait a random time before trying to prefetch
the Level 1 key. This time t
is u.r.d. in the interval [0, 15] minutes.
In this manner, the CS on the slow side SHOULD NOT request a Level 1 key before
epoch_end - (PREFETCHING_PERIOD - t)
instant in time (the PREFETCHING_PERIOD
is defined in Prefetching period).
DRKey Messages Format
The DRKey messages format is specified in terms of their protobuf definitions.
Protocol Enum
DRKeys are protocol-specific. The following enum defines the valid protocol IDs.
enum Protocol {
// Generic (unspecified protocol)
GENERIC = 0;
// SCION Control Message Protocol (SCMP)
SCMP = 1;
reserved 65536 to max; // only 16-bit values allowed
}
Control Plane Messages
Control plane messages are used to establish level 0 and level 1 keys. They are always between SCION control plane entities, e.g., between two CSes in two different ASes (level 1) or between an CS and a router within the same AS (level 0).
// SVRequest is used to request a secret value (level 0 key) for a given
// epoch and protocol. The secret value can then further be used to
// locally derive higher-level keys.
message SVRequest{
// Point in time when the requested key is valid.
Timestamp val_time = 1;
// Protocol value.
Protocol protocol_id = 2;
}
// SVResponse contains the secret value (level 0 key) and the epoch for which
// it is valid.
message SVResponse{
// Begin of the SV validity period.
Timestamp epoch_begin = 1;
// End of the SV validity period.
Timestamp epoch_end = 2;
// SV key.
bytes key = 3;
}
// Lvl1Request is used to request a level 1 key for a given epoch and protocol.
message Lvl1Request{
// Point in time when the requested key is valid.
Timestamp val_time = 1;
// Protocol value.
Protocol protocol_id = 2;
}
// Lvl1Response contains the level 1 key and the epoch for which it is valid.
message Lvl1Response{
// Begin of validity period.
Timestamp epoch_begin = 1;
// End of validity period.
Timestamp epoch_end = 2;
// Lvl1 key.
bytes key = 3;
}
Application Level Messages
Application level messages are used by SCION applications or SCION daemons to request and establish level 2 and level 3 keys from a CS in their AS. These messages constitute the API for applications to use DRKeys.
// HostASRequest is used to request a Host-AS (level 2) key for a given epoch and protocol.
message HostASRequest{
// Point in time where requested key is valid.
Timestamp val_time = 1;
// Protocol value.
Protocol protocol_id = 2;
// Src ISD-AS of the requested DRKey.
uint64 src_ia = 3;
// Dst ISD-AS of the requested DRKey.
uint64 dst_ia = 4;
// Src Host of the request DRKey.
string src_host = 5;
}
// HostASResponse contains the Host-AS (level 2) key and the epoch for which it is valid.
message HostASResponse{
// Begin of validity period of DRKey.
Timestamp epoch_begin = 1;
// End of validity period of DRKey.
Timestamp epoch_end = 2;
// Lvl2 key.
bytes key = 3;
}
// ASHostRequest is used to request an AS-Host (level 2) key for a given epoch and protocol.
message ASHostRequest{
// Point in time where requested key is valid.
Timestamp val_time = 1;
// Protocol value.
Protocol protocol_id = 2;
// Src ISD-AS of the requested DRKey.
uint64 src_ia = 3;
// Dst ISD-AS of the requested DRKey.
uint64 dst_ia = 4;
// Dst Host of the request DRKey.
string dst_host = 5;
}
// ASHostResponse contains the AS-Host (level 2) key and the epoch for which it is valid.
message ASHostResponse{
// Begin of validity period of DRKey.
Timestamp epoch_begin = 1;
// End of validity period of DRKey.
Timestamp epoch_end = 2;
// Lvl2 key.
bytes key = 3;
}
// HostHostRequest is used to request a Host-Host (level 3) key for a given epoch and protocol.
message HostHostRequest{
// Point in time where requested key is valid.
Timestamp val_time = 1;
// Protocol value.
Protocol protocol_id = 2;
// Src ISD-AS of the requested DRKey.
uint64 src_ia = 3;
// Dst ISD-AS of the requested DRKey.
uint64 dst_ia = 4;
// Src Host of the request DRKey.
string src_host = 5;
// Dst Host of the request DRKey.
string dst_host = 6;
}
// HostHostResponse contains the Host-Host (level 3) key and the epoch for which it is valid.
message HostHostResponse{
// Begin of validity period of DRKey.
Timestamp epoch_begin = 1;
// End of validity period of DRKey.
Timestamp epoch_end = 2;
// Lvl2 key.
bytes key = 3;
}
Assigned Protocol Identifiers
The following protocol identifiers are assigned:
Decimal |
Identifier |
Description |
Reference |
---|---|---|---|
0 |
Generic |
Identifier for Level 1 key in Generic-protocol derivation |
|
1 |
SCMP |
Authentication of SCMP messages |