home *** CD-ROM | disk | FTP | other *** search
/ Handbook of Infosec Terms 2.0 / Handbook_of_Infosec_Terms_Version_2.0_ISSO.iso / text / rfcs / rfc1507.txt < prev    next >
Text File  |  1996-05-07  |  292KB  |  2,929 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Network Working Group                                         C. Kaufman Request for Comments: 1507                 Digital Equipment Corporation                                                           September 1993 
  8.  
  9.                                    DASS               Distributed Authentication Security Service 
  10.  
  11. Status of this Memo 
  12.  
  13.    This memo defines an Experimental Protocol for the Internet    community.  It does not specify an Internet standard.  Discussion and    suggestions for improvement are requested.  Please refer to the    current edition of the "Internet Official Protocol Standards" for the    standardization state and status of this protocol.  Distribution of    this memo is unlimited. 
  14.  
  15. Table of Contents 
  16.  
  17.     1.   Introduction ................................................ 2          1.1  What is DASS? .......................................... 2          1.2  Central Concepts ....................................... 4          1.3  What This Document Won't Tell You ..................... 11          1.4  The Relationship between DASS and ISO Standards ....... 17          1.5  An Authentication Walkthrough ......................... 20     2.   Services Used .............................................. 25          2.1  Time Service .......................................... 25          2.2  Random Numbers ........................................ 26          2.3  Naming Service ........................................ 26     3.   Services Provided .......................................... 37          3.1  Certificate Contents .................................. 38          3.2  Encrypted Private Key Structure ....................... 40          3.3  Authentication Tokens ................................. 40          3.4  Credentials ........................................... 43          3.5  CA State .............................................. 47          3.6  Data types used in the routines ....................... 47          3.7  Error conditions ...................................... 49          3.8  Certificate Maintenance Functions ..................... 49          3.9  Credential Maintenance Functions ...................... 55          3.10 Authentication Procedures ............................. 63          3.11 DASSlessness Determination Functions .................. 87     4.   Certificate and message formats ............................ 89          4.1  ASN.1 encodings ....................................... 89          4.2  Encoding Rules ........................................ 96          4.3  Version numbers and forward compatibility ............. 96          4.4  Cryptographic Encodings ............................... 97     Annex A - Typical Usage ........................................ 101          A.1  Creating a CA ........................................ 101 
  18.  
  19.  
  20.  
  21. Kaufman                                                         [Page 1] 
  22.  RFC 1507                          DASS                    September 1993 
  23.  
  24.           A.2  Creating a User Principal ............................ 102          A.3  Creating a Server Principal .......................... 103          A.4  Booting a Server Principal ........................... 103          A.5  A user logs on to the network ........................ 103          A.6  An Rlogin (TCP/IP) connection is made ................ 104          A.7  A Transport-Independent Connection ................... 104     Annex B - Support of the GSSAPI ................................ 104          B.1  Summary of GSSAPI .................................... 105          B.2  Implementation of GSSAPI over DASS ................... 106          B.3  Syntax ............................................... 110     Annex C - Imported ASN.1 definitions ........................... 112     Glossary ....................................................... 114    Security Considerations ......................................... 119    Author's Address ................................................ 119    Figures     Figure 1 - Authentication Exchange Overview ....................  24 
  25.  
  26. 1. Introduction 
  27.  
  28. 1.1 What is DASS? 
  29.  
  30.    Authentication is a security service. The goal of authentication is    to reliably learn the name of the originator of a message or request.    The classic way by which people authenticate to computers (and by    which computers authenticate to one another) is by supplying a    password.  There are a number of problems with existing password    based schemes which DASS attempts to solve.  The goal of DASS is to    provide authentication services in a distributed environment which    are both more secure (more difficult for a bad guy to impersonate a    good guy) and easier to use than existing mechanisms. 
  31.  
  32.    In a distributed environment, authentication is particularly    challenging.  Users do not simply log on to one machine and use    resources there.  Users start processes on one machine which may    request services on another.  In some cases, the second system must    request services from a third system on behalf of the user.  Further,    given current network technology, it is fairly easy to eavesdrop on    conversations between computers and pick up any passwords that might    be going by. 
  33.  
  34.    DASS uses cryptographic mechanisms to provide "strong, mutual"    authentication.  Mutual authentication means that the two parties    communicating each reliably learn the name of the other.  Strong    authentication means that in the exchange neither obtains any    information that it could use to impersonate the other to a third    party.  This can't be done with passwords alone.  Mutual    authentication can be done with passwords by having a "sign" and a    "counter-sign" which the two parties must utter to assure one another 
  35.  
  36.  
  37.  
  38. Kaufman                                                         [Page 2] 
  39.  RFC 1507                          DASS                    September 1993 
  40.  
  41.     of their identities.  But whichever party speaks first reveals    information which can be used by the second (unauthenticated) party    to impersonate it.  Longer sequences (often seen in spy movies)    cannot solve the problem in general.  Further, anyone who can    eavesdrop on the conversation can impersonate either party in a    subsequent conversation (unless passwords are only good once).    Cryptography provides a means whereby one can prove knowledge of a    secret without revealing it.  People cannot execute cryptographic    algorithms in their heads, and thus cannot strongly authenticate to    computers directly.  DASS lays the groundwork for "smart cards":    microcomputers sealed in credit cards which when activated by a PIN    will strongly authenticate to a computer.  Until smart cards are    available, the first link from a user to a DASS node remains    vulnerable to eavesdropping.  DASS mechanisms are constructed so that    after the initial authentication, smart card or password based    authentication looks the same. 
  42.  
  43.    Today, systems are constructed to think of user identities in terms    of accounts on individual computers.  If I have accounts on ten    machines, there is no way a priori to see that those ten accounts all    belong to the same individual.  If I want to be able to access a    resource through any of the ten machines, I must tell the resource    about all ten accounts.  I must also tell the resource when I get an    eleventh account. 
  44.  
  45.    DASS supports the concept of global identity and network login.  A    user is assigned a name from a global namespace and that name will be    recognized by any node in the network.  (In some cases, a resource    may be configured as accessible only by a particular user acting    through a particular node.  That is an access control decision, and    it is supported by DASS, but the user is still known by his global    identity).  From a practical point of view, this means that a user    can have a single password (or smart card) which can be used on all    systems which allow him access and access control mechanisms can    conveniently give access to a user through any computer the user    happens to be logged into.  Because a single user secret is good on    all systems, it should never be necessary for a user to enter a    password other than at initial login.  Because cryptographic    mechanisms are used, the password should never appear on the network    beyond the initial login node. 
  46.  
  47.    DASS was designed as a component of the Distributed System Security    Architecture (DSSA) (see "The Digital Distributed System Security    Architecture" by M. Gasser, A. Goldstein, C. Kaufman, and B. Lampson,    1989 National Computer Security Conference).  It is a goal of DSSA    that access control on all systems be based on users' global names    and the concept of "accounts" on computers eventually be replaced    with unnamed rights to execute processes on those computers.  Until 
  48.  
  49.  
  50.  
  51. Kaufman                                                         [Page 3] 
  52.  RFC 1507                          DASS                    September 1993 
  53.  
  54.     this happens, computers will continue to support the concept of    "local accounts" and access controls on resources on those systems    will still be based on those accounts.  There is today within the    Berkeley rtools running over the Internet Protocol suite the concept    of a ".rhosts database" which gives access to local accounts from    remote accounts.  We envision that those databases will be extended    to support granting access to local accounts based on DASS global    names as a bridge between the past and the future.  DASS should    greatly simplify the administration of those databases for the    (presumably common) case where a user should be granted access to an    account ignoring his choice of intermediate systems. 
  55.  
  56. 1.2 Central Concepts 
  57.  
  58. 1.2.1 Strong Authentication with Public Keys 
  59.  
  60.    DASS makes heavy use of the RSA Public Key cryptosystem.  The    important properties of the RSA algorithms for purposes of this    discussion are: 
  61.  
  62.     - It supports the creation of a public/private key pair, where       operations with one key of the pair reverse the operations of       the other, but it is computationally infeasible to derive the       private key from the public key. 
  63.  
  64.     - It supports the "signing" of a message with the private key,       after which anyone knowing the public key can "verify" the       signature and know that it was constructed with knowledge of       the private key and that the message was not subsequently       altered. 
  65.  
  66.     - It supports the "enciphering" of a message by anyone knowing       the public key such that only someone with knowledge of the       private key can recover the message. 
  67.  
  68.    With access to the RSA algorithms, it is easy to see how one could    construct a "strong" authentication mechanism.  Each "principal"    (user or computer) would construct a public/private key pair, publish    the public key, and keep secret the private key.  To authenticate to    you, I would write a message, sign it with my private key, and send    it to you.  You would verify the message using my public key and know    the message came from me.  If mutual authentication were desired, you    could create an acknowledgment and sign it with your private key; I    could verify it with your public key and I would know you received my    message. 
  69.  
  70.    The authentication algorithms used by DASS are considerably more    complex than those described in the paragraph above in order to deal 
  71.  
  72.  
  73.  
  74. Kaufman                                                         [Page 4] 
  75.  RFC 1507                          DASS                    September 1993 
  76.  
  77.     with a large number of practical concerns including subtle security    threats.  Some of these are discussed below. 
  78.  
  79. 1.2.2 Timestamps vs. Challenge/Response 
  80.  
  81.    Cryptosystems give you the ability to sign messages so that the    receiver has assurance that the signer of the message knew some    cryptographic secret.  Free-standing public key based authentication    is sufficiently expensive that it is unlikely that anyone would want    to sign every message of an interactive communication, and even if    they did they would still face the threat of someone rearranging the    messages or playing them multiple times.  Authentication generally    takes place in the context of establishing some sort of "connection,"    where a conversation will ensue under the auspices of the single    peer-entity authentication.  This connection might be    cryptographically protected against modification or reordering of the    messages, but any such protection would be largely independent of the    authentication which occurred at the start of the connection.  DASS    provides as a side effect of authentication the provision of a shared    key which may be used for this purpose. 
  82.  
  83.    If in our simple minded authentication above, I signed the message    "It's really me!" with my private key and sent it to you, you could    verify the signature and know the message came from me and give the    connection in which this message arrived access to my resources.    Anyone watching this message over the network, however, could replay    it to any server (just like a password!) and impersonate me.  It is    important that the message I send you only be accepted by you and    only once.  I can prevent the message from being useful at any other    server by including your name in the message.  You will only accept    the message if you see your name in it.  Keeping you from accepting    the message twice is harder. 
  84.  
  85.    There are two "standard" ways of providing this replay protection.    One is called challenge/response and the other is called timestamp-    based.  In a challenge response type scheme, I tell you I want to    authenticate, you generate a "challenge" (generally a number), and I    include the challenge in the message I sign.  You will only accept a    message if it contains the recently generated challenge and you will    make sure you never issue the same challenge to me twice (either by    using a sequence number, a timestamp, or a random number big enough    that the probability of a duplicate is negligible).  In the    timestamp-based scheme, I include the current time in my message.    You have a rule that you will not accept messages more than - say -    five minutes old and you keep track of all messages you've seen in    the last five minutes.  If someone replays the message within five    minutes, you will reject it because you will remember you've seen it    before; if someone replays it after five minutes, you will reject it 
  86.  
  87.  
  88.  
  89. Kaufman                                                         [Page 5] 
  90.  RFC 1507                          DASS                    September 1993 
  91.  
  92.     as timed out. 
  93.  
  94.    The disadvantage of the challenge/response based scheme is that it    requires extra messages.  While one-way authentication could    otherwise be done with a single message and mutual authentication    with one message in each direction, the challenge/response scheme    always requires at least three messages. 
  95.  
  96.    The disadvantage of the timestamp-based scheme is that it requires    secure synchronized time.  If our clocks drift apart by more than    five minutes, you will reject all of my attempts to authenticate.  If    a network time service spoofer can convince you to turn back your    clock and then subsequently replays an expired message, you will    accept it again.  The multicast nature of existing distributed time    services and the likelihood of detection make this an unlikely    threat, but it must be considered in any analysis of the security of    the scheme.  The timestamp scheme also requires the server to keep    state about all messages seen in the clock skew interval.  To be    secure, this must be kept on stable storage (unless rebooting takes    longer than the permitted clock skew interval). 
  97.  
  98.    DASS uses the timestamp-based scheme.  The primary motivations behind    this decision were so that authentication messages could be    "piggybacked" on existing connection establishment messages and so    that DASS would fit within the same "form factor" (number and    direction of messages) as Kerberos. 
  99.  
  100. 1.2.3 Delegation 
  101.  
  102.    In a distributed environment, authentication alone is not enough.    When I log onto a computer, not only do I want to prove my identity    to that computer, I want to use that computer to access network    resources (e.g., file systems, database systems) on my behalf.  My    files should (normally) be protected so that I can access them    through any node I log in through.  DASS allows them to be so    protected without allowing all of the systems that I might ever use    to access those files in my absence.  In the process of logging in,    my password gives my login node access to my RSA secret.  It can use    that secret to "impersonate" me on any requests it makes on my    behalf.  It should forget all secrets associated with me when I log    off.  This limits the trust placed in computer systems.  If someone    takes control of a computer, they can impersonate all people who use    that computer after it is taken over but no others. 
  103.  
  104.    Normally when I access a network service, I want to strongly    authenticate to it.  That is, I want to prove my identity to that    service, but I don't want to allow that service to learn anything    that would allow it to impersonate me.  This allows me to use a 
  105.  
  106.  
  107.  
  108. Kaufman                                                         [Page 6] 
  109.  RFC 1507                          DASS                    September 1993 
  110.  
  111.     service without trusting it for more than the service it is    delivering.  When using some services, for example remote login    services, I may want that service to act on my behalf in calling    additional services.  DASS provides a mechanism whereby I can pass    secrets to such services that allow them to impersonate me. 
  112.  
  113.    Future versions of this architecture may allow "limited delegation"    so that a user may delegate to a server only those rights the server    needs to carry out the user's wishes.  This version  can limit    delegation only in terms of time.  The information a user gives a    server (other than the initial login node) can be used to impersonate    the user but only for a limited period of time.  Smart cards will    permit that time limitation to apply to the initial login node as    well. 
  114.  
  115. 1.2.4 Certification Authorities 
  116.  
  117.    A flaw in the strong authentication mechanism described above is that    it assumes that every "principal" (user and node) knows the public    key of every other principal it wants to authenticate.  If I can fool    a server into thinking my public key is actually your public key, I    can impersonate you by signing a message, saying it is from you, and    having the server verify the message with what it thinks is your    public key. 
  118.  
  119.    To avoid the need to securely install the public key of every    principal in the database of every other principal, the concept of a    "Certification Authority" was invented.  A certification authority is    a principal trusted to act as an introduction service.  Each    principal goes to the certification authority, presents its public    key, and proves it has a particular name (the exact mechanisms for    this vary with the type of principal and the level of security to be    provided).  The CA then creates a "certificate" which is a message    containing the name and public key of the principal, an expiration    date, and bookkeeping information signed by the CA's private key.    All "subscribers" to a particular CA can then be authenticated to one    another by presenting their certificates and proving knowledge of the    corresponding secret.  CAs need only act when new principals are    being named and new private keys created, so that can be maintained    under tight physical security. 
  120.  
  121.    The two problems with the scheme as described so far are "revocation"    and "scaleability". 
  122.  
  123. 1.2.4.1 Certificate Revocation 
  124.  
  125.    Revocation is the process of announcing that a key has (or may have)    fallen into the wrong hands and should no longer be accepted as proof 
  126.  
  127.  
  128.  
  129. Kaufman                                                         [Page 7] 
  130.  RFC 1507                          DASS                    September 1993 
  131.  
  132.     of some particular identity.  With certificates as described above,    someone who learns your secret and your certificate can impersonate    you indefinitely - even after you have learned of the compromise.  It    lacks the ability corresponding to changing your password.  DASS    supports two independent mechanisms for revoking certificates. In the    future, a third may be added. 
  133.  
  134.    One method for revocation is using timeouts and renewals of    certificates.  Part of the signed message which is a certificate may    be a time after which the certificate should not be believed.    Periodically, the CA would renew certificates by signing one with a    later timeout.  If a key were compromised, a new key would be    generated and a new certificate signed.  The old certificate would    only be valid until its timeout.  Timeouts are not perfect revocation    mechanisms because they provide only slow revocation (timeouts are    typically measured in months for the load on the CA and communication    with users to be kept manageable) and they depend on servers having    an accurate source of the current time.  Someone who can trick a    server into turning back its clock can use expired certificates. 
  135.  
  136.    The second method is by listing all non-revoked certificates in the    naming service and believing only certificates found there.  The    advantage of this method is that it is almost immediate (the only    delay is for name service "skulking" and caching delays).  The    disadvantages are: (1) the availability of authentication is only as    good as the availability of the naming service and (2) the security    of revocation is only as good as the security of the naming service. 
  137.  
  138.    A third method for revocation - not currently supported by DASS - is    for certification authorities to periodically issue "revocation    lists" which list certificates which should no longer be accepted. 
  139.  
  140. 1.2.4.2 Certification Authority Hierarchy 
  141.  
  142.    While using a certification authority as an introduction service    scales much better than having every principal learn the public key    of every other principal by some out of band means, it has the    problem that it creates a central point of trust.  The certification    authority can impersonate any principal by inventing a new key and    creating a certificate stating that the new key represents the    principal.  In a large organization, there may be no individual who    is sufficiently trusted to operate the CA.  Even if there were, in a    large organization it would be impractical to have every individual    authenticate to that single person.  Replicating the CA solves the    availability problem but makes the trust problem worse.  When    authentication is to be used in a global context - between companies    - the concept of a single CA is untenable. 
  143.  
  144.  
  145.  
  146.  Kaufman                                                         [Page 8] 
  147.  RFC 1507                          DASS                    September 1993 
  148.  
  149.     DASS addresses this problem by creating a hierarchy of CAs.  The CA    hierarchy is tied to the naming hierarchy.  For each directory in the    namespace, there is a single CA responsible for certifying the public    keys of its members.  That CA will also certify the public keys of    the CAs of all child directories and of the CA of the parent    directory.  With this cross-certification, it is possible knowing the    public key of any CA to verify the public keys of a series of    intermediate CAs and finally to verify the public key of any    principal. 
  150.  
  151.    Because the CA hierarchy is tied to the naming hierarchy, the trust    placed in any individual CA is limited.  If a CA is compromised, it    can impersonate any of the principals listed in its directory, but it    cannot impersonate arbitrary principals. 
  152.  
  153.    DASS provides mechanisms for every principal to know the public key    of its "parent" CA - the CA controlling the directory in which it is    named.  The result is the following rules for the implications of a    compromised CA: 
  154.  
  155.     a) A CA can impersonate any principal named in its directory. 
  156.  
  157.     b) A CA can impersonate any principal to a server named in its        directory. 
  158.  
  159.     c) A CA can impersonate any principal named in a subdirectory to        any server not named in the same subdirectory. 
  160.  
  161.     d) A CA can impersonate to any server in a subdirectory any        principal not named in the same subdirectory. 
  162.  
  163.    The implication is that a compromise low in the naming tree will    compromise all principals below that directory while a compromise    high in the naming tree will compromise only the authentication of    principals far apart in the naming hierarchy.  In particular, when    multiple organizations share a namespace (as they do in the case of    X.500), the compromise of a CA in one organization can not result in    false authentication within another organization. 
  164.  
  165.    DASS uses the X.500 directory hierarchy for principal naming.  At the    top of the hierarchy are names of countries.  National authorities    are not expected to establish certification authorities (at least    initially), so an alternative mechanism must be used to authenticate    entities "distant" in the naming hierarchy.  The mechanism for this    in DASS is the "cross-certificate" where a CA certifies the public    key for some CA or principal not its parent or child.  By limiting    the chains of certificates they will use to parent certificates    followed by a single "cross certificate" followed by child 
  166.  
  167.  
  168.  
  169. Kaufman                                                         [Page 9] 
  170.  RFC 1507                          DASS                    September 1993 
  171.  
  172.     certificates, a DASS implementation can avoid the need to have CAs    near the root of the tree or can avoid the requirement to trust them    even if they do exist.  A special case can also be supported whereby    a global authority whose name is not the root can certify the local    roots of independent "islands". 
  173.  
  174. 1.2.5 User vs. Node Authentication 
  175.  
  176.    In concept, DASS mechanisms support the mutual authentication of two    principals regardless of whether those principals are people,    computers, or applications.  Those mechanisms have been extended,    however, to deal with a common case of a pair of principals acting    together (a user and a node) authenticating to a single principal (a    remote server).  This is done by having optionally in each    credentials structure two sets of secrets - one for the user and one    for the node.  When authentication is done using such credentials,    both secrets sign the request so the receiving party can verify that    both principals are present. 
  177.  
  178.    This setup has a number of advantages.  It permits access controls to    be enforced based on both the identity of the user and the identity    of the originating node.  It also makes it possible to define users    of systems who have no network wide identities who can access network    resources on the basis of node credentials alone.  The security of    such a setup is less because a node can impersonate all of its users    even when they are not logged in, but it offers an easier transition    from existing global identities for all users. 
  179.  
  180. 1.2.6 Protection of User Keys 
  181.  
  182.    DASS mechanisms generally deal with authentication between principals    each knowing a private key.  For principals who are people, special    mechanisms are provided for maintaining that private key.  In    particular, it many cases it will be most convenient to keep    passwords as secrets rather than private keys.  This architecture    specifies a means of storing private keys encrypted under passwords.    This would provide security as good as hiding a private key were it    not that people tend to choose passwords from a small space (like    words in a dictionary) such that a password can be more easily    guessed than a private key.  To address this potential weakness, DASS    specifies a protocol between a login node and a login agent whereby    the login agent can audit and limit the rate of password guesses.    Use of these features is optional.  A user with a smart card could    store a private key directly and bypass all of these mechanisms.  If    users can be forced to choose "good" passwords, the login agent could    be eliminated and encrypted credentials could be stored directly in    the naming service. 
  183.  
  184.  
  185.  
  186.  Kaufman                                                        [Page 10] 
  187.  RFC 1507                          DASS                    September 1993 
  188.  
  189.     Another way in which user keys are protected is that the architecture    does not require that they be available except briefly at login.    This reduces the threat of a user walking away from a logged on    workstation and having someone take over the workstation and extract    his key.  It also makes the use of RSA based smart cards practical;    the card could keep the user's private key and execute one signature    operation at login time to authenticate an entire session. 
  190.  
  191. 1.3 What This Document Won't Tell You 
  192.  
  193.    Architecture documents are by their nature difficult to read.  This    one is no exception. The reason is that an architecture document    contains the details sufficient to build interoperable    implementations, but it is not a design specification. It goes out of    its way to leave out any details which an implementation could choose    without affecting interoperability. It also does not specify all the    uses of the services provided because these services are properly    regarded as general purpose tools. 
  194.  
  195.    The remainder of this section includes information which is not    properly part of the authentication architecture, but which may be    useful in understanding why the architecture is the way it is. 
  196.  
  197. 1.3.1 How DASS is Embedded in an Operating System 
  198.  
  199.    While architecturally DASS does not require any operating system    support in order to be used by an application (other than the    services listed in Section 2), it is expected that actual    implementations of DASS will be closely tied to the operating systems    of host computers.  This is done both for security and for    convenience. 
  200.  
  201.    In particular, it is expected that when a user logs into a node, a    set of credentials will be created for that user and then associated    by the operating system with all processes initiated by or on behalf    of the user.  When a user delegates to a service, the remote    operating system is expected to accept the delegation and start up    the remote process with the delegated credentials.  Most nodes are    expected to have credentials of their own and support the concept of    user accounts.  When user credentials are created, the node is    expected to verify them in its own context, determine the appropriate    user account, and add node credentials to the created credentials    set. 
  202.  
  203. 1.3.2 Forms of Credentials 
  204.  
  205.    In the DASS architecture, there is a single data structure called    "Credentials" with a large number of optional parts.  In an 
  206.  
  207.  
  208.  
  209. Kaufman                                                        [Page 11] 
  210.  RFC 1507                          DASS                    September 1993 
  211.  
  212.     implementation, it is possible that not all of the architecturally    allowed subsets will be supported and credentials structures with    different subsets of the data may be implemented quite differently. 
  213.  
  214.    The major categories of credentials likely to be supported in an    implementation are: 
  215.  
  216.     - Claimant credentials  - these are the credentials which would       normally be associated with a user process in order that it be       able to create authentication tokens.  It would contain the       user's name, login ticket, session private key, and (at least       logically) local node credentials and cached outgoing       contexts. 
  217.  
  218.     - Verifier credentials -  these are the credentials which would       normally be associated with a server which must verify tokens       and produce mutual authentication response tokens.  Since       servers may be started by a node on demand, some       representation of verifier credentials must exist independent       of a process.  If an operating system wishes to authenticate a       request before starting a server process, the credentials must       exist in usable form.  An implementation may choose to have       all services on a "node" share a verifier credentials       structure, or it may choose to have each service have its own. 
  219.  
  220.     - Combined credentials - architecturally, a server may have a       structure which is both claimant credentials and verifier       credentials combined so that the server may act in either role       using a single structure.  There is some overlap in the       contents.  There is no requirement, however, that an       implementation support such a structure. 
  221.  
  222.     - Stub credentials - In the architecture, a credentials       structure is created whenever a token is accepted.  If delegation       took place, these are claimant credentials usable by their       possessor to create additional tokens.  If no delegation took       place, this structure exists as an architectural place holder       against which an implementation may attempt to authenticate       user and node names.  An implementation might choose to       implement  stub credentials  with a different mechanism than       claimant or verifier credentials.  In particular, it might do       whatever user and node authentication is useful itself and not       support this structure at all. 
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  Kaufman                                                        [Page 12] 
  231.  RFC 1507                          DASS                    September 1993 
  232.  
  233.  1.3.3 Support for Alternative Certification Authority       Implementations 
  234.  
  235.    A motivating factor in much of the design of DASS is the need to    protect certification authorities from compromise. CAs are only used    to create certificates for new principals and to renew them on    expiration (expiration intervals are likely to be measured in    months). They therefore do not need to be highly available. For    maximum security, CAs could be implemented on standalone PCs where    the hardware, software, and keys can be locked in a safe when the CA    is not in use. The certificates the CA generates must be delivered to    the naming service to be registered, and a possible mechanism for    this is for the CA to have an RS232 line to an on-line component    which can pass certificates and related information but not login    sessions. The intent would be to make it implausible to mount a    network attack against the CA.  Alternatively, certificates could be    carried to the network on a floppy disk. 
  236.  
  237.    For CAs to be secure, a whole host of design details must be done    right. The most important of these is the design of user and system    manager interfaces that make it difficult to "trick" a user or system    manager into doing the wrong thing and certifying an impostor or    revealing a key. Mechanisms for generating keys must also be    carefully protected to assure that the generated key cannot be    guessed (because of lack of randomness) and is not recorded where a    penetrator can get it. Because a certificate contains relatively    little human intelligible information (its most important components    are UIDs and public keys), it will be a challenge to design a user    interface that assures the human operator only authorizes the signing    of intented certificates. Such considerations are beyond the scope of    the architecture (since they do not affect interoperability), but    they did affect the design in subtle ways.  In particular, it does    not assume uniform security throughout the CA hierarchy and is    designed to assure that the compromise of a CA in one part of the    hierarchy does not have global implications. 
  238.  
  239.    The architecture does not require that CAs be off-line. The CA could    be software that can run on any node when the proper secret is    installed.  Administrative convenience can be gained by integrating    the CA with account registration utilities and naming service    maintenance. As such, the CA would have to be on-line when in use in    order to register certificates in the naming service.  The CA key    could be unlocked with a password and the password could be entered    on each use both to authenticate the CA operator and to assure that    compromise of the host node while the CA is not in use will not    compromise the CA.  This design would be subject to attacks based on    planting Trojan horses in the CA software, but is entirely    interoperable with a more secure implementation.  Realistic tradeoffs 
  240.  
  241.  
  242.  
  243. Kaufman                                                        [Page 13] 
  244.  RFC 1507                          DASS                    September 1993 
  245.  
  246.     must be made between security, cost, and administrative convenience    bearing in mind that a system is only as secure as its weakest link    and that there is no benefit in making the CA substantially more    secure than the other components of the system. 
  247.  
  248. 1.3.4 Services Provided vs. Application Program Interface 
  249.  
  250.    Section 3 of this document specifies "abstract interfaces" to the    services provided by DASS. This means it tells what services are    provided, what parameters are supplied by the caller, and what data    is returned. It does not specify the calling interfaces.  Calling    interfaces may be platform, operating system, and language dependent.    They do not affect interoperability; different implementations which    implement completely different calling interfaces can still    interoperate over a network. They do, however, affect portability. A    program which runs on one platform can only run on another which    implements an identical API. 
  251.  
  252.    In order to support portability of applications - not just between    implementations of DASS but between implementations of DASS and    implementations of Kerberos - a "Generic Security Service API" has    been designed and is outlined in Annex B. This API could be the only    "published" interface to DASS services.  This interface does not,    however, give access to all the functions provided by DASS and it    provides some non-DASS services. It does not give access to the    "login" service, for example, so the login function cannot be    implemented in a portable way. Clearly an implementation must provide    some implementation of the login function, though perhaps only to one    system program and the implementation need not be portable.    Similarly, the Generic API provides no access to node authentication    information, so applications which use these services may not be    portable. 
  253.  
  254.    The Generic API provides services for encryption of user data for    integrity and possibly privacy. These services are not specified as a    part of the DASS architecture. This is because we envisioned that    such services would be provided by the communications network and not    in applications. These services are provided by the Generic API    because these services are provided by Kerberos, there exist    applications which use these services, and they are desired in the    context of the IETF-CAT work. The DASS architecture includes a Key    Distribution service so that the encryption functions of the Generic    API can be supported and integrated. Annex B specifies how those    services can be implemented using DASS services. 
  255.  
  256.    The Services Provided also differ from the GSSAPI because there are    important extensions envisioned to the API for future applications    and it was important to assure that architecturally those services 
  257.  
  258.  
  259.  
  260. Kaufman                                                        [Page 14] 
  261.  RFC 1507                          DASS                    September 1993 
  262.  
  263.     were available.  In particular, DASS provides the ability for a    principal to have multiple aliases and for the receiver of an    authentication token to verify any one of them.  We want DASS to    support the case where a server only learns the name it is trying to    validate in the course of evaluating an ACL.  This may be long after    a connection is accepted.  The Services Provided section therefore    separates the Accept_token function from the Verify Principal Name.    The other motivation behind a different interface is that DASS    provides node authentication - the ability to authenticate the node    from which a request originates as well as the user.  Because    Kerberos provides no such mechanism, the capability is missing from    the GSSAPI, but we expect some applications will want to make use of    it. 
  264.  
  265. 1.3.5 Use of a Naming Service 
  266.  
  267.    With the exception of the syntactical representation of names, which    is tied to X.500, the DASS architecture is designed to be independent    of the particular underlying naming service.  While the intention is    that certificates be stored in an X.500 naming service in the fields    architecturally reserved for this purpose in the standard, this    specification allows for the possibility of different forms of    certificate stores.  The SPX implementation of DASS implements its    own certificate distribution service because we did not want to    introduce a dependency on an X.500 naming service. 
  268.  
  269. 1.3.6 Key Hiding - Credentials 
  270.  
  271.    The abstract interfaces described in section 3 specify that    "credentials" and "keys" are the inputs and outputs of various    routines.  Credentials structures in particular contain secret    information which should not be made available to the calling    application.  In most cases, keeping this information from    applications is simply a matter of prudence - a misbehaving    application can do nearly as much damage using the credentials as it    can by using the secrets directly.  Having access to the keys    themselves may allow an application to bypass auditing or leak a key    to an accomplice who can use it on another node where a large amount    of activity is less likely to be noticed.  In some cases, most    dramatically where a "node key" is present in user credentials, it is    vital that the contents of the credentials be kept out of the hands    of applications. 
  272.  
  273.    To accomplish this, a concrete interface is expected to create    "credentials handles" that are passed in and out of DASS routines.    The credentials themselves would be kept in some portion of memory    where unprivileged code can't get at them. 
  274.  
  275.  
  276.  
  277.  Kaufman                                                        [Page 15] 
  278.  RFC 1507                          DASS                    September 1993 
  279.  
  280.     There is another aspect of the way credentials are used which is    important to the design of real implementations.  In normal use, a    user will create a set of credentials in the process of logging on to    a system and then use them from many processes or jobs.  When many    processes share a set of credentials, it is important for the sake of    performance that they share one set of credentials rather than having    a copy of the credentials made for each.  This is because information    is cached in credentials as a side effect of some requests and for    good performance those caches should be shared. 
  281.  
  282.    As an example, consider a system executing a series of copy commands    moving files from one system to another.  The credentials of the user    will have been established when the user logged on.  The first time a    copy is requested, a new process will start up, open a connection to    the destination system, and create a token to authenticate itself.    Creating that token will be an expensive operation, but information    will be computed and "cached" in the credentials structure which will    allow any subsequent tokens on behalf of that user to that server to    be computed cheaply.  After the copy completes, the connection is    closed and the process terminates.  In response to a second copy    request, another new process will be created and a new token    computed.  For this operation to get a performance benefit from the    caching, the information computed by the first process must somehow    make it to the second. 
  283.  
  284.    A model for how this caching might work can be seen in the way    Kerberos caches credentials.  Kerberos keeps credentials in a file    whose name can be computed from the name of the local user.  This    file is initialized as part of the login process and its protection    is set so that only processes running under the UID of the user may    read and write the file.  Processes cache information there; all    processes running on behalf of the user share the file. 
  285.  
  286.    There are two problems with this scheme: first, on a diskless node    putting information in a file exposes it to eavesdroppers on the    network; second, it does not accomplish the "key hiding" function    described earlier in this section.  In a more secure implementation,    the kernel or a privileged process would manage some "pool" of    credentials for all processes on a node and would grant access to    them only through the DASS calls.  Credentials structures are complex    and varying length; DASS may organize them as a set of pools rather    than as contiguous blocks of data.  All such design issues are    "beyond the scope of the architecture".  Implementations must decide    how to control access to credentials.  They could copy the Kerberos    scheme of having credentials available to processes with the UID of    the login session which created them and to privileged processes or    there may be a more elaborate mechanism for "passing" credentials    handles from process to process.  This design should probably follow 
  287.  
  288.  
  289.  
  290. Kaufman                                                        [Page 16] 
  291.  RFC 1507                          DASS                    September 1993 
  292.  
  293.     the operating system mechanisms for passing around local privileges. 
  294.  
  295. 1.3.7 Key Hiding - Contexts 
  296.  
  297.    The "GSSAPI" has a concept of a security context which has some of    the same key hiding problems as a credentials structure.  Security    contexts are used in calls to cryptographically protect user data    (from modification or from disclosure and modification) using keys    established during authentication.  The "services provided"    specification says that create_ and accept_token return a "shared    key" and "instance identifier".  The GSSAPI says that a context    handle is returned which is an integer.  A secure implementation    would keep the key and instance identifier in protected memory and    only allow access to them through provided interfaces. 
  298.  
  299.    Unlike credentials, there is probably no need to provide mechanisms    for contexts to be shared between processes.  Contexts will normally    be associated with some notion of a communications "connection" and    ends of a connection are not normally shared.  If an implementation    chooses to provide additional services to applications like message    sequencing or duplicate detection, contexts will have to contain    additional fields.  These can be created and maintained without any    additional authentication services. 
  300.  
  301. 1.4 The Relationship between DASS and ISO Standards 
  302.  
  303.    This section provides an introduction to DASS authentication in terms    of the ISO Authentication Framework (DP10181-2).   The purpose of    this introduction is to give the reader an intuitive understanding of    the way DASS works and how its mechanisms and terminology relate to    standards.  Important details have been omitted here but are spelled    out in section 3. 
  304.  
  305. 1.4.1 Concepts 
  306.  
  307.    The primary goal of authentication is to prevent impersonation, that    is, the pretense to a false identity. Authentication always involves    identification in some form. Without authentication, anyone could    claim to be whomever they wished and get away with it. 
  308.  
  309.    If it didn't matter with whom one was communicating, elaborate    procedures for authentication would be unnecessary. However, in most    systems, and in timesharing and distributed processing environments    in particular, the rights of individuals are often circumscribed by    security policy. In particular, authorization (identity based access    control) and accountability (audit) provisions could be circumvented    if masquerading attempts were impossible to prevent or detect. 
  310.  
  311.  
  312.  
  313.  Kaufman                                                        [Page 17] 
  314.  RFC 1507                          DASS                    September 1993 
  315.  
  316.     Almost all practical authentication mechanisms suitable for use in    distributed environments rely on knowledge of some secret    information. Most differences lie in how one presents evidence that    they know the secret. Some schemes, in particular the familiar simple    use of passwords, are quite susceptible to attack. Generally, the    threats to authentication may be classified as: 
  317.  
  318.     - forgery, attempting to guess or otherwise fabricate evidence; 
  319.  
  320.     - replay, where one can eavesdrop upon another's authentication       exchange and learn enough to impersonate them; and 
  321.  
  322.     - interception, where one slips between the communicants and is       able to modify the communications channel unnoticed. 
  323.  
  324.    Most such attacks can be countered by using what is known as strong    authentication. Strong authentication refers to techniques that    permit one to provide evidence that they know a particular secret    without revealing even a hint about the secret. Thus neither the    entity to whom one is authenticating, nor an eavesdropper on the    conversation can further their ability to impersonate the    authenticating principal at some future time as the result of an    authentication exchange. 
  325.  
  326.    Strong authentication mechanisms, in particular those used here, rely    on cryptographic techniques. In particular, DASS uses public key    cryptography. Note that interception attacks cannot be countered by    strong authentication alone, but generally need additional security    mechanisms to secure the communication channel, such as data    encryption. 
  327.  
  328. 1.4.2 Principals and Their Roles 
  329.  
  330.    All authentication is on behalf of principals. In DASS the following    types of principals are recognized: 
  331.  
  332.     - user principals, normally people with accounts who are       responsible for performing particular tasks. Generally it is       users that are authorized to do things by virtue of having       been granted access rights, or who are to be held accountable       for specific actions subject to being audited. 
  333.  
  334.     - server principals, which are accessed by users. 
  335.  
  336.     - node principals,  corresponding to locations where users and       servers, or more accurately, processes acting on behalf of       principals can reside. 
  337.  
  338.  
  339.  
  340.  Kaufman                                                        [Page 18] 
  341.  RFC 1507                          DASS                    September 1993 
  342.  
  343.     Principals can act in one of two capacities: 
  344.  
  345.     - the claimant is the active entity seeking to authenticate       itself, and 
  346.  
  347.     - the verifier is the passive entity to whom the claimant is       authenticating. 
  348.  
  349.    Users normally are claimants, whereas servers are usually verifiers,    although sometimes servers can also be claimants. 
  350.  
  351.    There is another kind of principal: 
  352.  
  353.     - certification authorities (CA's) issue certificates which       attest to another principal's public key. 
  354.  
  355. 1.4.3 Representation, Delegation and Representation Transfer 
  356.  
  357.    Of course, although it is users that are responsible for what the    computer does, human beings are physically unable to directly do    anything within a computer system. In point of fact, it is a    process executing on behalf of a user that actually performs    useful work. From the point of view of performing security    controlled functions, the process is the agent, or    representative, of the user, and is authorized by that user to do    things on his behalf. In the terms used in the ISO Authentication    Framework, the user is said to have a representation in the    process. 
  358.  
  359.    The representation has to come into existence somehow.  Delegation    refers to the act of creating a representation. A user is said to    create a representation for themselves by delegating to a process. If    the user creates another process, say by doing an rlogin on a    different computer, a representation may be needed there as well. This    may be accomplished automatically by a process known as representation    transfer.  DASS uses the term delegation to also mean the act of    creating additional representations on a remote systems. 
  360.  
  361.    A representation is instantiated in DASS as credentials.  Credentials    include the identity of the principal as well as the cryptographic    "state" needed to engage in strong authentication procedures. Claimant    information in credentials enable principals to authenticate    themselves to others, whereas verifier information in credentials    permit principals to verify the claims of others.  Credentials    intended primarily for use by a claimant will be referred to as    claimant credentials in the text which follows.  Credentials intended    primarily for use in verification will be referred to as verifier    credentials.  A particular set of credentials may or may not contain 
  362.  
  363.  
  364.  
  365. Kaufman                                                        [Page 19] 
  366.  RFC 1507                          DASS                    September 1993 
  367.  
  368.     all of the data necessary to be used in both roles.  That will depend    on the mechanisms by which the credentials were created. 
  369.  
  370.    In some contexts, but not here, the concept of representation    and/or delegation is sometimes referred to as proxy. This term is    used in ECMA TR/46.  We avoid use of the term because of possible    confusion with an unrelated use of the term in the context of    DECnet. 
  371.  
  372. 1.4.4 Key Distribution, Replay, Mutual Authentication and Trust 
  373.  
  374.    Strong authentication uses cryptographic techniques. The    particular mechanisms used in DASS result in the distribution of    cryptographic keys as a side effect. These keys are suitable for    use for providing a data origin authentication service and/or a    data confidentiality service between a pair of authenticated    principals. 
  375.  
  376.    Replay detection is provided using timestamps on relevant    authentication messages, combined with remembering previously    accepted messages until they become "stale". This is in contrast    to other techniques, such as challenge and response exchanges. 
  377.  
  378.    Authentication can be one-way or mutual. One-way authentication is    when only one party, in DASS the claimant, authenticates to the other.    Mutual authentication provides, in addition, authentication of the    verifier back to the claimant. In certain communications schemes, for    example connectionless transfer, only one-way authentication is    meaningful. DASS supports mutual authentication as a simple extension    of one-way authentication for use in environments where it makes    sense. 
  379.  
  380.    DASS potentially can allow many different "trust relationships"    to exist. All principals trust one or more CA's to safeguard the    certification process. Principals use certificates as the basis    for authenticating identities, and trust that CA's which issue    certificates act responsibly. Users expect CA's to make sure that    certificates (and related secrets) are only made for principals    that the CA knows or has properly authenticated on its own. 
  381.  
  382. 1.5 An Authentication Walkthrough 
  383.  
  384.    The OSI Authentication Framework characterizes authentication as    occurring in six phases. This section attempts to describe DASS    in these terms. 
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  Kaufman                                                        [Page 20] 
  391.  RFC 1507                          DASS                    September 1993 
  392.  
  393.  1.5.1 Installation 
  394.  
  395.    In this phase, principal certificates are created, as is the    additional information needed to create claimant and verifier    credentials. OSI defines three sub-phases: 
  396.  
  397.     - Enrollment. In DASS, this is the definition of a principal in       terms of a key, name and UID. 
  398.  
  399.     - Validation,  confirmation of identity to the satisfaction of       the CA, after which the CA generates a certificate. 
  400.  
  401.     - Confirmation.  In DASS, this is the act of providing the user       with the certificate and with the CA's own name, key and UID,       followed up by the user creating a  trusted authority for that       CA. A trusted authority is a certificate for the CA signed by       the user. 
  402.  
  403.    Included in this step in DASS is the posting of the certificate so as    to be available to principals wishing to verify the principal's    identity. In addition, the user principal saves the trusted authority    so as to be available when it creates credentials. 
  404.  
  405. 1.5.2 Distribution 
  406.  
  407.    DASS distributes certificates by placing them in the name service. 
  408.  
  409. 1.5.3 Acquisition 
  410.  
  411.    Whenever principals wish to authenticate to one another, they access    the Name Service to obtain whatever public key certificates they need    and create the necessary credentials. In DASS, acquisition means    obtaining credentials. 
  412.  
  413.    Claimant credentials implement the representation of a principal in a    process, or, more accurately, provide a representation of the    principal for use by a process. In making this representation, the    principal delegates to a temporary delegation key. In this fashion    the claimant's long term principal key need not remain in the system. 
  414.  
  415.    Claimant credentials are made by invoking the get credentials    primitive. Claimant credentials are a DASS specific data structure    containing: 
  416.  
  417.     - a name 
  418.  
  419.     - a ticket, a data structure containing 
  420.  
  421.  
  422.  
  423.  Kaufman                                                        [Page 21] 
  424.  RFC 1507                          DASS                    September 1993 
  425.  
  426.        .  a validity interval, 
  427.  
  428.       .  UID, and 
  429.  
  430.       .  (temporary) delegation public key, along with a 
  431.  
  432.       .  digital signature on the above made with the principal          private key 
  433.  
  434.     - the delegation private key 
  435.  
  436.    Optionally in addition, there may be credential information relating    to the node on which the user is logged in and the account on that    node.  A detailed description of all the information found in    credentials can be found in section 3.  Verifier credentials are made    with initialize_server. Verifier credentials consist of a principal    (long term) private key. The rationale is that these credentials are    usually needed by servers that must be able to run indefinitely    without re-entry of any long term key. 
  437.  
  438.    In addition, claimants and verifiers have a trusted authority, which    consists of information about a trusted CA.  That information is its: 
  439.  
  440.     - name (this will appear in the "issuer" field in principal       certificates), 
  441.  
  442.     - public key (to use in verifying certificates issued by that       CA), and 
  443.  
  444.     - UID. 
  445.  
  446.    Trusted authorities are used by principals to verify certificates for    other principals' public keys.  CAs are arranged in a hierarchy    corresponding to the naming hierarchy, where each directory in the    naming hierarchy is controlled by a single CA.  Each CA certifies the    CA of its parent directory, the CAs of each of its child directories,    and optionally CAs elsewhere in the naming hierarchy (mainly to deal    with the case where the directories up to a common ancestor lack    CAs).  Even though a principal has only a single CA as a trusted    authority, it can securely obtain the public key of any principal in    the namespace by "walking the CA hierarchy". 
  447.  
  448. 1.5.4 Transfer 
  449.  
  450.    The DASS exchange of authentication information is illustrated in    Figure 1-1. During the transfer phase, the DASS claimant sends an    authentication token  to the verifier. Authentication tokens are made    by invoking the create_token primitive. The authentication token is 
  451.  
  452.  
  453.  
  454. Kaufman                                                        [Page 22] 
  455.  RFC 1507                          DASS                    September 1993 
  456.  
  457.     cryptographically protected and specified as a DASS data structure in    ASN.1. The authentication token includes: 
  458.  
  459.     - a ticket, 
  460.  
  461.     - a DES authenticating key encrypted using the intended       verifier's public key 
  462.  
  463.     - one of the following: 
  464.  
  465.       . if delegation is not being performed, a digital signature on         the encrypted DES key using the delegation private key, or 
  466.  
  467.       . if delegation is being performed, sending the delegation         private key, DES encrypted using the DES authenticating key 
  468.  
  469.     - an authenticator, which is a cryptographic checksum made using       the DES authenticating key over a buffer containing 
  470.  
  471.       . a timestamp 
  472.  
  473.       . any application supplied "channel bindings". For example,         addresses or other context information. The purpose of this         field is to thwart substitution and replay attacks. 
  474.  
  475.     - additional optional information concerning node authentication       and context. 
  476.  
  477.    As a side effect, after init_authentication_context, the caller    receives a local authentication context, a data structure containing: 
  478.  
  479.     - the DES key, and 
  480.  
  481.     - if mutual authentication is being requested, the expected       response. 
  482.  
  483.    In order to construct an authentication token, the claimant needs to    access the verifier's public key certificate from the Name Service    (labeled CDC, for Certificate Distribution Center, in the figure). 
  484.  
  485.    Note that while an authenticator can only be used once, it is    permissible to re-establish the same local authentication context    multiple times. That is, the ticket and DES key establishment    components of the authentication token may have a relatively long    lifetime. This permits a performance improvement in that repeated    applications of public key operations can be alleviated if one caches    authentication contexts, along with other components from a    successfully used authentication token and the associated verified 
  486.  
  487.  
  488.  
  489. Kaufman                                                        [Page 23] 
  490.  RFC 1507                          DASS                    September 1993 
  491.  
  492.     principal public key value. It is a relatively inexpensive operation    to create (and verify) "fresh" authenticators based on cached    authentication context. 
  493.  
  494.       Claimant Actions      | Communications |  Verifier Actions                             |                |            verifier name    |                |                    |        |                |                    |        |           +---+|                    \------------------->|   ||      trusted                |           |   ||    authorities              |           |CDC||         |    +-----------+  |certificate|   ||         |    |  Verify   |<-------------|   ||         \--->|Certificate|  |           +---+|              +-----------+  |                |      Claimant        |      |                |    credentials    Verifier  |                |   Verifier         |       Public Key  |                | Credentials         |            |      |                |       |         |            V      |                |       V         |    +-----------+  | Authentication | +-----------+         |    |   Make    |  |     Token      | |   Check   |   Replay         \--->|  Token    |-------------------->|   Token   |<-->Cache              +-----------+  |                | +-----------+       DES <---/      |      |                |  |   |    \----->DES       key            |      |                | /Claimant        key                      |      |                |/Public Key                      |      |                /      |        trusted                      |      |      Claimant /|      V     authorities                      |      |+---+   Name  / | +-----------+     |             authentication  ||   |<-------/  | |  Verify   |<----/                context      ||   |certificate| |Certificate|                      |      ||CDC|------------>|           |-->accept/                      |      ||   |           | +-----------+   reject                      |      ||   |           |      |      \                      |      |+---+           |authentication\                      V      |     mutual     |   context     V              +-----------+  | authentication |      |      claimant           /--|  Accept   |  |    response    | +----------+credentials          V   |  Mutual   |<--------------------|  Make    |(delegation)      accept/ +-----------+  |                | | Response |      reject                 |                | +----------+                             |                | 
  495.  
  496.                Figure 1 - Authentication Exchange Overview 
  497.  
  498.  
  499.  
  500.  Kaufman                                                        [Page 24] 
  501.  RFC 1507                          DASS                    September 1993 
  502.  
  503.  1.5.5 Verification 
  504.  
  505.    Upon receipt of an authentication token, the verifier extracts the    DES key using its verifier credentials, accesses the Name Service    (labeled CDC for Certificate Distribution Center) to obtain the    certificates needed to perform cryptographic checks on the incoming    information, and verifies all of the signatures on the received    certificates and the authentication token.  Verification can result    in creation of new claimant credentials if delegation is performed. 
  506.  
  507.    As part of this process, verified authenticators are retained for a    suitable timeout period. 
  508.  
  509. 1.5.6 Unenrolment 
  510.  
  511.    This is the removal of information from the Name Service. The only    other form of revocation supported by DASS is certificate timeout.    Every certificate contains an expiration time (expected in ordinary    use to be about a year from its signing date).  DASS does not    currently support the revocation lists in X.509. 
  512.  
  513. 2. Services Used 
  514.  
  515.    Aside from operating system services needed to maintain its internal    state, DASS relies on a global distributed database in which to store    its certificates, a reliable source of time, and a source of random    numbers for creating cryptographic keys. 
  516.  
  517. 2.1 Time Service 
  518.  
  519.    DASS requires access to the current time in several of its    algorithms.  Some of its uses of time are security critical.  In    others, network synchronization of clocks is required.  DASS does    not, however, depend on having a single source of time which is both    secure and tightly synchronized. 
  520.  
  521.    The requirements on system provided time are: 
  522.  
  523.     - For purposes of validating certificates and tickets, the       system needs access to know the date and time accurate to       within a few hours with no particular synchronization       requirements.  If this time is inaccurate, then valid requests       may be rejected and expired messages may be accepted.       Certificate expiration is a backup revocation mechanism, so       this can only cause a security compromise in the event of       multiple failures.  In theory, this could be provided by       having a local clock on every node accurate to within a few       hours over the life of the product to provide this function. 
  524.  
  525.  
  526.  
  527. Kaufman                                                        [Page 25] 
  528.  RFC 1507                          DASS                    September 1993 
  529.  
  530.        If an insecure network time service is used to provide this       time, there are theoretical security threats, but they are       expected to be logistically impractical to exploit. 
  531.  
  532.     - For purposes of detecting replay of authentication tokens, the       system needs access to a  strictly monotonic time source which       is reasonably synchronized across the network (within a few       minutes) for the system to work, but inaccuracy does not       present a security threat except as noted below. It may       constitute an availability threat because valid requests may       be rejected.  In order to get strict monotonicity in the       presence of a rapid series of requests, time must be returned       with high precision.  There is no requirement for a high       degree of accuracy.  Inaccurate time could present a security       threat in the following scenario: if a client's clock is made       sufficiently fast that its tokens are rejected, someone       harvesting those tokens from the wire could replay them later       and impersonate the client.  In some environments, this might       be an easier threat than harvesting tokens and preventing       their delivery. 
  533.  
  534.     - For purposes of aging stale entries from caches, DASS requires       reasonably accurate timing of intervals.  To the extent that       intervals are reported as shorter than the actually were,       revocation of certificates from the naming service may not be       as timely as it should be. 
  535.  
  536. 2.2 Random Numbers 
  537.  
  538.    In order to generate keys, DASS needs a source of "cryptographic    quality" random numbers.  Cryptographic quality means that    knowing any of the "random numbers" returned from a series and    knowing all state information which is not protected, an attacker    cannot predict any of the other numbers in the series.  Hardware    sources are ideal, but there are alternative techniques which may    also be acceptable. A 56 bit "truly random" seed (say from a    series of coin tosses) could be used as a DES key to encrypt an    infinite length known text block in CBC mode to produce a pseudo-rand    sequence provided the key and current point in the sequence were    adequately protected.  There is considerable controversy    surrounding what constitutes cryptographic quality random    numbers, and it is not a goal of this document to resolve it. 
  539.  
  540. 2.3 Naming Service 
  541.  
  542.    DASS stores creates and uses "certificates" associated with every    principal in the system, and encrypted credentials associated    with most.  This information is stored in an on-line service 
  543.  
  544.  
  545.  
  546. Kaufman                                                        [Page 26] 
  547.  RFC 1507                          DASS                    September 1993 
  548.  
  549.     associated with the principal being certified.  The long term    vision is for DASS to use an X.500 naming service, and DASS will    from its inception authenticate X.500 names.  To avoid a    dependence on having an X.500 naming service available (and to    gain the benefits of a "login agent" that controls password    guessing), an alternative certificate  distribution center    protocol is also described. 
  550.  
  551.    The specific requirements DASS places on the naming service are: 
  552.  
  553.     - It must be highly available.  A user's naming service entry       must be available to any node where the user is to obtain       services (or service will be denied).  A server's naming       service entry must be available from any node from which the       service is to be invoked (or service will be denied). 
  554.  
  555.     - It must be timely.  The presence of "stale" information in the       naming service may cause some problems.  When a password       changes, the old password may remain valid (and the new       password invalid) to the extent the naming service provides       stale information.  When a user or server is added to the       network, it will not be able to participate in authentication       until the information added to the naming service is available       at the node doing the authentication.  In the unusual       circumstance that a key changes, the entity whose key has       changed will not be able to use the new key until the new       certificate is uniformly available. 
  556.  
  557.     - It must be secure with regard to certain specific properties.       In general, the security of DASS protected applications does       not depend on the security of the naming service.  It is       expected that the availability needs of the naming service       will prevent it from being as secure as some applications need       to be.  There are two aspects of DASS security which do depend       on the security of the naming service: timely revocation of       certificates and protection of user secrets against dictionary       based password guessing. DASS depends on the removal of       certificates from the naming service in order to revoke them       more quickly than waiting for them to time out.  For this       mechanism to provide any actual security, it must not be       possible for a network entity to "impersonate" the naming       service and the naming service must be able to enforce access       controls which prevent a revoked certificate from being       reinstated by an unauthorized entity.  In the long run, it is       expected that DASS itself will be used to secure the naming       service, which presents certain potential recursion problems       (to be addressed in the naming service design).  If the naming       service is not authenticated (as is expected in early 
  558.  
  559.  
  560.  
  561. Kaufman                                                        [Page 27] 
  562.  RFC 1507                          DASS                    September 1993 
  563.  
  564.        versions) attacks where a revoked certificate is "reinstated"       through impersonation of the naming service are possible. 
  565.  
  566.    The specific functions DASS requests of the naming service are    simple: 
  567.  
  568.     - Given an X.500 name, store a set of certificates associated       with that name. 
  569.  
  570.     - Given an X.500 name, retrieve the set of certificates       associated with that name. 
  571.  
  572.     - Given an X.500 name, store a set of encrypted credentials       associated with that name. 
  573.  
  574.     - Given and X.500 name, retrieve a set of encrypted credentials       associated with that name. 
  575.  
  576.    Implementation over a particular naming service may implement more    specialized functions for reasons of efficiency.  For example, the    certificates associated with a name may be separated into several    sets (child, parent, cross, self) so that only the relevant ones may    be retrieved.  In order that access to the naming service itself be    secure, the protocols should be authenticated.  Certificates should    generally be readable without authentication in order to avoid    recursion problems.  Requests to read encrypted credentials should be    specialized and should include proof of knowledge of the password in    order that the naming service can audit and slow down false password    guesses. 
  577.  
  578.    The following sections describe the interfaces to specific naming    services: 
  579.  
  580. 2.3.1 Interface to X.500 
  581.  
  582.    Certificates associated with a particular name are stored as    attributes of the entry as specified in X.509.  X.509 defines    attributes appropriate for parent and cross certificates    (CrossCertificatePair, CACertificate) for some principals; we will    have to define a DASSUserPrincipal object class including these    attributes in order to properly use them with ordinary users.    Retrieval is via normal X.500 protocols.  Certificates should be    world readable and modifiable only by appropriate authorities. 
  583.  
  584.    Encrypted credentials are stored with the entry of the principal    under a yet to be defined attribute.  The credentials should be    encoded as specified in section 4.  In the absence of extensions to    the X.500 protocol to control password guessing, the encrypted 
  585.  
  586.  
  587.  
  588. Kaufman                                                        [Page 28] 
  589.  RFC 1507                          DASS                    September 1993 
  590.  
  591.     credentials should be world readable and updatable only by the named    principal and other appropriate authorities. 
  592.  
  593. 2.3.2 Interface to CDC 
  594.  
  595.    The CDC (Certificate Distribution Center) is a special purpose name    server created to service DASS until an X.500 service is available in    all of the environments where DASS needs to operate.  The CDC uses a    special purpose protocol to communicate with DASS clients.  The    protocol was designed for efficiency, simplicity, and security.  CDCs    use DASS as an authentication mechanism and to protect encrypted    credentials from unaudited password guessing. 
  596.  
  597.    Each DASS client maintains a list of CDCs and the portion of the    namespace served by that CDC.  Each directory has a master replica    which is the only one which will accept updates.  The CDCs maintain    consistency with one another using protocols beyond the scope of this    document.  When a DASS client wishes to make a request of a CDC, it    opens a TCP or DECnet connection to the CDC and sends an ASN.1 (BER)    encoded request and receives a corresponding ASN.1 (BER) encoded    response.  Clients are expected to learn the IP or DECnet address and    port number of the CDC supporting a particular name from a local    configuration file.  To maximize performance, the requests bundle    what would be several requests if made in terms of requests for    individual certificates.  It is intended that all certificates needed    for an authentication operation be retrievable with at most two CDC    requests/responses (one to the CDC of the client and one to the CDC    of the server). 
  598.  
  599.    Documented here is the protocol a DASS client would use to retrieve    certificates and credentials from a CDC and update a user password.    This protocol does not provide for updates to the certificate and    credential databases.  Such updates must be supported for a practical    system, but could be done either by extensions to this protocol or by    local security mechanisms implemented on nodes supporting the CDC.    Similarly, availability can be enhanced by replicating the CDC.    Automating the replication of updates could be implemented by    extensions to this protocol or by some other mechanism.  This    specification assumes that updates and replication are local matters    solved by individual CA/CDC implementations. 
  600.  
  601.    Requests and responses are encoded as follows: 
  602.  
  603. 2.3.2.1 ReadPrinCertRequest 
  604.  
  605.    This request asks the CDC to return the child certificates and    selected incoming cross certificates for the specified object.  The    format of the request is: 
  606.  
  607.  
  608.  
  609. Kaufman                                                        [Page 29] 
  610.  RFC 1507                          DASS                    September 1993 
  611.  
  612.          ReadPrinCertRequest ::= [4] IMPLICIT SEQUENCE {              flags [0] BIT STRING DEFAULT {},              index [1] IMPLICIT INTEGER DEFAULT 0,              resolveFrom [2] Name OPTIONAL,              principal Name,              crossCertIssuers ListOfIssuers OPTIONAL              }         ListOfIssuers ::= SEQUENCE OF Name 
  613.  
  614.    The first 24 bits of flags, if present, contain a protocol version    number.  Clients following this spec should place the value 2.0.0 in    the three bytes.  Servers following this spec should accept any value    of the form 1.x.x or 2.x.x.  flags bits beyond the first 24 are    reserved for future use (should not be supplied by clients and should    be ignored by servers). 
  615.  
  616.    index is only used if the response exceeds the size of a single    message; in that case, the query is repeated with index set to the    value that was returned by ReadPrinCertResponse.  resolveFrom and    principal imply a set of entities for which certificates should be    retrieved.  resolveFrom (if present) must be an ancestor of principal    and child certificates will be retrieved for principal and all names    which are ancestors of principal but descendants of resolveFrom.  The    encoding of names is per X.500 and is specified in more detail in    section 4.  The CDC returns the certificates in order of the object    they came from, parents before children. 
  617.  
  618.    crossCertIssuers is a list of cross certifiers that would be believed    in the context of this authentication.  If supplied, the CDC may    return a chain of certificates starting with one of the named    crossCertIssuers and ending with the named principal.  One of    resolveFrom or crossCertIssuers must be present in any request; if    both are present, the CDC may return either chain. 
  619.  
  620. 2.3.2.2 ReadPrinCertResponse 
  621.  
  622.    This is the response a CDC sends to a ReadPrinCertRequest.  Its    syntax is: 
  623.  
  624.         ReadPrinCertResponse ::= [5] IMPLICIT SEQUENCE {              status [0] IMPLICIT CDCstatus DEFAULT success,              index [1] INTEGER OPTIONAL,              resolveTo [2] Name OPTIONAL,              certSequence [3] IMPLICIT CertSequence,              indexInvalidator [4] OCTET STRING (SIZE(8)) OPTIONAL,              flags [5] BIT STRING OPTIONAL              }         CertSequence ::= SEQUENCE OF Certificate 
  625.  
  626.  
  627.  
  628. Kaufman                                                        [Page 30] 
  629.  RFC 1507                          DASS                    September 1993 
  630.  
  631.     status indicates success or the cause of the failure. 
  632.  
  633.    index if present indicates that the request could not be fully    satisfied in a single request because of size limitations.  The    request should be repeated with this index supplied in the request to    get more. 
  634.  
  635.    resolveTo will be present if index is present and should be supplied    in the request for more certificates.  certSequence contains    certificates found matching the search criteria. 
  636.  
  637.    indexInvalidator may be present and indicates the version of the    database being read.  If a set of certificates is being read in    multiple requests (because there were too many to return in a single    message), the reader should check that the value for indexInvalidator    is the same on each request.  If it is not, the server may have    skipped or duplicated some certificates.  This field must not be    present if the version number in the request was missing or version    1.x.x. 
  638.  
  639.    The first 24 bits of flags, if present, indicate the protocol version    number.  Implementers of this version of the spec should supply 2.0.0    and should accept any version number of the form 1.x.x or 2.x.x. 
  640.  
  641. 2.3.2.3 ReadOutgoingCertRequest 
  642.  
  643.    This requests from the CDC a list of all parent and outgoing cross    certificates for a specified object.  A CDC is capable of storing    cross certificates either with the subject or the issuer of the cross    certificate.  In response to this request, the CDC will return all    parent and cross certificates stored with the issuer for the named    principal and all of its ancestors. Its syntax is: 
  644.  
  645.         ReadOutgoingCertRequest ::= [6] IMPLICIT SEQUENCE {              flags [0] BIT STRING DEFAULT {},              index [1] IMPLICIT INTEGER DEFAULT 0,              principal Name              } 
  646.  
  647.    The first 24 bits of flags is a protocol version number and should    contain 2.0.0 for clients implementing this version of the spec.    Servers implementing this version of the spec should accept any    version number of the form 1.x.x or 2.x.x.  The remaining bits are    reserved for future use (they should not be supplied by clients and    they should be ignored by servers). 
  648.  
  649.    index is used for continuation (see ReadPrinCertRequest). 
  650.  
  651.  
  652.  
  653.  Kaufman                                                        [Page 31] 
  654.  RFC 1507                          DASS                    September 1993 
  655.  
  656.     principal is the name for which certificates are requested. 
  657.  
  658.  2.3.2.4 ReadOutgoingCertResponse 
  659.  
  660.    This is the response to a ReadOutgoingCertRequest.  Its syntax is: 
  661.  
  662.         ReadOutgoingCertResponse::= [7] IMPLICIT SEQUENCE {              status [0] IMPLICIT CDCStatus DEFAULT success,              index [1] INTEGER OPTIONAL,              certSequence [2] IMPLICIT CertSequence,              indexInvalidator [3] OCTET STRING (SIZE(8))         OPTIONAL,              flags [4] BIT STRING OPTIONAL              } 
  663.  
  664.         CertSequence ::= SEQUENCE OF Certificate 
  665.  
  666.    status indicates success of the cause of failure of the operation. 
  667.  
  668.    index is used for continuation; see ReadPrinCertRequest. 
  669.  
  670.    certSequence is the list of parent and outgoing cross certificates. 
  671.  
  672.    indexInvalidator is used for continuation; see ReadPrinCertResponse    (the same rules apply with respect to version numbers). 
  673.  
  674.    The first 24 bits of flags, if present, contain the protocol version    number.  Clients implementing this version of the spec should supply    the value 2.0.0.  Servers should accept any values of the form 1.x.x    or 2.x.x.  The remaining bits are reserved for future use (they    should not be supplied by clients and should be ignored by servers). 
  675.  
  676. 2.3.2.5 ReadCredentialRequest 
  677.  
  678.    This request is made to retrieve an principal's encrypted    credentials.  To prevent unaudited password guessing, this structure    includes an encrypted value that proves that the requester knows the    password that will decrypt the structure.  The syntax of the request    is: 
  679.  
  680.         ReadCredentialRequest ::= [2] IMPLICIT SEQUENCE {              flags [0] BIT STRING DEFAULT {}              principal Name,              logindata [2] BIT STRING DEFAULT {},              token [3] BIT STRING OPTIONAL              } 
  681.  
  682.  
  683.  
  684.  Kaufman                                                        [Page 32] 
  685.  RFC 1507                          DASS                    September 1993 
  686.  
  687.     The first 24 bits of flags contains the version number of the    protocol.  The value 2.0.0 should be supplied. Any value of the form    1.x.x or 2.x.x should be accepted. Any additional bits are reserved    for future use (should not be supplied by clients and should be    ignored by servers). 
  688.  
  689.    principal is the name of the principal for whom encrypted credentials    are desired. 
  690.  
  691.    logindata is an encrypted value.  It may only be present if the    version number is 2.0.0 or higher.  It must be present to read    credentials which are protected by the login agent functionality of    the CDC.  It is constructed as a single RSA block encrypted under the    public key of the CDC.  The public key of the CDC is learned by some    local means.  Possibilities include a local configuration file or by    using DASS to read and verify a chain of certificates ending with the    CDC [the CDC serving a directory should have its public key listed    under a name consisting of the directory name with the RDN    "CSS=X509"; the OID for the type CSS is 1.3.24.9.1].  The contents of    the block are as follows: 
  692.  
  693.     - The low order eight bytes contain a randomly generated DES key       with the last byte of the DES key placed in the last byte of       the RSA block.  This DES key will be used by the CDC to       encrypt the response.  Key parity bits are ignored. 
  694.  
  695.     - The next to last eight bytes contain a long Posix time with       the integer time encoded as a byte string using big endian       order. 
  696.  
  697.     - The next eight bytes (from the end) contain a hash of the       password.  The algorithm for computing this hash is listed in       section 4.4.2.  The CDC never computes this hash; it simply       compares the value it receives with the value associated with       the credentials. 
  698.  
  699.     - The next sixteen bytes (from the end) contain zero. 
  700.  
  701.     - The remainder of the RSA block (which should be the same size       as the public modulus of the CDC) contains a random number.       The first byte should be chosen to be non-zero but so the       value in the block does not exceed the RSA modulus.  Servers       should ignore these bits.  This random number need not be of       cryptographic strength, but should not be the same value for       all encryptions.  Repeating the DES key would be adequate. 
  702.  
  703.     - The byte string thus constructed is encrypted using the RSA       algorithm by treating the string of bytes as a "big endian" 
  704.  
  705.  
  706.  
  707. Kaufman                                                        [Page 33] 
  708.  RFC 1507                          DASS                    September 1993 
  709.  
  710.        integer and treating the integer result as "big endian" to       make a string of bytes. 
  711.  
  712.    token will not be present in the initial implementation but a space    is reserved in case some future implementation wants to authenticate    and audit the node from which a user is logging in. 
  713.  
  714. 2.3.2.6 ReadCredentialProtectedResponse 
  715.  
  716.    This is the second possible response to a ReadPrinLoginRequest.  It    is returned when the encrypted credentials are protected from    password guessing by the CDC acting as a login agent.  Its syntax is: 
  717.  
  718.    ReadCredentialProtectedResponse::=[16] IMPLICIT SEQUENCE {            status [0] IMPLICIT CDCStatus DEFAULT success,            encryptedCredential [1] BIT STRING,            flags [2] BIT STRING OPTIONAL            } 
  719.  
  720.    status indicates that the request succeeded or the cause of the    failure. 
  721.  
  722.    encryptedCredential contains the DASSPrivateKey structure (defined in    section 4.1) encrypted under a DES key computed from the user's name    and password as specified in section 4.4.2 and then reencrypted under    the DES key provided in the ReadPrinLoginRequest. 
  723.  
  724.    The first 24 bits of flags, if present, contains the version number    of the protocol.  Implementers of this version of the spec should    supply 2.0.0 and should accept any version number of the form 2.x.x.    Other bits are reserved for future use (they should not be supplied    and they should be ignored). 
  725.  
  726. 2.3.2.7 WriteCredentialRequest 
  727.  
  728.    This is a request to update the encrypted credential structure.  It    is used when a user's key or password changes.  The syntax of the    request is: 
  729.  
  730.         WriteCredentialRequest ::= [17] IMPLICIT SEQUENCE {              flags [0] BIT STRING DEFAULT {},              authtoken [2] BIT STRING OPTIONAL,              principal [3] Name,              logindata [4] BIT STRING DEFAULT {},              furtherSensitiveStuff [5] BIT STRING              } 
  731.  
  732.    The first 24 bits of flags is a version number.  Clients implementing 
  733.  
  734.  
  735.  
  736. Kaufman                                                        [Page 34] 
  737.  RFC 1507                          DASS                    September 1993 
  738.  
  739.     this version of the spec should supply 2.0.0.  Servers should accept    any value of the form 2.x.x.  Additional bits are reserved for future    use (clients should not supply them and servers should ignore them). 
  740.  
  741.    token, if present, authenticates the entity making the request.  A    request will be accepted either from a principal proving knowledge of    the password (see logindata below) or a principal presenting a token    in this field and satisfying the authorization policy of the CDC.    This field need not be present if logindata includes the hash2 of the    password (anyone knowing the old password may set a new one). 
  742.  
  743.    principal is the name of the object for which encrypted credentials    should be updated. 
  744.  
  745.    logindata is encrypted as in ReadPrinLoginRequest.  It proves that    the requester knows the old password of the principal to be updated    (unless the token supplied is from the user's CA) and includes the    key which encrypts furtherSensitiveStuff. 
  746.  
  747.    furtherSensitiveStuff is an encrypted field constructed as follows: 
  748.  
  749.     - The first eight bytes consist of the hash2 defined in section       4.4.2 with the last byte of the hash2 value stored first.  The       CDC stores this value and compares it with the values supplied       in future requests of ReadCredentialRequest and       WriteCredentialRequest. 
  750.  
  751.     - The next (variable number of) bytes contains a DASSPrivateKey       structure (defined in section 4.1).  This is the new       credential structure that will be returned by the CDC on       future ReadCredentialRequests. 
  752.  
  753.     - The result is padded with zero bytes to a multiple of eight       bytes. 
  754.  
  755.     - The entire padded string is encrypted using the key from       logindata or token using DES in CBC mode with zero IV. 
  756.  
  757.    the new eight byte "hash2" defined in section 4.4.2 concatenated with    the DASSPrivateKey structure encrypted under the new "hash1" all    encrypted under the DES key included in logindata. 
  758.  
  759. 2.3.2.8 HereIsStatus 
  760.  
  761.    This is the response message to ill-formed requests and requests that    only return a status and no data.  It's syntax is: 
  762.  
  763.  
  764.  
  765.  
  766.  
  767. Kaufman                                                        [Page 35] 
  768.  RFC 1507                          DASS                    September 1993 
  769.  
  770.          HereIsStatus ::= [1] IMPLICIT SEQUENCE {              status [0] IMPLICIT CDCStatus DEFAULT success              } 
  771.  
  772.    status indicates success or the cause of the failure. 
  773.  
  774. 2.3.2.9 Status Codes 
  775.  
  776.    The following are the CDCStatus codes that can be returned by    servers.  Not all of these values are possible with all calls, and    some of the status codes are not possible with any of the calls    described in this document. 
  777.  
  778.         CDCStatus ::= INTEGER { 
  779.  
  780.              success(0),              accessDenied(1), 
  781.  
  782.              wrongCDC(2),     --this CDC does not store the                               --requested information 
  783.  
  784.              unrecognizedCA(3),              unrecognizedPrincipal(4), 
  785.  
  786.              decodeRequestError(5),--invalid BER              illegalRequest(6),    --request not recognised 
  787.  
  788.              objectDoesNotExist(7),              illegalAttribute(8), 
  789.  
  790.              notPrimaryCDC(9),--write requests not accepted                               --at this CDC replica 
  791.  
  792.              authenticationFailure(11),              incorrectPassword(12), 
  793.  
  794.              objectAlreadyExists(13),              objectWouldBeOrphan(15), 
  795.  
  796.              objectIsPermanent(16), 
  797.  
  798.              objectIsTentative(17),              parentIsTentative(18), 
  799.  
  800.              certificateNotFound(19),              attributeNotFound(20), 
  801.  
  802.              ioErrorOnCertifDatabase(100), 
  803.  
  804.  
  805.  
  806. Kaufman                                                        [Page 36] 
  807.  RFC 1507                          DASS                    September 1993 
  808.  
  809.               databaseFull(101), 
  810.  
  811.              serverInternalError(102),              serverFatalError(103), 
  812.  
  813.              insufficientResources(104)              } 
  814.  
  815. 3. Services Provided 
  816.  
  817.    This section specifies the services provided by DASS in terms of    abstract interfaces and a model implementation.  A particular    implementation may support only a subset of these services and may    provide them through interfaces which combine functions and supply    some parameters implicitly. The specific calling interfaces are in    some cases language and operating system specific.  An actual    implementation may choose, for example, to structure interfaces so    that security contexts are established and then passed implicitly in    calls rather than explicitly including them in every call.  It might    also bundle keys into opaque structures to be used with supplied    encryption and decryption routines in order to enhance security and    modularity and better comply with export regulations. Annex B    describes a Portable API designed so that applications using a    limited subset of the capabilities of DASS can be easily ported    between operating systems and between DASS and Kerberos based    environments.  The model implementation describes data structures    which include cached values to enhance performance.  Implementations    may choose different contents or different caching strategies so long    as the same sequence of calls would produce the same output for some    caching policy. 
  818.  
  819.    DASS operates on four kinds of data structures: Certificates,    Credentials, Tokens, and Certification Authority State.  Certificates    and Tokens are passed between implementations and thus their exact    format must be architecturally specified. This detailed bit-for-bit    specification is in section 4. Credentials generally exist only    within a single node and their format is therefore not specified    here. The contents of all of these data structures is listed below    followed by the algorithms for manipulating them. 
  820.  
  821.    There are three kinds of services provided by DASS: Certificate    Maintenance, Credential Maintenance, and Authentication. The first    two kinds exist only in support of the third. Certificate maintenance    functions maintain the database of public keys in the naming service.    These functions tend to be fairly specialized and may not be    supported on all platforms. Before authentication can take place,    both authenticating principals must have constructed credentials    structures. These are built using the Credential Maintenance calls. 
  822.  
  823.  
  824.  
  825. Kaufman                                                        [Page 37] 
  826.  RFC 1507                          DASS                    September 1993 
  827.  
  828.     The Authentication functions use credential information and    certificates, produce and consume authentication tokens and tell the    two communicating parties one another's names. 
  829.  
  830. 3.1 Certificate Contents 
  831.  
  832.    For purposes of this architecture, a certificate is a data structure    posted in the naming service which proclaims that knowledge of the    private key associated with a stated public key authenticates a named    principal. Certificates are "signed" by some authority, are readable    by anyone, and can be verified by anyone knowing the public key of    the authority.  DASS organizes the CA trust hierarchy around the    naming hierarchy. There exists a trusted authority associated with    each directory in the naming hierarchy. Generally, each authority    creates certificates stating the public keys of each of its children    (in the naming hierarchy) and the public key of its parent (in the    naming hierarchy). In this way, anyone knowing the public key of any    authority can learn the public key of any other by "walking the    tree". In order that principals may authenticate even when all of    their ancestor directories do not participate in DASS, authorities    may also create "cross-certificates" which certify the public key of    a named entity which is not a descendent.  Rules for finding and    following these cross-certificates are described in the Get_Pub_Keys    routines.  Every principal is expected to know the public key of the    CA of the directory in which it is named. This must be securely    learned when the principal is initialized and may be maintained in    some form of local storage or by having the principal sign a    certificate listing the name and public key of its parent and posting    that certificate in the naming service. 
  833.  
  834.    The syntax and content of DASS certificates are defined in terms of    X.509 (Directory - Authentication Framework).  While that standard    prescribes a single syntax for certificates, DASS considers    certificates to be of one of six types: 
  835.  
  836.     - Normal Principal certificates are signed by a CA and certify       the name and public key of a principal where the name of the       CA is a prefix of the name of the principal and is one       component shorter. 
  837.  
  838.     - Trusted Authority certificates are signed by an ordinary       principal and certify the name and public key of the       principal's CA (i.e., the CA whose name is a prefix of the       principal's name and is one component shorter). 
  839.  
  840.     - Child certificates are signed by a CA and certify the name and       public key of a CA of a descendent directory (i.e., where the       name of the issuing CA is a prefix of the name of the subject 
  841.  
  842.  
  843.  
  844. Kaufman                                                        [Page 38] 
  845.  RFC 1507                          DASS                    September 1993 
  846.  
  847.        CA and is one component shorter). 
  848.  
  849.     - Parent certificates are signed by a CA and certify the name       and public key of the CA of its parent directory (i.e., whose       name is a prefix of the name of the issuer and is one       component shorter). 
  850.  
  851.     - Cross certificates are signed by a CA and certify the name and       public key of a CA of a directory where neither name is a       prefix of the other. 
  852.  
  853.     - Self certificates are signed by a principal or a CA and the       issuer and subject name are the same.  They are not used in       this version of the architecture but are defined as a       convenient data structure in which in which implementations       may insecurely pass public keys and they may be used in the       future in certain key roll-over procedures. 
  854.  
  855.    It is intended that some future version of the architecture relax the    restrictions above where prefixes must be one component shorter.    Being able to handle certificates where prefixes are two or more    components shorter complicates the logic of treewalking somewhat and    is not immediately necessary, so such certificates are disallowed for    now. 
  856.  
  857.    The syntax of certificates is defined in section 4. For purposes of    the algorithms which follow, the following is the portion of the    content which is used (names in brackets refer to the field names in    the ASN.1 encoded structure): 
  858.  
  859.     - UID of the issuer (optional) 
  860.  
  861.     - Full name of the issuer (the authority or principal signing)       [issuer] 
  862.  
  863.     - UID of the subject (optional) 
  864.  
  865.     - Full name of the subject (the authority or principal whose key       is being certified) [subject] 
  866.  
  867.     - Public Key of the subject [subjectPublicKey] 
  868.  
  869.     - Period of validity (effective date and expiration date)       [valid] 
  870.  
  871.     - Signature over the entire content of the certificate created       using the private key of the issuer. 
  872.  
  873.  
  874.  
  875.  Kaufman                                                        [Page 39] 
  876.  RFC 1507                          DASS                    September 1993 
  877.  
  878.     When parsing a certificate, the reader compares the two name fields    to determine what type of certificate it is. For Parent and Trusted    Authority certificates, the names are ignored for purposes of all    further processing. For Child and Normal Principal certificates, only    the suffix by which the child's name is longer than the parent's is    used for further processing. The reason for this is so that if a    branch of the namespace is renamed, all of the certificates in the    moved branch remain valid for purposes of DASS processing. The only    purposes of having full names in these certificates are (1) to comply    with X.509, (2) for possible interoperability with other    architectures using different algorithms, and (3) to allow principals    to securely store their own names in trusted authority certificates    in the case where they do not have enough local storage to keep it. 
  879.  
  880. 3.2 Encrypted Private Key Structure 
  881.  
  882.    In order that humans need only remember a password rather than a full    set of credentials, and also to make installation of nodes and    servers easier, there is a defined format for encrypting RSA secrets    under a password and posting in the naming service. This structure    need only exist when passwords are used to protect RSA secrets; for    servers which keep their secrets in non-volatile memory or users who    carry smart cards, they are unnecessary. 
  883.  
  884.    This structure includes the RSA private/public key pair encrypted    under a DES key. The DES key is computed as a one-way hash of the    password.  This structure also optionally includes the UID of the    principal.  It is needed only if a single RSA key is shared by    multiple principals (with multiple UIDs). 
  885.  
  886.    Since this structure is posted in the name service and may be used by    multiple implementations, its format must be architecturally defined.    The exact encoding is listed in section 4. 
  887.  
  888. 3.3 Authentication Tokens 
  889.  
  890.    This section of the document defines the contents of the    authentication tokens which are produced and consumed by Create_token    and Accept_token. With DASS, the token passed from the client to the    server is complex, with a large number of optional parts, while the    token passed from server to client (in the case of mutual    authentication only) is small and simple. 
  891.  
  892.    The authentication token potentially contains a large number of    parts, most of which are optional depending on the type of    authentication. The following defines the content and purpose of each    of the parts, but does not describe the actual encoding (in the    belief that such details would be distracting). The encoding is in 
  893.  
  894.  
  895.  
  896. Kaufman                                                        [Page 40] 
  897.  RFC 1507                          DASS                    September 1993 
  898.  
  899.     section 4. 
  900.  
  901.    The authentication process begins when the initiator calls    Create_token with the name of the target. This routine returns an    authentication token, which is sent to the target. The target calls    Accept_token passing it the token. Both routines produce a second    "mutual authentication token". The target returns this to the    initiator to prove that it received the token. 
  902.  
  903. 3.3.1 Initial Authentication Token 
  904.  
  905.    The components of the initial authentication token are (names in    brackets refer to the field names within the ASN.1 encoded structures    defined in section 4): 
  906.  
  907.     a) Encrypted Shared Key - [authenticatingKey] - This is a Shared        (DES) key encrypted under the public key of the target. Also        included in the encrypted structure is a validity interval and        a recognizable pattern so that the receiver can tell whether        the decryption was successful. 
  908.  
  909.     b) Login Ticket - [sourcePrincipal.userTicket] - This is a        "delegation certificate" signed by a principal's long term        private key delegating to a short term public key. Its "active        ingredients" are: 
  910.  
  911.       1) UID of delegating principal [subjectUID] 
  912.  
  913.       2) Period of validity [validity] 
  914.  
  915.       3) Delegation public key [delegatingPublicKey] 
  916.  
  917.       4) Signature by private key of principal          The existence of this signature is testimony that the          private key corresponding to the delegation public key          speaks for the user during the validity interval.          This data structure is optional and will be missing if the          authentication is only on behalf of a Local Username on a          node (i.e., proxy) rather than on behalf of a real principal          with a real key. 
  918.  
  919.     c) Shared Key Ticket - [sourcePrincipal.sharedKeyTicketSignature]        - This is a signature of the Encrypted Shared Key by the        Delegation Public key in the Login Ticket.  The existence of        this signature is testimony that  the DES key in the encrypted        shared key speaks for the user. 
  920.  
  921.        This data structure is optional and will be missing if the 
  922.  
  923.  
  924.  
  925. Kaufman                                                        [Page 41] 
  926.  RFC 1507                          DASS                    September 1993 
  927.  
  928.         authentication is only on behalf of a Local Username on a node        (i.e., proxy) rather than on behalf of a real principal with a        real key. It will also be missing if delegation is taking        place. 
  929.  
  930.     d) Node Ticket - [sourceNode.nodeTicketSignature] - This is a        signature of the Encrypted Shared key and a "Local Username"        on the host node by the node's private key.  The existence of        this signature is testimony by the node that the DES key in        the encrypted shared key speaks for the named account on that        node. 
  931.  
  932.     e) Delegator - [sourcePrincipal.delegator] - This data structure        contains the private login key encrypted under the Shared key.        It is optional and is present only if the initiator is        delegating to the destination. 
  933.  
  934.     f) Authenticator - [authenticatorData] - This data structure        contains a timestamp and a message digest of the channel        bindings signed by the Shared Key. It is always present. 
  935.  
  936.     g) Principal name - [sourcePrincipal.userName] - This is the name        of the initiating principal. It is optional and will be        missing for strong proxy where bits on the wire are at a        premium and where the destination is capable of independently        constructing the name. 
  937.  
  938.     h) Node name - [sourceNode.nodeName] - This is the name of the        initiating node. It is optional and will be missing for strong        proxy where bits on the wire are at a premium and the name is        present elsewhere in the message being passed. 
  939.  
  940.     i) Local Username - [sourceNode.username] - This is the local        user name on the initiating node. It is optional and will be        missing for strong proxy where bits on the wire are at a        premium and where the name is present elsewhere in the message        being passed. 
  941.  
  942. 3.3.2 Mutual Authentication Token 
  943.  
  944.    The authentication buffer sent from the target to the initiator (in    the case of mutual authentication) is much simpler. It contains only    the timestamp taken from the authenticator encrypted under the Shared    Key.  It is ASN.1 encoded to allow for future extensions. 
  945.  
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952. Kaufman                                                        [Page 42] 
  953.  RFC 1507                          DASS                    September 1993 
  954.  
  955.  3.4 Credentials 
  956.  
  957.    DASS organizes its internal state with Credentials structures.  There    are many kinds of information which can be stored in credentials.    Rather than making a different kind of data structure for each kind    of data, DASS provides a single credentials structure where most of    its fields are optional.  Operating systems must provide some    mechanism for having several processes share credentials. An example    of a mechanism for doing this would be for credentials to be stored    in a file and the name of the file is used as a "handle" by all    processes which use those credentials. Some of the calls which follow    cause credentials structures to be updated. It is important to the    performance of a system that updates to credentials (such as occur    during the routines Verify_Principal_Name and Verify_Node_Name, where    the caches are updated) be visible to all processes sharing those    credentials. 
  958.  
  959.    In many of the calls which follow, the credentials passed may be    labeled: claimant credentials, verifier credentials or some such.    This indicates whose credentials are being passed rather than a type    of credentials. DASS supports only one type of credentials, though    the fields present in the credentials of one sort of principal may be    quite different from those present in the credentials of another. 
  960.  
  961.    An implementation may choose to support multiple kinds of credentials    structures each of which will support only a subset of the functions    available if it is not implementing the full architecture.  This    would be the case, for example, if an implementation did not support    the case where a server both received requests from other principals    and made requests on its own behalf using a single set of    credentials. 
  962.  
  963.    The following are a list of the fields that may be contained in a    credentials structure. They are grouped according to common usage. 
  964.  
  965. 3.4.1 Claimant information 
  966.  
  967.    This is the information used when the holder of these credentials is    requesting something. It includes: 
  968.  
  969.     a) Full X.500 name of the principal 
  970.  
  971.     b) Public Key of the principal 
  972.  
  973.     c) Login Ticket - a login ticket contains: 
  974.  
  975.       1) the UID of the principal 
  976.  
  977.  
  978.  
  979.  Kaufman                                                        [Page 43] 
  980.  RFC 1507                          DASS                    September 1993 
  981.  
  982.        2) a period of validity (effective date & expiration date) 
  983.  
  984.       3) a delegation public key 
  985.  
  986.       4) a signature of the ticket contents by the principal's long          term key 
  987.  
  988.     d) Delegation Private Key (corresponding to the public key in c3) 
  989.  
  990.     e) Encrypted Shared Key (present only when credentials were        created by accept_token; this information is needed to verify        a node ticket after credentials are accepted) 
  991.  
  992. 3.4.2 Verifier information 
  993.  
  994.    This is the information needed by a server to decrypt incoming    requests. It is also used by generate_server_ticket to generate a    login ticket. 
  995.  
  996.     a) RSA private key. 
  997.  
  998. 3.4.3 Trusted Authority 
  999.  
  1000.    This is information used to seed the walk of the CA hierarchy to    reliably find the public key(s) associated with a name.    Normally, the trusted authority in a set of credentials will be    the directory parent of the principal named in Claimant    information.  In some circumstances, it may instead be the    directory parent of the node on which the credentials reside. 
  1001.  
  1002.     a) Full X.500 name of a CA 
  1003.  
  1004.     b) Corresponding RSA Public Key 
  1005.  
  1006.     c) Corresponding UID 
  1007.  
  1008. 3.4.4 Remote node authentication 
  1009.  
  1010.    This information is present only for credentials generated by    "Accept_token". It includes information about any remote node which    vouched for the request. 
  1011.  
  1012.     a) Full X.500 name of the node 
  1013.  
  1014.     b) Local Username on the node 
  1015.  
  1016.     c) Node ticket. 
  1017.  
  1018.  
  1019.  
  1020.  Kaufman                                                        [Page 44] 
  1021.  RFC 1507                          DASS                    September 1993 
  1022.  
  1023.  3.4.5 Local node credentials 
  1024.  
  1025.    This information is added by Combine_credentials, and is used by    Create_token to add a node signature to outbound requests. 
  1026.  
  1027.     a) Full X.500 name of the node 
  1028.  
  1029.     b) Local Username on the node 
  1030.  
  1031.     c) RSA private key of the node 
  1032.  
  1033. 3.4.6 Cached outgoing contexts 
  1034.  
  1035.    There may be one (or more) such structures for each server for which    this principal has created authentication tokens. These represent a    cache: they may be discarded at any time with no effect except on    performance. For each association, the following information is kept: 
  1036.  
  1037.     a) Destination RSA Public Key (index) 
  1038.  
  1039.     b) Encrypted Shared key 
  1040.  
  1041.     c) Shared Key Ticket (optional, included if there has been a        non-delegating connection) 
  1042.  
  1043.     d) Node Ticket 
  1044.  
  1045.     e) Delegator (optional, included if there has been a delegating        connection) 
  1046.  
  1047.     f) Validity interval 
  1048.  
  1049.     g) Shared Key 
  1050.  
  1051. 3.4.7 Cached Incoming Contexts 
  1052.  
  1053.    There may be one such structure for each client from which this server    has received an authentication token.  These represent a cache: they    may be discarded at any time with no effect except on performance. (An    implementation may choose to keep one System-wide Cache (and list of    incoming timestamps). While it is unlikely that the same Encrypted    Shared Key will result from encryption of Shared keys generated by    different clients or for different servers, an implementation must    ensure that an entry made for one client/server can not be reused by    another client/server.  Similarly an implementation may choose to keep    separate caches for the Shared Key/Validity Interval/Delegation Public    Key, the Nodename/UID/key/username and the Principal name/UID/key.)    For each association, the following information is kept: 
  1054.  
  1055.  
  1056.  
  1057. Kaufman                                                        [Page 45] 
  1058.  RFC 1507                          DASS                    September 1993 
  1059.  
  1060.      a) Encrypted Shared key (index) 
  1061.  
  1062.     b) Shared Key 
  1063.  
  1064.     c) Validity Interval 
  1065.  
  1066.     d) Full X.500 name of Client Principal 
  1067.  
  1068.     e) UID of Client Principal 
  1069.  
  1070.     f) Public Key of Client Principal 
  1071.  
  1072.     g) Name of Client Node 
  1073.  
  1074.     h) UID of Client Node 
  1075.  
  1076.     i) Public Key of Client Node 
  1077.  
  1078.     j) Local Username on Client node 
  1079.  
  1080.     k) Delegation Public key of Client Principal's Login Ticket 
  1081.  
  1082.    The Name, UID and Public key of the Principal are all entered    together once the Login Ticket has been verified. Similarly the Node    name, Node key and Username are entered together once the Node Ticket    has been verified. These pieces of information are only present if    they have been verified. 
  1083.  
  1084. 3.4.8 Received Authenticators 
  1085.  
  1086.    A record of all the authenticators received is kept. This is used to    detect replayed messages. (This list must be common to all targets    that could accept the same authenticator (channel bindings will    prevent other targets from accepting the same authenticator). This    includes different `servers' sharing the same key.)  The entries in    this list may be deleted when the timestamp is old enough that they    would no longer be accepted. This list is kept separate from the    Cached incoming context in order that the information in the cached    incoming context can be discarded at any time. An implementation    could choose to save these timestamps with the cached incoming    context if it ensures that it can never purge entries from the cache    before the timestamp has aged sufficiently. This list is accessed    based on an extract from the signature from the Authenticator. The    extract must be at least 64 bits, to ensure that it is very unlikely    that 2 authenticators will be received with matching signatures. 
  1087.  
  1088.     a) Extract from Signature from Authenticator 
  1089.  
  1090.  
  1091.  
  1092.  Kaufman                                                        [Page 46] 
  1093.  RFC 1507                          DASS                    September 1993 
  1094.  
  1095.      b) Timestamp 
  1096.  
  1097.    If an implementation runs out of space to store additional    authenticators, it may either reject the token which would have    overflowed the table or it may temporarily narrow the allowed clock    skew to allow it to free some of the space used to hold "old"    authenticators.  The first strategy will always falsely reject    tokens; the second may cause false rejection of tokens if the allowed    clock skew gets narrowed beyond the actual clock skew in the network. 
  1098.  
  1099. 3.5 CA State 
  1100.  
  1101.    The CA needs to maintain some internal state in order to generate    certificates. This internal state must be protected at all times, and    great care must be taken to prevent its being disclosed. A CA may    choose to maintain additional state information in order to enhance    security.  In particular, it is the responsibility of the CA to    assure that the same UID is not serially reused by two holders of a    single name.  In most cases, this can be done by creating the UID at    the time the user is registered.  To securely permit users to keep    their UIDs when transferring from another CA, the CA must keep a    record of any UIDs used by previous holders of the name. Since    actions of a CA are so security sensitive, the CA should also    maintain an audit trail of all certificates signed so that a history    can be reconstructed in the event of a compromise.  Finally, for the    convenience of the CA operator, the CA should record a list of the    directories for which it is responsible and their UIDs so that these    need not be entered whenever the CA is to be used.  The state    includes at least the following information: 
  1102.  
  1103.     - Public Key of CA 
  1104.  
  1105.     - Private Key of CA 
  1106.  
  1107.     - Serial number of next certificate to be issued 
  1108.  
  1109. 3.6 Data types used in the routines 
  1110.  
  1111.    There are several abstract data types used as parameters to the    routines described in this section. These are listed here 
  1112.  
  1113.     a) Integer 
  1114.  
  1115.     b) Name        Names unless otherwise noted are always X.500 names.  While        most of the design of DASS is naming service independent, the        syntax of certificates and tokens only permits X.500 names to        be used.  If DASS is to be used in an environment where some 
  1116.  
  1117.  
  1118.  
  1119. Kaufman                                                        [Page 47] 
  1120.  RFC 1507                          DASS                    September 1993 
  1121.  
  1122.         other form of name is used, those names must be translated        into something syntactically compliant with X.500 using some        mechanism which is beyond the scope of this architecture.  The        only other form of name appearing in this architecture is a        "local user name", which corresponds to the simple name of an        "account" on a node.  As a type, such names appear in        parameter lists as "Strings". 
  1123.  
  1124.     c) String        A String is a sequence of printable characters. 
  1125.  
  1126.     d) Absolute Time        A UTC time. The precision of these Times is not stated. A        precision of the order of one second in all times is        sufficient. 
  1127.  
  1128.     e) Time Interval        A Time interval is composed of 2 times. A Start Time and an        End Time, both of which are Absolute Times 
  1129.  
  1130.     f) Timestamp        A Timestamp is a time in POSIX format. I.e., two 32 bit        Integers. The first representing seconds, and the second        representing nanoseconds. 
  1131.  
  1132.     g) Duration        A Duration is the length of a time interval. 
  1133.  
  1134.     h) Octet String        A sequence of bytes containing binary data 
  1135.  
  1136.     i) Boolean        A value of either True or False 
  1137.  
  1138.     j) UID        A UID is an bit string of 128 bits. 
  1139.  
  1140.     k) OID        An OID is an ISO Object Identifier. 
  1141.  
  1142.     l) Shared key        A Shared key is a DES key, a sequence of 8 bytes 
  1143.  
  1144.     m) CA State        A structure of the form described in '3.5 
  1145.  
  1146.     n) Credentials        A structure of the form described in '3.4 
  1147.  
  1148.  
  1149.  
  1150. Kaufman                                                        [Page 48] 
  1151.  RFC 1507                          DASS                    September 1993 
  1152.  
  1153.      o) Certificate        An ASN.1 encoding of the structure described in '3.1 
  1154.  
  1155.     p) Authentication Token        An ASN.1 encoding of the structure described in '3.3.1 
  1156.  
  1157.     q) Mutual Authentication Token        An ASN.1 encoding of the structure described in '3.3.2 
  1158.  
  1159.     r) Encrypted Credentials        An ASN.1 encoding of  the  structure described in '3.2 
  1160.  
  1161.     s) Public key        A representation of an RSA Public key, including all the        information needed to encode the public key in a certificate. 
  1162.  
  1163.     t) Set of Public key/UID pairs        A set of Public key/UID pairs. This Data type is only used        internally in DASS - it does not appear in any interface used        to other architectures. 
  1164.  
  1165. 3.7 Error conditions 
  1166.  
  1167.    These routines can return the following error conditions (an    implementation may indicate errors with more or less precision): 
  1168.  
  1169.     a) Incomplete chain of trustworthy CAs 
  1170.  
  1171.     b) Target has no keys which can be trusted. 
  1172.  
  1173.     c) Invalid Authentication Token 
  1174.  
  1175.     d) Login Ticket Expired 
  1176.  
  1177.     e) Invalid Password 
  1178.  
  1179.     f) Invalid Credentials 
  1180.  
  1181.     g) Invalid Authenticator 
  1182.  
  1183.     h) Duplicate Authenticator 
  1184.  
  1185. 3.8 Certificate Maintenance Functions 
  1186.  
  1187.    Authentication services depend on a set of data structures maintained    in the naming service. There are two kinds of information:    Certificates, which associate names and public keys and are signed by    off-line Certification Authorities; and Encrypted Credentials, which 
  1188.  
  1189.  
  1190.  
  1191. Kaufman                                                        [Page 49] 
  1192.  RFC 1507                          DASS                    September 1993 
  1193.  
  1194.     contain RSA Private Keys and certain context information encrypted    under passwords. Encrypted Credentials are only necessary in    environments where passwords are used. Credentials may alternatively    be stored in some other secure manner (for example on a smart card). 
  1195.  
  1196.    The certificate maintenance services are designed so that the most    sensitive - the actual signing of certificates - may be done by an    off-line authority.  Once signed, certificates must be posted in the    naming service to be believed.  The precise mechanisms for moving    certificates between off-line CAs and the on-line naming service are    implementation dependent.  For the off-line mechanisms to provide any    actual security, the CAs must be told what to sign in some reliable    manner.  The mechanisms for doing this are implementation dependent.    The abstract interface says that the CA is given all of the    information that goes into a certificate and it produces the signed    certificate.  There are requirements surrounding the auditing of a    CA's actions. The details of what actions are audited, where the    audit trail is maintained, and what utilities exist to search that    audit trail are not specified here. The functions a CA must provide    are: 
  1197.  
  1198. 3.8.1 Install CA 
  1199.  
  1200.    Install_CA(                        keysize               Integer,   --inputs                        CA_state              CA State,  --outputs                        CA_Public_Key         Public Key) 
  1201.  
  1202.    This routine need only generate a public/private key pair of the    requested size. Keysize is likely to be in implementation constant    rather than a parameter.  The value is likely to be either 512 or    640.  Key sizes throughout will have to increase over time as    factoring technology and CPU speeds improve.  Both keys are stored as    part of the CA_state; the public key is returned so that other CAs    may cross-certify this one. The `Next Serial number' in the CA state    is set to 1. 
  1203.  
  1204. 3.8.2 Create Certificate 
  1205.  
  1206.    Create_certificate(                                                     --inputs                        Renewal               Boolean,                        Include_UID           Boolean,                        Issuer_name           Name,                        Issuer_UID            UID,                        Effective_date        Absolute Time,                        Expiration_date       Absolute Time,                        Subject_name          Name, 
  1207.  
  1208.  
  1209.  
  1210. Kaufman                                                        [Page 50] 
  1211.  RFC 1507                          DASS                    September 1993 
  1212.  
  1213.                         Subject_UID           UID,                        Subject_public_key    Public Key,                                                     --updated                        CA_state              CA State,                                                     --outputs                        Certificate           Certificate) 
  1214.  
  1215.    This procedure creates and signs a certificate.  Note that the    various contents of the certificate must be communicated to the CA in    some reliable fashion.  The Issuer_name and UID are the name and UID    of the directory on whose behalf the certificate is being signed. 
  1216.  
  1217.    This routine formats and signs a certificate with the private key in    CA_state. It audits the creation of the certificate and updates the    sequence number which is part of CA_state. The Issuer and Subject    names are X.500 names.  If the CA state includes a history of what    UIDs have previously been used by what names, this call will only    succeed in the collision case if the Renewal boolean is set true.  If    the Include_UID boolean is set true, this routine will generate a    1992 format X.509 certificate; otherwise it will generate a 1988    format X.509 certificate. 
  1218.  
  1219. 3.8.3 Create Principal 
  1220.  
  1221.    Create_principal(                                                     --inputs                        Password              String,                        keysize               Integer,                        Principal_name        Name,                        Principal_UID         UID,                        Parent_Public_key     Public Key,                        Parent_UID            UID,                                                     --outputs                        Encrypted_Credentials Encrypted Credentials,                        Trusted_authority_certificate Certificate) 
  1222.  
  1223.    This procedure creates a new principal by generating a new    public/private key pair, encrypting the public and private keys under    the password, and signing a trusted authority certificate for the    parent CA.  In an implementation not using passwords (e.g., smart    cards), an alternative mechanism must be used for initially creating    principals.  If a principal has protected storage for trusted    authority information, it is not necessary to create a trusted    authority certificate and store it in the naming service.  Some    procedure analogous to this one must be executed, however, in which    the principal learns the public key and UID of its CA and its own    name. 
  1224.  
  1225.  
  1226.  
  1227.  Kaufman                                                        [Page 51] 
  1228.  RFC 1507                          DASS                    September 1993 
  1229.  
  1230.     This routine creates two output structures with the following steps: 
  1231.  
  1232.     a) Generate a public/private key pair using the indicated        keysize. An implementation will likely fix the keysize as an        implementation constant, most likely 512 or 640 bits, rather        than accepting it as a parameter.  Key sizes generally will        have to increase over time as factoring technology and CPU        speeds improve. 
  1233.  
  1234.     b) Form the encrypted credentials by using the public key,        private key, and Principal_UID and encrypting them using a        hash of the password as the key. 
  1235.  
  1236.     c) Generate a trusted authority certificate (which is identical        in format to a "parent" certificate) getting fields as        follows: 
  1237.  
  1238.       1) Certificate version is X.509 1992. 
  1239.  
  1240.       2) Issuer name is the Principal name (which is an X.500 name). 
  1241.  
  1242.       3) Issuer UID is the Principal UID. 
  1243.  
  1244.       4) Validity is for all time. 
  1245.  
  1246.       5) Subject name is constructed from the Principal name by          removing the last simple name from the hierarchical name. 
  1247.  
  1248.       6) Subject UID is the CA_UID. 
  1249.  
  1250.       7) Subject Public Key is the CA_Public_Key 
  1251.  
  1252.       8) Sequence number is 1. 
  1253.  
  1254.       9) Sign the certificate with the newly generated private key of          the principal. 
  1255.  
  1256. 3.8.4 Change Password 
  1257.  
  1258.    Change_password(                                 --inputs                        Encrypted_credentials Encrypted Credentials,                        Old_password          String,                        New_password          String,                                                     --outputs                        Encrypted_credentials Encrypted Credentials) 
  1259.  
  1260.    If credentials are stored encrypted under a password, it is possible    to change the password if the old one is known.  Note that it is 
  1261.  
  1262.  
  1263.  
  1264. Kaufman                                                        [Page 52] 
  1265.  RFC 1507                          DASS                    September 1993 
  1266.  
  1267.     insufficient to just change a user's password if the password has    been disclosed.  Anyone knowing the old password may have already    learned the user's private key.  If a password has been disclosed,    the secure recovery procedure is to call create_principal again    followed by create_certificate to certify the new key. 
  1268.  
  1269.    Using DASS, it may not be appropriate for users to periodically    change their passwords as a precaution unless they also change their    private keys by the procedure above.  The only likely use of the    change_password procedure is to handle the case where an    administrator has chosen a password for the user in the course of    setting up the account and the user wishes to change it to something    the user can remember.  A future version of the architecture may    smooth key roll-over by having the change_password command also    generate a new key and sign a "self" certificate in which the old key    certifies the new one.  As a separate step, a CA which notices a self    certificate posted in the naming service could certify the new key    instead of the old one when the user's certificate is renewed.  While    this procedure is not as rapid or as reliable as having the user    directly interact with the CA, it offers a reasonable tradeoff    between security and convenience when there is no evidence of    password compromise. 
  1270.  
  1271.    This routine simply decrypts the encrypted credentials structure    supplied using the password supplied. It returns a bad status if the    format of the decrypted information is bad (indicating an incorrect    password). Otherwise, it creates a new encrypted credentials    structure by encrypting the same data with the new password. It would    be highly desirable for the user interface to this function to    provide the capability to randomly generate passwords and prohibit    easily guessed user chosen passwords using length, character set, and    dictionary lookup rules, but such capabilities are beyond the scope    of this document.  If encrypted credentials are stored in some local    secure storage, the above function is all that is necessary (in fact,    if the storage is sufficiently secure, no password is needed;    credentials could be stored unenciphered).  If they are stored in a    naming service, this function must be coupled with one which    retrieves the old encrypted credentials from the naming service and    stores the new.  The full protocol is likely to include access    control checks that require the principal to acquire credentials and    produce tokens.  For best security, the encrypted credentials should    be accessible only through a login agent.  The role of the login    agent is to audit and limit the rate of password guessing.  If    passwords are well chosen, there is no significant threat from    password guessing because searching the space is computationally    infeasible.  In the context of a login agent, change password will be    implemented with a specialized protocol requiring knowledge of the    password and (for best security) a trusted authority from which the 
  1272.  
  1273.  
  1274.  
  1275. Kaufman                                                        [Page 53] 
  1276.  RFC 1507                          DASS                    September 1993 
  1277.  
  1278.     public key of the login agent can be learned.  See section 2.3.2 for    the plans for the non-X.500 credential storage facility. 
  1279.  
  1280. 3.8.5 Change Name 
  1281.  
  1282.    Change_name(                                                     --inputs                        Claimant_Credentials  Credentials,                        New_name              Name,                        CA_Public_Key         Public Key,                        CA_UID                UID,                                                     --outputs                        Trusted_Authority_Certificate Certificate) 
  1283.  
  1284.    DASS permits a principal to have many current aliases, but only one    current name.  A principal can authenticate itself as any of its    aliases but verifies the names of others relative to the name by    which it knows itself.  Aliases can be created simply by using the    create_certificate function once for each alias.  To change the name    of a principal, however, requires that the principal securely learn    the public key and UID of its new parent CA.  As with    create_principal, if a principal has secure private storage for its    trusted authority information, it need not create a certificate, but    some analogous procedure must be able to install new naming    information. 
  1285.  
  1286.    This routine produces a new Trusted Authority Certificate with    contents as follows: 
  1287.  
  1288.     a) Issuer name is New_name (an X.500 name) 
  1289.  
  1290.     b) Issuer_UID is Principal UID from Credentials. 
  1291.  
  1292.     c) Validity is for all time. 
  1293.  
  1294.     d) Subject name is constructed from the Issuer name by removing        the last simple name from the hierarchical name, and        converting to an X.500 name. 
  1295.  
  1296.     e) Subject UID is CA_UID 
  1297.  
  1298.     f) Subject Public Key is CA_Public_Key 
  1299.  
  1300.     g) Sequence number is 1. 
  1301.  
  1302.     h) The certificate is signed with the private key of the        principal from the credentials. Note that this call will only        succeed if the principal's private key is in the credentials, 
  1303.  
  1304.  
  1305.  
  1306. Kaufman                                                        [Page 54] 
  1307.  RFC 1507                          DASS                    September 1993 
  1308.  
  1309.         which will only be true if the credentials were created by        calling Create_server_credentials. 
  1310.  
  1311. 3.9 Credential Maintenance Functions 
  1312.  
  1313.    DASS credentials can potentially have information about two    principals.  This functionality is included to support the case    where a user on a node has two identities that might be    recognized for purposes of managing access controls.  First,    there is the user's network identity; second, there is an    identity as controlling a particular "account" or "username" on    that node.  There are two reasons for recognizing this second    identity: first, access controls might be specified such that    only a user is only permitted access to certain resources when    coming through certain trusted nodes (e.g., files that can't be    accessed from a terminal at home); and second, before the    transition strategy to global identities is complete, as a way to    refer to USER@NODE in a way analogous to existing mechanisms but    with greater security. 
  1314.  
  1315.    The mapping of global usernames to local user names on a node is    outside the scope of DASS.  This is done via a "proxy database"    or some analogous local mechanism.  What DASS provides are    mechanisms for adding node oriented credentials into a user's    credentials structure, carrying the dual authentication    information in authentication tokens, and extracting the    information from the credentials structure created by    Accept_token. 
  1316.  
  1317.    Some applications of DASS will not make use of the node    authentication related extensions.  In that case, they will never    use the Combine_credentials, Create_credentials, Get_node_info,    or Verify_node_name functions. 
  1318.  
  1319.    The "normal" sequence of events surrounding a user logging into a    node are as follows: 
  1320.  
  1321.     a) When the user logs in, he types either a local user ID known        to the node or a global name (the details of the user        interface are implementation specific).  Through some sort of        local mapping, the node determines both a global name and a        local account name.  The user also enters a password        corresponding to the global name. 
  1322.  
  1323.     b) The node calls network_login specifying the user's global name        and the supplied password.  The result is credentials which        can be used to access network services but which have not yet        been verified to be valid. 
  1324.  
  1325.  
  1326.  
  1327. Kaufman                                                        [Page 55] 
  1328.  RFC 1507                          DASS                    September 1993 
  1329.  
  1330.      c) The node calls verify_principal_name using its own credentials        to verify the authenticity of the user's credentials (these        node credentials must have previously been established by a        call to initialize_server during node initialization). 
  1331.  
  1332.     d) If that test succeeds, the node adds its credentials to those        of the user by calling combine_credentials. 
  1333.  
  1334.    The set of facilities for manipulating credentials follow: 
  1335.  
  1336. 3.9.1 Network login 
  1337.  
  1338.    Network_login(                                                     --inputs                        Name                  Name,                        password              String,                        keysize               Integer,                        expiration            Time interval,                        TA_credentials        Credentials,--optional                                                     --outputs                        Claimant_credentials  Credentials) 
  1339.  
  1340.    This function creates credentials for a principal when the principal    "logs into the network". 
  1341.  
  1342.    Name is the X.500 name of the principal. 
  1343.  
  1344.    Password is a secret which authenticates the principal to the    network. 
  1345.  
  1346.    Keysize specifies the size of the temporary "login" or "delegation"    key.  In a real implementation, it is expected to be an    implementation constant (most likely 384 or 512 bits). 
  1347.  
  1348.    Expiration sets a lifetime for the credentials created.  For a normal    login, this is likely to be an implementation constant on the order    of 8-72 hours.  Some mechanism for overriding it must be provided to    make it possible (for example) to submit a background job that might    run days or even months after they are submitted. 
  1349.  
  1350.    TA_credentials   are used if the encrypted credentials are protected    by a login agent. If they are missing, the password will be less well    protected from guessing attacks. 
  1351.  
  1352.    This routine does not (as one might expect) securely authenticate the    principal to the calling procedure.  Since the password is used to    obtain the principal's private key, this call will normally fail if    the principal supplies an invalid password.  A penetrator who has 
  1353.  
  1354.  
  1355.  
  1356. Kaufman                                                        [Page 56] 
  1357.  RFC 1507                          DASS                    September 1993  
  1358.  
  1359.    compromised the naming service could plant fake encrypted credentials    under any name and impersonate that name as far as this call is    concerned. A caller that wishes to authenticate the user in addition    to obtaining credentials to be able to act on the user's behalf    should call Verify_principal_name (below) with the created    credentials and the credentials of the calling process. 
  1360.  
  1361.    This routine constructs a credentials structure from information    found in the naming service encrypted using the supplied password. 
  1362.  
  1363.     a) If the encrypted credentials structure is protected with a        login agent, retrieve the public key of the login agent: 
  1364.  
  1365.       1) If TA_credentials are available, use them in a call to          Get_Pub_Keys to get the public key of the login agent (whose          name is derived from the name of the principal by truncating          the last element of the RDN and adding CSS=X509). 
  1366.  
  1367.       2) If TA_credentials are not available, look up the public key          of the login agent in the naming service. 
  1368.  
  1369.        Login agents limit and audit password guesses, and are        important when passwords may not be well chosen (as when users        are allowed to choose their own).  To fully prevent the        password guessing threat, principals may only log onto nodes        that already have TA_credentials which can be used to        authenticate the login agent.  To support nodes which have no        credentials of their own and to allow this procedure to        support node initialization, it is possible to network login        without TA credentials. 
  1370.  
  1371.        A principal who logs into a node that lacks TA credentials is        subject to the following subtle security threat:  A penetrator        who impersonates the naming service could post his own public        key and address as those of the login agent.  This procedure        would then in the process of logging in reveal the the        penetrator enough information for the penetrator to mount an        unaudited password guessing attack against the principal's        credentials. 
  1372.  
  1373.     b) Retrieve the encrypted credentials from the naming service or        login agent.  In the case of the login agent, the password is        one-way hashed to produce proof of knowledge of the password        and the hashed value is supplied to the login agent encrypted        under its public key as part of the request. 
  1374.  
  1375.     c) Decrypt the encrypted credentials structure using a the        supplied password. Verify that the decryption was successful 
  1376.  
  1377.  
  1378.  
  1379. Kaufman                                                        [Page 57] 
  1380.  RFC 1507                          DASS                    September 1993 
  1381.  
  1382.         by verifying that the resulting structure can be parsed        according the the ASN.1 rules for Encrypted_Credentials and        that the two included primes when multiplied together produce        the included modulus. If the decryption was unsuccessful then        the routine returns the `Invalid password' error status. The        decryption results in both the Private Key and the Public Key. 
  1383.  
  1384.     d) Generate a public/private key pair for the Delegation Key,        using the indicated keysize. Key size is likely to be an        implementation constant rather than a supplied parameter, with        likely values being 384 and 512 bits.  Key sizes generally        will have to increase over time as factoring technology and        CPU speeds improve.  Delegation keys can be relatively shorter        than long term keys because DASS is designed so that        compromise of the delegation key after it has expired does not        result in a security compromise.  An important advantage of        making key size an implementation constant is that nodes can        generate key pairs in advance, thus speeding up this procedure.        Key generation is the most CPU intensive RSA procedure and        could make login annoyingly slow. 
  1385.  
  1386.     e) Construct a Login Ticket by signing with the user's private        key a combination of the public key, a validity period        constructed from the current time and the expiration passed in        the call, and the principal UID found in the encrypted-key        structure. 
  1387.  
  1388.     f) Forget the user's private key. 
  1389.  
  1390.     g) Retrieve from the naming service any trusted authority        certificates stored with the user's entry. Discard any that        are not signed by the user's public key and UID.  An        implementation in which the login node has credentials of its        own may choose its trusted authority information instead of        retrieving and verifying trusted authority certificates from        the naming service.  This will have a subtle effect on the        security of the resulting system. 
  1391.  
  1392.     h) Construct a credentials structure from: 
  1393.  
  1394.       1) Claimant credentials: 
  1395.  
  1396.         (i)  Name of the principal from calling parameter         (ii) Login Ticket as constructed in (e)         (iii)Delegation Private key as constructed in (d)         (iv) Public key from the encrypted credentials structure 
  1397.  
  1398.       2) No verifier credentials 
  1399.  
  1400.  
  1401.  
  1402. Kaufman                                                        [Page 58] 
  1403.  RFC 1507                          DASS                    September 1993 
  1404.  
  1405.        3) Trusted Authorities: for the most recently signed trusted          authority certificate (There is normally only one Trusted          Authority Certificate.  If there is more than one then an          implementation may choose to maintain a list of all the valid          keys. They should all refer to the same CA (UID and name).): 
  1406.  
  1407.         (i)  Name of the CA from the subject field of the certificate         (ii) Public Key of the CA from the subject public key field         (iii)UID of the CA from the subject UID field 
  1408.  
  1409.       4) no remote node credentials 
  1410.  
  1411.       5) no local node credentials 
  1412.  
  1413.       6) no cached outgoing associations 
  1414.  
  1415.       7) no cached incoming associations 
  1416.  
  1417. 3.9.2 Create Credentials     Create_credentials(                                                       --outputs                        Claimant_credentials  Credentials) 
  1418.  
  1419.     This routine creates an "empty" credentials structure.  It is needed    in the case of a user logging into a node and obtaining node oriented    credentials but no global username credentials.  Because the    "combine_credentials" call wants to modify a set of user credentials    rather than create a new set, this call is needed to produce the    "shell" for combine_credentials to fill in. 
  1420.  
  1421.    It is unlikely that any real implementation would support this    function, but rather would have some functions which combine    network_login, create_credentials, and combine_credentials in    whatever ways are supported by that node. 
  1422.  
  1423. 3.9.3 Combine Credentials 
  1424.  
  1425.    Combine_credentials(                                                     --inputs                        node_credentials      Credentials,                        localusername         String,                                                     --updated                        user_credentials      Credentials) 
  1426.  
  1427.    This routine is provided by implementations which support the notion    of local node credentials.  After the node has verified to its own 
  1428.  
  1429.  
  1430.  
  1431. Kaufman                                                        [Page 59] 
  1432.  RFC 1507                          DASS                    September 1993 
  1433.  
  1434.     satisfaction that the user_credentials are entitled to access to a    particular local account, this call adds node credential information    to the user_credential structure.  This function may be applied to    user_credentials created by network_login, create_credentials, or    accept_token. 
  1435.  
  1436.     a) Fill in the local node credentials substructure of        user_credentials as follows: 
  1437.  
  1438.       1) Full name of the node: from Full name of the Principal in          node_credentials 
  1439.  
  1440.       2) Local username on the node: from proxy lookup 
  1441.  
  1442.       3) RSA private key of the node: from verifier credentials in          node_credentials 
  1443.  
  1444.     b) Optionally,  change the trusted authorities to match the        trusted authorities from the node credentials.  This is an        implementation option, done most likely as a performance        optimization.  The only case where this option is required is        where no trusted authorities existed in the user credentials        (because they were created by create_credentials of        accept_token).  Server credentials should generally keep their        own trusted authorities. 
  1445.  
  1446.    It is likely that an implementation will choose not to replicate its    node credentials in every credentials structure that it supports, but    rather will maintain some sort of pointer to a single copy.  This    algorithm is stated as it is only for ease of specification. 
  1447.  
  1448. 3.9.4 Initialize_server 
  1449.  
  1450.    initialize_server(                                                     --inputs                        Name                  Name,                        password              String,                        TA_credentials        Credentials, --optional                                                     --outputs                        Server_credentials    Credentials) 
  1451.  
  1452.    Somehow a server must get access to its credentials. One way is for    the credentials to be stored in the naming service like user    credentials encrypted under a service password. The service then    needs to gain at startup time access to a service password. This may    be easier to manage and is not insecure so long as the service    password is well chosen. Alternately, the service needs some    mechanism to gain access directly to its credentials. The credentials 
  1453.  
  1454.  
  1455.  
  1456. Kaufman                                                        [Page 60] 
  1457.  RFC 1507                          DASS                    September 1993 
  1458.  
  1459.     created by this call are intended to be very long lived. They do not    time out, so a node or server might store them in Non-Volatile memory    after "initial installation" rather than calling this routine at each    "boot". These credentials are shared between all servers which use    the same key. This routine works as follows: 
  1460.  
  1461.     a) Retrieve from the naming service or login agent the encrypted        credentials structure corresponding to the supplied name. See        Network_login for a discussion of the use of TA_credentials        and login agents. 
  1462.  
  1463.     b) Decrypt that structure using a one-way hash of the supplied        password. Verify that the decryption was successful. Verify        that the public key in the structure matches the private key. 
  1464.  
  1465.     c) Retrieve from the naming service any trusted authority        certificates stored under the supplied name. Discard any which        do not contain the UID from the encrypted credentials        structure or are not signed by the key in the encrypted        credentials structure. 
  1466.  
  1467.     d) Construct a credentials structure from: 
  1468.  
  1469.       1) Claimant credentials:         (i)   Name of the principal from the calling parameter         (ii)  UID of the principal from the encrypted-key structure         (iii) No login ticket         (iv)  No login secret key 
  1470.  
  1471.       2) Verifier credentials:         (i)   Server secret key from the encrypted-key structure 
  1472.  
  1473.       3) Trusted Authorities: from the most recently signed Trusted          Authority Certificate:         (i)   Name of CA from the Subject Name field         (ii)  UID of the CA from the Subject UID field         (iii) Public Key of the CA from the Subject Public Key field 
  1474.  
  1475.       4) no node credentials 
  1476.  
  1477.       5) no cached outgoing associations 
  1478.  
  1479.       6) no cached incoming associations 
  1480.  
  1481.  
  1482.  
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  Kaufman                                                        [Page 61] 
  1488.  RFC 1507                          DASS                    September 1993 
  1489.  
  1490.  3.9.5 Generate Server Ticket 
  1491.  
  1492.    generate_server_ticket(                                                     --inputs                        expiration            Time interval,                                                     --updated                        Server_credentials    Credentials) 
  1493.  
  1494.    Server credentials created by initialize_server can be used to accept    incoming authentication tokens and can act as node_credentials for    outgoing authentications, but cannot create user_credentials of their    own. If a server initiates connections on its own behalf, it must    have a ticket just like any other user might have. That ticket has    limited lifetime and the right to act on behalf of the server can be    delegated. The server cannot, however, delegate the right to receive    connections intended for it. An implementation must come up with a    policy for the expiration of server tickets and how long before    expiration they are renewed.  A likely policy is for this procedure    to be implicitly called by Create_token if there is no current ticket    present in the credentials.  If so, this interface need not be    exposed. 
  1495.  
  1496.    This routine is implemented as follows: 
  1497.  
  1498.     a) Generate an RSA public/private key pair. 
  1499.  
  1500.     b) Compute a validity interval from the current time and the        expiration supplied. 
  1501.  
  1502.     c) Construct a login ticket from the RSA public key (from a),        validity interval (from b), the UID from the credentials, and        signed with the server key in the credentials. (Discard        previous Login Ticket if there was one). 
  1503.  
  1504.     d) Discard all information in the  Cached Outgoing Contexts. 
  1505.  
  1506. 3.9.6 Delete Credentials 
  1507.  
  1508.    delete_credentials(                                                     --updated                        credentials           Credentials) 
  1509.  
  1510.    Erases the secrets in the credentials structure and deallocates the    storage. 
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518. Kaufman                                                        [Page 62] 
  1519.  RFC 1507                          DASS                    September 1993 
  1520.  
  1521.  3.10 Authentication Procedures 
  1522.  
  1523.    The guts of the authentication process takes place in the next two    calls. When one principal wishes to authenticate to another, it calls    Create_token and sends the token which results to the other. The    recipient calls Accept_token and creates a new set of credentials.    The other calls in this section manipulate the received credentials    in order to retrieve its contents and verify the identity of the    token creator. 
  1524.  
  1525. 3.10.1  Create Token 
  1526.  
  1527.    Create_token(                                                     --inputs                        target_name            Name,                        deleg_req_flag         Boolean,                        mutual_req_flag        Boolean,                        replay_det_req_flag    Boolean,                        sequence_req_flag      Boolean,                        chan_bindings          Octet String,                        Include_principal_name Boolean,                        Include_node_name      Boolean,                        Include_username       Boolean,                                                       --updated                        claimant_credentials   Credentials,                                                     --outputs                        authentication_token   Authentication token,                        mutual_authentication_token                                    Mutual Authentication token,                        Shared_key             Shared Key,                        instance_identifier    Timestamp) 
  1528.  
  1529.    This routine is used by the initiator of a connection to create an    authentication token which will prove its identity. If the claimant    credentials includes node/account information, the token will include    node authentication. 
  1530.  
  1531.    target_name is the X.500 name of the intended recipient of the token.    Only an entity with access to the private key associated with that    name will be able to verify the created token and generate the    mutual_authentication_token. 
  1532.  
  1533.    deleg_req_flag indicates whether the caller wishes to delegate to the    recipient of the token. If it is set, the delegated_credentials    returned by Accept_token will be capable of generating tokens on    behalf of the caller. Node based authentication information cannot be    delegated. The mutual_req_flag, replay_det_req_flag , and    sequence_req_flag are put in the authentication token and passed to 
  1534.  
  1535.  
  1536.  
  1537. Kaufman                                                        [Page 63] 
  1538.  RFC 1507                          DASS                    September 1993 
  1539.  
  1540.     the target.  This information is included in the token to make it    easier to implement the GSSAPI over DASS.  DASS itself makes no use    of this information. 
  1541.  
  1542.    In most applications, the purpose of a token exchange is to    authenticate the principals controlling the two ends of a    communication channel.  chan_bindings contains an identifier of the    channel which is being authenticated, and thus its format and content    should be tied to the underlying communication protocol.  DASS only    guarantees that the information has been communicated reliably to the    named target. If DASS is used with a cryptographically protected    channel (such as SP4), this data should contain a one-way hash of the    key used to encrypt the channel. If that channel is multiplexed, the    data should also include the ID of the subchannel.  If the channel is    not encrypted, the network must be trusted not to modify data on a    connection.  The source and target network addresses and a connection    ID should be included in the chan_bindings at the source and checked    at the target.  A token exchange also results in the two ends sharing    a key and an instance identifier.  If that key and instance    identifier are used to cryptographically protect subsequent    communications, then chan_bindings need not have any cryptographic    significance but may be used to differentiate multiple entities    sharing the public keys of communicating principals.  For example, if    a service is replicated and all replicas share a public key,    chan_bindings should include something that identifies a single    instance of the service (such as current address) so that the token    cannot be successfully presented to more than one of the servers. 
  1543.  
  1544.    include_principal_name, include_node_name, and include_username are    flags which determine whether the principal name, node name, and/or    username from the credentials structure are to be included in the    token.  This information is made optional in a token so that    applications which communicate this information out of band can    produce "compressed" tokens.  If this information is included in the    token, it will be used to populate the corresponding fields in the    credentials structure created by Accept_token.  claimant_credentials    are the credentials of the calling procedure.  The secrets contained    therein are used to sign the token and the trusted authorities are    used to securely learn the public key of the target.  The cached    outgoing contexts portion of the credentials may be updated as a side    effect of this call. 
  1545.  
  1546.    The major output of this routine is an  authentication_token which    can be passed to the target in order to authenticate the caller. 
  1547.  
  1548.    In addition to returning an authentication token, this routine    returns a mutual_authentication_token,  a shared_key, and an    instance_identifier. The mutual authentication token is the same as 
  1549.  
  1550.  
  1551.  
  1552. Kaufman                                                        [Page 64] 
  1553.  RFC 1507                          DASS                    September 1993 
  1554.  
  1555.     the one generated by the Accept_token call at the target. If the    protocol using DASS wishes mutual authentication, the target should    return this token to the source. The source will compare it to the    one returned by this routine using Compare_Mutual_Token (below) and    know that the token was accepted at its proper destination. 
  1556.  
  1557.    The DES key and instance identifier can be used to encrypt or sign    data to be sent to this target. The key and instance will be given to    the target by Accept_token, and the key will only be known by the two    parties to the authentication. If a single set of credentials is used    to authenticate to the same target more than once, the same DES key    is likely to be returned each time.  If the parties wish to protect    against the possibility of an outside agent mixing and matching    messages from one authenticated session with those of another, they    should include the instance identifier in the messages. The instance    identifier is a timestamp and it is guaranteed that the DES    key/instance identifier pair will be unique. 
  1558.  
  1559.    An implementation may wish to "hide" the DES key from calling    applications by placing it in system storage and providing calls    which encrypt/decrypt/sign/verify using the key. 
  1560.  
  1561.    The primary tasks of this routine are to create its output    parameters. As a side effect, it may also update claimant_credentials    It's algorithm is as follows: 
  1562.  
  1563.     a) The login ticket is checked. If it has passed the end of its        lifetime an `Login Ticket Expired' error is returned. If there        is a login ticket, but no corresponding private key then an        `Invalid credentials' error is returned (this is the case if        the credentials were created by an authentication-without-        delegation operation).  If there is no login ticket or an        expired one and if the long term private key is present in the        credentials, an implementation may choose to automatically call        create_server_ticket to renew the ticket. 
  1564.  
  1565.     b) Create new timestamp using the current time.  (This timestamp        must be unique for this Shared Key. The timestamp is a 64 bit        POSIX time, with a resolution of 1 nanosecond An implemen tation        must ensure that timestamps cannot be reused.) 
  1566.  
  1567.     c) The public key and UID of target_name are looked up by calling        get_pub_keys, using the target_name and the Trusted Authority        section of the claimant_credentials structure. If none is        found, an error status is returned. Otherwise, the cached        outbound connections portion of credentials are searched        (indexed by target Public Key) for a cached Shared key with a        validity interval which has not expired. If a suitable one is 
  1568.  
  1569.  
  1570.  
  1571. Kaufman                                                        [Page 65] 
  1572.  RFC 1507                          DASS                    September 1993 
  1573.  
  1574.         found skip to step g, else create a cache entry as follows: 
  1575.  
  1576.     d) Destination Public Key is the one found looking up the target.        A Shared Key is generated at random. A validity interval is        chosen according to node policy but not to exceed the validity        interval of the ticket in the credentials (if any). 
  1577.  
  1578.     e) Create the Encrypted Shared Key, using the public key of the        Target, and place in the cache. 
  1579.  
  1580.     f) If node authentication credentials are available in the        credentials structure, create a "Node Ticket" signature using        the node secret and include it in the cache. 
  1581.  
  1582.     g) If delegation is requested and no delegator is present in the        cache, create one by encrypting the delegation private key        under the Shared key. The delegation private key is        represented as an ASN.1 data structure containing only one of        the primes (p). 
  1583.  
  1584.     h) If delegation is not requested and no Shared Key Ticket is in        the cache, create one by signing the requisite information        with the delegation private key. 
  1585.  
  1586.     i) Create the Authenticator.  The contents of the Authenticator        (including the channel bindings) are encoded into ASN.1, and        the signature is computed. The Authenticator is then        re-encoded, without including the Channel Bindings but using        the same signature. 
  1587.  
  1588.     j) Create output_token as follows:       1) Encrypted Shared Key from cache       2) Login Ticket from Claimant Credentials (if present)       3) Shared Key Ticket from cache (if no delegation and if          present)       4) Node Ticket from cache (if present)       5) Delegator from cache (if delegation and if present)       6) Authenticator       7) Principal name from credentials (if present and parameter          requests this)       8) Node name from credentials (if present and parameter request          this)       9) Local Username from credentials (if present and parameter          requests this) 
  1589.  
  1590.     k) Compute Mutual_authentication_token by encrypting the        timestamp from the authenticator using the Shared key. 
  1591.  
  1592.  
  1593.  
  1594.  Kaufman                                                        [Page 66] 
  1595.  RFC 1507                          DASS                    September 1993 
  1596.  
  1597.      l) The instance_identifier is the timestamp. This and the Shared        key are returned for use by the caller for further encryption        operations (if these are supported). 
  1598.  
  1599. 3.10.2 Accept_token 
  1600.  
  1601.    Accept_token(                                                     --inputs                        authentication_token  Authentication Token,                        chan_bindings         Octet String,                                                      --updated                        verifying_credentials Credentials,                                                     --outputs                        accepted_credentials  Credentials,                        deleg_req_flag        Boolean,                        mutual_req_flag       Boolean,                        replay_det_req_flag   Boolean,                        sequence_req_flag     Boolean,                        mutual_authentication_token                                         Mutual authentication token                        shared_key            Shared Key,                        instance_identifier   Timestamp) 
  1602.  
  1603.    This routine is used by the recipient of an authentication token to    validate it.  authentication_token is the token as received;    chan_bindings is the identifier of the channel being authenticated.    See the description of Create_token for information on the    appropriate contents for chan_bindings.  DASS does not enforce any    particular content, but checks to assure that the same value is    supplied to both Create_token and Accept_token. 
  1604.  
  1605.    Verifying_credentials are the credentials of the recipient of the    token.  They must include the private key of the entity named as the    target in Create_token or the call will fail.  The cached incoming    contexts section of the verifying credentials may be modified as a    side effect of this call. 
  1606.  
  1607.    Accepted_credentials will contain additional information about the    token creator. If delegation was requested, these credentials can be    used to make additional calls to Create_token on the creator's    behalf. Whether or not delegation was requested, they can also be    used in the calls which follow to gain additional information about    the token creator. 
  1608.  
  1609.    The deleg_req_flag indicates whether the accepted_credentials include    delegation which can be used by the recipient to act on behalf of the    principal.  Mutual_req_flag, replay_det_req_flag, and    sequence_req_flag are passed through from Create_token in support of 
  1610.  
  1611.  
  1612.  
  1613. Kaufman                                                        [Page 67] 
  1614.  RFC 1507                          DASS                    September 1993 
  1615.  
  1616.     the GSSAPI.  DASS makes no use of these fields. 
  1617.  
  1618.    The mutual_authentication_token can be returned to the token creator    as proof of receipt. In many protocols, this will be used by a client    to authenticate a server. Only the genuine server would be able to    compute the mutual_authentication_token from the token. 
  1619.  
  1620.    The shared_key and instance_identifier can be used to encrypt or sign    data between the two authenticating parties. See Create_token. 
  1621.  
  1622.    This routine verifies the contents of the authentication token in the    context of the verifying credentials (In particular, the Private Key    of the server is used.  Also, the Cached Incoming Contexts and    Incoming Timestamp list is used.) and returns information about it.    The algorithm updates a cache of information. This cache is not    updated if the algorithm exits with an error. The algorithm is as    follows: 
  1623.  
  1624.     a) If there is a Login Ticket, but no Shared Key Ticket or        Delegator then exit with error `Invalid Authenticator'. If        there is a Shared Key Ticket or Delegator, but no Login Ticket        then exit with error `Invalid Authentication Token'. 
  1625.  
  1626.        Look up the Encrypted Shared key in the Cached Incoming Contexts        of the credentials structure. (This cache entry is used during        the execution of this routine. An implementation must ensure that        references to the cache entry can not be affected by other users        modifying the cache.  One way is to use a copy of the cache entry,        and update it at exit.)  If it is not found then create        a new cache entry as follows: 
  1627.  
  1628.       1) Encrypted Shared Key, from the Authentication Token. 
  1629.  
  1630.       2) Shared Key and Validity Interval, by decrypting the          Encrypted Shared Key using the server private key in          credentials. If the decryption fails then exit with error          `Invalid Authentication Token'. 
  1631.  
  1632.     b) Check that the Validity Interval (in the cache entry) includes        the current time; return `Invalid Authentication Token' if not. 
  1633.  
  1634.        Check the Timestamp is within max-clock-skew of the current        time, return `invalid Authentication Token' if not. 
  1635.  
  1636.        Reconstruct the Authenticator including the Channel Bindings        passed as a parameter. 
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642. Kaufman                                                        [Page 68] 
  1643.  RFC 1507                          DASS                    September 1993 
  1644.  
  1645.         Check that the reconstructed Authenticator is signed by the        Shared key. If not then exit with error `Invalid        Authentication Token'. 
  1646.  
  1647.        Look up the Authenticator Signature in the Received        Authenticators. If the same Signature is found in the list        then exit with error `Duplicate Authenticator'. Otherwise add        the Signature and timestamp to the list. 
  1648.  
  1649.        If there is a Login Ticket and the Delegation Public key is in        the cache entry, then check that the same key is specified in        the Login Ticket, if not then exit with error `Invalid        Authentication Token'. Place the Delegation Public key in the        cache if it is not already there. 
  1650.  
  1651.        If there is a Login Ticket, the Delegation Public key was not        previously in the cache entry, and there is a Shared Key        Ticket in the Authentication Token, then check that the Shared        Key Ticket is signed by the Delegation Public Key in the Login        Ticket. If not then exit with error `Invalid Authentication        Token'. 
  1652.  
  1653.        If a delegator is present in the message then decrypt the        delegator using the Shared key. If the private key does not        match the Delegation Public key then exit with error        `Invalid Authentication Token' (The prime in the delegator        is used to find the other prime (from the modulus). The division        must not have a remainder.  Neither prime may be 1. The two        primes are then used to reconstruct any other information        needed to perform cryptographic operations.). 
  1654.  
  1655.        Build the delegation credentials data structure as follows: 
  1656.  
  1657.        1) Claimant credentials:         (i)  Login Ticket from the Authentication token         (ii) Delegation Private key from the decrypted delegator if               the token is delegating.         (iii)Encrypted Shared Key from the Authentication token.        2) There are no verifier credentials.        3) Trusted authorities are copied from the verifying_credentials           passed to this routine (If an implementation is able to           obtain the original Trusted Authorities of the Principal then           it may do so instead of using the server's Trusted           Authorities.).        4) Remote node credentials (Node name, Username, Node Ticket)        5) There are no local node credentials.        6) There are no cached contexts. 
  1658.  
  1659.  
  1660.  
  1661.  Kaufman                                                        [Page 69] 
  1662.  RFC 1507                          DASS                    September 1993 
  1663.  
  1664.      c) The returned boolean values are obtained from the        Authenticator. 
  1665.  
  1666.     d) Mutual_authentication_token is computed by encrypting the        timestamp from the Authenticator with the Shared key from the        cache. 
  1667.  
  1668.     e) Instance_identifier is the timestamp from the Authenticator.        This and the Shared key are returned to the caller for further        encryption operations (if these are supported). 
  1669.  
  1670. 3.10.3 Compare Mutual Token 
  1671.  
  1672.    Compare_mutual_token(                                                     --inputs                        Generated_token    Mutual authentication token,                        Received_token     Mutual authentication token,                                                      --outputs                        equality_flag         Boolean) 
  1673.  
  1674.    This routine compares two mutual authentication tokens and tells    whether they match.  In the expected use, the first is the token    generated by Create_token at the initiating end and the second is the    token generated by Accept_token at the accepting end and returned to    the initiating end.  This routine can be implemented as a byte by    byte comparison of the two parameters. 
  1675.  
  1676. 3.10.4 Get Node Info 
  1677.  
  1678.    get_node_info(                                                     --inputs                        accepted_credentials  Credentials,                                                     --outputs                        nodename              Name,                        username              String) 
  1679.  
  1680.    This routine extracts from accepted credentials the name of the node    from which the authentication token came and the named account on    that node. Because this information is not cryptographically    protected within the token, this information can only be regarded as    a "hint" by the receiving application.  It can, however, be verified    using Verify_node_name in a cryptographically secure manner.  This    information will only be present if these are accepted credentials    and it the caller of Create_token set the include_node_name and/or    include_username flags. 
  1681.  
  1682.    An actual implementation is not likely to have get_node_info and    verify_node_name as separate calls.  They are specified this way 
  1683.  
  1684.  
  1685.  
  1686. Kaufman                                                        [Page 70] 
  1687.  RFC 1507                          DASS                    September 1993 
  1688.  
  1689.     because there are different ways this information might be used.  For    most applications, the nodename and username will be included in the    token, and a single function might extract and verify them (it might    in fact be part of accept token).  For other applications, the    nodename and username will not be in the token but rather will be    computed from other information passed during connection initiation    so a call would have to take these as inputs.  Still other    applications such as ACL evaluators that want to support the renaming    and aliasing capabilities of DASS would defer verifying node    information until they came upon an ACL which allowed access only    from a particular node.  They would then verify that the name on the    ACL was an authenticatable alias for the node which created the    token.  All of these uses can be defined in terms of calls to    get_node_info and verify_node_name. 
  1690.  
  1691. 3.10.5 Get Principal UID 
  1692.  
  1693.    get_principal_uid(                                                     --inputs                        accepted_credentials  Credentials,                                                     --outputs                        uid                   UID) 
  1694.  
  1695.    This routine extracts a principal UID from a set of credentials. 
  1696.  
  1697.    As with Get_Node_Info, this interface is not likely to appear in an    actual implementation, but rather will be bundled with other    routines.  It is specified this way because there might be a variety    of algorithms by which credentials are evaluated and all of them can    be defined in terms of these primitives. 
  1698.  
  1699.    In DASS, it is possible for a principal to have many aliases.  This    can happen either because the principal was given multiple names to    limit the number of CAs that need to be trusted when authenticating    to different servers or because the principal's name has changed and    the old name remains behind as an alias.  Accept_token returns the    name by which the principal identified itself when creating its    credentials. A service may know the user by some alias. The normal    way to handle this is for the service to know the principal's UID    (which is constant over name changes) and to compare it with the UID    in the token to identify a likely alias situation. It gets the UID    from the token using this routine. It then confirms the alias by    calling verify_principal_name. 
  1700.  
  1701.    The UID is in a signed portion of accepted credentials, but the    signature may not have been verified at the time this call is issued.    The information returned by this routine must therefore be regarded    as a hint.  If a call to Verify_principal_name succeeds, however, 
  1702.  
  1703.  
  1704.  
  1705. Kaufman                                                        [Page 71] 
  1706.  RFC 1507                          DASS                    September 1993 
  1707.  
  1708.     then the caller can securely know that the name given to that routine    and the UID returned by this one are the authenticated source of the    token. 
  1709.  
  1710. 3.10.6 Get Principal Name 
  1711.  
  1712.    get_principal_name(                                                     --inputs                        accepted_credentials  Credentials,                                                     --outputs                        name                  Name) 
  1713.  
  1714.    This routine extracts a principal name from a set of credentials.    This name is the name most recently associated with the principal. It    may be the name that the principal supplied when the credentials were    created (in which case it may not have been verified yet) or it may    be a different name that has been verified. 
  1715.  
  1716.    As with Get_Node_Info and Get_Principal_UID, this routine is not    likely to appear in an actual implementation, but will be bundled in    some fashion with related procedures.  The name returned by this    procedure is not guaranteed to have been cryptographically verified.    Verify_Principal_Name performs that function. 
  1717.  
  1718. 3.10.7 Get Lifetime 
  1719.  
  1720.    get_lifetime(                                                     --inputs                        Claimant_credentials  Credentials,                                                     --outputs                        lifetime              Duration) 
  1721.  
  1722.    This routine computes the life remaining in a set of credentials.    Its most common use would be to know to renew credentials before they    expire. 
  1723.  
  1724.    Returns the remaining lifetime of the login ticket in the    credentials. This can either be the done on the node where the    original login took place, or at a server which has been delegated    to. It indicates how much longer these credentials can be used for    further delegations. This routine will return 0 if the login ticket    has passed the end of its life, if there is no login ticket, or if    the credentials do not contain the private key certified by the    ticket (i.e., where they were created by an authentication-without-    delegation operation). 
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  Kaufman                                                        [Page 72] 
  1731.  RFC 1507                          DASS                    September 1993 
  1732.  
  1733.  3.10.8 Verify Node Name 
  1734.  
  1735.    Verify_node_name(                                                     --inputs                        nodename              Name,                        username              String,                                                      --updated                        verifying_credentials Credentials,                        accepted_credentials  Credentials,                                                     --outputs                        Name matches          Boolean) 
  1736.  
  1737.    This routine tests whether the originating node of an authentication    token can be authenticated as having the provided name. Like a    principal, a node may have multiple aliases. One of them may be    returned by Get_node_info, but this call allows a suspected alias to    be verified.  The verifying credentials supplied with this call must    be the same credentials as were used in the Accept_token call. The    procedure for completing this request is as follows: 
  1738.  
  1739.     a) If there is no Node Ticket in the claimant credentials then        return False. 
  1740.  
  1741.     b) Search the incoming context cache of the verifying credentials        for an entry containing the same encrypted shared key as the        encrypted shared key subfield of the claimant information of        the accepted credentials.  In the steps which follow,        references to "the cache" refer to this entry.  If none is        found, initialize such an entry as follows: 
  1742.  
  1743.       1) Encrypted shared key from the encrypted shared key subfield          of the claimant information of the accepted credentials. 
  1744.  
  1745.       2) The shared key and validity interval are determined by          decrypting the encrypted shared key using the RSA private          key in the verifier information of the server credentials.          If this procedure is called after a call to Accept_token          using the same server credentials (as is required for          correct use), the shared key and validity interval must          correctly decrypt.  If called in some other context, the          results are undefined.  The validity interval is not          checked. 
  1746.  
  1747.       3) Initialize all other entries in the cache to missing. 
  1748.  
  1749.     c) If there is a "local username on client node" in the cache and        it does not match the username supplied as a parameter, return        False. 
  1750.  
  1751.  
  1752.  
  1753. Kaufman                                                        [Page 73] 
  1754.  RFC 1507                          DASS                    September 1993 
  1755.  
  1756.      d) If there is a "name of client node" in the cache and it        matches the nodename supplied as a parameter: 
  1757.  
  1758.       1) Set the "Full name of the node" subfield of the remote node          authentication field of the accepted credentials to be the          nodename supplied as a parameter. 
  1759.  
  1760.       2) Set the "Local Username on the node" subfield of the remote          node authentication field of the accepted credentials to be          the username supplied as a parameter. 
  1761.  
  1762.       3) return True. 
  1763.  
  1764.     e) Call the Get_Pub_Keys subroutine with the server_credentials,        the nodename supplied as a parameter, and Try_Hard=False. 
  1765.  
  1766.     f) If "Public Key of Client Node" is missing from the cache,        check all of the Public keys returned to see if one verifies        the node ticket.  If one does, set the "Public Key of Client        Node" and "UID of Client Node" fields in the cache to be the        PK/UID pair that verified the ticket and set the "Local        Username on Client node" field to be the username supplied as        a parameter.. 
  1767.  
  1768.     g) If any of the Public Key/UID pairs match the "Public Key of        Client Node" and "UID of Client Node" fields in the cache,        then: 
  1769.  
  1770.       1) Set the "name of client node" in the cache equal to the          nodename supplied as a parameter. 
  1771.  
  1772.       2) Set the "Full name of the node" subfield of the remote node          authentication field of the accepted credentials to be the          nodename supplied as a parameter. 
  1773.  
  1774.       3) Set the "Local Username on the node" subfield of the remote          node authentication field of the accepted credentials to be          the username supplied as a parameter. 
  1775.  
  1776.       4) Return True. 
  1777.  
  1778.     h) If none of them match, call Get_Pub_Keys again with        Try_Hard=True and repeat steps 6 & 7.  If Step 7 fails a        second time, return False. 
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786. Kaufman                                                        [Page 74] 
  1787.  RFC 1507                          DASS                    September 1993 
  1788.  
  1789.  3.10.9 Verify Principal Name 
  1790.  
  1791.    Verify_principal_name(                                                     --inputs                        principal_name        Name,                                                      --updated                        verifier_credentials  Credentials,                        claimant_credentials  Credentials,                                                     --outputs                        Name matches          Boolean) 
  1792.  
  1793.    This routine tests (in the context of the verifier credentials)    whether the claimant credentials are authenticatable as being those    of the named principal.  This procedure is called with a set of    accepted credentials to authenticate their source, or with a set of    credentials produced by network_login to authenticate the creator of    those credentials.  If the claimant credentials were created by    Accept_token, then the verifier credentials supplied in this call    must be the same as those used in that call.  The procedure for    completing this request is as follows: 
  1794.  
  1795.     a) If there is no Login Ticket in the claimant credentials, then        return False. 
  1796.  
  1797.     b) If the current time is not within the validity interval of the        Login Ticket, then return False. 
  1798.  
  1799.     c) If there is an Encrypted Shared Key present in the Claimant        information field of the claimant credentials, then find or        create a matching cache entry in the Cached Incoming Contexts        of the verifier credentials.  In the description which        follows, references to "the cache" refer to this entry.  If        the cache entry must be created, its contents is set to be as        follows: 
  1800.  
  1801.       1) Encrypted shared key from the encrypted shared key subfield          of the claimant information of the accepted credentials. 
  1802.  
  1803.       2) The shared key and validity interval are determined by          decrypting the encrypted shared key using the RSA private          key in the verifier information of the server credentials.          If this procedure is called after a call to Accept_token          using the same server credentials (as is required for          correct use), the shared key and validity interval must          correctly decrypt.  If called in some other context, the          results are undefined.  The validity interval is not          checked. 
  1804.  
  1805.  
  1806.  
  1807.  Kaufman                                                        [Page 75] 
  1808.  RFC 1507                          DASS                    September 1993 
  1809.  
  1810.        3) Initialize all other entries in the cache to missing. 
  1811.  
  1812.     d) If there is a cache entry and if the "Public Key of Client        Principal" field is present and if the "UID of Client        Principal" field is present and matches the UID in the Login        Ticket, then: 
  1813.  
  1814.       1) Set the Public Key of the principal field in the Claimant          information to be the Public Key of Client Principal. 
  1815.  
  1816.       2) If the "Full name of the principal" field is missing from          the claimant information of the claimant credentials, then          set it to the "Name of Client Principal" field from the          cache. 
  1817.  
  1818.     e) If there is a cache entry and if the "Name of Client        Principal" field is present and if it matches the principal        name supplied to this routine and if the UID in the cache        matches the UID in the Login Ticket, return True. 
  1819.  
  1820.     f) Call the Get_Pub_Keys subroutine with the name and verifier        credentials supplied to this routine and Try_Hard=FALSE.        Ignore any keys retrieved where the corresponding UID does not        match the UID in the claimant credentials. 
  1821.  
  1822.     g) If the Public Key of the principal is missing from the        claimant information of the claimant credentials, then attempt        to verify the signature on the login ticket with each public        key returned by Get_Pub_Keys.  If verification succeeds: 
  1823.  
  1824.       1) Set the Public Key of the principal in the claimant          information of the claimant credentials to be the Public Key          that verified the ticket. 
  1825.  
  1826.       2) If the Full name of the principal in the claimant          information of the claimant credentials is missing, set it          to the name supplied to this routine. 
  1827.  
  1828.       3) If there is a cache entry, set the Name of Client Principal          to be the name supplied to this routine, the UID of Client          Principal to be the UID from the Login Ticket, and the          Public Key of Client Principal to be the Public Key that          verified the ticket. 
  1829.  
  1830.       4) Return True. 
  1831.  
  1832.     h) If the Public Key of the principal is present in the claimant        information of the claimant credentials, then see if it 
  1833.  
  1834.  
  1835.  
  1836. Kaufman                                                        [Page 76] 
  1837.  RFC 1507                          DASS                    September 1993 
  1838.  
  1839.         matches any of the public keys returned by Get_Pub_Keys.  If        one of them matches: 
  1840.  
  1841.       1) If the Full name of the principal in the claimant          information of the claimant credentials is missing, set it          to the name supplied to this routine. 
  1842.  
  1843.       2) If there is a cache entry, set the Name of Client Principal          to be the name supplied to this routine, the UID of Client          Principal to be the UID from the Login Ticket, and the          Public Key of Client Principal to be the Public Key that          verified the ticket. 
  1844.  
  1845.       3) Return True. 
  1846.  
  1847.     i) If steps 7 & 8 fail, retry the call to Get_Pub_Keys with        Try_Hard=TRUE, and retry steps 7 & 8.  If they fail again,        return false. 
  1848.  
  1849. 3.10.10 Get Pub Keys 
  1850.  
  1851.    Get_Pub_Keys(                                                     --inputs                        TA_credentials     Credentials                        Try_Hard           Boolean,                        Target Name        Name,                                                     --outputs                        Pub_keys           Set of Public key/UID pairs 
  1852.  
  1853.    This common subroutine is used in the execution of Create_Token,    Verify_Principal_Name, and Verify_Node_Name.  Given the name of a    principal, it retrieves a set of public key/UID pairs which    authenticate that principal (normally only one pair).  It does this    by retrieving from the naming service a series of certificates,    verifying the signatures on those certificates, and verifying that    the sequence of certificates constitute a valid "treewalk". 
  1854.  
  1855.    The credentials structure passed into this procedure represent a    starting point for the treewalk.  Included in these credentials will    be the public key, UID, and name of an authority that is trusted to    authenticate all remote principals (directly or indirectly). 
  1856.  
  1857.    The "Try_Hard" bit is a specification anomaly resulting from the fact    that caches maintained by this routine are not transparent to the    calling routines.  It tells this procedure to bypass caches when    doing all name service lookups because the information in caches is    believed to be stale.  In general, a routine will call Get_Pub_Keys    with Try_Hard set false and try to use the keys returned.  If use of 
  1858.  
  1859.  
  1860.  
  1861. Kaufman                                                        [Page 77] 
  1862.  RFC 1507                          DASS                    September 1993 
  1863.  
  1864.     those keys fails, the calling routine may call this routine again    with Try_Hard set true in hopes of getting additional keys.    Routinely calling this routine with Try_Hard set true is likely to    have adverse performance implications but would not affect the    correctness or the security of the operation. 
  1865.  
  1866.    The name supplied is the full X.500 name of the principal for whom    public keys are needed as part of some authentication process. 
  1867.  
  1868.    This procedure securely learns the public keys and UIDs of foreign    principals by constructing a valid chain of certificates between its    trusted TA and the certificate naming the foreign principal.  In the    simplest case, where the TA has signed a certificate for the foreign    principal, the chain consists of a single certificate.  Otherwise,    the chain must consist of a series of certificates where the first is    signed by the TA, the last is a certificate for the foreign    principal, and the subject of each principal in the chain is the    issuer of the next.  What follows is first a definition of what    constitutes a valid chain of certificates followed by a model    algorithm which constructs all of (and only) the valid chains which    exist between the TA and the target name. 
  1869.  
  1870.    In order to limit the implications of the compromise of a single CA,    and also to limit the complexity of the search of the certificate    space, there are restrictions on what constitutes a valid chain of    certificates from the TA to the Name provided.  The only CAs whose    compromise should be able to compromise an authentication are those    controlling directories that are ancestors of one of the two names    and that are not above a common ancestor.  Therefore, only    certificates signed by those CAs will be considered valid in a    certificate chain.  Normally, the CA for a directory is expected to    certify a public key and UID for the CA of each child directory and    one parent directory.  A CA may also certify another CA for some    remote part of the naming hierarchy, and such certificates are    necessary if there are no CAs assigned to directories high in the    naming hierarchy. 
  1871.  
  1872.    A certificate chain is considered valid if it meets the following    criteria: 
  1873.  
  1874.     a) It must consist of zero or more  parent certificates, followed        by zero or one   cross certificates, followed by zero or more        child certificates. 
  1875.  
  1876.     b) The number of parent certificates may not exceed the number of        levels in the naming hierarchy between the TA name and the        name of the least common ancestor in the naming hierarchy        between the TA name and the target name. 
  1877.  
  1878.  
  1879.  
  1880. Kaufman                                                        [Page 78] 
  1881.  RFC 1507                          DASS                    September 1993 
  1882.  
  1883.      c) Each  parent certificate must be stored in the naming service        under the entry of its issuer. 
  1884.  
  1885.     d) The subject of the cross certificate (if any) must be an        ancestor of the target name but must be a longer name than the        least common ancestor of the TA name and the target name. 
  1886.  
  1887.     e) The cross certificate (if any) must have been stored in the        naming service under the entry of its issuer or there must        have been an indication in the naming service that        certificates signed by this issuer may be stored with their        subjects. 
  1888.  
  1889.     f) The issuer of each parent certificate does not have stored        with it in the naming service a cross certificate with the        same issuer whose subject is an ancestor of the target name. 
  1890.  
  1891.     g) Each child certificate must be stored in the naming service        under the entry of its subject.      h) The subject of each child certificate does not have associated        with it in the naming service a cross certificate with the        same subject whose issuer is the same as the issuer of any of        the parent certificates or the cross certificate of the chain. 
  1892.  
  1893.     i) The subject of each certificate must be the issuer of the        certificate that follows in the chain.  The equality test can        be met by either of two methods: 
  1894.  
  1895.       1) The public key of the subject in the earlier certificate          verifies the signature of the later and the subject UID in          the earlier certificate is equal to the issuer UID in the          later; or 
  1896.  
  1897.       2) The public key of the subject in the earlier certificate          verifies the signature of the later, the earlier lacks a          subject UID and/or the later lacks an issuer UID and the          name of the subject in the earlier certificate is equal to          the name of the issuer in the later. 
  1898.  
  1899.     j) The Public Key of the TA verifies the signature of the first        certificate. 
  1900.  
  1901.     k) The UID of the TA equals the UID of the issuer of the first        certificate  or the UID is missing on one or both places and        the name of the TA equals the name of the issuer of the first        certificate. 
  1902.  
  1903.  
  1904.  
  1905.  Kaufman                                                        [Page 79] 
  1906.  RFC 1507                          DASS                    September 1993 
  1907.  
  1908.      l) All of the certificates are valid X.509 encodings and the        current time is within all of their validity intervals. 
  1909.  
  1910.    If a chain is valid, the name which it authenticates can be    constructed as follows: 
  1911.  
  1912.     a) If the chain contains a cross certificate, the name        authenticated can be constructed by taking the subject name        from the cross certificate and appending to it a relative name        for each child certificate which follows.  The relative name        is the extension by which the subject name in the child        certificate extends the issuer name. 
  1913.  
  1914.     b) If the chain does not contain a cross certificate, the name        authenticated can be constructed by taking the TA name,        truncating from it the last  n name components where  n is the        number of  parent certificates in the chain, and appending to        the result a relative name for each child certificate.  The        relative name is the extension by which the subject name in        the child certificate extends the issuer name. 
  1915.  
  1916.    In the common case, the authenticated name will be the subject    name in the last certificate.  The authenticated name is    constructed by the rules above to deal with namespace    reorganization.  If a branch of the namespace is renamed (due to,    for example, a corporate acquisition or reorganization), only the    certificates around the break point need to be regenerated.    Certificates below the break will continue to contain the old    names (until renewed), but the algorithms above assure the    principals in that branch will be able to authenticate as their    new names.  Further, if the certificates at the branch point are    maintained for both the old and new names for an interim period,    principals in the moved branch will be able to authenticate as    either their old or new names for that interim period without    having duplicate certificates. 
  1917.  
  1918.    A final complication that the algorithm must deal with is the    location of  cross certificates.  If a key is compromised or for    some other reason it is important to revoke a certificate ahead    of its expiration, it is removed from the naming service.  This    algorithm will only use certificates that it has recently    retrieved from the naming service, so revocation is as effective    as the mechanisms that prevent impersonation of the naming    service.   There are plans to eventually use DASS mechanisms to    secure access to the naming service; until they are in place,    name service impersonation is a theoretical threat to the    security of revocation.  Opinions differ as to whether it is a    practical threat.   Child certificates are always stored with the 
  1919.  
  1920.  
  1921.  
  1922. Kaufman                                                        [Page 80] 
  1923.  RFC 1507                          DASS                    September 1993 
  1924.  
  1925.     subject and will not be found unless stored in the name server of    the subject.    Parent  certificates are always stored with the    issuer and will not be found unless stored in the name server of    the issuer.  For best security, cross certificates should be    stored with the issuer because the name server for the subject    may not be adequately trustworthy to perform revocation.  There    are performance and availability penalties, however, in doing so.    The architecture and the algorithm therefore support storing    cross certificates with either the issuer or the subject.  There    must be some sort of flag in the name service associated with the    issuer saying whether cross certificates from that issuer are    permitted to be stored in the subject's name service entry, and    if that flag is set such certificates will be found and used. 
  1926.  
  1927.    In order to make revocation effective, DASS must assure that    naming service caches do not become arbitrarily stale (the    allowed age of a cache entry is included in the sum of times with    together make up the revocation time).  If DASS uses a naming    service such as DNS that does not time out cache entries, it must    bypass cache on all calls and (to achieve reasonable performance)    maintain its own naming service cache.  It may be advantageous to    maintain a cache in any case so the that the fact that the    certificates have been verified can be cached as well as the fact    that they are current. 
  1928.  
  1929. 3.10.10.1 Basic Algorithm 
  1930.  
  1931.    For ease of exposition, this first description will ignore the    operation of any caches.  Permissible modifications to take    advantage of caches and enhance performance will be covered in    the next section.  This path will be followed if the Try_Hard bit    is set True on the call. 
  1932.  
  1933.    Rather than trying construct all possible chains between the TA    and the name to be authenticated (in the event of multiple    certificates per principal, there could be exponentially many    valid chains), this algorithm computes a set of PK/UID/Name    triples that are valid for each principal on the path between the    TA and the name to be authenticated.  By doing so, it minimizes    the processing of redundant information. 
  1934.  
  1935.     a) Determining path and initialization 
  1936.  
  1937.        Several state variables are manipulated during the tree walk.        These are called: 
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  Kaufman                                                        [Page 81] 
  1944.  RFC 1507                          DASS                    September 1993 
  1945.  
  1946.        1) Current-directory-name          This is the name indicating the current place in the tree          walk.  Initially, this is the name of the TA. 
  1947.  
  1948.       2) Least-Common-Ancestor-Name          This is the portion of the names which is common to both the          CA and the Target.  This is computed at initialization and          does not change during the treewalk. 
  1949.  
  1950.       3) Trusted-Key-Set          For each name which is an ancestor of either the TA or the          Target but not of the Least-Common-Ancestor, a list of          PK/UID/Name triples.  This is initialized to a single triple          from the TA information in the supplied credentials. 
  1951.  
  1952.       4) Search-when-descending          This is a list of PK/UID/Name triples of issuers that will          be trusted when descending the tree.  This set is initially          empty. 
  1953.  
  1954.       5) Saved-RDNs          This is a sequence of Relative Distinguished Names (RDNs)          stripped off the right of the target name to form          Least-common-ancestor-name.  This "stack" is initially empty          and is populated during Step 3. 
  1955.  
  1956.     b) Ascending the "TA side" of the tree 
  1957.  
  1958.        While Current-directory-name is not identical to        Common-point-Name the algorithm moves up the tree. At each        step it does the following operations. 
  1959.  
  1960.       1) Find all cross certificates stored in the naming service          under Current-directory-name in which the subject is an          ancestor of the principal to be authenticated or an          indication that cross certificates from this issuer are          stored in the subject entry.  If there is an indication that          such certificates are stored in the subject entry, copy all          triples in Trusted-Key-Set for Current-directory-name into          the "Search-when-descending" list.  If any such certificates          are found, filter them to include only those which meet the          following criteria: 
  1961.  
  1962.         (i)  For some triple in the Trusted-Key-Set corresponding to              the Current-directory-name, the public key in the triple              verifies the signature on the certificate  and either the              UID in the triple matches the issuer UID in the              certificate  or the UID in the triple and/or the 
  1963.  
  1964.  
  1965.  
  1966. Kaufman                                                        [Page 82] 
  1967.  RFC 1507                          DASS                    September 1993 
  1968.  
  1969.               certificate is missing and the name in the triple matches              the issuer name in the certificate. 
  1970.  
  1971.         (ii) No certificates were found signed by this issuer in which              the subject name is longer than the subject name in this              certificate (i.e., if there are cross certificates to two              different ancestors, accept only those which lead to the              closest ancestor). 
  1972.  
  1973.         (iii)The current time is within the validity interval of the              certificate. 
  1974.  
  1975.       2) If any cross certificates were found (whether or not they          were all eliminated as part of the filtering process), set          Current-directory-name to the longest name that was found in          any certificate and construct a set of PK/UID/Name triples          for that name from the certificates which pass the filter          and place them in the Trusted Key Set associated with their          subject.  Exit the ascending tree loop at this point and          proceed directly to step 3.  Note that this means that if          there are cross certificates to an ancestor of the target          but they are all rejected (for example if they have          expired), the treewalk will   not construct a chain through          the least common ancestor and will ultimately fail unless a          crosslink from a lower ancestor is found stored with its          subject.  This is a security feature. 
  1976.  
  1977.       3) If no cross certificates are found, find all the parent          directory certificates for the directory whose name is in          the Current-directory-name.  Filter these to find only those          which meet the following criteria: 
  1978.  
  1979.         (i)  The current time is within the validity interval. 
  1980.  
  1981.         (ii) For some triple corresponding to the              Current-directory-name, the public key in the triple              verifies the signature on the certificate  and either  the              UID in the triple matches the issuer UID in the              certificate  or the UID in the triple and/or the              certificate is missing and the name in the triple matches              the issuer name in the certificate. 
  1982.  
  1983.       4) Construct PK/UID/Name triples from the remaining          certificates for the directory whose name is constructed by          stripping the rightmost simple name from the          Current-directory-name and place them in the Trusted-Key-Set. 
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989. Kaufman                                                        [Page 83] 
  1990.  RFC 1507                          DASS                    September 1993 
  1991.  
  1992.        5) Strip the rightmost simple name of the          Current-directory-name. 
  1993.  
  1994.       6) Repeat from step (a) (testing to see if          current-directory-name is the same as Common-point-Name). 
  1995.  
  1996.     c) Searching the "target side" of the tree for a crosslink: 
  1997.  
  1998.       1) Initialization: set Current-directory-name to the name          supplied as input to this procedure. 
  1999.  
  2000.       2) Retrieve from the naming service all cross certificates          associated with Current-directory-name.  Filter to only          those that meet the following criteria: 
  2001.  
  2002.         (i)  The current time is within their validity interval. 
  2003.  
  2004.         (ii) The subject name is equal to Current-directory-name. 
  2005.  
  2006.         (iii)For some PK/UID/Name triple in the              "Search-when-descending" list compiled while ascending              the tree, the Public Key verifies the signature on the              certificate and  either the UID matches the issuer UID in              the certificate   or a UID is missing from the triple              and/or the certificate and the Name in the triple matches              the issuer name in the certificate. 
  2007.  
  2008.         (iv) There are no certificates found meeting criteria (ii) and              (iii) matching a PK/UID/Name triple in the              Search-when-descending list whose subject is a directory              lower in the naming hierarchy. 
  2009.  
  2010.       3) If any qualifying certificates are found, construct          PK/UID/Name triples for each of them; these should replace          rather than supplement any triples already in the          Trusted-key-set for that directory. 
  2011.  
  2012.       4) If after steps (b) and (c), there are no PK/UID/Name triples          corresponding to Current-directory-name in Trusted-Key-Set,          shorten Current-directory-name by one RDN (pushing it onto          the Saved-RDNs stack) and repeat this process until          Current-directory-name is equal to          Least-common-ancestor-name  or there is at least one triple          in Trusted-key-set corresponding to Current-directory-name. 
  2013.  
  2014.     d) Descending the tree 
  2015.  
  2016.        While the list Saved-RDNs is not Empty the algorithm moves 
  2017.  
  2018.  
  2019.  
  2020. Kaufman                                                        [Page 84] 
  2021.  RFC 1507                          DASS                    September 1993 
  2022.  
  2023.         down the tree. At each step it does the following operations. 
  2024.  
  2025.       1) Remove the first RDN from Saved-RDNs and append it to the          Current-directory-name. 
  2026.  
  2027.       2) Find all the child directory certificates for the directory          whose name is in the current-directory-name. 
  2028.  
  2029.       3) Filter these certificates to find only those which meet the          following criteria: 
  2030.  
  2031.         (i)  The current time is within the validity interval. 
  2032.  
  2033.         (ii) For some PK/UID/Name triple in the Current-key-set for              the parent directory, the Public Key verifies the              signature on the certificate and either the UID matches              the issuer UID of the certificate   or the UID is missing              from the triple and/or the certificate and the Name in              the triple matches the issuer name in the certificate. 
  2034.  
  2035.         (iii)The issuer name in the certificate is a prefix of the              subject name and the difference between the two names is              the final RDN of Current-directory-name. 
  2036.  
  2037.       4) Take the key, UID, and name from each remaining certificate          and form a new triple corresponding to          Current-directory-name in Trusted-Key-Set. If this set is          empty then the algorithm exits with the          'Incomplete-chain-of-trustworthy-CAs' error condition. 
  2038.  
  2039.       5) repeat from step (a), appending a new simple name to          Current-directory-name. 
  2040.  
  2041.     e) Find public keys:        If there are no triples in the Trusted-Key-Set for the named        principal, then the algorithm exits with the `Target-has-no-keys-w        error condition. Otherwise, the Public Key and UID are        extracted from each pair, duplicates are eliminated, and this        set is returned as the Pub_keys. 
  2042.  
  2043. 3.10.10.2 Allowed Variations - Caching 
  2044.  
  2045.    Some use of caches can be implemented without affecting the semantics    of the Get_Pub_Keys routine.  For example, a crypto-cache could    remember the public key that verified a signature in the past and    could avoid the verification operation if the same key was used to    verify the same data structure again.  In some cases, however, it is    impossible (or at least inconvenient) for a cache implementation to 
  2046.  
  2047.  
  2048.  
  2049. Kaufman                                                        [Page 85] 
  2050.  RFC 1507                          DASS                    September 1993 
  2051.  
  2052.     be completely transparent. 
  2053.  
  2054.    In particular, for good performance it is important that certificates    not be re-retrieved from the naming service on every authentication.    This must be balanced against the need to have changes to the    contents of the naming service be reflected in DASS calls on a timely    basis.  There are two cases of interest: changes which cause an    authentication which previously would have succeeded to fail and    changes which cause an authentication which previously would have    failed to succeed.  These two cases are subject to different time    constraints. 
  2055.  
  2056.    In general, changes that cause authentication to succeed must be    reflected quite quickly - on the order of minutes.  If a user    attempts an operation, it fails, the user tracks down a system    manager and causes the appropriate updates to take place, and the    user retries the operation, it is unacceptable for the operation to    continue to fail for an extended period because of stale caches. 
  2057.  
  2058.    Changes that cause authentication to fail must be reflected reliably    within a bounded period of time for security reasons.  If a user    leaves the company, it must be possible to revoke his ability to    authenticate within a relatively short period of time - say hours. 
  2059.  
  2060.    These constraints mean that a naming service cache which contains    arbitrarily old information is unacceptable.  To meet the second    constraint, naming service cache entries must be timed out within a    reasonable period of time unless in implementation verifies that the    certificate is still present (a crypto-cache which lasted longer    would be legal; rather than deleting a name service cache entry, in    implementation might instead verify that the entry was still present    in the naming service.  This would avoid repeating the cryptographic    "verify"). 
  2061.  
  2062.    In order to assure that information cached for even a few hours not    deny authentication for that extended period, it must be possible to    bypass caches when the result would otherwise be a failure.  Since    the performance of authentication failures is not a serious concern,    it is acceptable to expect that before an operation fails a retry    will be made to the naming service to see if there are any new    relevant certificates (or in certain obscure conditions, to see if    any relevant certificates have been deleted). 
  2063.  
  2064.    If on a call to Get_Pub_Keys, the Try_Hard bit is True, then this    procedure must return results based on the contents of the naming    service no more than five minutes previous (this would normally be    accomplished by ignoring name service caches and making all    operations directly to the naming service).  If the Try_Hard bit is 
  2065.  
  2066.  
  2067.  
  2068. Kaufman                                                        [Page 86] 
  2069.  RFC 1507                          DASS                    September 1993 
  2070.  
  2071.     False, this procedure may return results based on the contents of the    naming service any time in the previous few hours, in the sense that    it may ignore any certificate added in the previous few hours and may    use any certificate deleted in the previous few hours.  Procedures    which call this routine with Try_Hard set to false must be prepared    to call it again with Try_Hard True if their operation fails possibly    from this result. 
  2072.  
  2073.    The exact timer values for "five minutes" and "a few hours" are    expected to be implementation constants. 
  2074.  
  2075.    In the envisioned implementation, the entire "ascending treewalk" is    retrieved, verified, and its digested contents cached when a    principal first establishes credentials.  A mechanism should be    provided to refresh this information periodically for principals    whose sessions might be long lived, but it would probably be    acceptable in the unlikely event of a user's ancestor's keys changing    to require that the user log out and log back in.  This is consistent    with the observed behavior of existing security mechanisms. 
  2076.  
  2077.    The descending treewalk, on the other hand, is expected to be    maintained as a more conventional cache, where entries are kept in a    fixed amount of memory with a "least recently used" replacement    policy and a watchdog timer that assures that stale information is    not kept indefinitely.  A call to Get_Pub_Keys with Try_Hard set    false would first check that cache for relevant certificates and only    if none were found there would it go out to the naming service.  If    there were newer certificates in the naming service, they might not    be found and an authentication might therefore fail. 
  2078.  
  2079.    When Try_Hard is false, an implementation may assume that    certificates not in the cache do not exist so long as that assumption    does not cause an authentication to falsely succeed.  In that case,    it may only make that assumption if the certificates have been    verified to not exist within the revocation time (a few hours). 
  2080.  
  2081. 3.11 DASSlessness Determination Functions 
  2082.  
  2083.    In order to provide better interoperability with alternative    authentication mechanisms and to provide backward compatibility with    older (insecure) authentication mechanisms, it is sometimes important    to be able to determine in a secure way what the appropriate    authentication mechanism is for a particular named principal.  For    some applications, this will be done by a local mechanism, where    either the person creating access control information must know and    specify the mechanism for each principal or a system administrator on    the node must maintain a database mapping names to mechanisms.  Three    applications come to mind where scaleability makes such mechanisms 
  2084.  
  2085.  
  2086.  
  2087. Kaufman                                                        [Page 87] 
  2088.  RFC 1507                          DASS                    September 1993 
  2089.  
  2090.     implausible: 
  2091.  
  2092.     a) To transparently secure proxy-based applications (like rlogin)        in an environment where some hosts have been upgraded to        support DASS and some have not, a node must be willing to        accept connections authenticated only by their network        addresses but only if they can be assured that such nodes do        not have DASS installed.  Access to a resource becomes secure        without administrative action when all nodes authorized to        access it have been upgraded. 
  2093.  
  2094.        In this scenario, the server node must be able to determine        whether the client node is DASSless in a secure fashion. 
  2095.  
  2096.     b) Similarly, in a mixed environment where some servers are        running DASS and some are not, it may be desirable for clients        to authenticate servers if they can but it would be        unacceptable for a client to stop being able to access a        DASSless server once DASS is installed on the client.  In such        a situation where server authentication is desirable but not        essential, the client would like to determine in a secure        fashion whether the server can accept DASS authentication. 
  2097.  
  2098.     c) In a DASS/Kerberos interoperability scenario, a server may        decide that Kerberos authentication is "good enough" for        principals that do not have DASS credentials without        introducing trust in on-line authorities when DASS credentials        are available.  In parallel with case 1, we want it to be true        that when the last principal with authority to access an        object is upgraded to DASS, we automatically cease to trust        PasswdEtc servers without administrative action on the part of        the object owner.  For this purpose, the authenticator must        learn in a secure fashion that the principal is incapable of        DASS authentication. 
  2099.  
  2100.    Reliably determining DASSlessness is optional for implementations of    DASS and for applications.  No other capabilities of DASS rely on    this one. 
  2101.  
  2102.    The interface to the DASSlessness inquiry function is specified as a    call independent of all others.  This capability must be exposed to    the calling application so that a server that receives a request and    no token can ask whether the named principal should be believed    without a token.  It might improve performance and usability if in    real interfaces DASSlessness were returned in addition to a bad    status on the function that creates a token if the token is targeted    toward a server incapable or processing it.  An application could    then decide whether to make the request without a token (and give up 
  2103.  
  2104.  
  2105.  
  2106. Kaufman                                                        [Page 88] 
  2107.  RFC 1507                          DASS                    September 1993 
  2108.  
  2109.     server authentication) or to abort the request. 
  2110.  
  2111. 3.11.1 Query DASSlessness 
  2112.  
  2113.    Query_DASSlessness(                                                       --inputs                        verifying_credentials Credentials,                        principal_name        Name,                                                       --outputs                        alternate_authentication Set of OIDs) 
  2114.  
  2115.    This function uses the verifying credentials to search for an    alternative authentication mechanism certificate for the named    principal or for any CA on the path between the verifying credentials    and the named principal.  Such a certificate is identical to an DASS    X.509 certificate except that it lists a different algorithm    identifier for the public key of the subject than that expected by    DASS. 
  2116.  
  2117.    This function is implemented identically to Get_Pub_Keys except: 
  2118.  
  2119.     a) If in any set of certificates found, no valid DASS certificate        is found and one or more certificates are found that would        otherwise be valid except for an invalid subject public key        OID, the OID from that certificate or certificates is returned        and the algorithm terminates. 
  2120.  
  2121.     b) On initial execution, Try_Hard=False.  If the first execution        fails to retrieve any valid PK/UID pairs but also fails to        find any invalid OID certificates, repeat the execution with        Try_Hard=True. 
  2122.  
  2123.     c) If the either execution finds PK/UID pairs or if neither finds        and invalid OID certificates, fail by returning a null set. 
  2124.  
  2125. 4. Certificate and message formats 
  2126.  
  2127. 4.1 ASN.1 encoding 
  2128.  
  2129.    Some definitions are taken from X.501 and X.509. 
  2130.  
  2131.    Dass DEFINITIONS ::= 
  2132.  
  2133.    BEGIN 
  2134.  
  2135.    --CCITT Definitions: 
  2136.  
  2137.    joint-iso-ccitt      OBJECT IDENTIFIER ::= {2} 
  2138.  
  2139.  
  2140.  
  2141. Kaufman                                                        [Page 89] 
  2142.  RFC 1507                          DASS                    September 1993 
  2143.  
  2144.     ds                   OBJECT IDENTIFIER ::= {joint-iso-ccitt 5}    algorithm            OBJECT IDENTIFIER ::= {ds 8}    encryptionAlgorithm  OBJECT IDENTIFIER ::= {algorithm 1}    hashAlgorithm        OBJECT IDENTIFIER ::= {algorithm 2}    signatureAlgorithm   OBJECT IDENTIFIER ::= {algorithm 3}    rsa                  OBJECT IDENTIFIER ::= {encryptionAlgorithm 1} 
  2145.  
  2146.    iso                  OBJECT IDENTIFIER ::= {1}    identified-organization OBJECT IDENTIFIER ::= {iso 3}    ecma               OBJECT IDENTIFIER ::= {identified-organization 12}    member-company       OBJECT IDENTIFIER ::= {ecma 2}    digital              OBJECT IDENTIFIER ::= {member-company 1011} 
  2147.  
  2148.     --1989 OSI Implementors Workshop "Stable" Agreements 
  2149.  
  2150.    oiw                OBJECT IDENTIFIER ::= {identified-organization 14}    dssig                  OBJECT IDENTIFIER ::= {oiw 7}    oiwAlgorithm           OBJECT IDENTIFIER ::= {dssig 2}    oiwEncryptionAlgorithm OBJECT IDENTIFIER ::= {oiwAlgorithm 1}    oiwHashAlgorithm       OBJECT IDENTIFIER ::= {oiwAlgorithm 2}    oiwSignatureAlgorithm  OBJECT IDENTIFIER ::= {oiwAlgorithm 3}    oiwMD2                 OBJECT IDENTIFIER ::= {oiwHashAlgorithm 1}                                                   --null parameter    oiwMD2withRSA          OBJECT IDENTIFIER ::= {oiwSignatureAlgorithm 1}                                                   --null parameter 
  2151.  
  2152.    --X.501 definitions 
  2153.  
  2154.    AttributeType ::= OBJECT IDENTIFIER    AttributeValue ::= ANY    AttributeValueAssertion ::= SEQUENCE {AttributeType,AttributeValue} 
  2155.  
  2156.    Name ::= CHOICE {       --only one for now                    RDNSequence                        }    RDNSequence ::= SEQUENCE OF RelativeDistinguishedName    DistinguishedName ::= RDNSequence 
  2157.  
  2158.    RelativeDistinguishedName ::= SET OF AttributeValueAssertion 
  2159.  
  2160.    --X.509 definitions (with proposed 1992 extensions presumed) 
  2161.  
  2162.    ENCRYPTED MACRO ::=    BEGIN    TYPE NOTATION   ::= type(ToBeEnciphered)    VALUE NOTATION  ::= value(VALUE BIT STRING)    END     -- of ENCRYPTED 
  2163.  
  2164.  
  2165.  
  2166. Kaufman                                                        [Page 90] 
  2167.  RFC 1507                          DASS                    September 1993 
  2168.  
  2169.     SIGNED MACRO    ::=    BEGIN    TYPE NOTATION   ::= type (ToBeSigned)    VALUE NOTATION  ::= value (VALUE    SEQUENCE{            ToBeSigned,            AlgorithmIdentifier,    --of the algorithm used to                                    --generate the signature            ENCRYPTED OCTET STRING  --where the octet string is the                                    --result of the hashing of the                                    --value of "ToBeSigned"            }                            )    END     -- of SIGNED 
  2170.  
  2171.     SIGNATURE MACRO ::=    BEGIN    TYPE NOTATION   ::= type (OfSignature)    VALUE NOTATION  ::= value (VALUE    SEQUENCE {            AlgorithmIdentifier,    --of the algorithm used to compute            ENCRYPTED OCTET STRING  -- the signature where the octet                                    -- string is a function (e.g., a                                    -- compressed or hashed version)                                    -- of the value 'OfSignature',                                    -- which may include the                                    -- identifier of the algorithm                                    -- used to compute the signature            }                            )    END     -- of SIGNATURE 
  2172.  
  2173.  
  2174.  
  2175.    Certificate ::= SIGNED SEQUENCE {            version [0]             Version DEFAULT v1988,            serialNumber    CertificateSerialNumber,            signature               AlgorithmIdentifier,            issuer          Name,            valid           Validity,            subject         Name,            subjectPublicKey        SubjectPublicKeyInfo,            issuerUID [1]   IMPLICIT UID OPTIONAL,  -- v1992            subjectUID [2]  IMPLICIT UID OPTIONAL   -- v1992            } 
  2176.  
  2177.            --The Algorithm Identifier for both the signature field 
  2178.  
  2179.  
  2180.  
  2181. Kaufman                                                        [Page 91] 
  2182.  RFC 1507                          DASS                    September 1993 
  2183.  
  2184.             --and in the signature itself is:            --      oiwMD2withRSA (1.3.14.7.2.3.1) 
  2185.  
  2186.    Version ::= INTEGER {v1988(0), v1992(1)} 
  2187.  
  2188.    CertificateSerialNumber ::= INTEGER 
  2189.  
  2190.    Validity ::= SEQUENCE {            NotBefore       UTCTime,            NotAfter        UTCTime            } 
  2191.  
  2192.     AlgorithmIdentifier ::= SEQUENCE {            algorithm       OBJECT IDENTIFIER,            parameter       ANY DEFINED BY algorithm OPTIONAL            } 
  2193.  
  2194.    --The algorithms we support in one context or another are:            --oiwMD2withRSA (1.3.14.7.2.3.1) with parameter NULL            --rsa (2.5.8.1.1) with parameter keysize INTEGER which is            --           the keysize in bits            --decDEA (1.3.12.1001.7.1.2) with optional parameter            --           missing            --decDEAMAC (1.3.12.2.1011.7.3.3) with optional parameter            --           missing 
  2195.  
  2196.    SubjectPublicKeyInfo  ::=  SEQUENCE {            algorithm       AlgorithmIdentifier,     -- rsa (2.5.8.1.1)            subjectPublicKey        BIT STRING                    -- the "bits" further decode into a DASS public key            } 
  2197.  
  2198.    UID ::= BIT STRING 
  2199.  
  2200.    -- the following definitions are for Digital specified Algorithms 
  2201.  
  2202.    cryptoAlgorithm OBJECT IDENTIFIER ::= {digital 7} 
  2203.  
  2204.    decEncryptionAlgorithm  OBJECT IDENTIFIER ::= {cryptoAlgorithm 1}    decHashAlgorithm        OBJECT IDENTIFIER ::= {cryptoAlgorithm 2}    decSignatureAlgorithm   OBJECT IDENTIFIER ::= {cryptoAlgorithm 3}    decDASSLessness         OBJECT IDENTIFIER ::= {cryptoAlgorithm 6} 
  2205.  
  2206.    decMD2withRSA   OBJECT IDENTIFIER ::= {decSignatureAlgorithm 1}    decMD4withRSA   OBJECT IDENTIFIER ::= {decSignatureAlgorithm 2}    decDEAMAC       OBJECT IDENTIFIER ::= {decSignatureAlgorithm 3} 
  2207.  
  2208.  
  2209.  
  2210.  Kaufman                                                        [Page 92] 
  2211.  RFC 1507                          DASS                    September 1993 
  2212.  
  2213.     decDEA          OBJECT IDENTIFIER ::= {decEncryptionAlgorithm 2}    decMD2          OBJECT IDENTIFIER ::= {decHashAlgorithm 1}    decMD4          OBJECT IDENTIFIER ::= {decHashAlgorithm 2} 
  2214.  
  2215.     ShortPosixTime ::= INTEGER   -- number of seconds since base time 
  2216.  
  2217.    LongPosixTime ::= SEQUENCE {            INTEGER,             -- number of seconds since base time            INTEGER              -- number of nanoseconds since second            } 
  2218.  
  2219.     ShortPosixValidity ::=  SEQUENCE {            notBefore       ShortPosixTime,            notAfter        ShortPosixTime } 
  2220.  
  2221.    -- Note: Annex C of X.509 prescribes the following format for the    -- representation of a public key, but does not give the structure    -- a name. 
  2222.  
  2223.    DASSPublicKey ::=  SEQUENCE {            modulus         INTEGER,            exponent        INTEGER            } 
  2224.  
  2225.    DASSPrivateKey ::= SEQUENCE {            p       INTEGER ,                      -- prime p            q [0]   IMPLICIT INTEGER OPTIONAL ,    -- prime q            mod[1]  IMPLICIT INTEGER OPTIONAL,     -- modulus            exp [2] IMPLICIT INTEGER OPTIONAL,     -- public exponent            dp [3]  IMPLICIT INTEGER OPTIONAL ,    -- exponent mod p            dq [4]  IMPLICIT INTEGER OPTIONAL ,    -- exponent mod q            cr [5]  IMPLICIT INTEGER OPTIONAL ,    -- Chinese                                               --remainder coefficient            uid[6]  IMPLICIT UID OPTIONAL,            more[7] IMPLICIT BIT STRING OPTIONAL   --Reserved for                                                   --future use            } 
  2226.  
  2227.     LocalUserName   ::= OCTET STRING    ChannelId               ::= OCTET STRING    VersionNumber           ::= OCTET STRING (SIZE(3))                            -- first octet is major version                            -- second octet is minor version                            -- third octet is ECO rev.    versionZero  VersionNumber ::= '000000'H 
  2228.  
  2229.  
  2230.  
  2231. Kaufman                                                        [Page 93] 
  2232.  RFC 1507                          DASS                    September 1993 
  2233.  
  2234.     Authenticator ::= SIGNED SEQUENCE {            type            BIT STRING,                     -- first bit `delegation required'                     -- second bit `Mutual Authentication Requested'            whenSigned      LongPosixTime ,            channelId  [3]  IMPLICIT ChannelId OPTIONAL                    -- channel bindings are included when doing the                    -- signature, but excluded when transmitting the                    -- Authenticator            }                    -- uses decDEAMAC (1.3.12.2.1011.7.3.3) 
  2235.  
  2236.     EncryptedKey ::= SEQUENCE {            algorithm               AlgorithmIdentifier,                            -- uses rsa (2.5.8.1.1)            encryptedAuthKey        BIT STRING                            -- as defined in section 4.4.5            } 
  2237.  
  2238.    SignatureOnEncryptedKey ::=  SIGNATURE EncryptedKey                 -- uses oiwMD2withRSA (1.3.14.7.2.3.1)                 -- Signature bits computed over EncryptedKey structure 
  2239.  
  2240.     LoginTicket ::= SIGNED SEQUENCE {            version [0]         IMPLICIT VersionNumber DEFAULT versionZero,            validity            ShortPosixValidity ,            subjectUID          UID ,            delegatingPublicKey SubjectPublicKeyInfo            }            -- uses oiwMD2withRSA (1.3.14.7.2.3.1) 
  2241.  
  2242.    Delegator ::= SEQUENCE {            algorithm               AlgorithmIdentifier                            -- decDEA encryption (1.3.12.1001.7.1.2)            encryptedPrivKey        ENCRYPTED  DASSPrivateKey,                            -- (only p is included)            } 
  2243.  
  2244.    UserClaimant ::=  SEQUENCE {            userTicket [0]  IMPLICIT LoginTicket,            evidence  CHOICE {                    delegator [1]   IMPLICIT Delegator ,                                 -- encrypted delegation private key                                 -- under DES authenticating key                                 -- present if delegating                    sharedKeyTicketSignature [2] 
  2245.  
  2246.  
  2247.  
  2248. Kaufman                                                        [Page 94] 
  2249.  RFC 1507                          DASS                    September 1993 
  2250.  
  2251.                             IMPLICIT SignatureOnEncryptedKey                                 -- present if not delegating                    } ,            userName [3]    IMPLICIT Name OPTIONAL                                 -- name of user principal            } 
  2252.  
  2253.     EncryptedKeyandUserName ::= SEQUENCE {            encryptedKey    EncryptedKey ,            username                LocalUserName            } 
  2254.  
  2255.    SignatureOnEncryptedKeyandUserName ::=            SIGNATURE EncryptedKeyandUserName                    -- uses oiwMD2withRSA (1.3.14.7.2.3.1)                    -- Signature bits computed over                    -- EncryptedKeyandUserName structure                    -- using node private key            } 
  2256.  
  2257.    NodeClaimant ::= SEQUENCE {            nodeTicket Signature[0] IMPLICIT                    SignatureOnEncryptedKeyandUserName,            nodeName  [1]   IMPLICIT Name OPTIONAL,            username  [2]   IMPLICIT LocalUserName OPTIONAL            } 
  2258.  
  2259.    AuthenticationToken ::= SEQUENCE {            version [0]    IMPLICIT VersionNumber DEFAULT versionZero,            authenticator [1]       IMPLICIT Authenticator ,            encryptedKey  [2]       IMPLICIT EncryptedKey OPTIONAL ,                     -- required if initiating token            userclaimant  [3]       IMPLICIT UserClaimant OPTIONAL ,                     -- missing if only doing node authentication                     -- required if not doing node authentication            nodeclaimant [4]        IMPLICIT NodeClaimant OPTIONAL                     -- missing if only doing principal authentication                     -- required if not doing principal authentication            } 
  2260.  
  2261.    MutualAuthenticationToken ::= CHOICE {            v1Response [0] IMPLICIT  OCTET STRING (SIZE(6))                  -- Constructed as follows:  A single DES block                  -- of eight octets is constructed from the two                  -- integers in the timestamp.  First four bytes                  -- are the high order integer encoded MSB                  -- first; Last four bytes are the low order 
  2262.  
  2263.  
  2264.  
  2265. Kaufman                                                        [Page 95] 
  2266.  RFC 1507                          DASS                    September 1993 
  2267.  
  2268.                   -- integer encoded MSB first.  The block is                  -- encrypted using the shared DES key, and                  -- the first six bytes are the OCTET STRING.                  -- With the [0] type and 6-byte length, the                  -- MutualAuthenticationToken has a fixed                  -- length of eight bytes.            }    END 
  2269.  
  2270. 4.2 Encoding Rules 
  2271.  
  2272.    Whenever a structure is to be signed it must always be constructed    the same way. This is particularly important where a signed structure    has to be reconstructed by the recipient before the signature is    verified. The rules listed below are taken from X.509. 
  2273.  
  2274.     - the definite form of length encoding shall be used, encoded in       the minimum number of octets; 
  2275.  
  2276.     - for string types, the constructed form of encoding shall not       be used; 
  2277.  
  2278.     - if the value of a type is its default value, it shall be       absent; 
  2279.  
  2280.     - the components of a Set type shall be encoded in ascending       order of their tag value; 
  2281.  
  2282.     - the components of a Set-of type shall be encoded in ascending       order of their octet value; 
  2283.  
  2284.     - if the value of a Boolean type is true, the encoding shall       have its contents octet set to `FF'16; 
  2285.  
  2286.     - each unused bits in the final octet of the encoding of a       BitString value, if there are any, shall be set to zero; 
  2287.  
  2288.     - the encoding of a Real type shall be such that bases 8, 10 and       16 shall not  be used, and the binary scaling factor shall be       zero. 
  2289.  
  2290. 4.3 Version numbers and forward compatibility 
  2291.  
  2292.    The LoginTicket and AuthenticationToken structures contain a    three octet version identifier which is intended to ease    transition to future revisions of this architecture.  The default    value, and the value which should always be supplied by    implementations of this version of the architecture is 0.0.0 
  2293.  
  2294.  
  2295.  
  2296. Kaufman                                                        [Page 96] 
  2297.  RFC 1507                          DASS                    September 1993 
  2298.  
  2299.     (three zero octets).  The first octet is the major version.  An    implementation of this version of the architecture should refuse    to process data structures where it is other than zero, because    changing it indicates that the interpretation of some subsidiary    data structure has changed.  The second octet is the minor    version.  An implementation of this version of the architecture    should ignore the value of this octet.  Some future version of    the architecture may set a value other than zero and may specify    some different processing of the remainder of the structure based    on that different value.  Such a change would be backward compatible    and interoperable.  The third octet is the ECO revision.  No    implementation should make any processing decisions based on the    value of that octet.  It may be logged, however, to help in    debugging interoperability problems. 
  2300.  
  2301.    In the CDC protocol, there is also a three octet version    numbering scheme, where versions 1.0.0 and 2.0.0 have been    defined.  Implementations should follow the same rules above and    reject major version numbers greater than 2. 
  2302.  
  2303.    ASN.1 is inherently extensible because it allows new fields to be    added "onto the end" of existing data structures in an    unambiguous way.  Implementations of DASS are encouraged to    ignore any such additional fields in order to enhance backwards    compatibility with future versions of the architecture.    Unfortunately, commonly available ASN.1 compilers lack this    capability, so this behavior cannot reasonably be required and    may limit options for future extensions. 
  2304.  
  2305. 4.4 Cryptographic Encoding 
  2306.  
  2307.    Some of the substructures listed in the previous sections are    specified as ENCRYPTED OCTET STRINGs containing encrypted    information.  DASS uses the DES, RSA, and MD2 cryptosystems  Each    of those cryptosystems specifies a function from octet string    into another in the presence of a key (except MD2, which is    keyless).  This section describes how to form the octet strings    on which the DES and RSA operations are performed. 
  2308.  
  2309. 4.4.1 Algorithm Independence vs. Key Parity 
  2310.  
  2311.    All of the defined encodings for DASS for secret key encryption    are based on DES.  It is intended, however, that other    cryptosystems could be substituted without any other changes for    formats or algorithms.  The required "form factor" for such a    cryptosystem is that it have a 64 bit key and operate on 64 bit    blocks (this appears to be a common form factor for a    cryptosystem).  For this reason, DES keys are in all places 
  2312.  
  2313.  
  2314.  
  2315. Kaufman                                                        [Page 97] 
  2316.  RFC 1507                          DASS                    September 1993 
  2317.  
  2318.     treated as though they were 64 bits long rather than 56.  Only in    the operation of the algorithm itself are eight bits of the key    dropped and key parity bits substituted. Choosing a key always    involves picking a 64 bit random number. 
  2319.  
  2320. 4.4.2 Password Hashing 
  2321.  
  2322.    Encrypted credentials are encrypted using DES as described in the    next section.  The key for that encryption is derived from the    user's password and name by the following algorithm: 
  2323.  
  2324.     a) Put the rightmost RDN of the user's name in canonical form        according to BER and the X.509 encoding rules.  For any string        types that are case insensitive, map to upper case, and where        matching is independent of number of spaces collapse all        multiple spaces to a single space and delete leading and        trailing spaces. 
  2325.  
  2326.        Note:  the RDN is used to add "salt" to the hash calculation        so that someone can't precompute the hash of all the words in        a dictionary and then apply them against all names.  Deriving        the salt from the last RDN of the name is a compromise.  If it        were derived from the whole name, all encrypted keys would be        obsoleted when a branch of the namespace was renamed.  If it        were independent of name, interaction with a login agent would        take two extra messages to retrieve the salt.  With this        scheme, encrypted keys are obsoleted by a change in the last        RDN and if a final RDN is common to a large number of users,        dictionary attacks against them are easier; but the common        case works as desired. 
  2327.  
  2328.     b) Compute TEMP as the MD2 message digest of the concatenation of        the password and the RDN computed above. 
  2329.  
  2330.     c) Repeat the following 40 times:  Use the first 64 bits of TEMP        as a DES key to encrypt the second 64 bits;  XOR the result        with the first 64 bits of TEMP; and compute a new TEMP as MD2        of the 128 bit result. 
  2331.  
  2332.     d) Use the final 64 bits of the result (called hash1) as the key        to decrypt the encrypted credentials.  Use the first 64 bits        (called hash2) as the proof of knowledge of the password for        presentation to a login agent (if any). 
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.  
  2339.  
  2340.  Kaufman                                                        [Page 98] 
  2341.  RFC 1507                          DASS                    September 1993 
  2342.  
  2343.  4.4.3 Digital DEA encryption 
  2344.  
  2345.    DES encryption is used in the following places: 
  2346.  
  2347.     - In the encryption of the encrypted credentials structure 
  2348.  
  2349.     - To encrypt the delegator in authentication tokens 
  2350.  
  2351.     - To encrypt the time in the mutual authenticator 
  2352.  
  2353.    In the first two cases, a varying length block of information    coded in ASN.1 is encrypted.  This is done by dividing the block    of information into 8 octet blocks, padding the last block with    zero bytes if necessary, and encrypting the result using the CBC    mode of DES.  A zero IV is used. 
  2354.  
  2355.    In the third case, a fixed length (8 byte) quantity (a timestamp)    is encrypted.  The timestamp is mapped to a byte string using    "big endian" order and the block is encrypted using the ECB mode    of DES. 
  2356.  
  2357. 4.4.4  Digital MAC Signing 
  2358.  
  2359.    DES signing is used in the Authenticator.  Here, the signature is    computed over an ASN.1 structure.  The signature is the CBC residue    of the structure padded to a multiple of eight bytes with zeros.  The    CBC is computed with an IV of zero. 
  2360.  
  2361. 4.4.5 RSA Encryption 
  2362.  
  2363.    RSA encryption is used in the Encrypted Shared Key.  RSA encryption    is best thought of as operating on blocks which are integers rather    than octet strings and the results are also integers.  Because an RSA    encryption permutes the integers between zero and (modulus-1), it is    generally thought of as acting on a block of size (keysizeinbits-1)    and producing a block of size (keysizeinbits) where keysizeinbits is    the smallest number of bits in which the modulus can be represented. 
  2364.  
  2365.    DASS only supports key sizes which are a multiple of eight bits (This    restriction is only required to support interoperation with certain    existing implementations.  If the key size is not a multiple of eight    bits, the high order byte may not be able to hold values as large as    the mandated '64'.  This is not a problem so long as the two high    order bytes together are non-zero, but certain early implementations    check for the value '64' and will not interoperate with    implementations that use some other value.). 
  2366.  
  2367.    The encrypted shared key structure is laid out as follows: 
  2368.  
  2369.  
  2370.  
  2371. Kaufman                                                        [Page 99] 
  2372.  RFC 1507                          DASS                    September 1993 
  2373.  
  2374.      - The DES key to be shared is placed in the last eight bytes 
  2375.  
  2376.     - The POSIX format creation time encoded in four bytes using big       endian byte order is placed in the next four (from the end)       bytes 
  2377.  
  2378.     - The POSIX format expiration time encoded in four bytes using       big endian byte order is placed in the next four (from the       end) bytes 
  2379.  
  2380.     - Four zero bytes are placed in the next four (from the end)       bytes 
  2381.  
  2382.     - The first byte contains the constant '64' (decimal) 
  2383.  
  2384.     - All remaining bytes are filled with random bytes (the security       of the system does not depend on the cryptographic randomness       of these bytes, but they should not be a frequently repeating       or predictable value.  Repeating the DES key from the last       bytes would be good). 
  2385.  
  2386.    The RSA algorithm is applied to the integer formed by treating the    bytes above as an integer in big endian order and the resulting    integer is converted to a BIT STRING by laying out the integer in    'big endian' order. 
  2387.  
  2388.    On decryption, the process is reversed; the decryptor should verify    the four explicitly zero bytes but should not verify the contents of    the high order byte or the random bytes. 
  2389.  
  2390. 4.4.6 oiwMD2withRSA Signatures 
  2391.  
  2392.    RSA-MD2 signatures are used on certificates, login tickets, shared    key tickets, and node tickets.  In all cases, a signature is computed    on an ASN.1 encoded string using an RSA private key.  This is done as    follows: 
  2393.  
  2394.     - The MD2 algorithm is applied to the ASN.1 encoded string to       produce a 128 bit message digest 
  2395.  
  2396.     - The message digest is placed in the low order bytes of the RSA       block (big endian) 
  2397.  
  2398.     - The next two lowest order bytes are the ASN.1 'T' and 'L' for       an OCTET STRING. 
  2399.  
  2400.     - The remainder of the RSA block is filled with zeros 
  2401.  
  2402.  
  2403.  
  2404.  Kaufman                                                       [Page 100] 
  2405.  RFC 1507                          DASS                    September 1993 
  2406.  
  2407.      - The RSA operation is performed, and the resulting integer is       converted to an octet string by laying out the bytes in big       endian order. 
  2408.  
  2409.    On verification, a value like the above  or one where the message    digest is present but the 'T' and 'L' are missing (zero) should be    accepted for backwards compatibility with an earlier definition of    this crypto algorithm. 
  2410.  
  2411. 4.4.7 decMD2withRSA Signatures 
  2412.  
  2413.    This algorithm is the same as the oiwMD2withRSA algorithm as defined    above.  We allocated an algorithm object identifier from the Digital    space in case the definition of that OID should change.  It will not    be used unless the meaning of oiwMD2withRSA becomes unstable. 
  2414.  
  2415. Annex A 
  2416.  
  2417. Typical Usage 
  2418.  
  2419.    This annex describes one way a system could use DASS services (as    described in section 3) to provide security services.  While this    example provided motivation for some of the properties of DASS, it is    not intended to represent the only way that DASS may be used.  This    goes through the steps that would be needed to install DASS "from    scratch". 
  2420.  
  2421. A.1 Creating a CA 
  2422.  
  2423.    A CA is created by initializing its state. Each CA can sign    certificates that will be placed in some directory in the name    service. Before these certificates will be believed in a wider    context than the sub-tree of the name space which is headed by that    directory, the CA must be certified by a CA for the parent directory.    The procedure below accomplishes this. For most secure operation, the    CA should run on an off-line system and communicate with the rest of    the network by interchanging files using a simple specialized    mechanism such as an RS232 line or a floppy disk. It is assumed that    access to the CA is controlled and that the CA will accept    instructions from an operator. 
  2424.  
  2425.     - Call Install_CA to create the CA State.       This state is saved within the CA system and is never       disclosed. 
  2426.  
  2427.     - If this is the first CA in the namespace and the CA is       intended to certify only members of a single directory, we are       done.  Otherwise, the new CA must be linked into the CA 
  2428.  
  2429.  
  2430.  
  2431. Kaufman                                                       [Page 101] 
  2432.  RFC 1507                          DASS                    September 1993 
  2433.  
  2434.        hierarchy by cross-certifying the parent and children of this       CA.  There is no requirement that CA hierarchies be created       from the root down, but to simplify exposition, only this case       will be described.  The newly created CA must learn its name,       its UID, the UID of its parent directory, and the public key       of the parent directory CA by some out of band reliable means.       Most likely, this would be done by looking up the information       in the naming service and asking the CA operator to verify it.       The CA then forms this information into a   parent certificate       and signs it using the Create_certificate function.  It       communicates the certificate to the network and posts it in       the naming service. 
  2435.  
  2436.     - This name, UID, and public key of the new CA are taken to the       CA of the parent directory, which verifies it (again by some       unspecified out-of-band mechanism) and calls       Create_Certificate to create a child  certificate using its own       Name and UID in the issuer fields. This certificate is also       placed in the naming service. 
  2437.  
  2438.    A CA can sign certificates for more than one directory. In this case    it is possible that a single CA will take the role of both CAs in the    example above. The above procedure can be simplified in this case, as    no interchange of information is required. 
  2439.  
  2440. A.2 Creating a User Principal 
  2441.  
  2442.    A system manager may create a new user principal by invoking the    Create_principal function supplying the principal's name, UID, and    the public key/UID of the parent CA.  The public key and UID must be    obtained in a reliable out of band manner.  This is probably by    having knowledge of that information "wired into" the utility which    creates new principals.  At account creation time, the system manager    must supply what will become the user's password.  This might be done    by having the user present and directly enter a password or by having    the password selected by some random generator. 
  2443.  
  2444.    The trusted authority certificate and corresponding user public key    generated by the Create_principal function are sent to the CA which    verifies its contents (again by an out-of-band mechanism) and signs a    corresponding certificate.  The encrypted credentials, CA signed    certificate, and trusted authority certificates are all placed in the    naming service.  The process by which the password is made known to    the user must be protected by some out-of-band mechanism. 
  2445.  
  2446.    In some cases the principal may wish to generate its own key, and not    use the Encrypted_Credentials. (e.g., if the Principal is represented    by a Smart Card). This may be done using a procedure similar to the 
  2447.  
  2448.  
  2449.  
  2450. Kaufman                                                       [Page 102] 
  2451.  RFC 1507                          DASS                    September 1993 
  2452.  
  2453.     one for creating a new CA. 
  2454.  
  2455. A.3 Creating a Server Principal 
  2456.  
  2457.    A server also has a public/private key pair. Conceptually, the same    procedure used to create a user principal can be used to create a    server.  In practice, the most important difference  is likely to be    how the password is protected when installing it on a server compared    to giving it to a user. 
  2458.  
  2459.    A server may wish to retrieve (and store) its Encrypted Credentials    directly and never have them placed in the naming service. In this    case some other mechanism can be used (e.g., passing the floppy disk    containing the encrypted credentials to the server). This would    require a variant of the Initialize_Server routine which does not    fetch the Encrypted Credentials from the naming service. 
  2460.  
  2461. A.4 Booting a Server Principal 
  2462.  
  2463.    When the server first boots it needs its name (unreliably) and    password (reliably). It then calls Initialize_Server to obtain its    credentials and trusted authority certificates (which it will later    need in order to authenticate users).  These credentials never time    out, and are expected to be saved for a long time.  In particular the    associated Incoming Timestamp List must be preserved while there are    any timestamps on it. It is desirable to preserve the Cached Incoming    Contexts as long as there are any contexts likely to be reused. 
  2464.  
  2465.    If a server wants to initiate associations on its own behalf then it    must call Generate_Server_Ticket.  It must repeat this at intervals    if the expiration period expires. 
  2466.  
  2467.    A node that wishes to do node authentication (or which acts as a    server under its own name) must be created as a server. 
  2468.  
  2469. A.5 A user logs on to the network 
  2470.  
  2471.    The system that the user logs onto finds the user's name and    password. It then calls Network_Login to obtain credentials for the    user. These credentials are saved until the user wants to make a    network connection. The credentials have a time limit, so the user    will have to obtain new credentials in order to make connections    after the time limit. The credentials are then checked by calling    Verify_Principal_Name, in order to check that the key specified in    the encrypted credentials has been certified by the CA. 
  2472.  
  2473.    If the system does source node authentication it will call    Combine_credentials, once the local username has been found.  (This 
  2474.  
  2475.  
  2476.  
  2477. Kaufman                                                       [Page 103] 
  2478.  RFC 1507                          DASS                    September 1993 
  2479.  
  2480.     can either be found by looking the principal's global name up in a    file, or the user can be asked to give the local name directly.    Alternatively the user can be asked to give his local username, which    the system looks up to find the global name). 
  2481.  
  2482. A.6 An Rlogin (TCP/IP) connection is made 
  2483.  
  2484.    When the user calls a modified version of the rlogin utility, it    calls Create_token in order to create the Initial Authentication    Token, which is passed to the other system as part of the rlogin    protocol.  The rlogind utility at the destination node calls    Accept_token to verify it.  It then looks up in a local rhosts-like    database to determine whether this global user is allowed access to    the requested destination account.  It calls Verify_principal_name    and/or Verify_node_name to confirm the identity of the requester.  If    access is allowed, the connection is accepted and the Mutual    Authentication Token is returned in the response message. 
  2485.  
  2486.    The source receives the returned Mutual Authentication Token and uses    it to confirm it communicating with the correct destination node. 
  2487.  
  2488.    Rlogind then calls Combine_credentials to combine its node/account    information with the global user identification in the received    credentials in case the user accesses any network resources from the    destination system. 
  2489.  
  2490. A.7 A Transport-Independent Connection 
  2491.  
  2492.    As an alternative to the description in A.6, an application wishing    to be portable between different underlying transports may call    create_token to create an authentication token which it then sends to    its peer.  The peer can then call accept_token and    verify_principal_name and learn the identity of the requester. 
  2493.  
  2494. Annex B 
  2495.  
  2496. Support of the GSSAPI 
  2497.  
  2498.    In order to support applications which need to be portable across a    variety of underlying security mechanisms, a "Generic Security    Service API" (or GSSAPI) was designed which gives access to a common    core of security services expected to be provided by several    mechanisms.  The GSSAPI was designed with DASS, Kerberos V4, and    Kerberos V5 in mind, and could be written as a front end to any or    all of those systems.  It is hoped that it could serve as an    interface to other security systems as well. 
  2499.  
  2500.    Application portability requires that the security services supported 
  2501.  
  2502.  
  2503.  
  2504. Kaufman                                                       [Page 104] 
  2505.  RFC 1507                          DASS                    September 1993 
  2506.  
  2507.     be comparable.  Applications using the GSSAPI will not be able to    access all of the features of the underlying security mechanisms.    For example, the GSSAPI does not allow access to the "node    authentication" features of DASS.  To the extent the underlying    security mechanisms do not support all the features of GSSAPI,    applications using those features will not be portable to those    security mechanisms.  For example, Kerberos V4 does not support    delegation, so applications using that feature of the GSSAPI will not    be portable to Kerberos V4. 
  2508.  
  2509.    This annex explains how the GSSAPI can be implemented using the    primitive services provided by DASS. 
  2510.  
  2511. B.1 Summary of GSSAPI 
  2512.  
  2513.    The latest draft of the GSSAPI specification is available as an    internet draft.  The following is a brief summary of that evolving    document and should not be taken as definitive.  Included here are    only those aspects of GSSAPI whose implementation would be DASS    specific. 
  2514.  
  2515.    The GSSAPI provides four classes of functions: Credential Management,    Context-Level Calls, Per-message calls, and Support Calls; two types    of objects: Credentials and Contexts; and two kinds of data    structures to be transmitted as opaque byte strings: Tokens and    Messages. Credentials hold keys and support information used in    creating tokens.  Contexts hold keys and support information used in    signing and encrypting messages. 
  2516.  
  2517.    The Credential Management functions of GSSAPI are "incomplete" in the    sense that one could not build a useful security implementation using    only GSSAPI.  Functions which create credentials based on passwords    or smart cards are needed but not provided by GSSAPI.  It is    envisioned that such functions would be invoked by security mechanism    specific functions at user login or via some separate utility rather    than from within applications intended to be portable.  The    Credential Management functions available to portable applications    are: 
  2518.  
  2519.     - GSS_Acquire_cred:  get a handle to an existing credential       structure based on a name or process default. 
  2520.  
  2521.     - GSS_Release_cred:  release credentials after use. 
  2522.  
  2523.    The Context-Level Calls use credentials to establish contexts.    Contexts are like connections: they are created in pairs and are    generally used at the two ends of a connection to process messages    associated with that connection.  The Context-Level Calls of interest 
  2524.  
  2525.  
  2526.  
  2527. Kaufman                                                       [Page 105] 
  2528.  RFC 1507                          DASS                    September 1993 
  2529.  
  2530.     are: 
  2531.  
  2532.     - GSS_Init_sec_context:  given credentials and the name of a       destination, create a new context and a token which will       permit the destination to create a corresponding context. 
  2533.  
  2534.     - GSS_Accept_sec_context:  given credentials and an incoming       token, create a context corresponding to the one at the       initiating end and provide information identifying the       initiator. 
  2535.  
  2536.     - GSS_Delete_sec_context:  delete a context after use. 
  2537.  
  2538.    The Per-Message Calls use contexts to sign, verify, encrypt, and    decrypt messages between the holders of matching contexts.  The Per-    Message Calls are: 
  2539.  
  2540.     - GSS_Sign:  Given a context and a message, produces a string of       bytes which constitute a signature on a provided message. 
  2541.  
  2542.     - GSS_Verify:  Given a context, a message, and the bytes       returned by GSS_Sign, verifies the message to be authentic       (unaltered since it was signed by the corresponding context). 
  2543.  
  2544.     - GSS_Seal:  Given a context and a message, produces a string of       bytes which include the message and a signature; the message       may optionally be encrypted. 
  2545.  
  2546.     - GSS_Unseal:  Given a context and the string of bytes from       GSS_Seal, returns the original message and a status indicating       its authenticity. 
  2547.  
  2548.    The Support Calls provide utilities like translating names and status    codes into printable strings. 
  2549.  
  2550. B.2 Implementation of GSSAPI over DASS 
  2551.  
  2552. B.2.1 Data Structures 
  2553.  
  2554.    The objects and data structures of the GSSAPI do not map neatly into    the objects and data structures of the DASS architecture. 
  2555.  
  2556.    This section describes how those data structures can be implemented    using the DASS data structures and primitives 
  2557.  
  2558.    Credential handles correspond to the credentials structures in DASS,    where the portable API assumes that the credential structures    themselves are kept from applications and handles are passed to and 
  2559.  
  2560.  
  2561.  
  2562. Kaufman                                                       [Page 106] 
  2563.  RFC 1507                          DASS                    September 1993 
  2564.  
  2565.     from the various subroutines. 
  2566.  
  2567.    Context initialization tokens correspond to the tokens of DASS.  The    GSSAPI prescribes a particular ASN.1 encoded form for tokens which    includes a mechanism specific bit string within it.  An    implementation of GSSAPI should enclose the DASS token within the    GSSAPI "wrapper". 
  2568.  
  2569.    Context handles have no corresponding structure in DASS. The    Create_token and Accept_token calls of DASS return a shared key and    instance identifier. An implementation of the GSSAPI must take those    values along with some other status information and package it as a    "context" opaque structure.  These data structures must be allocated    and freed with the appropriate calls. 
  2570.  
  2571.    Per-message tokens and sealed messages have no corresponding data    structure within DASS.  To fully support the GSSAPI functionality,    DASS must be extended to include this functionality.  These data    structures are created by cryptographic routines given the keys and    status information in context structures and the messages passed to    them.  While not properly part of the DASS architecture, the formats    of these data structures are included in section C.3. 
  2572.  
  2573. B.2.2 Procedures 
  2574.  
  2575.    This section explains how the functions of the GSSAPI can be provided    in terms of the Services Provided by DASS.  Not all of the DASS    features are accessible through the GSSAPI. 
  2576.  
  2577. B.2.2.1 GSS_Acquire_cred 
  2578.  
  2579.    The GSSAPI does not provide a mechanism for logging in users or    establishing server credentials. It assumes that some system specific    mechanism created those credentials and that applications need some    mechanism for getting at them. A model implementation might save all    credentials in a node-global pool indexed by some sort of credential    name. The credentials in the pool would be access controlled by some    local policy which is not concern of portable applications. Those    applications would simply call GSS_Acquire_cred and if they passed    the access control check, they would get a handle to the credentials    which could be used in subsequent calls. 
  2580.  
  2581. B.2.2.2 GSS_Release_cred 
  2582.  
  2583.    This call corresponds to the "delete_credentials" call of DASS. 
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  Kaufman                                                       [Page 107] 
  2590.  RFC 1507                          DASS                    September 1993 
  2591.  
  2592.  B.2.2.3 GSS_Init_sec_context 
  2593.  
  2594.    In the course of a normal mutual authentication, this routine will be    called twice. The procedure can determine whether this is the first    or second call by seeing whether the "input_context_handle" is zero    (it will be on the first call).  On the first call, it will use the    DASS Create_token service to create a token and it will also allocate    and populate a "context" structure. That structure will hold the key,    instance identifier, and mutual authentication token returned by    Create_token and will in addition hold the flags which were passed    into the Init_sec_context call. The token returned by    Init_sec_context will be the DASS token included in the GSSAPI token    "wrapper".  The DASS token will include the optional principal name. 
  2595.  
  2596.    If mutual authentication is not requested in the GSSAPI call, the    mutual authentication token returned by DASS will be ignored and the    initial call will return a COMPLETE status. If mutual authentication    is requested, the mutual authentication token will be stored in the    context information and a CONTINUE_NEEDED status returned. 
  2597.  
  2598.    On the second call to GSS_Init_sec_context (with input_context_handle    non-zero), the returned token will be compared to the one in the    context information using the Compare_mutual_token procedure and a    COMPLETE status will be returned if they match. 
  2599.  
  2600. B.2.2.4 GSS_Accept_sec_context 
  2601.  
  2602.    This routine in GSSAPI accepts an incoming token and creates a    context.  It combines the effects of a series of DASS functions.  It    could be implemented as follows: 
  2603.  
  2604.     - Remove the GSSAPI "wrapper" from the incoming token and pass       the rest and the credentials to "Accept_token".  Accept_token       produces a mutual authentication token and a new credentials       structure.  If delegation was requested, the new credentials       structure will be an output of GSS_Accept_sec_context.  In any       case, it will be used in the subsequent steps of this       procedure. 
  2605.  
  2606.     - Use the DASS Get_principal_name function to extract the       principal name from the credentials produced by Accept_token.       This name is one of the outputs of "GSS_Accept_sec_context. 
  2607.  
  2608.     - Apply the DASS Verify_principal_name to the new credentials       and the retrieved name to authenticate the token as having       come from the named principal. 
  2609.  
  2610.     - Create and populate a context structure with the key and 
  2611.  
  2612.  
  2613.  
  2614. Kaufman                                                       [Page 108] 
  2615.  RFC 1507                          DASS                    September 1993 
  2616.  
  2617.        timestamp returned by Accept_token and a status of COMPLETE.       Return a handle to that context. 
  2618.  
  2619.     - If delegation was requested, return the new credentials from       GSS_Accept_sec_context.  Otherwise, call Delete_credentials. 
  2620.  
  2621.     - If mutual authentication was requested, wrap the mutual       authentication token from Accept_token in a GSSAPI "wrapper"       and return it.  Otherwise return a null string. 
  2622.  
  2623. B.2.2.5 GSS_Delete_sec_context 
  2624.  
  2625.    This routine simply deletes the context state.  No calls to DASS are    required. 
  2626.  
  2627. B.2.2.6 GSS_Sign 
  2628.  
  2629.    This routine takes as input a context handle and a message. It    creates a per_msg_token by computing a digital signature on the    message using the key and timestamp in the context block.  No DASS    services are required. If additional cryptographic services were    requested (replay detection or sequencing), a timestamp or sequence    number must be prepended to the message and sent with the signature.    The syntax for this message is listed in section C.3. 
  2630.  
  2631. B.2.2.7 GSS_Verify 
  2632.  
  2633.    This routine repeats the calculation of the sign routine and verifies    the signature provided. If replay detection or sequencing services    are provided, the context must maintain as part of its state    information containing the sequence numbers or timestamps of messages    already received and this one must be checked for acceptability. 
  2634.  
  2635. B.2.2.8 GSS_Seal 
  2636.  
  2637.    This routine performs the same functions as Sign but also optionally    encrypts the message for privacy using the shared key and    encapsulates the whole thing in a GSSAPI specified ASN.1 wrapper. 
  2638.  
  2639. B.2.2.9 GSS_Unseal 
  2640.  
  2641.    This routine performs the same functions as GSS_Verify but also    parses the data structure including the signature and message and    decrypts the message if necessary. 
  2642.  
  2643.  
  2644.  
  2645.  
  2646.  
  2647.  
  2648.  
  2649. Kaufman                                                       [Page 109] 
  2650.  RFC 1507                          DASS                    September 1993 
  2651.  
  2652.  B.3 Syntax 
  2653.  
  2654.    The GSSAPI specification recommends the following ASN.1 encoding for    the tokens and messages generated through the GSSAPI: 
  2655.  
  2656.         --optional top-level token definitions to frame         -- different mechanisms 
  2657.  
  2658.         GSSAPI DEFINITIONS ::=         BEGIN 
  2659.  
  2660.         MechType ::= OBJECT IDENTIFIER         -- data structure definitions         ContextToken ::=         -- option indication (delegation, etc.) indicated         -- within mechanism-specific token         [APPLICATION 0] IMPLICIT SEQUENCE {              thisMech MechType,              responseExpected BOOLEAN,              innerContextToken ANY DEFINED BY MechType                -- contents mechanism-specific              } 
  2661.  
  2662.         PerMsgToken ::=         -- as emitted by GSS_Sign and processed by         -- GSS_Verify         [APPLICATION 1] IMPLICIT SEQUENCE {              thisMech MechType,              innerMsgToken ANY DEFINED BY MechType                -- contents mechanism-specific              }         SealedMessage ::=         -- as emitted by GSS_Seal and processed by         -- GSS_Unseal         [APPLICATION 2] IMPLICIT SEQUENCE {              sealingToken PERMSGTOKEN,              confFlag BOOLEAN,              userData OCTET STRING                -- encrypted if confFlag TRUE              } 
  2663.  
  2664.    The object identifier for the DASS MechType is 1.3.12.2.1011.7.5. 
  2665.  
  2666.    The innerContextToken of a token is a DASS token or mutual    authentication token. 
  2667.  
  2668.    The innerMsgToken is a null string in the case where the message is    encrypted and the token is included as part of a SealedMessage. 
  2669.  
  2670.  
  2671.  
  2672. Kaufman                                                       [Page 110] 
  2673.  RFC 1507                          DASS                    September 1993 
  2674.  
  2675.     Otherwise, it is an eight octet sequence computed as the CBC residue    computed using a key and string of bytes defined as follows: 
  2676.  
  2677.     - Pad the message provided by the application with 1-8 bytes of       pad to produce a string whose length is a multiple of 8       octets.  Each pad byte has a value equal to the number of pad       bytes. 
  2678.  
  2679.     - Compute the key by taking the timestamp of the association       (two four byte integers laid out in big endian order with the       most significant integer first), complementing the high order       bit (to avoid aliasing with mutual authenticators), and       encrypting the block in ECB mode with the shared key of the       association. 
  2680.  
  2681.    The userData field of a SealedMessage is exactly the application    provided byte string if confFlag=FALSE.  Otherwise, it is the    application supplied message encrypted as follows: 
  2682.  
  2683.     - Pad the message provided by the application with 1-8 bytes of       pad to produce a string whose length = 4 (mod 8).  Each pad       byte has a value equal to the number of pad bytes. 
  2684.  
  2685.     - Append a four byte CRC32 computed over the message + pad. 
  2686.  
  2687.     - Compute a key by taking the timestamp of the association (two       four byte integers laid out in big endian order with the most       significant integer first), complementing the high order bit       (to avoid aliasing with mutual authenticators), and encrypting       the block in ECB mode with the shared key of the association. 
  2688.  
  2689.     - Encrypt the message + pad + CRC32 using CBC and the key       computed in the previous step. 
  2690.  
  2691.    A note of the logic behind the above: 
  2692.  
  2693.     - Because the shared key of an association may be reused by many       associations between the same pair of principals, it is       necessary to bind the association timestamp into the messages       somehow to prevent messages from a previous association being       replayed into a new sequence.  The technique above of       generating an association key accomplishes this and has a side       benefit.  An implementation may with to keep the long term       keys out of the hands of applications for purposes of       confinement but may wish to put the encryption associated with       an association in process context for reasons of performance.       Defining an association key makes that possible. 
  2694.  
  2695.  
  2696.  
  2697.  Kaufman                                                       [Page 111] 
  2698.  RFC 1507                          DASS                    September 1993 
  2699.  
  2700.      - The reason that the association specific key is not specified       as the output of Create_token and Accept_token is that the DCE       RPC security implementation requires that a series of       associations between two principals always have the same key       and we did not want to have to support a different interface       in that application. 
  2701.  
  2702.     - The CRC32 after pad constitutes a cheap integrity check when       data is encrypted.     - The fact that padding is done differently for encrypted and       signed messages means that there are no threats related to       sending the same message encrypted and unencrypted and using       the last block of the encrypted message as a signature on the       unencrypted one. 
  2703.  
  2704. Annex C 
  2705.  
  2706. Imported ASN.1 definitions 
  2707.  
  2708.    This annex contains extracts from the ASN.1 description of X.509 and    X.500 definitions referenced by the DASS ASN.1 definitions. 
  2709.  
  2710.    CCITT DEFINITIONS ::= 
  2711.  
  2712.    BEGIN joint-iso-ccitt          OBJECT IDENTIFIER ::= {2} ds    OBJECT IDENTIFIER ::= {joint-iso-ccitt 5} algorithm    OBJECT IDENTIFIER ::= {ds 8} 
  2713.  
  2714.    iso                      OBJECT IDENTIFIER ::= {1} identified-    organization  OBJECT IDENTIFIER ::= {iso 3} ecma            OBJECT    IDENTIFIER ::= {identified-organization 12} digital    OBJECT IDENTIFIER ::= { ecma 1011 } 
  2715.  
  2716.    -- X.501 definitions 
  2717.  
  2718.    AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY            -- useful ones are                    --      OCTET STRING ,                    --      PrintableString ,                    --      NumericString ,                    --      T61String ,                    --      VisibleString 
  2719.  
  2720.    AttributeValueAssertion ::= SEQUENCE {AttributeType,                                                  AttributeValue} 
  2721.  
  2722.    Name ::= CHOICE {-- only one possibility for now --                    RDNSequence} 
  2723.  
  2724.  
  2725.  
  2726. Kaufman                                                       [Page 112] 
  2727.  RFC 1507                          DASS                    September 1993 
  2728.  
  2729.     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName    DistinguishedName ::= RDNSequence 
  2730.  
  2731.    RelativeDistinguishedName ::= SET OF AttributeValueAssertion 
  2732.  
  2733.    -- X.509 definitions 
  2734.  
  2735.    Certificate ::= SIGNED SEQUENCE {                    version [0]             Version DEFAULT 1988 ,                    serialNumber            SerialNumber ,                    signature               AlgorithmIdentifier ,                    issuer                  Name,                    valid                   Validity,                    subject                 Name,                    subjectPublicKey        SubjectPublicKeyInfo } 
  2736.  
  2737.    Version ::=      INTEGER { 1988(0)} SerialNumber ::= INTEGER Validity    ::=     SEQUENCE{            notBefore               UTCTime,            notAfter                UTCTime} 
  2738.  
  2739.    SubjectPublicKeyInfo  ::=  SEQUENCE {            algorithm               AlgorithmIdentifier ,            subjectPublicKey        BIT STRING            } 
  2740.  
  2741.    AlgorithmIdentifier ::= SEQUENCE {            algorithm       OBJECT IDENTIFIER ,                        parameters ANY DEFINED BY algorithm OPTIONAL} 
  2742.  
  2743.    ALGORITHM MACRO BEGIN TYPE NOTATION   ::= "PARAMETER" type VALUE    NOTATION  ::= value (VALUE OBJECT IDENTIFIER) END -- of ALGORITHM 
  2744.  
  2745.    ENCRYPTED MACRO BEGIN TYPE NOTATION   ::=type(ToBeEnciphered) VALUE    NOTATION  ::= value(VALUE BIT STRING)            -- the value of the bit string is generated by            -- taking the octets which form the complete            -- encoding (using the ASN.1 Basic Encoding Rules)            -- of the value of the ToBeEnciphered type and            -- applying an encipherment procedure to those octets-- END 
  2746.  
  2747.    SIGNED MACRO    ::= BEGIN TYPE NOTATION   ::= type (ToBeSigned) VALUE    NOTATION  ::= value(VALUE SEQUENCE{            ToBeSigned,            AlgorithIdentifier, -- of the algorithm used to generate                                -- the signature            ENCRYPTED OCTET STRING            -- where the octet string is the result 
  2748.  
  2749.  
  2750.  
  2751. Kaufman                                                       [Page 113] 
  2752.  RFC 1507                          DASS                    September 1993 
  2753.  
  2754.             -- of the hashing of the value of "ToBeSigned" END -- of    SIGNED 
  2755.  
  2756.     SIGNATURE MACRO ::= BEGIN TYPE NOTATION   ::= type(OfSignature) VALUE    NOTATION  ::= value(VALUE            SEQUENCE{                    AlgorithmIdentifier,                    -- of the algorithm used to compute the signature                    ENCRYPTED OCTET STRING                    -- where the octet string is a function (e.g., a                    -- compressed or hashed version) of the value                    -- "OfSignature", which may include the identifier                    -- of the algorithm used to compute                    -- the signature--}                            ) END -- of SIGNATURE 
  2757.  
  2758.    -- X.509 Annex H (not part of the standard) 
  2759.  
  2760.    encryptionAlgorithm OBJECT IDENTIFIER ::= {algorithm 1} rsa ALGORITHM            PARAMETER KeySize            ::= {encryptionAlgorithm 1} 
  2761.  
  2762.    KeySize ::= INTEGER 
  2763.  
  2764.    END 
  2765.  
  2766.  Glossary 
  2767.  
  2768.    authentication         The process of determining the identity         (usually the name) of the other party in some communication         exchange. 
  2769.  
  2770.    authentication context         Cached information used during a particular instance of         authentication and including a shared symmetric (DES) key as         well as components of the authentication token conveyed         during establishment of this context. 
  2771.  
  2772.    authentication token         Information conveyed during a strong authentication exchange         that can be used to authenticate its sender. An         authentication token can, but is not necessarily limited to,         include the claimant identity and ticket, as well as signed         and encrypted secret key exchange messages conveying a         secret key to be used in future cryptographic operations. An 
  2773.  
  2774.  
  2775.  
  2776. Kaufman                                                       [Page 114] 
  2777.  RFC 1507                          DASS                    September 1993 
  2778.  
  2779.          authentication token names a particular protocol data         structure component. 
  2780.  
  2781.    authorization         The process of determining the rights         associated with a particular principal. 
  2782.  
  2783.    certificate         The public key of a particular principal, together         with some other information relating to the names of the         principal and the certifying authority, rendered unforgeable         by encipherment with the private key of the certification         authority that issued it. 
  2784.  
  2785.    certification authority         An authority trusted by one or more principals to create and         assign certificates. 
  2786.  
  2787.    claimant         The party that initiates the authentication process.         In the DASS architecture, claimants possess credentials         which include their identity, authenticating private key and         a ticket certifying their authenticating public key. 
  2788.  
  2789.    credentials         Information "state" required by principals in order         to for them to authenticate.   Credentials may contain         information used to initiate the authentication process         (claimant information), information used to respond to an         authentication request (verifier information), and cached         information useful in improving performance. 
  2790.  
  2791.    cryptographic checksum         Information which is derived by performing a cryptographic         transformation on the data unit. This information can be         used by the receiver to verify the authenticity of data         passed in cleartext 
  2792.  
  2793.    decipher         To reverse the effects of encipherment and render a         message comprehensible by use of a cryptographic key. 
  2794.  
  2795.    delegation         The granting of temporary credentials that allow a         process to act on behalf of a principal. 
  2796.  
  2797.  
  2798.  
  2799.  
  2800.  
  2801.  Kaufman                                                       [Page 115] 
  2802.  RFC 1507                          DASS                    September 1993 
  2803.  
  2804.     delegation key         A short term public/private key pair used by a claimant         to act on behalf of a principal for a bounded period. The         delegation public key appears in the ticket, whereas the         delegation private key is used to sign secret key exchange         messages. 
  2805.  
  2806.    DES         Data Encryption Standard: a symmetric (secret key)         encryption algorithm used by DASS. An alternate encryption         algorithm could be substituted with little or no disruption         to the architecture. 
  2807.  
  2808.    DES key         A 56-bit secret quantity used as a parameter to the         DES encryption algorithm. 
  2809.  
  2810.    digital signature         A value computed from a block of data         and a key which could only be computed by someone knowing         the key. A digital signature computed with a secret key can         only be verified by someone knowing that secret key.  A         digital signature computed with a private key can be         verified by anyone knowing the corresponding public key. 
  2811.  
  2812.    encipher         To render incomprehensible except to the holder of a         particular key. If you encipher with a secret key, only the         holder of the same secret can decipher the message. If you         encipher with a public key, only the holder of the         corresponding private key can decipher it. 
  2813.  
  2814.    initial trust certificate         A certificate signed by a principal for its own use which         states the name and public key of a trusted authority. 
  2815.  
  2816.    global user name         A hierarchical name for a user which is         unique within the entire domain of discussion (typically the         network). 
  2817.  
  2818.    local user name         A simple (non-hierarchical) name by         which a user is known within a limited context such as on a         single computer. 
  2819.  
  2820.  
  2821.  
  2822.  
  2823.  
  2824.  Kaufman                                                       [Page 116] 
  2825.  RFC 1507                          DASS                    September 1993 
  2826.  
  2827.     principal         Abstract entity which can be authenticated by name.         In DASS there are user principals and server principals. 
  2828.  
  2829.    private key         Cryptographic key used in asymmetric (public key)         cryptography to decrypt and/or sign messages. In asymmetric         cryptography, knowing the encryption key is independent of         knowing the decryption key. The decryption (or signing)         private key cannot be derived from the encrypting (or         verifying) public key. 
  2830.  
  2831.    proxy         A mapping from an external name to a local account         name for purposes of establishing a set of local access         rights. Note that this differs from the definition in ECMA         TR/46. 
  2832.  
  2833.    public key         Cryptographic key used in asymmetric cryptography to         encrypt messages and/or verify signatures. 
  2834.  
  2835.    RSA         The Rivest-Shamir-Adelman public key cryptosystem         based on modular exponentiation where the modulus is the         product of two large primes.  When the term RSA key is used,         it should be clear from context whether the public key, the         private key, or the public/private pair is intended. 
  2836.  
  2837.    secret key         Cryptographic key used in symmetric cryptography to         encrypt, sign, decrypt and verify messages. In symmetric         cryptography, knowledge of the decryption key implies         knowledge of the encryption key, and vice-versa. 
  2838.  
  2839.    sign         A process which takes a piece of data and a key and         produces a digital signature which can only be calculated by         someone with the key. The holder of a corresponding key can         verify the signature. 
  2840.  
  2841.    source         The initiator of an authentication exchange. 
  2842.  
  2843.    strong authentication         Authentication by means of cryptographically derived         authentication tokens and credentials. The actual working         definition is closer to that of "zero knowledge" proof: 
  2844.  
  2845.  
  2846.  
  2847. Kaufman                                                       [Page 117] 
  2848.  RFC 1507                          DASS                    September 1993 
  2849.  
  2850.          authentication so as to not reveal any information usable by         either the verifier, or by an eavesdropping third party, to         further their potential ability to impersonate the claimant. 
  2851.  
  2852.    target         The intended second party (other than the source) to         an authentication exchange. 
  2853.  
  2854.    ticket         A data structure certifying an authenticating         (public) key by virtue of being signed by a user principal         using their (long term) private key. The ticket also         includes the UID of the principal. 
  2855.  
  2856.    trusted authority         The public key, name and UID of a         certification authority trusted in some context to certify         the public keys of other principals. 
  2857.  
  2858.    UID         A 128 bit unique identifier produced according to OSF         standard specifications. 
  2859.  
  2860.    user key         A "long term" RSA key whose private portion         authenticates its holder as having the access rights of a         particular person. 
  2861.  
  2862.    verify         To cryptographically process a piece of data and a         digital signature to determine that the holder of a         particular key signed the data. 
  2863.  
  2864.    verifier         The party who will perform the operations necessary         to verify the claimed identity of a claimant. 
  2865.  
  2866.  
  2867.  
  2868.  
  2869.  
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880. Kaufman                                                       [Page 118] 
  2881.  RFC 1507                          DASS                    September 1993 
  2882.  
  2883.  Security Considerations 
  2884.  
  2885.    Security issues are discussed throughout this memo. 
  2886.  
  2887. Author's Address 
  2888.  
  2889.    Charles Kaufman    Digital Equipment Corporation    ZKO3-3/U14    110 Spit Brook Road    Nashua, NH 03062 
  2890.  
  2891.    Phone: (603) 881-1495    Email: kaufman@zk3.dec.com 
  2892.  
  2893.    General comments on this document should be sent to cat-ietf@mit.edu.    Minor corrections should be sent to the author. 
  2894.  
  2895.  
  2896.  
  2897.  
  2898.  
  2899.  
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.  
  2909.  
  2910.  
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916.  
  2917.  
  2918.  
  2919.  
  2920.  
  2921.  
  2922.  
  2923.  
  2924.  
  2925.  
  2926.  
  2927.  Kaufman                                                       [Page 119] 
  2928.  
  2929.