This is a multi-part message in MIME format. ------From keyprov-bounces at ietf.org Mon Jul 14 04:56:03 2008 Return-Path: <keyprov-bounces at ietf.org> X-Original-To: keyprov-archive at optimus.ietf.org Delivered-To: ietfarch-keyprov-archive at core3.amsl.com Received: from [127.0.0.1] (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id 9DF623A683D; Mon, 14 Jul 2008 04:56:03 -0700 (PDT) X-Original-To: keyprov at core3.amsl.com Delivered-To: keyprov at core3.amsl.com Received: from localhost (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id B54473A683D for <keyprov at core3.amsl.com>; Mon, 14 Jul 2008 04:56:02 -0700 (PDT) X-Virus-Scanned: amavisd-new at amsl.com X-Spam-Flag: NO X-Spam-Score: 0.977 X-Spam-Level: X-Spam-Status: No, score=0.977 tagged_above=-999 required=5 tests=[AWL=0.225, BAYES_00=-2.599, HELO_EQ_FR=0.35, HTML_MESSAGE=0.001, J_CHICKENPOX_22=0.6, J_CHICKENPOX_23=0.6, J_CHICKENPOX_25=0.6, J_CHICKENPOX_26=0.6, J_CHICKENPOX_28=0.6] Received: from mail.ietf.org ([64.170.98.32]) by localhost (core3.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CRhF5+gFaMb5 for <keyprov at core3.amsl.com>; Mon, 14 Jul 2008 04:55:30 -0700 (PDT) Received: from frhub1.activcard.fr (frhub1.activcard.fr [91.151.120.133]) by core3.amsl.com (Postfix) with ESMTP id 047583A6808 for <keyprov at ietf.org>; Mon, 14 Jul 2008 04:55:28 -0700 (PDT) Received: from sur-corp-ex-02.corp.ad.activcard.com (sur-corp-ex-02.corp.ad.activcard.com [192.168.33.40]) by frhub1.activcard.fr (Postfix) with ESMTP id 6FF6825ED46; Mon, 14 Jul 2008 13:56:01 +0200 (CEST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Date: Mon, 14 Jul 2008 13:56:00 +0200 Message-ID: <5BFE9E473DBFC24CA87F18F29B3F0AC40203F17E at sur-corp-ex-02.corp.ad.activcard.com> In-Reply-To: <C888CF75146307419E47C46FA89C5A576DF962 at CORPUSMX10A.corp.emc.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [KEYPROV] [pskc] Latest draft of PSKC - no more name value pairs Thread-Index: Acihb52vIXPZfM+dQBGaWxrT4r5ocAAVy7xQAHs9/BAAB0GJoAAC0jWgARViyUAASBMeYAFfxKKAAAGFK/UAAAvvgANQaPGwAZRV6yADujT6IAG6oWTwATCmQMAA2/9+cAAaOCvwAARo/kAAAmN1MABi6N2wAMd0K8A= References: <9ED76AB595E4944BB33D8998DE448D110160C92D at CORPUSMX10B.corp.emc.com><5BFE9E473DBFC24CA87F18F29B3F0AC40203F0D3 at sur-corp-ex-02.corp.ad.activcard.com> <5BFE9E473DBFC24CA87F18F29B3F0AC40203F105 at sur-corp-ex-02.corp.ad.activcard.com> <5BFE9E473DBFC24CA87F18F29B3F0AC40203F12D at sur-corp-ex-02.corp.ad.activcard.com> <C888CF75146307419E47C46FA89C5A575BBBB3 at CORPUSMX10A.corp.emc.com> <5BFE9E473DBFC24CA87F18F29B3F0AC40203F154 at sur-corp-ex-02.corp.ad.activcard.com> <3E5A2F1AD44F5E49A74F79AB47C0C0C9DF4431 at mou1wnexmb10.vcorp.ad.vrsn.com> <5BFE9E473DBFC24CA87F18F29B3F0AC40203F157 at sur-corp-ex-02.corp.ad.activcard.com> <C888CF75146307419E47C46FA89C5A576DF962 at CORPUSMX10A.corp.emc.com> From: "Philip Hoyer" <philip.hoyer at actividentity.com> To: <robert.philpott at rsa.com>, <mpei at verisign.com>, <SMachani at diversinet.com>, <Hannes.Tschofenig at gmx.net>, <pbaker at verisign.com>, <andrea.doherty at rsa.com> Cc: keyprov at ietf.org Subject: Re: [KEYPROV] [pskc] Latest draft of PSKC - no more name value pairs X-BeenThere: keyprov at ietf.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: "Provisioning of Symmetric Keys \(keyprov\)" <keyprov.ietf.org> List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/keyprov>, <mailto:keyprov-request at ietf.org?subject=unsubscribe> List-Archive: <http://www.ietf.org/pipermail/keyprov> List-Post: <mailto:keyprov at ietf.org> List-Help: <mailto:keyprov-request at ietf.org?subject=help> List-Subscribe: <https://www.ietf.org/mailman/listinfo/keyprov>, <mailto:keyprov-request at ietf.org?subject=subscribe> Content-Type: multipart/mixed; boundary="===============0085122715==" Sender: keyprov-bounces at ietf.org Errors-To: keyprov-bounces at ietf.org This is a multi-part message in MIME format.Title: Re: [KEYPROV] [pskc] Latest draft of PSKC
|
Rob, Please see comments inline [PH2] Thanks again for all your help, From:
robert.philpott at rsa.com [mailto:robert.philpott at rsa.com] Hi folks, Sorry I didn’t
get this out last night. I’ve continued the dialog below (some content
was snipped to shorten the message)… Sorry for the length – I’m
trying to provide sufficient context around our use cases to justify the
suggestions. Cheers, Rob Philpott RSA,
the Security Division of EMC Philip From:
robert.philpott at rsa.com [mailto:robert.philpott at rsa.com] Hi folks, Sorry I didn’t
get this out last night. I’ve continued the dialog below (some content
was snipped to shorten the message)… Sorry for the length – I’m
trying to provide sufficient context around our use cases to justify the
suggestions. Cheers, Rob Philpott RSA,
the Security Division of EMC From: Philip Hoyer
[mailto:philip.hoyer at actividentity.com] Ming do you think we should add
‘class’ in DeviceInfo ? [RSP] I really would prefer not using the name
“class” for the element as that only solves half of our use
case. The purpose of the element we need is to have a single item in the
device description of the PSKC instance document that can be used to match
against a characteristic of the device to ensure that the keys are being loaded
on the correct device or class of device (sorry for the long sentence J). You suggested below that the combination of
<Manufacturer> and <SerialNo> should identify a specific device and
that adding a class element could then identify a class of device. First,
<Manufacture>+<SerialNo> are inadequate for our “specific
device” use case. There are numerous devices (e.g. many phones)
where we just cannot programmatically retrieve the device serial number.
For example, I have a Verizon WinMobile phone that has a unique serial number
printed on it. However, I cannot obtain that value from a WinMobile
app. From: Philip Hoyer
[mailto:philip.hoyer at actividentity.com] Ming do you think we should add
‘class’ in DeviceInfo ? [RSP] I really would prefer not using the name
“class” for the element as that only solves half of our use
case. The purpose of the element we need is to have a single item in the
device description of the PSKC instance document that can be used to match
against a characteristic of the device to ensure that the keys are being loaded
on the correct device or class of device (sorry for the long sentence J). You suggested below that the combination of
<Manufacturer> and <SerialNo> should identify a specific device and
that adding a class element could then identify a class of device. First,
<Manufacture>+<SerialNo> are inadequate for our “specific
device” use case. There are numerous devices (e.g. many phones)
where we just cannot programmatically retrieve the device serial number.
For example, I have a Verizon WinMobile phone that has a unique serial number
printed on it. However, I cannot obtain that value from a WinMobile
app. The use case I need to
satisfy is when an admin provisions a key to me but our policy mandates that
the key can only be loaded on my specific phone. I thus need my
application to verify that when I try to load the key into the device, that it
truly is the right device. Now if I gave the admin the serial number from
the phone, the app can’t verify it. But I might be able to obtain
the phone’s IMEI number or have the app show me some other unique
value. I could then provide this value when requesting my key and the
admin would put it in the <Device> instance document and my app could
verify it when loading the key. While it would be feasible to put this identifier in the
SerialNo element (even though it’s not the serial number), I still have
the “class” use case to deal with. If you provide a separate
<Class> element, we then will need yet another attribute or element to
indicate which of the 2 options should be enforced when loading a key since
both <Class> and the <Manufacture>+<SerialNo> combination could
appear in the document. For us, it can only be one of the choices but we
can’t make that an arbitrary choice; it has to be based on an enterprise
policy. This is a critical capability to us. Thus, we are requesting
a single element to identify the restriction information. Since we are
“binding” a key to either a device or to a device class with this
information, I previously suggested calling it either <BindingInfo> or
<DeviceRestriction>. Perhaps a better name would be simply
<DeviceBinding>. This would go into the <DeviceInfoType>
definition. The description for the spec would be as follows: ·
<DeviceBinding> (OPTIONAL), the
identifier that can be used to bind keys to the device or class of device. When
loading keys into a device, this identifier can be checked against information
obtained from the device to ensure that the correct device or class of device
is being used.
The use case I need to
satisfy is when an admin provisions a key to me but our policy mandates that
the key can only be loaded on my specific phone. I thus need my
application to verify that when I try to load the key into the device, that it
truly is the right device. Now if I gave the admin the serial number from
the phone, the app can’t verify it. But I might be able to obtain
the phone’s IMEI number or have the app show me some other unique
value. I could then provide this value when requesting my key and the
admin would put it in the <Device> instance document and my app could
verify it when loading the key. While it would be feasible to put this identifier in the
SerialNo element (even though it’s not the serial number), I still have
the “class” use case to deal with. If you provide a separate
<Class> element, we then will need yet another attribute or element to
indicate which of the 2 options should be enforced when loading a key since
both <Class> and the <Manufacture>+<SerialNo> combination could
appear in the document. For us, it can only be one of the choices but we
can’t make that an arbitrary choice; it has to be based on an enterprise
policy. This is a critical capability to us. Thus, we are requesting
a single element to identify the restriction information. Since we are
“binding” a key to either a device or to a device class with this
information, I previously suggested calling it either <BindingInfo> or
<DeviceRestriction>. Perhaps a better name would be simply
<DeviceBinding>. This would go into the <DeviceInfoType>
definition. The description for the spec would be as follows: ·
<DeviceBinding> (OPTIONAL), the
identifier that can be used to bind keys to the device or class of device. When
loading keys into a device, this identifier can be checked against information
obtained from the device to ensure that the correct device or class of device
is being used. See comment from Robert below in the
email. Philip [PH2] understood and added to submitted
spec [RSP] <snip> 3. Shouldn’t the “KeyId” attribute in the
KeyType type also be of type xs:ID? It is currently defined as xs:string?
If this was intentional, I am quite confused as to the reason for using
xs:string. a. Assuming KeyId should be of type xs:ID (and renamed to
simply “Id”), then the PINKeyId attribute in the PINPolicyType type
(pending #1 above) and the MasterKeyId attribute in KeyPropertiesType and
KeyType types would need to be of type xs:IDREF. These attributes are
described to be unique references to keys. [PH] No
it can’t be of type xs:ID becaue KeyId is actually what you refer further
down as the unique serial number of the keys. [RSP] I suspected that might
be the case. However, based on my experience with a number of other
XML-based protocols, I strongly recommend separating the mechanism l> See comment from Robert below in the
email. Philip [PH2] understood and added to submitted
spec [RSP] <snip> 3. Shouldn’t the “KeyId” attribute in the
KeyType type also be of type xs:ID? It is currently defined as xs:string?
If this was intentional, I am quite confused as to the reason for using
xs:string. a. Assuming KeyId should be of type xs:ID (and renamed to
simply “Id”), then the PINKeyId attribute in the PINPolicyType type
(pending #1 above) and the MasterKeyId attribute in KeyPropertiesType and
KeyType types would need to be of type xs:IDREF. These attributes are
described to be unique references to keys. [PH] No
it can’t be of type xs:ID becaue KeyId is actually what you refer further
down as the unique serial number of the keys. [RSP] I suspected that might
be the case. However, based on my experience with a number of other
XML-based protocols, I strongly recommend separating the mechanism of ideof identifying
a blob of XML in an instance document (for which xs:ID and xs:IDREF are very
useful) from the serial numbers that tie the blob to information managed by
external systems. That is, it is generally not a good idea to overload an
attribute to serve double-duty. IMO that’s just a cleaner content model.
The ID/IDREF attributes provide formal semantics for defining/referring
to the XML blobs. A “serial number” string does not. Also, it seems
to me that the serial number of a key is no different from a serial number of a
device in that it’s info about the key itself, not the XML blob
representing the key. Yet you didn’t use the ID attribute of the device
as the serial number of the device. Thus the current approach is internally
inconsistent. So, I still recommend: ·
In <KeyType>, change <xs:attribute name="KeyId"
type="xs:string" use="required"/> to <xs:attribute
name="ID" type="xs:ID" use="required"/> ·
Since <PINKeyId> refers to a specific
<Key> in the instance document, in <PINPolicyType>, change <xs:attribute name="PINKeyId"
type="xs:string" use="optional"/> to <xs:attribute
name="PINKey" type="xs:IDREF" use="optional"/> For <MasterKeyId>, I am assuming that the master key will also always be present in the instance document (it’s not clear in the spec). If it is always present, then in <KeyPropertiesType> and <KeyType>, change <xs:element name="MasterKeyId" type="xs:string" minOccurs=”0"/> to ·
In <KeyType>, change <xs:attribute name="KeyId"
type="xs:string" use="required"/> to <xs:attribute
name="ID" type="xs:ID" use="required"/> ·
Since <PINKeyId> refers to a specific
<Key> in the instance document, in <PINPolicyType>, change <xs:attribute name="PINKeyId"
type="xs:string" use="optional"/> to <xs:attribute
name="PINKey" type="xs:IDREF" use="optional"/> For <MasterKeyId>, I am assuming that the master key
will also always be present in the instance document (it’s not clear in
the spec). If it is always present, then in <KeyPropertiesType> and
<KeyType>, change <xs:element
name="MasterKeyId" type="xs:string" minOccurs=”0"/>
to <xs:element
name="MasterKeyId" type="xs:IDREF" minOccurs=”0"/>. If, however, the key being
referred to is possibly external to the instance document, then this element
should be left alone, but the description should state that the value refers to
an externally-defined key with a <SerialNo> that matches the value. Finally, in <KeyType> add <xs:element name=”SerialNo” type=”xs:string
minOccurs=”0”> I think it should be an optional element (since we would now
have the xs:ID that can be used to refer to it), although I could be convinced
it should be mandatory. The description would be: ·
<SerialNo> (OPTIONAL), a unique
and global identifier of the symmetric key. The identifier is defined as
a string of alphanumeric characters. [PH2] I
understand that there is obviously a confusion here about semantics and
especially with the referral of PIN Key there is a double use of an external
unique identifier (BTW some people do not agree with the term KeySerialNumber
because it somehow makes people think of a series or continuous number whereas
unique keyId could be random. I left this for now since there is alignment with
DSKPP and alos too kuch work but this is an issue that should be discussed at
IETF before we finalise the spec. The MasterKeyId is external to the document
hence left alone. I added some more I added some text that hoipefully should
make it clear that these are external identifiers. [RSP] <snip><xs:element
name="MasterKeyId" type="xs:IDREF" minOccurs=”0"/>. If, however, the key being
referred to is possibly external to the instance document, then this element
should be left alone, but the description should state that the value refers to
an externally-defined key with a <SerialNo> that matches the value. Finally, in <KeyType> add <xs:element name=”SerialNo” type=”xs:string
minOccurs=”0”> I think it should be an optional element (since we would now
have the xs:ID that can be used to refer to it), although I could be convinced
it should be mandatory. The description would be: ·
<SerialNo> (OPTIONAL), a unique
and global identifier of the symmetric key. The identifier is defined as
a string of alphanumeric characters. [PH2] I
understand that there is obviously a confusion here about semantics and
especially with the referral of PIN Key there is a double use of an external
unique identifier (BTW some people do not agree with the term KeySerialNumber
because it somehow makes people think of a series or continuous number whereas
unique keyId could be random. I left this for now since there is alignment with
DSKPP and alos too kuch work but this is an issue that should be discussed at
IETF before we finalise the spec. The MasterKeyId is external to the document
hence left alone. I added some more I added some text that hoipefully should
make it clear that these are external identifiers. [RSP] <snip>Calibri> 5. I personally think the ability to override settings in
the <KeyProperties> element with specific values defined in the
<Key> element might be overkill and could create more opportunities for
implementation bugs. My first preference would be to just define
standalone <KeyProperties> elements and ONLY allow references from the
<Key> elements via the IDREF mechanism. My second preference is to
simply have the <Key> element directly embed a <KeyProperties>
element that is of type KeyPropertiesType and eliminate the use of the IDREF.
I can live with it as is, but do think it over-complicates processing. [PH] the
main use for Keyproperties is for bulk provisioning where many keys share same
properties. Hence the model of being able to not have to repeat the common
properties in the same instance. The override is something that I believe makes
sense in this scenario. Assume you are carrying thousands of keys that share
the same properties but a few have different values so you allow an instance to
set a specific value for something that is already contained in the shared
properties. I share your concern for the support of keyproperties all together.
I believe that many implementations will not implement support for
keyproperties at all. I am less concerned about the override. [RSP] You convinced me; As I
said, I can live with the override mechanism and also realized we have a use
case that it can solve. 6. In the DeviceInfoType, I believe that the
<SerialNo> element should be optional. I know of devices where you
cannot discover the actual serial number of the specific device (e.g. it is
embedded in a larger platform). But I still might desire to include some of the
other device info in the declaration. To do this, I’d have to
include a dummy value for <SerialNo>, which IMO is a bad idea. 5. I personally think the ability to override settings in
the <KeyProperties> element with specific values defined in the
<Key> element might be overkill and could create more opportunities for
implementation bugs. My first preference would be to just define
standalone <KeyProperties> elements and ONLY allow references from the
<Key> elements via the IDREF mechanism. My second preference is to
simply have the <Key> element directly embed a <KeyProperties>
element that is of type KeyPropertiesType and eliminate the use of the IDREF.
I can live with it as is, but do think it over-complicates processing. [PH] the
main use for Keyproperties is for bulk provisioning where many keys share same
properties. Hence the model of being able to not have to repeat the common
properties in the same instance. The override is something that I believe makes
sense in this scenario. Assume you are carrying thousands of keys that share
the same properties but a few have different values so you allow an instance to
set a specific value for something that is already contained in the shared
properties. I share your concern for the support of keyproperties all together.
I believe that many implementations will not implement support for
keyproperties at all. I am less concerned about the override. [RSP] You convinced me; As I
said, I can live with the override mechanism and also realized we have a use
case that it can solve. 6. In the DeviceInfoType, I believe that the
<SerialNo> element should be optional. I know of devices where you
cannot discover the actual serial number of the specific device (e.g. it is
embedded in a larger platform). But I still might desire to include some of the
other device info in the declaration. To do this, I’d have to
include a dummy value for <SerialNo>, which IMO is a bad idea. [PH]
after long discussions we narrowed down a universal (multiple manufacturers)
way to uniquely identify the device to the combination of Manufacturer +
SerialNo. This is the same as in the certificate world the use of IssuerDN and
serial number uniquely identifies a certificate. To enforce this combined key
Manufacturer and SerialNo are Mandatory. If you do not have a
‘device’ per se now that I clarified the KeyId is the SerialNo of
the key you can use the same value for the SerialNo of a virtual device. [RSP] I’m not sure I
understand. In our use case, we have a real, physical device (not a virtual
one), but my physical device cannot provide me (programmatically) with the
device serial number. And my physical device can hold multiple keys.
So I can’t use the KeyId of one of the keys as the serial number of the
device… unless you are suggesting that I create a virtual device for
every key that I want to load into my physical device. This just doesn’t
make sense to me. In order to put the
<SerialNo> info into the instance document, the value has to get entered
into the provisioning system that creates the document. As I said, we have run
into quite a few devices where we can’t obtain the device serial number
at all or can only obtain it programmatically with elevated user privs.
Examples include my WinMobile phone, the TPM device on my laptop, and many
secure USB flash drives. If I can’t find/display the serial number,
it can’t be transferred into the provisioning system to be associated
with the <Device> element that holds my keys. Thus, I still believe
<SerialNo> should be an optional element. If you adopt our request to
include an element in <DeviceInfo> called <DeviceBinding> (as
described above), then I can live with having a required serial number element
here. In cases where we don’t know the serial number, we’ll
just throw in a dummy value. [RSP] <snip> [PH]
after long discussions we narrowed down a universal (multiple manufacturers)
way to uniquely identify the device to the combination of Manufacturer +
SerialNo. This is the same as in the certificate world the use of IssuerDN and
serial number uniquely identifies a certificate. To enforce this combined key
Manufacturer and SerialNo are Mandatory. If you do not have a
‘device’ per se now that I clarified the KeyId is the SerialNo of
the key you can use the same value for the SerialNo of a virtual device. [RSP] I’m not sure I
understand. In our use case, we have a real, physical device (not a virtual
one), but my physical device cannot provide me (programmatically) with the
device serial number. And my physical device can hold multiple keys.
So I can’t use the KeyId of one of the keys as the serial number of the
device… unless you are suggesting that I create a virtual device for
every key that I want to load into my physical device. This just doesn’t
make sense to me. In order to put the
<SerialNo> info into the instance document, the value has to get entered
into the provisioning system that creates the document. As I said, we have run
into quite a few devices where we can’t obtain the device serial number
at all or can only obtain it programmatically with elevated user privs.
Examples include my WinMobile phone, the TPM device on my laptop, and many
secure USB flash drives. If I can’t find/display the serial number,
it can’t be transferred into the provisioning system to be associated
with the <Device> element that holds my keys. Thus, I still believe
<SerialNo> should be an optional element. If you adopt our request to
include an element in <DeviceInfo> called <DeviceBinding> (as
described above), then I can live with having a required serial number element
here. In cases where we don’t know the serial number, we’ll
just throw in a dummy value. [RSP] <snip> 8. I’m not sure I understand why the <UserId>
element is part of the DeviceType type definition. In our environment, a key is
typically aligned with a single user ID. Consider a scenario where a <KeyContainer>
holds the keys I will use across multiple applications where I have been
assigned different user ID’s. If I use a single device to hold all
of my keys, I can’t do this. I thus would prefer to see the
<UserId> element become part of the KeyPropertiesType type. I don’t
think I understand the use case for having it be part of the device definition. [PH] The
userId represents the information of the binding of a physical device to a
user. The userId here is more to do with the concept of a global UserId rather
than the username for a specific application. I understand your use case but
was wondering if this is not slightly out of scope of PSKC. The concept of
UserId to application Username mapping is covered more in something like SPML.
I think the concept of which key/device can be used for which application is
something that we should leave for this version of the spec. [RSP] Hmmm… I don’t
think this is quite right. We don’t typically think of binding a device
to a single “UserId”; We bind a device to a “user” (it’s
owner) or even multiple users (e.g. a multi-user workstation on a shop floor).
A “UserId” typically binds a “user” to a specific
account in an authentication system/application. Consider a user that has
multiple accounts on multiple systems in an enterprise and they want to use the
same device to hold all of the keys for those accounts. They may of
course have different UserId’s for each of those accounts/keys. The
enterprise provisioning system could certainly use SPML to provision the user’s
accounts (i.e. UserId’s) and keys into the multiple systems/applications.
SPML is intended for provisioning this info into those systems. But to
provision the user’s keys into the device, they will use PSKC.
Under the current PSKC, the provisioning system won’t know which UserId
to use when creating the PSKC instance document for the <Device>. Next,raph style='margin-left:0pt'> 8. I’m not sure I understand why the <UserId>
element is part of the DeviceType type definition. In our environment, a key is
typically aligned with a single user ID. Consider a scenario where a <KeyContainer>
holds the keys I will use across multiple applications where I have been
assigned different user ID’s. If I use a single device to hold all
of my keys, I can’t do this. I thus would prefer to see the
<UserId> element become part of the KeyPropertiesType type. I don’t
think I understand the use case for having it be part of the device definition. [PH] The
userId represents the information of the binding of a physical device to a
user. The userId here is more to do with the concept of a global UserId rather
than the username for a specific application. I understand your use case but
was wondering if this is not slightly out of scope of PSKC. The concept of
UserId to application Username mapping is covered more in something like SPML.
I think the concept of which key/device can be used for which application is
something that we should leave for this version of the spec. [RSP] Hmmm… I don’t
think this is quite right. We don’t typically think of binding a device
to a single “UserId”; We bind a device to a “user” (it’s
owner) or even multiple users (e.g. a multi-user workstation on a shop floor).
A “UserId” typically binds a “user” to a specific
account in an authentication system/application. Consider a user that has
multiple accounts on multiple systems in an enterprise and they want to use the
same device to hold all of the keys for those accounts. They may of
course have different UserId’s for each of those accounts/keys. The
enterprise provisioning system could certainly use SPML to provision the user’s
accounts (i.e. UserId’s) and keys into the multiple systems/applications.
SPML is intended for provisioning this info into those systems. But to
provision the user’s keys into the device, they will use PSKC.
Under the current PSKC, the provisioning system won’t know which UserId
to use when creating the PSKC instance document for the <Device>. Next, when th when the user wants to
access one of the enterprise systems, they will access their device and need to
choose one of the keys. In our experience, this is best facilitated by
associating a “friendly name” with each key so they can readily
pick the one they need. Once they choose a key, the <UserId> associated
with the key can then be provided to the system as part of the authentication.
So, I’m not talking about bringing application-style provisioning into
PSKC. I’m simply associating the user id to which the key pertains
with the <Key> element. A single <Key> with a <UserId>
and credential might be used across many applications. But if I have
different sets of keys, I want to know what the user id is that it relates to. So, my suggestion is to allow
BOTH associating an optional user name (e.g. <User>, not <UserId>)
to a device AND associating an optional <UserId> for each key: In <DeviceType>,
change: <xs:element name="UserId"
type="xs:string" minOccurs="0"/> To
<xs:element name="User" type="xs:string"
minOccurs="0"/> The description should be
shortened to: ·
<User> (OPTIONAL), identifies the
owner or the user of the device. So, my suggestion is to allow
BOTH associating an optional user name (e.g. <User>, not <UserId>)
to a device AND associating an optional <UserId> for each key: In <DeviceType>,
change: <xs:element name="UserId"
type="xs:string" minOccurs="0"/> To
<xs:element name="User" type="xs:string"
minOccurs="0"/> The description should be
shortened to: ·
<User> (OPTIONAL), identifies the
owner or the user of the device. In <KeyType>, add: <xs:element name="UserId"
type="xs:string" minOccurs="0"/> with a description of: ·
<UserId> (OPTIONAL), identifies the
user account (e.g. username or user id) to which the key is assigned. The
value MAY be a string representation of a Distinguished Name as defined in
[RFC4514]. For example “UID=jsmith,DC=example,DC=net”.
In systems where unique user Ids are used the string representation 'UID=[uniqueId]'
SHOULD be used. Note that IMO, the use of “UID=[uniqueId]”
should not be mandated (i.e. MUST). It’s use might help
interoperability, but if the (potentially constrained) client devices just need
the user id value, we’d be forcing them to parse the value to pull out
the ID and I just don’t think that should be mandated. Also
please consider the concept where keys can be tied to more than one user (role
certs or attribute certs are examples) one could eve envisage having the same
OTP key for multiple users in an environment where the OTP key protects access
to a shared collaboration space (although if provisioning of an =nt size=2 color="#1f497d" face=Calibri>I see no reason to place format constraints on this value as
is currently described using RFC4514. In <KeyType>, add: <xs:element name="UserId"
type="xs:string" minOccurs="0"/> with a description of: ·
<UserId> (OPTIONAL), identifies the
user account (e.g. username or user id) to which the key is assigned. The
value MAY be a string representation of a Distinguished Name as defined in
[RFC4514]. For example “UID=jsmith,DC=example,DC=net”.
In systems where unique user Ids are used the string representation 'UID=[uniqueId]'
SHOULD be used. Note that IMO, the use of “UID=[uniqueId]”
should not be mandated (i.e. MUST). It’s use might help
interoperability, but if the (potentially constrained) client devices just need
the user id value, we’d be forcing them to parse the value to pull out
the ID and I just don’t think that should be mandated. Also
please consider the concept where keys can be tied to more than one user (role
certs or attribute certs are examples) one could eve envisage having the same
OTP key for multiple users in an environment where the OTP key protects access
to a shared collaboration space (although if provisioning of an individ
individual key
is relatively cheap the it makes no sense to share an single access key). Absolutely. But the
alternative I suggest supports this as well in addition to supporting the use
case I described. [PH2]
agree with proposed changes but I am maintaining the format recommendation for
User for interoperability (I changed the MUST to SHOULD though) [RSP] <snip> *** RE: 3. Add additional elements under KeyData based on input from Rob
Philpot The additions below
are not just in KeyData: 1. I mentioned this in my previous comments, but I still
don’t understand why the spec-defined elements currently listed under the
<Data> element need to be nested under <Data>. They are
well-known properties of the <Key> so why not just list them as
<Key> child elements? For example, I don’t consider
<TimeInterval> to be any different than <ExpiryDate> or
<FriendlyName> w.r.t. the keys properties, so why is one nested under
<Data> and the others are not. IMO, <Data>, if it is needed
at all, should just be for extensions. Note that my preferenual key
is relatively cheap the it makes no sense to share an single access key). Absolutely. But the
alternative I suggest supports this as well in addition to supporting the use
case I described. [PH2]
agree with proposed changes but I am maintaining the format recommendation for
User for interoperability (I changed the MUST to SHOULD though) [RSP] <snip> *** RE: 3. Add additional elements under KeyData based on input from Rob
Philpot The additions below
are not just in KeyData: 1. I mentioned this in my previous comments, but I still
don’t understand why the spec-defined elements currently listed under the
<Data> element need to be nested under <Data>. They are
well-known properties of the <Key> so why not just list them as
<Key> child elements? For example, I don’t consider
<TimeInterval> to be any different than <ExpiryDate> or
<FriendlyName> w.r.t. the keys properties, so why is one nested under
<Data> and the others are not. IMO, <Data>, if it is needed
at all, should just be for extensions. Note that my preference wouce would be
to not use “Data” at all and just use the <Extensions>
mechanism I describe below. [PH] I
tried to explain that everything under Data has a common structure (e.g,
PLainValue and EncryptedValue) and that only those under <Data> can be
encrypted. This makes parsing in constraint environment easier, for example ona
smarft card applet where full XML parsers are not available) (e.g. string
search until one finds <Data> and then proceed). [RSP] I understand that point,
but I strongly believe that this approach makes processing more difficult,
especially for constrained environments. IMO there is an alternative that is
better for both constrained and unconstrained environments. For example, in our
environment, we would never encrypt a <TimeInterval>, so our
<TimeInterval> would just be a value in a <PlainValue> element.
But in the current scheme, you say we would search for <Data> and proceed
from there. That means then searching for <TimeInterval>,
then parsing for <PlainValue>, then getting the xs:int value. Yes, I
could perhaps skip the search for <Data> and look directly for
<TimeInterval>, but the other parsing is still required. I contend that if
<TimeInterval> was defined outside of <Data> with a type=”xs:int”,
then I could simply search for <TimeInterval> and then grab the xs:int
value. This is much simpler in a constrained environment. And in
environments where I do have an XML parser, this structure is even easier to
deal with. Also, at least in our use
cases, we would never need to encrypt <Time>, <Counter> or
<TimeDrift>, so the same argument applies to these as well. [PH] I
tried to explain that everything under Data has a common structure (e.g,
PLainValue and EncryptedValue) and that only those under <Data> can be
encrypted. This makes parsing in constraint environment easier, for example ona
smarft card applet where full XML parsers are not available) (e.g. string
search until one finds <Data> and then proceed). [RSP] I understand that point,
but I strongly believe that this approach makes processing more difficult,
especially for constrained environments. IMO there is an alternative that is
better for both constrained and unconstrained environments. For example, in our
environment, we would never encrypt a <TimeInterval>, so our
<TimeInterval> would just be a value in a <PlainValue> element.
But in the current scheme, you say we would search for <Data> and proceed
from there. That means then searching for <TimeInterval>,
then parsing for <PlainValue>, then getting the xs:int value. Yes, I
could perhaps skip the search for <Data> and look directly for
<TimeInterval>, but the other parsing is still required. I contend that if
<TimeInterval> was defined outside of <Data> with a type=”xs:int”,
then I could simply search for <TimeInterval> and then grab the xs:int
value. This is much simpler in a constrained environment. And in
environments where I do have an XML parser, this structure is even easier to
deal with. Also, at least in our use
cases, we would never need to encrypt <Time>, <Counter> or
<TimeDrift>, so the same argument applies to these as well. The alternative mechanism we’ve
used in other standards for dealing with the encrypted/plainvalue question is,
for each item that might need to get encrypted, we define the plain value
element and encrypted value element using different element names and types.
For Secret, we would thus define: <xs:element
name="Secret" type="xs:base64Binary"
minOccurs="0"/> <xs:element
name="EncryptedSecret" type="xenc:EncryptedDataType"
minOccurs="0"/> If for some reason, you
wanted Counter to have an encrypted alternative, we would have: <xs:element
name="Counter " type="xs:int " minOccurs="0"/> <xs:element
name="EncryptedCounter" type="xenc:EncryptedDataType"
minOccurs="0"/> Whether you want to encrypt
these items or not, we get to avoid the extra parsing overhead. I don’t
have to look for the <Data> element and then I don’t have to see if
the child element is a PlainValue or an EncryptedValue. For those things
I’d never encrypt, I just search for the tag and get the value. The
ONLY thing that is lost in this approach is enforcement of the “xs:choice”
in the schema. But since no one will be doing sily:Calibri;
color:#1F497D;font-weight:bold;font-style:italic'> The alternative mechanism we’ve
used in other standards for dealing with the encrypted/plainvalue question is,
for each item that might need to get encrypted, we define the plain value
element and encrypted value element using different element names and types.
For Secret, we would thus define: <xs:element
name="Secret" type="xs:base64Binary"
minOccurs="0"/> <xs:element
name="EncryptedSecret" type="xenc:EncryptedDataType"
minOccurs="0"/> If for some reason, you
wanted Counter to have an encrypted alternative, we would have: <xs:element
name="Counter " type="xs:int " minOccurs="0"/> <xs:element
name="EncryptedCounter" type="xenc:EncryptedDataType"
minOccurs="0"/> Whether you want to encrypt
these items or not, we get to avoid the extra parsing overhead. I don’t
have to look for the <Data> element and then I don’t have to see if
the child element is a PlainValue or an EncryptedValue. For those things
I’d never encrypt, I just search for the tag and get the value. The
ONLY thing that is lost in this approach is enforcement of the “xs:choice”
in the schema. But since no one will be doing schema chema validation/enforcement for
this stuff anyway (especially in constrained environments), that’s of no
value and is far outweighed by the simpler processing. I also point out that now
that we’ve adopted the <ExtensionsType> mechanism, it becomes VERY
easy to use that to define custom items without the special PSKC-defined data
types. The items just get added into the <Extensions> element of the
<Key> element. [PH2] we debated tis and we came up with the current
proposal, I have to say I can see pros and cons for both approaches. I did not
change this for current submittal as it is a major change. If you think we
should discuss this at IETF let me know I out it on the agenda. BTW, we’d also like to
raise a concern about defining <Time> as an xs:int (via intDataType).
IMO, <Time> should be defined as an xs:dateTime, which we’ve
recently agreed would uniformly express time as UTC in Z form. Using an
int for time is very problematic for computational reasons. The spec
leaves the interpretation of this value undefined. It just seems dangerous to
leave this so ambiguously defined. If expressed as a UTC time value using
xs:dateTime, then it’s pretty easy to do the right thing and timezones,
etc don’t get in the way. Protocols really shouldn’t leave
such things to chance since it definitely inhibits interoperability. <Time> also seems to
have an overloaded use if the <TimeInterval> value is also provided.
In thivalidation/enforcement for
this stuff anyway (especially in constrained environments), that’s of no
value and is far outweighed by the simpler processing. I also point out that now
that we’ve adopted the <ExtensionsType> mechanism, it becomes VERY
easy to use that to define custom items without the special PSKC-defined data
types. The items just get added into the <Extensions> element of the
<Key> element. [PH2] we debated tis and we came up with the current
proposal, I have to say I can see pros and cons for both approaches. I did not
change this for current submittal as it is a major change. If you think we
should discuss this at IETF let me know I out it on the agenda. BTW, we’d also like to
raise a concern about defining <Time> as an xs:int (via intDataType).
IMO, <Time> should be defined as an xs:dateTime, which we’ve
recently agreed would uniformly express time as UTC in Z form. Using an
int for time is very problematic for computational reasons. The spec
leaves the interpretation of this value undefined. It just seems dangerous to
leave this so ambiguously defined. If expressed as a UTC time value using
xs:dateTime, then it’s pretty easy to do the right thing and timezones,
etc don’t get in the way. Protocols really shouldn’t leave
such things to chance since it definitely inhibits interoperability. <Time> also seems to
have an overloaded use if the <TimeInterval> value is also provided.
In this case ts case the <Time> value is not a time value, but is instead an
interval count. IMO, this is confusing and the overloading should be
avoided by adding an optional <IntervalCount> element. If
<TimeInterval> is not specified, is <Time> a local time? What
is the epoch? Etc. etc… It seems pretty ambiguous. Now, we don’t
need it for our use cases, although we might in the future. I do think it
would be helpful to clean this up. I also
prefer having a description in the spec (semantic) of what the attribute is
hence I would really like from you a list of additional elements under
<Data> that you know about that make sense. For example: <DisplayInterval>
, of type integerData – “Number of seconds between the interval of
a display of a token) [RSP] We don’t need
<DisplayInterval> since <TimeInterval> is already defined in the
spec. In our case, the display interval is the time interval of the
algorithm. I am assuming the same is true for other time-based algorithms. I’ve provided
descriptions elsewhere in this message for all elements we’ve asked to be
added. We don’t currently have any additional ones. |