-- extracted from rfc2574.txt
-- at Mon Nov 15 17:12:03 1999

SNMP-USER-BASED-SM-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY,
    OBJECT-TYPE,
    OBJECT-IDENTITY,
    snmpModules,
    Counter32
        FROM SNMPv2-SMI
    MODULE-COMPLIANCE,
    OBJECT-GROUP
        FROM SNMPv2-CONF
    TEXTUAL-CONVENTION,
    TestAndIncr,
    RowStatus,
    RowPointer,
    StorageType,
    AutonomousType
        FROM SNMPv2-TC
    SnmpAdminString,
    SnmpEngineID,
    snmpAuthProtocols,
    snmpPrivProtocols
        FROM SNMP-FRAMEWORK-MIB;


snmpUsmMIB MODULE-IDENTITY
    LAST-UPDATED    "9901200000Z"
    ORGANIZATION    "SNMPv3 Working Group"
    CONTACT-INFO
            "WG-email:   snmpv3@lists.tislabs.com
            Subscribe:  majordomo@lists.tislabs.com
                        In msg body:  subscribe snmpv3

            Chair:      Russ Mundy
                        Trusted Information Systems
            postal:     3060 Washington Rd
                        Glenwood MD 21738
                        USA
            email:      mundy@tislabs.com
            phone:      +1-301-854-6889

            Co-editor   Uri Blumenthal
                        IBM T. J. Watson Research
            postal:     30 Saw Mill River Pkwy,
                        Hawthorne, NY 10532
                        USA
            email:      uri@watson.ibm.com
            phone:      +1-914-784-7964

            Co-editor:  Bert Wijnen
                        IBM T. J. Watson Research
            postal:     Schagen 33
                        3461 GL Linschoten
                        Netherlands
            email:      wijnen@vnet.ibm.com
            phone:      +31-348-432-794"
    DESCRIPTION
        "The management information definitions for the
        SNMP User-based Security Model."
    REVISION        "9901200000Z"
    DESCRIPTION
        "Clarifications, published as RFC2574"
    REVISION        "9711200000Z"
    DESCRIPTION
        "Initial version, published as RFC2274"
    ::= { snmpModules 15 }

-- Identification of Authentication and Privacy Protocols ************

usmNoAuthProtocol OBJECT-IDENTITY
    STATUS          current
    DESCRIPTION
        "No Authentication Protocol."
    ::= { snmpAuthProtocols 1 }


usmHMACMD5AuthProtocol OBJECT-IDENTITY
    STATUS          current
    DESCRIPTION
        "The HMAC-MD5-96 Digest Authentication Protocol."
    REFERENCE
        "- H. Krawczyk, M. Bellare, R. Canetti HMAC:
            Keyed-Hashing for Message Authentication,
            RFC2104, Feb 1997.
          - Rivest, R., Message Digest Algorithm MD5, RFC1321."
    ::= { snmpAuthProtocols 2 }


usmHMACSHAAuthProtocol OBJECT-IDENTITY
    STATUS          current
    DESCRIPTION
        "The HMAC-SHA-96 Digest Authentication Protocol."
    REFERENCE
        "- H. Krawczyk, M. Bellare, R. Canetti, HMAC:
            Keyed-Hashing for Message Authentication,
            RFC2104, Feb 1997.
          - Secure Hash Algorithm. NIST FIPS 180-1."
    ::= { snmpAuthProtocols 3 }


usmNoPrivProtocol OBJECT-IDENTITY
    STATUS          current
    DESCRIPTION
        "No Privacy Protocol."
    ::= { snmpPrivProtocols 1 }


usmDESPrivProtocol OBJECT-IDENTITY
    STATUS          current
    DESCRIPTION
        "The CBC-DES Symmetric Encryption Protocol."
    REFERENCE
        "- Data Encryption Standard, National Institute of
            Standards and Technology.  Federal Information
            Processing Standard (FIPS) Publication 46-1.
            Supersedes FIPS Publication 46,
            (January, 1977; reaffirmed January, 1988).

          - Data Encryption Algorithm, American National
            Standards Institute.  ANSI X3.92-1981,
            (December, 1980).

          - DES Modes of Operation, National Institute of
            Standards and Technology.  Federal Information
            Processing Standard (FIPS) Publication 81,
            (December, 1980).

          - Data Encryption Algorithm - Modes of Operation,
            American National Standards Institute.
            ANSI X3.106-1983, (May 1983)."
    ::= { snmpPrivProtocols 2 }



-- Administrative assignments ****************************************

usmMIBObjects  OBJECT IDENTIFIER
    ::= { snmpUsmMIB 1 }

usmMIBConformance  OBJECT IDENTIFIER
    ::= { snmpUsmMIB 2 }


-- Textual Conventions ***********************************************

KeyChange ::= TEXTUAL-CONVENTION
    STATUS          current
    DESCRIPTION
        "Every definition of an object with this syntax must identify
        a protocol P, a secret key K, and a hash algorithm H
        that produces output of L octets.

        The object's value is a manager-generated, partially-random
        value which, when modified, causes the value of the secret
        key K, to be modified via a one-way function.

        The value of an instance of this object is the concatenation
        of two components: first a 'random' component and then a
        'delta' component.

        The lengths of the random and delta components
        are given by the corresponding value of the protocol P;
        if P requires K to be a fixed length, the length of both the
        random and delta components is that fixed length; if P
        allows the length of K to be variable up to a particular
        maximum length, the length of the random component is that
        maximum length and the length of the delta component is any
        length less than or equal to that maximum length.
        For example, usmHMACMD5AuthProtocol requires K to be a fixed
        length of 16 octets and L - of 16 octets.
        usmHMACSHAAuthProtocol requires K to be a fixed length of
        20 octets and L - of 20 octets. Other protocols may define
        other sizes, as deemed appropriate.

        When a requester wants to change the old key K to a new
        key keyNew on a remote entity, the 'random' component is
        obtained from either a true random generator, or from a
        pseudorandom generator, and the 'delta' component is
        computed as follows:

         - a temporary variable is initialized to the existing value
           of K;
         - if the length of the keyNew is greater than L octets,
           then:
            - the random component is appended to the value of the
              temporary variable, and the result is input to the
              the hash algorithm H to produce a digest value, and
              the temporary variable is set to this digest value;
            - the value of the temporary variable is XOR-ed with
              the first (next) L-octets (16 octets in case of MD5)
              of the keyNew to produce the first (next) L-octets
              (16 octets in case of MD5) of the 'delta' component.
            - the above two steps are repeated until the unused
              portion of the keyNew component is L octets or less,
         - the random component is appended to the value of the
           temporary variable, and the result is input to the
           hash algorithm H to produce a digest value;
         - this digest value, truncated if necessary to be the same
           length as the unused portion of the keyNew, is XOR-ed
           with the unused portion of the keyNew to produce the
           (final portion of the) 'delta' component.

         For example, using MD5 as the hash algorithm H:

            iterations = (lenOfDelta - 1)/16; /* integer division */
            temp = keyOld;
            for (i = 0; i < iterations; i++) {
                temp = MD5 (temp || random);
                delta[i*16 .. (i*16)+15] =
                       temp XOR keyNew[i*16 .. (i*16)+15];
            }
            temp = MD5 (temp || random);
            delta[i*16 .. lenOfDelta-1] =
                   temp XOR keyNew[i*16 .. lenOfDelta-1];

        The 'random' and 'delta' components are then concatenated as
        described above, and the resulting octet string is sent to
        the recipient as the new value of an instance of this object.

        At the receiver side, when an instance of this object is set
        to a new value, then a new value of K is computed as follows:

         - a temporary variable is initialized to the existing value
           of K;
         - if the length of the delta component is greater than L
           octets, then:
            - the random component is appended to the value of the
              temporary variable, and the result is input to the
              hash algorithm H to produce a digest value, and the
              temporary variable is set to this digest value;
            - the value of the temporary variable is XOR-ed with
              the first (next) L-octets (16 octets in case of MD5)
              of the delta component to produce the first (next)
              L-octets (16 octets in case of MD5) of the new value
              of K.
            - the above two steps are repeated until the unused
              portion of the delta component is L octets or less,
         - the random component is appended to the value of the
           temporary variable, and the result is input to the
           hash algorithm H to produce a digest value;
         - this digest value, truncated if necessary to be the same
           length as the unused portion of the delta component, is
           XOR-ed with the unused portion of the delta component to
           produce the (final portion of the) new value of K.

         For example, using MD5 as the hash algorithm H:

            iterations = (lenOfDelta - 1)/16; /* integer division */
            temp = keyOld;
            for (i = 0; i < iterations; i++) {
                temp = MD5 (temp || random);
                keyNew[i*16 .. (i*16)+15] =
                       temp XOR delta[i*16 .. (i*16)+15];
            }
            temp = MD5 (temp || random);
            keyNew[i*16 .. lenOfDelta-1] =
                   temp XOR delta[i*16 .. lenOfDelta-1];

        The value of an object with this syntax, whenever it is
        retrieved by the management protocol, is always the zero
        length string.

        Note that the keyOld and keyNew are the localized keys.

        Note that it is probably wise that when an SNMP entity sends
        a SetRequest to change a key, that it keeps a copy of the old
        key until it has confirmed that the key change actually
        succeeded."
    SYNTAX          OCTET STRING
-- Statistics for the User-based Security Model **********************

usmStats  OBJECT IDENTIFIER
    ::= { usmMIBObjects 1 }


usmStatsUnsupportedSecLevels OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they requested a
        securityLevel that was unknown to the SNMP engine
        or otherwise unavailable." 
    ::= { usmStats 1 }

usmStatsNotInTimeWindows OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they appeared
        outside of the authoritative SNMP engine's window." 
    ::= { usmStats 2 }

usmStatsUnknownUserNames OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they referenced a
        user that was not known to the SNMP engine." 
    ::= { usmStats 3 }

usmStatsUnknownEngineIDs OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they referenced an
        snmpEngineID that was not known to the SNMP engine." 
    ::= { usmStats 4 }

usmStatsWrongDigests OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they didn't
        contain the expected digest value." 
    ::= { usmStats 5 }

usmStatsDecryptionErrors OBJECT-TYPE
    SYNTAX          Counter32
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "The total number of packets received by the SNMP
        engine which were dropped because they could not be
        decrypted." 
    ::= { usmStats 6 }
-- The usmUser Group ************************************************

usmUser  OBJECT IDENTIFIER
    ::= { usmMIBObjects 2 }


usmUserSpinLock OBJECT-TYPE
    SYNTAX          TestAndIncr
    MAX-ACCESS      read-write
    STATUS          current
    DESCRIPTION
        "An advisory lock used to allow several cooperating
        Command Generator Applications to coordinate their
        use of facilities to alter secrets in the
        usmUserTable." 
    ::= { usmUser 1 }
-- The table of valid users for the User-based Security Model ********

usmUserTable OBJECT-TYPE
    SYNTAX          SEQUENCE OF UsmUserEntry 
    MAX-ACCESS      not-accessible
    STATUS          current
    DESCRIPTION
        "The table of users configured in the SNMP engine's
        Local Configuration Datastore (LCD).

        To create a new user (i.e., to instantiate a new
        conceptual row in this table), it is recommended to
        follow this procedure:

          1)  GET(usmUserSpinLock.0) and save in sValue.
          2)  SET(usmUserSpinLock.0=sValue,
                  usmUserCloneFrom=templateUser,
                  usmUserStatus=createAndWait)
              You should use a template user to clone from
              which has the proper auth/priv protocol defined.

        If the new user is to use privacy:

          3)  generate the keyChange value based on the secret
              privKey of the clone-from user and the secret key
              to be used for the new user. Let us call this
              pkcValue.
          4)  GET(usmUserSpinLock.0) and save in sValue.
          5)  SET(usmUserSpinLock.0=sValue,
                  usmUserPrivKeyChange=pkcValue
                  usmUserPublic=randomValue1)
          6)  GET(usmUserPulic) and check it has randomValue1.
              If not, repeat steps 4-6.

        If the new user will never use privacy:
          7)  SET(usmUserPrivProtocol=usmNoPrivProtocol)

        If the new user is to use authentication:

          8)  generate the keyChange value based on the secret
              authKey of the clone-from user and the secret key
              to be used for the new user. Let us call this
              akcValue.
          9)  GET(usmUserSpinLock.0) and save in sValue.
          10) SET(usmUserSpinLock.0=sValue,
                  usmUserAuthKeyChange=akcValue
                  usmUserPublic=randomValue2)
          11) GET(usmUserPulic) and check it has randomValue2.
              If not, repeat steps 9-11.

        If the new user will never use authentication:

          12) SET(usmUserAuthProtocol=usmNoAuthProtocol)

        Finally, activate the new user:

          13) SET(usmUserStatus=active)

        The new user should now be available and ready to be
        used for SNMPv3 communication. Note however that access
        to MIB data must be provided via configuration of the
        SNMP-VIEW-BASED-ACM-MIB.

        The use of usmUserSpinlock is to avoid conflicts with
        another SNMP command responder application which may
        also be acting on the usmUserTable."
    ::= { usmUser 2 }

usmUserEntry OBJECT-TYPE
    SYNTAX          UsmUserEntry
    MAX-ACCESS      not-accessible
    STATUS          current
    DESCRIPTION
        "A user configured in the SNMP engine's Local
        Configuration Datastore (LCD) for the User-based
        Security Model."
    INDEX           {
                        usmUserEngineID,
                        usmUserName
                    } 
    ::= { usmUserTable 1 }

UsmUserEntry ::= SEQUENCE {
        usmUserEngineID         SnmpEngineID,
        usmUserName             SnmpAdminString,
        usmUserSecurityName     SnmpAdminString,
        usmUserCloneFrom        RowPointer,
        usmUserAuthProtocol     AutonomousType,
        usmUserAuthKeyChange    KeyChange,
        usmUserOwnAuthKeyChange KeyChange,
        usmUserPrivProtocol     AutonomousType,
        usmUserPrivKeyChange    KeyChange,
        usmUserOwnPrivKeyChange KeyChange,
        usmUserPublic           OCTET STRING,
        usmUserStorageType      StorageType,
        usmUserStatus           RowStatus
}

usmUserEngineID OBJECT-TYPE
    SYNTAX          SnmpEngineID
    MAX-ACCESS      not-accessible
    STATUS          current
    DESCRIPTION
        "An SNMP engine's administratively-unique identifier.

        In a simple agent, this value is always that agent's
        own snmpEngineID value.

        The value can also take the value of the snmpEngineID
        of a remote SNMP engine with which this user can
        communicate." 
    ::= { usmUserEntry 1 }

usmUserName OBJECT-TYPE
    SYNTAX          SnmpAdminString (SIZE  (1..32))
    MAX-ACCESS      not-accessible
    STATUS          current
    DESCRIPTION
        "A human readable string representing the name of
        the user.

        This is the (User-based Security) Model dependent
        security ID." 
    ::= { usmUserEntry 2 }

usmUserSecurityName OBJECT-TYPE
    SYNTAX          SnmpAdminString
    MAX-ACCESS      read-only
    STATUS          current
    DESCRIPTION
        "A human readable string representing the user in
        Security Model independent format.

        The default transformation of the User-based Security
        Model dependent security ID to the securityName and
        vice versa is the identity function so that the
        securityName is the same as the userName." 
    ::= { usmUserEntry 3 }

usmUserCloneFrom OBJECT-TYPE
    SYNTAX          RowPointer
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "A pointer to another conceptual row in this
        usmUserTable.  The user in this other conceptual
        row is called the clone-from user.

        When a new user is created (i.e., a new conceptual
        row is instantiated in this table), the privacy and
        authentication parameters of the new user must be
        cloned from its clone-from user. These parameters are:
          - authentication protocol (usmUserAuthProtocol)
          - privacy protocol (usmUserPrivProtocol)
        They will be copied regardless of what the current
        value is.

        Cloning also causes the initial values of the secret
        authentication key (authKey) and the secret encryption
        key (privKey) of the new user to be set to the same
        value as the corresponding secret of the clone-from
        user.

        The first time an instance of this object is set by
        a management operation (either at or after its
        instantiation), the cloning process is invoked.
        Subsequent writes are successful but invoke no
        action to be taken by the receiver.
        The cloning process fails with an 'inconsistentName'
        error if the conceptual row representing the
        clone-from user does not exist or is not in an active
        state when the cloning process is invoked.

        When this object is read, the ZeroDotZero OID
        is returned." 
    ::= { usmUserEntry 4 }

usmUserAuthProtocol OBJECT-TYPE
    SYNTAX          AutonomousType
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "An indication of whether messages sent on behalf of
        this user to/from the SNMP engine identified by
        usmUserEngineID, can be authenticated, and if so,
        the type of authentication protocol which is used.

        An instance of this object is created concurrently
        with the creation of any other object instance for
        the same user (i.e., as part of the processing of
        the set operation which creates the first object
        instance in the same conceptual row).

        If an initial set operation (i.e. at row creation time)
        tries to set a value for an unknown or unsupported
        protocol, then a 'wrongValue' error must be returned.

        The value will be overwritten/set when a set operation
        is performed on the corresponding instance of
        usmUserCloneFrom.

        Once instantiated, the value of such an instance of
        this object can only be changed via a set operation to
        the value of the usmNoAuthProtocol.

        If a set operation tries to change the value of an
        existing instance of this object to any value other
        than usmNoAuthProtocol, then an 'inconsistentValue'
        error must be returned.

        If a set operation tries to set the value to the
        usmNoAuthProtocol while the usmUserPrivProtocol value
        in the same row is not equal to usmNoPrivProtocol,
        then an 'inconsistentValue' error must be returned.
        That means that an SNMP command generator application
        must first ensure that the usmUserPrivProtocol is set
        to the usmNoPrivProtocol value before it can set
        the usmUserAuthProtocol value to usmNoAuthProtocol."
    DEFVAL          { usmNoAuthProtocol } 
    ::= { usmUserEntry 5 }

usmUserAuthKeyChange OBJECT-TYPE
    SYNTAX          KeyChange
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "An object, which when modified, causes the secret
        authentication key used for messages sent on behalf
        of this user to/from the SNMP engine identified by
        usmUserEngineID, to be modified via a one-way
        function.

        The associated protocol is the usmUserAuthProtocol.
        The associated secret key is the user's secret
        authentication key (authKey). The associated hash
        algorithm is the algorithm used by the user's
        usmUserAuthProtocol.

        When creating a new user, it is an 'inconsistentName'
        error for a set operation to refer to this object
        unless it is previously or concurrently initialized
        through a set operation on the corresponding instance
        of usmUserCloneFrom.

        When the value of the corresponding usmUserAuthProtocol
        is usmNoAuthProtocol, then a set is successful, but
        effectively is a no-op.

        When this object is read, the zero-length (empty)
        string is returned.

        The recommended way to do a key change is as follows:

          1) GET(usmUserSpinLock.0) and save in sValue.
          2) generate the keyChange value based on the old
             (existing) secret key and the new secret key,
             let us call this kcValue.

        If you do the key change on behalf of another user:

          3) SET(usmUserSpinLock.0=sValue,
                 usmUserAuthKeyChange=kcValue
                 usmUserPublic=randomValue)

        If you do the key change for yourself:

          4) SET(usmUserSpinLock.0=sValue,
                 usmUserOwnAuthKeyChange=kcValue
                 usmUserPublic=randomValue)

        If you get a response with error-status of noError,
        then the SET succeeded and the new key is active.
        If you do not get a response, then you can issue a
        GET(usmUserPublic) and check if the value is equal
        to the randomValue you did send in the SET. If so, then
        the key change succeeded and the new key is active
        (probably the response got lost). If not, then the SET
        request probably never reached the target and so you
        can start over with the procedure above."
    DEFVAL          { '00000000'H } 
    ::= { usmUserEntry 6 }

usmUserOwnAuthKeyChange OBJECT-TYPE
    SYNTAX          KeyChange
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "Behaves exactly as usmUserAuthKeyChange, with one
        notable difference: in order for the set operation
        to succeed, the usmUserName of the operation
        requester must match the usmUserName that
        indexes the row which is targeted by this
        operation.
        In addition, the USM security model must be
        used for this operation.

        The idea here is that access to this column can be
        public, since it will only allow a user to change
        his own secret authentication key (authKey).
        Note that this can only be done once the row is active.

        When a set is received and the usmUserName of the
        requester is not the same as the umsUserName that
        indexes the row which is targeted by this operation,
        then a 'noAccess' error must be returned.

        When a set is received and the security model in use
        is not USM, then a 'noAccess' error must be returned."
    DEFVAL          { '00000000'H } 
    ::= { usmUserEntry 7 }

usmUserPrivProtocol OBJECT-TYPE
    SYNTAX          AutonomousType
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "An indication of whether messages sent on behalf of
        this user to/from the SNMP engine identified by
        usmUserEngineID, can be protected from disclosure,
        and if so, the type of privacy protocol which is used.
        An instance of this object is created concurrently
        with the creation of any other object instance for
        the same user (i.e., as part of the processing of
        the set operation which creates the first object
        instance in the same conceptual row).

        If an initial set operation (i.e. at row creation time)
        tries to set a value for an unknown or unsupported
        protocol, then a 'wrongValue' error must be returned.

        The value will be overwritten/set when a set operation
        is performed on the corresponding instance of
        usmUserCloneFrom.

        Once instantiated, the value of such an instance of
        this object can only be changed via a set operation to
        the value of the usmNoPrivProtocol.

        If a set operation tries to change the value of an
        existing instance of this object to any value other
        than usmNoPrivProtocol, then an 'inconsistentValue'
        error must be returned.

        Note that if any privacy protocol is used, then you
        must also use an authentication protocol. In other
        words, if usmUserPrivProtocol is set to anything else
        than usmNoPrivProtocol, then the corresponding instance
        of usmUserAuthProtocol cannot have a value of
        usmNoAuthProtocol. If it does, then an
        'inconsistentValue' error must be returned."
    DEFVAL          { usmNoPrivProtocol } 
    ::= { usmUserEntry 8 }

usmUserPrivKeyChange OBJECT-TYPE
    SYNTAX          KeyChange
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "An object, which when modified, causes the secret
        encryption key used for messages sent on behalf
        of this user to/from the SNMP engine identified by
        usmUserEngineID, to be modified via a one-way
        function.

        The associated protocol is the usmUserPrivProtocol.
        The associated secret key is the user's secret
        privacy key (privKey). The associated hash
        algorithm is the algorithm used by the user's
        usmUserAuthProtocol.

        When creating a new user, it is an 'inconsistentName'
        error for a set operation to refer to this object
        unless it is previously or concurrently initialized
        through a set operation on the corresponding instance
        of usmUserCloneFrom.

        When the value of the corresponding usmUserPrivProtocol
        is usmNoPrivProtocol, then a set is successful, but
        effectively is a no-op.

        When this object is read, the zero-length (empty)
        string is returned.
        See the description clause of usmUserAuthKeyChange for
        a recommended procedure to do a key change."
    DEFVAL          { '00000000'H } 
    ::= { usmUserEntry 9 }

usmUserOwnPrivKeyChange OBJECT-TYPE
    SYNTAX          KeyChange
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "Behaves exactly as usmUserPrivKeyChange, with one
        notable difference: in order for the Set operation
        to succeed, the usmUserName of the operation
        requester must match the usmUserName that indexes
        the row which is targeted by this operation.
        In addition, the USM security model must be
        used for this operation.

        The idea here is that access to this column can be
        public, since it will only allow a user to change
        his own secret privacy key (privKey).
        Note that this can only be done once the row is active.

        When a set is received and the usmUserName of the
        requester is not the same as the umsUserName that
        indexes the row which is targeted by this operation,
        then a 'noAccess' error must be returned.

        When a set is received and the security model in use
        is not USM, then a 'noAccess' error must be returned."
    DEFVAL          { '00000000'H } 
    ::= { usmUserEntry 10 }

usmUserPublic OBJECT-TYPE
    SYNTAX          OCTET STRING (SIZE  (0..32))
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "A publicly-readable value which can be written as part
        of the procedure for changing a user's secret
        authentication and/or privacy key, and later read to
        determine whether the change of the secret was
        effected."
    DEFVAL          { ''H } 
    ::= { usmUserEntry 11 }

usmUserStorageType OBJECT-TYPE
    SYNTAX          StorageType
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "The storage type for this conceptual row.

        Conceptual rows having the value 'permanent' must
        allow write-access at a minimum to:

        - usmUserAuthKeyChange, usmUserOwnAuthKeyChange
          and usmUserPublic for a user who employs
          authentication, and
        - usmUserPrivKeyChange, usmUserOwnPrivKeyChange
          and usmUserPublic for a user who employs
          privacy.

        Note that any user who employs authentication or
        privacy must allow its secret(s) to be updated and
        thus cannot be 'readOnly'.

        If an initial set operation tries to set the value to
        'readOnly' for a user who employs authentication or
        privacy, then an 'inconsistentValue' error must be
        returned.  Note that if the value has been previously
        set (implicit or explicit) to any value, then the rules
        as defined in the StorageType Textual Convention apply.

        It is an implementation issue to decide if a SET for
        a readOnly or permanent row is accepted at all. In some
        contexts this may make sense, in others it may not. If
        a SET for a readOnly or permanent row is not accepted
        at all, then a 'wrongValue' error must be returned."
    DEFVAL          { nonVolatile } 
    ::= { usmUserEntry 12 }

usmUserStatus OBJECT-TYPE
    SYNTAX          RowStatus
    MAX-ACCESS      read-create
    STATUS          current
    DESCRIPTION
        "The status of this conceptual row.

        Until instances of all corresponding columns are
        appropriately configured, the value of the
        corresponding instance of the usmUserStatus column
        is 'notReady'.

        In particular, a newly created row for a user who
        employs authentication, cannot be made active until the
        corresponding usmUserCloneFrom and usmUserAuthKeyChange
        have been set.

        Further, a newly created row for a user who also
        employs privacy, cannot be made active until the
        usmUserPrivKeyChange has been set.

        The RowStatus TC [RFC2579] requires that this
        DESCRIPTION clause states under which circumstances
        other objects in this row can be modified:

        The value of this object has no effect on whether
        other objects in this conceptual row can be modified,
        except for usmUserOwnAuthKeyChange and
        usmUserOwnPrivKeyChange. For these 2 objects, the
        value of usmUserStatus MUST be active." 
    ::= { usmUserEntry 13 }
 

-- Conformance Information *******************************************

usmMIBCompliances  OBJECT IDENTIFIER
    ::= { usmMIBConformance 1 }

usmMIBGroups  OBJECT IDENTIFIER
    ::= { usmMIBConformance 2 }


-- Compliance statements

usmMIBCompliance MODULE-COMPLIANCE
    STATUS          current
    DESCRIPTION
        "The compliance statement for SNMP engines which
        implement the SNMP-USER-BASED-SM-MIB."
    MODULE          -- this module
    MANDATORY-GROUPS { usmMIBBasicGroup }

    OBJECT          usmUserAuthProtocol
    MIN-ACCESS      read-only
    DESCRIPTION
        "Write access is not required."

    OBJECT          usmUserPrivProtocol
    MIN-ACCESS      read-only
    DESCRIPTION
        "Write access is not required."
    ::= { usmMIBCompliances 1 }

-- Units of compliance

usmMIBBasicGroup OBJECT-GROUP
    OBJECTS         {
                        usmStatsUnsupportedSecLevels,
                        usmStatsNotInTimeWindows,
                        usmStatsUnknownUserNames,
                        usmStatsUnknownEngineIDs,
                        usmStatsWrongDigests,
                        usmStatsDecryptionErrors,
                        usmUserSpinLock,
                        usmUserSecurityName,
                        usmUserCloneFrom,
                        usmUserAuthProtocol,
                        usmUserAuthKeyChange,
                        usmUserOwnAuthKeyChange,
                        usmUserPrivProtocol,
                        usmUserPrivKeyChange,
                        usmUserOwnPrivKeyChange,
                        usmUserPublic,
                        usmUserStorageType,
                        usmUserStatus
                    }
    STATUS          current
    DESCRIPTION
        "A collection of objects providing for configuration
        of an SNMP engine which implements the SNMP
        User-based Security Model."
    ::= { usmMIBGroups 1 }

END


