RFC 4131

Management Information Base for Data Over Cable Service Interface Specification (DOCSIS) Cable Modems and Cable Modem Termination Systems for Baseline Privacy Plus

๐Ÿ“… published September 2005, from ietf

RFC 4131 ๐Ÿ’– Management Information Base for DOCSIS Baseline Privacy Plus

Okay bestie, this is RFC 4131 โœจ It's a Standards Track document from the Network Working Group, dated September 2005. The authors are S. Green (listed as a Consultant), K. Ozawa (Toshiba), E. Cardona, Ed. (CableLabs), and A. Katsnelson (no affiliation is listed in the header). It doesn't have an "Obsoletes" or an "Updates" line, so it doesn't replace or change any earlier RFC according to its header ๐Ÿ™ˆ

Its title is Management Information Base for Data Over Cable Service Interface Specification (DOCSIS) Cable Modems and Cable Modem Termination Systems for Baseline Privacy Plus. Main character energy ๐Ÿ‘‘


Status of This Memo ๐Ÿ“œ

This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited.

Copyright (C) The Internet Society (2005).

Abstract ๐ŸŽ€

This memo defines a piece of the Management Information Base (MIB) for network management protocols in the Internet community. The main point is a set of managed objects for Simple Network Management Protocol (SNMP) based management of the Baseline Privacy Plus features of DOCSIS 1.1 and DOCSIS 2.0 (Data-over-Cable Service Interface Specification) compliant Cable Modems and Cable Modem Termination Systems. It's giving SNMP management realness ๐Ÿ’…

Table of Contents ๐Ÿ—บ๏ธ

1. The Internet-Standard Management Framework.....................  2
2. Overview.......................................................  2
   2.1. Structure of the MIB......................................  3
   2.2. Relationship of BPI+ and BPI MIB Modules..................  4
   2.3. BPI+ MIB Module Relationship with The Interfaces Group MIB  5
3. Definitions....................................................  5
4. Acknowledgements............................................... 77
5. Normative References........................................... 77
6. Informative References......................................... 78
7. Security Considerations........................................ 79
8. IANA Considerations............................................ 83

1. The Internet-Standard Management Framework ๐Ÿงš

Okay so for a detailed overview of the documents that describe the current Internet-Standard Management Framework, check out section 7 of RFC 3410 [RFC3410]. It's the place to go if you want the whole picture ๐Ÿฆ‹

Managed objects are accessed through a virtual information store called the Management Information Base, or MIB. MIB objects are usually accessed through the Simple Network Management Protocol (SNMP). Objects in the MIB are defined using the mechanisms in the Structure of Management Information (SMI). This memo specifies a MIB module that is compliant with the SMIv2, which is described in STD 58, RFC 2578 [RFC2578], STD 58, RFC 2579 [RFC2579] and STD 58, RFC 2580 [RFC2580]. Not me getting excited about STD 58 ๐Ÿฅน

2. Overview ๐ŸŒˆ

This MIB module (BPI+ MIB) gives you a set of objects that are needed to manage the Baseline Privacy Interface Plus features of DOCSIS 1.1 and DOCSIS 2.0 Cable Modem (CM) and Cable Modem Termination System (CMTS). The spec is based on the operational model described in the DOCSIS Baseline Privacy Interface Plus Specification [DOCSIS].

DOCSIS Baseline Privacy Plus has four distinct functional and manageable areas, and they're all giving main character energy:

  • Key exchange and data encryption โœจ
  • Cable modem authentication ๐Ÿ”
  • Multicast encryption ๐Ÿ“ก
  • Authentication of downloaded software images ๐Ÿ’พ

This MIB module extends the DOCSIS 1.0 Baseline Privacy MIB module [RFC3083] (BPI MIB). That one comes from the operational model in the DOCSIS Baseline Privacy Interface Specification [DOCSIS-1.0]. The original Baseline Privacy MIB structure has mostly been kept in Baseline Privacy Plus, so it's a very familiar vibe ๐Ÿ“

Now the important bit ๐Ÿ‘€ The referenced DOCSIS specifications only require that Cable Modems process IPv4 customer traffic, and the design choices in this MIB module reflect that. Future versions of the DOCSIS specifications are expected to require IPv6 support as well, so keep your eyes open ๐Ÿ”ฅ

Conventions Used in This Document ๐Ÿ“

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14, RFC 2119 [RFC2119]. These are the official requirement words, so read them carefully ๐Ÿ’…

2.1. Structure of the MIB ๐Ÿ—๏ธ

This MIB module is organized into several tables and objects. Let's walk through them ๐Ÿซถ

2.1.1. Cable Modem ๐Ÿ“ฑ

  • The docsBpi2CmBaseTable holds authorization key exchange information for one CM MAC interface.
  • The docsBpi2CmTEKTable holds traffic key exchange and data encryption information for a particular security association ID of the cable modem.
  • Multicast Encryption information lives under Docsbpi2CmMulticastObjects. There is currently one multicast table object that handles IP multicast encryption, docsBpi2CmIpMulticastMapTable.
  • Digital certificates used for cable modem authentication are available through docsBpi2CmDeviceCertTable.
  • Cryptographic suite capabilities for a CM MAC are kept in the docsBpi2CmCryptoSuiteTable.

2.1.2. Cable Modem Termination System ๐Ÿ–ฅ๏ธ

  • The docsBpi2CmtsBaseTable holds default settings and summary counters for the cable modem termination system.
  • The DocsBpi2CmtsAuthTable holds Authorization Key Exchange information for each CM MAC interface, plus data from the CM certificates used in cable modem authentication.
  • The docsBpi2CmtsTEKTable holds traffic key exchange and data encryption information for a particular security association ID.
  • Multicast Encryption information lives under Docsbpi2CmtsMulticastObjects. There are currently two multicast table objects. The table docsBpi2CmtsIpMulticastMapTable is designed specifically for IP multicast encryption, while docsBpi2CmtsMulticastAuthTable is meant to manage all multicast security associations.

In particular, the table docsBpi2CmtsIpMulticastMapTable defines the object docsBpi2CmtsIpMulticastMask, which could be a non-contiguous netmask. That's why the object syntax is based on the INET-ADDRESS-MIB MIB Module [RFC4001] Textual Convention InetAddress instead of InetAddressPrefixLength. ๐Ÿค“

This makes it possible to assign the same DOCSIS Security Association ID (SAID) to one or more IPv6 multicast group IDs that match one or more IPv6 multicast scope types within an entry in this table. For example, multicast scopes labeled "unassigned" [RFC3513] may be allocated by administrators to a particular SAID, regardless of their multicast scope. That maps a transient multicast group 'Y' to SAID 'z' for ANY multicast scope, and the non-contiguous netmask will be FF10:Y. For more on IPv6 multicast addressing, see [RFC3513] ๐Ÿฆ‹

  • DocsBpi2CmtsCertObjects contains 2 manageable tables: one for provisioned cable modem certificates and one for certification authority certificates. ๐Ÿ“œ

2.1.3. Common ๐Ÿค

  • The docsBpi2CodeDownloadControl objects manage the authenticated software download process for a given device.

2.2. Relationship of BPI+ and BPI MIB Modules ๐Ÿ”—

This section describes how the BPI+ MIB module in this document relates to the BPI MIB module defined in RFC 3083 [RFC3083]. The BPI+ protocol interface is an enhancement to the BPI protocol, and it's a distinct protocol from BPI. The BPI+ managed objects should be considered separate from the BPI MIB objects defined in RFC 3083. Two different things, bestie ๐Ÿ’–

DOCSIS 1.1 and 2.0 systems implement both the BPI+ and BPI protocols so they stay backward compatible with 1.0 systems. For more on interoperability between BPI and BPI+ compliant systems, see appendix C of the DOCSIS BPI+ specification [DOCSIS]. For MIB module requirements, check section 4.6.1, Figure 9, of the DOCSIS 1.1 OSSI specification [DOCSIS-1.1], and section 7.6.1, Tables 7-9, of the DOCSIS 2.0 OSSI specification [DOCSIS-2.0]. ๐Ÿ“š

2.3. BPI+ MIB Module Relationship with the Interfaces Group MIB ๐Ÿงฉ

The BPI+ MIB module is the management framework of the Baseline Privacy Plus Interface Specification [DOCSIS]. That spec provides the MAC layer (Media Access Control) security services of DOCSIS through the Baseline Privacy Key Management (BPKM) protocol. The BPI+ MIB module objects are organized as extensions of the Radio Frequency (RF) Interface Management [RFC2670] ๐Ÿซง

The MIB table structures in this module extend the DOCSIS CATV (Community Antenna Television) MAC layer interface (DocsCableMaclayer by [IANA]). The provisions of the Interface Group MIB [RFC2863] for counter discontinuities and system re-initialization apply to CM and CMTS, so you can validate the difference between two consecutive counter polls. Super useful ๐Ÿ’…

All BPI+ MIB module counters are 32 bits. They're based on the minimum time-to-wrap considerations of [RFC2863] and on how often they're expected to occur as BPI+ FSM (Finite State Machine) event counters. See [DOCSIS] for BPI+ FSM parameter guidelines. ๐Ÿ”ข

Okay that's the end of part 1 of 15 ๐ŸŽ€ The next part picks up with Section 3, the Definitions module, so stay tuned, bestie ๐Ÿซถ๐Ÿ’œ

Okay so this is where the actual MIB lives, bestie ๐ŸŽ€ It's the module that defines the DOCSIS Baseline Privacy Plus Interface (BPI+) stuff for cable modems and CMTSs, and the identity block up top tells you who wrote it and when. ๐Ÿงš

      docsBpi2MIB    MODULE-IDENTITY
           LAST-UPDATED "200507200000Z" -- July 20, 2005
           ORGANIZATION "IETF IP over Cable Data Network (IPCDN)
                         Working Group"
           CONTACT-INFO "---------------------------------------
                      Stuart M. Green
                      E-mail: rubbersoul3@yahoo.com
                      ---------------------------------------
                      Kaz Ozawa
                      Automotive Systems Development Center
                      TOSHIBA CORPORATION
                      1-1, Shibaura 1-Chome
                      Minato-ku, Tokyo 105-8001
                      Japan
                      Phone: +81-3-3457-8569
                      Fax: +81-3-5444-9325
                      E-mail: Kazuyoshi.Ozawa@toshiba.co.jp
                      ---------------------------------------
                      Alexander Katsnelson
                      Postal:
                      Tel:    +1-303-680-3924
                      E-mail: katsnelson6@peoplepc.com
                      ---------------------------------------
                      Eduardo Cardona
                      Postal:
                      Cable Television Laboratories, Inc.
                      858 Coal Creek Circle
                      Louisville, CO 80027- 9750
                      U.S.A.
                      Tel:    +1 303 661 9100
                      Fax:    +1 303 661 9199
                      E-mail: e.cardona@cablelabs.com
                      ---------------------------------------

              IETF IPCDN Working Group
              General Discussion: ipcdn@ietf.org
              Subscribe: http://www.ietf.org/mailman/listinfo/ipcdn.
              Archive: ftp://ftp.ietf.org/ietf-mail-archive/ipcdn.
              Co-chairs: Richard Woundy, rwoundy@cisco.com
                         Jean-Francois Mule, jfm@cablelabs.com"
           DESCRIPTION
               "This is the MIB module for the DOCSIS Baseline
                Privacy Plus Interface (BPI+) at cable modems (CMs)
                and cable modem termination systems (CMTSs).

                Copyright (C) The Internet Society (2005).  This
                version of this MIB module is part of RFC 4131; see
                the RFC itself for full legal notices."

           REVISION        "200507200000Z"  -- July 20, 2005
           DESCRIPTION
               "Initial version of the IETF BPI+ MIB module.
                This version published as RFC 4131."
              ::= { mib-2 126 }

      -- Textual conventions

   DocsX509ASN1DEREncodedCertificate ::= TEXTUAL-CONVENTION
           STATUS    current
           DESCRIPTION
               "An X509 digital certificate encoded as an ASN.1 DER
           object."
           SYNTAX    OCTET STRING (SIZE (0..4096))

   DocsSAId ::= TEXTUAL-CONVENTION
           DISPLAY-HINT "d"
           STATUS    current
           DESCRIPTION
                "Security Association identifier (SAID)."
           REFERENCE
                 "DOCSIS Baseline Privacy Plus Interface
           specification, Section 2.1.3, BPI+ Security
           Associations"
           SYNTAX    Integer32 (1..16383)

   DocsSAIdOrZero ::= TEXTUAL-CONVENTION
           DISPLAY-HINT "d"
           STATUS    current
           DESCRIPTION
                "Security Association identifier (SAID).  The value
           zero indicates that the SAID is yet to be determined."
           REFERENCE
                 "DOCSIS Baseline Privacy Plus Interface
           specification, Section 2.1.3, BPI+ Security
                 Associations"
           SYNTAX    Unsigned32 (0 | 1..16383)

   DocsBpkmSAType ::= TEXTUAL-CONVENTION
           STATUS    current
           DESCRIPTION
                "The type of security association (SA).
           The values of the named-numbers are associated
           with the BPKM SA-Type attributes:
           'primary' corresponds to code '1', 'static' to code '2',
           and 'dynamic' to code '3'.
           The 'none' value must only be used if the SA type has yet
           to be determined."
           REFERENCE
                 "DOCSIS Baseline Privacy Plus Interface
           specification, Section 4.2.2.24"
           SYNTAX    INTEGER {
                          none(0),
                          primary(1),
                          static(2),
                          dynamic(3)
                     }

   DocsBpkmDataEncryptAlg ::= TEXTUAL-CONVENTION
           STATUS    current
           DESCRIPTION
               "The list of data encryption algorithms defined for
           the DOCSIS interface in the BPKM cryptographic-suite
           parameter.  The value 'none' indicates that the SAID
           being referenced has no data encryption."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           SYNTAX    INTEGER {
                          none(0),
                          des56CbcMode(1),
                          des40CbcMode(2),
                          t3Des128CbcMode(3),
                          aes128CbcMode(4),
                          aes256CbcMode(5)
                     }

   DocsBpkmDataAuthentAlg ::= TEXTUAL-CONVENTION
           STATUS    current
           DESCRIPTION
               "The list of data integrity algorithms defined for the
           DOCSIS interface in the BPKM cryptographic-suite parameter.
           The value 'none' indicates that no data integrity is used for
           the SAID being referenced."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           SYNTAX    INTEGER {
                          none(0),
                          hmacSha196(1)
                     }

      docsBpi2MIBObjects  OBJECT IDENTIFIER ::= { docsBpi2MIB 1 }
      -- Cable Modem Group

      docsBpi2CmObjects OBJECT IDENTIFIER ::= { docsBpi2MIBObjects 1 }

      --
      -- The BPI+ base and authorization table for CMs,
      -- indexed by ifIndex
      --

      docsBpi2CmBaseTable OBJECT-TYPE
           SYNTAX              SEQUENCE OF    DocsBpi2CmBaseEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "This table describes the basic and authorization-
           related Baseline Privacy Plus attributes of each CM MAC
           interface."
           ::= { docsBpi2CmObjects 1 }

      docsBpi2CmBaseEntry OBJECT-TYPE
           SYNTAX              DocsBpi2CmBaseEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "Each entry contains objects describing attributes of
           one CM MAC interface.  An entry in this table exists for
           each ifEntry with an ifType of docsCableMaclayer(127)."
           INDEX               { ifIndex }
           ::= { docsBpi2CmBaseTable 1 }

      DocsBpi2CmBaseEntry ::= SEQUENCE {
           docsBpi2CmPrivacyEnable             TruthValue,
           docsBpi2CmPublicKey                 OCTET STRING,
           docsBpi2CmAuthState                 INTEGER,
           docsBpi2CmAuthKeySequenceNumber     Integer32,
           docsBpi2CmAuthExpiresOld            DateAndTime,
           docsBpi2CmAuthExpiresNew            DateAndTime,
           docsBpi2CmAuthReset                 TruthValue,
           docsBpi2CmAuthGraceTime             Integer32,
           docsBpi2CmTEKGraceTime              Integer32,
           docsBpi2CmAuthWaitTimeout           Integer32,
           docsBpi2CmReauthWaitTimeout         Integer32,
           docsBpi2CmOpWaitTimeout             Integer32,
           docsBpi2CmRekeyWaitTimeout          Integer32,
           docsBpi2CmAuthRejectWaitTimeout     Integer32,
           docsBpi2CmSAMapWaitTimeout          Integer32,
           docsBpi2CmSAMapMaxRetries           Integer32,
           docsBpi2CmAuthentInfos              Counter32,
           docsBpi2CmAuthRequests              Counter32,
           docsBpi2CmAuthReplies               Counter32,
           docsBpi2CmAuthRejects               Counter32,
           docsBpi2CmAuthInvalids              Counter32,
           docsBpi2CmAuthRejectErrorCode       INTEGER,
           docsBpi2CmAuthRejectErrorString     SnmpAdminString,
           docsBpi2CmAuthInvalidErrorCode      INTEGER,
           docsBpi2CmAuthInvalidErrorString    SnmpAdminString
           }

      docsBpi2CmPrivacyEnable  OBJECT-TYPE
           SYNTAX              TruthValue
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "This object identifies whether this CM is
           provisioned to run Baseline Privacy Plus."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1."
           ::= { docsBpi2CmBaseEntry 1 }

      docsBpi2CmPublicKey     OBJECT-TYPE
           SYNTAX             OCTET STRING (SIZE (0..524))
           MAX-ACCESS         read-only
           STATUS             current
           DESCRIPTION
                "The value of this object is a DER-encoded
           RSAPublicKey ASN.1 type string, as defined in the RSA
           Encryption Standard (PKCS #1), corresponding to the
           public key of the CM."

           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.4."
           ::= { docsBpi2CmBaseEntry 2 }

      docsBpi2CmAuthState OBJECT-TYPE
           SYNTAX         INTEGER   {
                          start(1),
                          authWait(2),
                          authorized(3),
                          reauthWait(4),
                          authRejectWait(5),
                          silent(6)
                     }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the state of the CM
           authorization FSM.  The start state indicates that FSM is
           in its initial state."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.1.2.1."
           ::= { docsBpi2CmBaseEntry 3 }

      docsBpi2CmAuthKeySequenceNumber    OBJECT-TYPE
           SYNTAX              Integer32 (0..15)
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the most recent
           authorization key sequence number for this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.10."
           ::= { docsBpi2CmBaseEntry 4 }

      docsBpi2CmAuthExpiresOld OBJECT-TYPE
           SYNTAX              DateAndTime
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the actual clock time for
           expiration of the immediate predecessor of the most recent
           authorization key for this FSM.  If this FSM has only one
           authorization key, then the value is the time of activation
           of this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.9."
           ::= { docsBpi2CmBaseEntry 5 }

okay so we're still deep in the MIB objects ๐Ÿ’– and these next ones are all about authorization keys and timers, which is giving very security bestie energy ๐Ÿ”

      docsBpi2CmAuthExpiresNew OBJECT-TYPE
           SYNTAX              DateAndTime
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the actual clock time for
           expiration of the most recent authorization key for this
           FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.9."
           ::= { docsBpi2CmBaseEntry 6 }

      docsBpi2CmAuthReset OBJECT-TYPE
           SYNTAX         TruthValue
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "Setting this object to 'true' generates a Reauthorize
           event in the authorization FSM.  Reading this object always
           returns FALSE.

           This object is for testing purposes only, and therefore it
           is not required to be associated with a last reset
           object."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.1.2.3.4."
           ::= { docsBpi2CmBaseEntry 7 }

ok so docsBpi2CmAuthExpiresNew is the read-only clock time for when the newest auth key runs out โฐ and docsBpi2CmAuthReset is literally a testing-only switch ๐Ÿงช setting it to 'true' fires a Reauthorize event, but reading it always gives you FALSE ๐Ÿ™ˆ it's not required to be tied to a last reset object, so no drama there ๐Ÿ’…

      docsBpi2CmAuthGraceTime  OBJECT-TYPE
           SYNTAX         Integer32 (1..6047999)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the grace time for an
           authorization key in seconds.  A CM is expected to start
           trying to get a new authorization key beginning
           AuthGraceTime seconds before the most recent authorization
           key actually expires."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.3."
           ::= { docsBpi2CmBaseEntry 8 }

      docsBpi2CmTEKGraceTime   OBJECT-TYPE
           SYNTAX         Integer32 (1..302399)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the grace time for
           the TEK in seconds.  The CM is expected to start trying to
           acquire a new TEK beginning TEK GraceTime seconds before
           the expiration of the most recent TEK."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.6."
           ::= { docsBpi2CmBaseEntry 9 }

      docsBpi2CmAuthWaitTimeout     OBJECT-TYPE
           SYNTAX         Integer32 (1..30)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Authorize Wait
           Timeout in seconds."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.1."
           ::= { docsBpi2CmBaseEntry 10 }

      docsBpi2CmReauthWaitTimeout   OBJECT-TYPE
           SYNTAX         Integer32 (1..30)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Reauthorize Wait
           Timeout in seconds."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.2."
           ::= { docsBpi2CmBaseEntry 11 }

      docsBpi2CmOpWaitTimeout  OBJECT-TYPE
           SYNTAX         Integer32 (1..10)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Operational Wait
           Timeout in seconds."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.4."
           ::= { docsBpi2CmBaseEntry 12 }

      docsBpi2CmRekeyWaitTimeout    OBJECT-TYPE
           SYNTAX         Integer32 (1..10)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Rekey Wait Timeout
           in seconds."
           REFERENCE

                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.5."
           ::= { docsBpi2CmBaseEntry 13 }

      docsBpi2CmAuthRejectWaitTimeout    OBJECT-TYPE
           SYNTAX         Integer32 (1..600)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Authorization Reject
           Wait Timeout in seconds."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.7."
           ::= { docsBpi2CmBaseEntry 14 }

      docsBpi2CmSAMapWaitTimeout    OBJECT-TYPE
           SYNTAX         Integer32 (1..10)
           UNITS          "seconds"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the retransmission
           interval, in seconds, of SA Map Requests from the MAP Wait
           state."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.8."
           ::= { docsBpi2CmBaseEntry 15 }

      docsBpi2CmSAMapMaxRetries     OBJECT-TYPE
           SYNTAX         Integer32 (0..10)
           UNITS          "count"
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the maximum number of
           Map Request retries allowed."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.1.1.1.9."
           ::= { docsBpi2CmBaseEntry 16 }

so this is basically the timer drawer ๐Ÿง we've got grace times for auth keys (in seconds, max 6047999 โฑ๏ธ) and the TEK, plus a bunch of wait timeouts for auth, reauth, operational, rekey, auth reject, and SA Map requests ๐Ÿซถ the SA Map one is the retransmission interval from the MAP Wait state, and the max retries one is the cap on Map Request retries ๐Ÿ” every single one is read-only, so the CM just reports these back, no changing them here ๐Ÿ’œ

      docsBpi2CmAuthentInfos   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times
           the CM has transmitted an Authentication Information
           message.  Discontinuities in the value of this counter can
           occur at re-initialization of the management system, and at
           other times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.9."
           ::= { docsBpi2CmBaseEntry 17 }

      docsBpi2CmAuthRequests   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has transmitted an Authorization Request message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.1."
           ::= { docsBpi2CmBaseEntry 18 }

      docsBpi2CmAuthReplies    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has received an Authorization Reply message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.2."
           ::= { docsBpi2CmBaseEntry 19 }

      docsBpi2CmAuthRejects    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has received an Authorization Reject message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.3."
           ::= { docsBpi2CmBaseEntry 20 }

      docsBpi2CmAuthInvalids   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the count of times the CM
           has received an Authorization Invalid message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.7."
           ::= { docsBpi2CmBaseEntry 21 }

and now the counter crew ๐Ÿงฎ these four Counter32 objects are basically a scoreboard for auth messages: how many Authentication Information messages the CM sent, how many Authorization Requests it sent, how many Authorization Replies it got back, how many Authorization Rejects it got, and how many Authorization Invalids showed up ๐Ÿ“Š they can get discontinuities at re-initialization of the management system and whenever ifCounterDiscontinuityTime says so, so don't panic if the numbers suddenly reset ๐Ÿ˜ญ

      docsBpi2CmAuthRejectErrorCode OBJECT-TYPE
           SYNTAX         INTEGER {
                                 none(1),
                                 unknown(2),
                                 unauthorizedCm(3),
                                 unauthorizedSaid(4),
                                 permanentAuthorizationFailure(8),
                                 timeOfDayNotAcquired(11)
                                 }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent
           Authorization Reject message received by the CM.  This has
           the value unknown(2) if the last Error-Code value was 0 and
           none(1) if no Authorization Reject message has been received
           since reboot."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,

           Sections 4.2.1.3 and 4.2.2.15."
           ::= { docsBpi2CmBaseEntry 22 }

      docsBpi2CmAuthRejectErrorString    OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent Authorization Reject message received by the
           CM.  This is a zero length string if no Authorization
           Reject message has been received since reboot."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.3 and 4.2.2.6."
           ::= { docsBpi2CmBaseEntry 23 }

last but not least, the reject detective work ๐Ÿ•ต๏ธโ€โ™€๏ธ docsBpi2CmAuthRejectErrorCode is an enum that tells you what the most recent Authorization Reject error code meant, and it shows unknown(2) if that last code was 0, while none(1) means no reject has come in since reboot ๐Ÿซ  then docsBpi2CmAuthRejectErrorString gives you the actual text from that reject, up to 128 characters, and it's a zero length string if no reject has shown up since reboot ๐Ÿ’€ iconic data, honestly ๐ŸŒˆ

Okay bestie, we're picking up right where the Definitions get spicy ๐Ÿ’…โœจ First up are two objects about the most recent Authorization Invalid message the CM got, with the error code and the error string ๐ŸŽ€

      docsBpi2CmAuthInvalidErrorCode     OBJECT-TYPE
           SYNTAX         INTEGER {
                                 none(1),
                                 unknown(2),
                                 unauthorizedCm(3),
                                 unsolicited(5),
                                 invalidKeySequence(6),
                                 keyRequestAuthenticationFailure(7)
                                 }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent
           Authorization Invalid message received by the CM.  This has
           the value unknown(2) if the last Error-Code value was 0 and
           none(1) if no Authorization Invalid message has been received
           since reboot."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.7 and 4.2.2.15."
           ::= { docsBpi2CmBaseEntry 24 }

      docsBpi2CmAuthInvalidErrorString   OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent Authorization Invalid message received by the
           CM.  This is a zero length string if no Authorization
           Invalid message has been received since reboot."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.7 and 4.2.2.6."
           ::= { docsBpi2CmBaseEntry 25 }

      --
      -- The CM TEK Table, indexed by ifIndex and SAID
      --

      docsBpi2CmTEKTable  OBJECT-TYPE
           SYNTAX         SEQUENCE OF    DocsBpi2CmTEKEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table describes the attributes of each CM
           Traffic Encryption Key (TEK) association.  The CM maintains
           (no more than) one TEK association per SAID per CM MAC
           interface."
           ::= { docsBpi2CmObjects 2 }

      docsBpi2CmTEKEntry  OBJECT-TYPE
           SYNTAX         DocsBpi2CmTEKEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains objects describing the TEK
           association attributes of one SAID.  The CM MUST create one
           entry per SAID, regardless of whether the SAID was obtained
           from a Registration Response message, from an Authorization
           Reply message, or from any dynamic SAID establishment
           mechanisms."
           INDEX     { ifIndex, docsBpi2CmTEKSAId }
           ::= { docsBpi2CmTEKTable 1 }

Next up is the TEK entry's shape, the full row of columns, which is basically the whole table in one lineup ๐Ÿงš

      DocsBpi2CmTEKEntry ::= SEQUENCE {
           docsBpi2CmTEKSAId                  DocsSAId,
           docsBpi2CmTEKSAType                DocsBpkmSAType,
           docsBpi2CmTEKDataEncryptAlg        DocsBpkmDataEncryptAlg,
           docsBpi2CmTEKDataAuthentAlg        DocsBpkmDataAuthentAlg,
           docsBpi2CmTEKState                 INTEGER,
           docsBpi2CmTEKKeySequenceNumber     Integer32,
           docsBpi2CmTEKExpiresOld            DateAndTime,
           docsBpi2CmTEKExpiresNew            DateAndTime,
           docsBpi2CmTEKKeyRequests           Counter32,
           docsBpi2CmTEKKeyReplies            Counter32,
           docsBpi2CmTEKKeyRejects            Counter32,
           docsBpi2CmTEKInvalids              Counter32,
           docsBpi2CmTEKAuthPends             Counter32,
           docsBpi2CmTEKKeyRejectErrorCode    INTEGER,
           docsBpi2CmTEKKeyRejectErrorString  SnmpAdminString,
           docsBpi2CmTEKInvalidErrorCode      INTEGER,
           docsBpi2CmTEKInvalidErrorString    SnmpAdminString
           }

Now the individual TEK columns, starting with the SAID itself, the SAtype, and the two algorithm objects ๐Ÿ”ฅ

      docsBpi2CmTEKSAId   OBJECT-TYPE
           SYNTAX         DocsSAId
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The value of this object is the DOCSIS Security
           Association ID (SAID)."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.12."
           ::= { docsBpi2CmTEKEntry 1 }

      docsBpi2CmTEKSAType OBJECT-TYPE
           SYNTAX         DocsBpkmSAType
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the type of security
           association."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 2.1.3."
           ::= { docsBpi2CmTEKEntry 2 }

      docsBpi2CmTEKDataEncryptAlg   OBJECT-TYPE
           SYNTAX    DocsBpkmDataEncryptAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the data encryption
           algorithm for this SAID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmTEKEntry 3 }

      docsBpi2CmTEKDataAuthentAlg   OBJECT-TYPE
           SYNTAX    DocsBpkmDataAuthentAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The value of this object is the data authentication
           algorithm for this SAID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmTEKEntry 4 }

Then comes the TEK state machine, which has six states, and the key sequence number ๐Ÿฆ‹

      docsBpi2CmTEKState  OBJECT-TYPE
           SYNTAX         INTEGER {
                                  start(1),
                                  opWait(2),
                                  opReauthWait(3),
                                  operational(4),
                                  rekeyWait(5),
                                  rekeyReauthWait(6)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the state of the
           indicated TEK FSM.  The start(1) state indicates that the
           FSM is in its initial state."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.1.3.1."
           ::= { docsBpi2CmTEKEntry 5 }

      docsBpi2CmTEKKeySequenceNumber     OBJECT-TYPE
           SYNTAX              Integer32 (0..15)
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the most recent TEK
           key sequence number for this TEK FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.2.10 and 4.2.2.13."
           ::= { docsBpi2CmTEKEntry 6 }

Okay the expiry times are next, which is where the clock stuff lives โฐ

      docsBpi2CmTEKExpiresOld  OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the actual clock time for
           expiration of the immediate predecessor of the most recent
           TEK for this FSM.  If this FSM has only one TEK, then the
           value is the time of activation of this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.5 and 4.2.2.9."
           ::= { docsBpi2CmTEKEntry 7 }

      docsBpi2CmTEKExpiresNew  OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the actual clock time for
           expiration of the most recent TEK for this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.5 and 4.2.2.9."
           ::= { docsBpi2CmTEKEntry 8 }

And now the counters, which are the tally marks of every key request, reply, reject, invalid and auth pend ๐Ÿ“Š

      docsBpi2CmTEKKeyRequests OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has transmitted a Key Request message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."

           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.4."
           ::= { docsBpi2CmTEKEntry 9 }

      docsBpi2CmTEKKeyReplies  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has received a Key Reply message, including a message whose
           authentication failed.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,

           Section 4.2.1.5."
           ::= { docsBpi2CmTEKEntry 10 }

      docsBpi2CmTEKKeyRejects  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has received a Key Reject message, including a message
           whose authentication failed.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.6."
           ::= { docsBpi2CmTEKEntry 11 }

      docsBpi2CmTEKInvalids    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the CM
           has received a TEK Invalid message, including a message
           whose authentication failed.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.8."
           ::= { docsBpi2CmTEKEntry 12 }

      docsBpi2CmTEKAuthPends   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the count of times an
           Authorization Pending (Auth Pend) event occurred in this
           FSM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.1.3.3.3."
           ::= { docsBpi2CmTEKEntry 13 }

okay so this part is where the MIB really gets into the key reject and TEK invalid stuff, plus the multicast mapping table and the cert objects. it's giving detailed bestie energy ๐ŸŽ€โœจ

      docsBpi2CmTEKKeyRejectErrorCode    OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  unauthorizedSaid(4)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent Key Reject
           message received by the CM.  This has the value unknown(2) if
           the last Error-Code value was 0 and none(1) if no Key
           Reject message has been received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.1.2.6 and 4.2.2.15."
           ::= { docsBpi2CmTEKEntry 14 }

      docsBpi2CmTEKKeyRejectErrorString  OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent Key Reject message received by the CM.  This is
           a zero length string if no Key Reject message has been
           received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.1.2.6 and 4.2.2.6."
           ::= { docsBpi2CmTEKEntry 15 }

      docsBpi2CmTEKInvalidErrorCode OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  invalidKeySequence(6)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The value of this object is the enumerated
           description of the Error-Code in the most recent TEK Invalid
           message received by the CM.  This has the value unknown(2) if
           the last Error-Code value was 0 and none(1) if no TEK
           Invalid message has been received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.1.2.8 and 4.2.2.15."
           ::= { docsBpi2CmTEKEntry 16 }

      docsBpi2CmTEKInvalidErrorString    OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent TEK Invalid message received by the CM.  This is
           a zero length string if no TEK Invalid message has been
           received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.1.2.8 and 4.2.2.6."
           ::= { docsBpi2CmTEKEntry 17 }

      --
      -- The CM Multicast Objects Group
      --

      docsBpi2CmMulticastObjects OBJECT IDENTIFIER
           ::= { docsBpi2CmObjects 3 }

      --
      -- The CM Dynamic IP Multicast Mapping Table, indexed by
      -- docsBpi2CmIpMulticastIndex and by ifIndex
      --

      docsBpi2CmIpMulticastMapTable OBJECT-TYPE
           SYNTAX         SEQUENCE OF DocsBpi2CmIpMulticastMapEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table maps multicast IP addresses to SAIDs per
           CM MAC Interface.
           It is intended to map multicast IP addresses associated
           with SA MAP Request messages."
           ::= { docsBpi2CmMulticastObjects 1 }

      docsBpi2CmIpMulticastMapEntry OBJECT-TYPE

           SYNTAX         DocsBpi2CmIpMulticastMapEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains objects describing the mapping of
           one multicast IP address to one SAID, as well as
           associated state, message counters, and error information.

           An entry may be removed from this table upon the reception
           of an SA Map Reject."
           INDEX     { ifIndex, docsBpi2CmIpMulticastIndex }
           ::= { docsBpi2CmIpMulticastMapTable 1 }

      DocsBpi2CmIpMulticastMapEntry ::= SEQUENCE {
           docsBpi2CmIpMulticastIndex               Unsigned32,
           docsBpi2CmIpMulticastAddressType         InetAddressType,
           docsBpi2CmIpMulticastAddress             InetAddress,
           docsBpi2CmIpMulticastSAId                DocsSAIdOrZero,
           docsBpi2CmIpMulticastSAMapState          INTEGER,
           docsBpi2CmIpMulticastSAMapRequests       Counter32,
           docsBpi2CmIpMulticastSAMapReplies        Counter32,
           docsBpi2CmIpMulticastSAMapRejects        Counter32,
           docsBpi2CmIpMulticastSAMapRejectErrorCode INTEGER,
           docsBpi2CmIpMulticastSAMapRejectErrorString SnmpAdminString
           }

      docsBpi2CmIpMulticastIndex         OBJECT-TYPE
           SYNTAX         Unsigned32 (1..4294967295)
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The index of this row."
           ::= { docsBpi2CmIpMulticastMapEntry 1 }

      docsBpi2CmIpMulticastAddressType   OBJECT-TYPE
           SYNTAX         InetAddressType
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The type of Internet address for
           docsBpi2CmIpMulticastAddress."
           ::= { docsBpi2CmIpMulticastMapEntry 2 }

      docsBpi2CmIpMulticastAddress  OBJECT-TYPE
           SYNTAX         InetAddress
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "This object represents the IP multicast address
           to be mapped.  The type of this address is determined by
           the value of the docsBpi2CmIpMulticastAddressType object."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 5.4."
           ::= { docsBpi2CmIpMulticastMapEntry 3 }

      docsBpi2CmIpMulticastSAId          OBJECT-TYPE
           SYNTAX         DocsSAIdOrZero
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "This object represents the SAID to which the IP
           multicast address has been mapped.  If no SA Map Reply has
           been received for the IP address, this object should have
           the value 0."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.12."
           ::= { docsBpi2CmIpMulticastMapEntry 4 }

      docsBpi2CmIpMulticastSAMapState         OBJECT-TYPE
           SYNTAX         INTEGER {
                                 start(1),
                                 mapWait(2),
                                 mapped(3)
                          }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the state of the SA
           Mapping FSM for this IP."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 5.3.1."
           ::= { docsBpi2CmIpMulticastMapEntry 5 }

      docsBpi2CmIpMulticastSAMapRequests OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CM has transmitted an SA Map Request message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.10."
           ::= { docsBpi2CmIpMulticastMapEntry 6 }

      docsBpi2CmIpMulticastSAMapReplies  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CM has received an SA Map Reply message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.11."
           ::= { docsBpi2CmIpMulticastMapEntry 7 }

      docsBpi2CmIpMulticastSAMapRejects  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CM has received an SA MAP Reject message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.12."
           ::= { docsBpi2CmIpMulticastMapEntry 8 }

      docsBpi2CmIpMulticastSAMapRejectErrorCode    OBJECT-TYPE
           SYNTAX         INTEGER {
                          none(1),
                          unknown(2),
                          noAuthForRequestedDSFlow(9),
                          dsFlowNotMappedToSA(10)
                          }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The value of this object is the enumerated
           description of the Error-Code in the most recent SA Map
           Reject message sent in response to an SA Map Request for
           This IP.  It has the value none(1) if no SA MAP Reject
           message has been received since entry creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.12 and 4.2.2.15."
           ::= { docsBpi2CmIpMulticastMapEntry 9 }

      docsBpi2CmIpMulticastSAMapRejectErrorString  OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in
           the most recent SA Map Reject message sent in response to
           an SA Map Request for this IP.  It is a zero length string
           if no SA Map Reject message has been received since entry
           creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.12 and 4.2.2.6."
           ::= { docsBpi2CmIpMulticastMapEntry 10 }

      --
      -- CM Cert Objects
      --

      docsBpi2CmCertObjects OBJECT IDENTIFIER
           ::= { docsBpi2CmObjects 4 }

      --
      -- CM Device Cert Table
      --

      docsBpi2CmDeviceCertTable  OBJECT-TYPE
           SYNTAX                SEQUENCE OF DocsBpi2CmDeviceCertEntry
           MAX-ACCESS            not-accessible
           STATUS                current
           DESCRIPTION
                "This table describes the Baseline Privacy Plus
           device certificates for each CM MAC interface."
           ::= { docsBpi2CmCertObjects 1 }

ok so the vibe check: the key reject and TEK invalid objects are basically the CM's little diary of its most recent complaint ๐Ÿ““๐Ÿ’… The "none(1)" and "unknown(2)" values are the defaults, and the error strings are zero length until something actually goes wrong ๐ŸŒธ Then the multicast map table keys each row on ifIndex plus docsBpi2CmIpMulticastIndex, which is so organized of it ๐ŸŽ€ the SA Map counters are Counter32 and can reset at re-initialization or whenever ifCounterDiscontinuityTime says so ๐Ÿฆ‹ The SAID is set to 0 until an SA Map Reply shows up, and the mapping state moves through start, mapWait, and mapped ๐Ÿงš

the cert table is up next and I'm literally obsessed ๐ŸŒˆ๐Ÿ’œ

Okay bestie, now we're getting into the cable modem certificate stuff ๐ŸŽ€ The CM certs live in their own little table, and the CMTS side gets its own group with a special note about SAIDs and SIDs ๐Ÿฆ‹

      docsBpi2CmDeviceCertEntry  OBJECT-TYPE
           SYNTAX              DocsBpi2CmDeviceCertEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "Each entry contains the device certificates of
           one CM MAC interface.  An entry in this table exists for
           each ifEntry with an ifType of docsCableMaclayer(127)."
           INDEX               { ifIndex }
           ::= { docsBpi2CmDeviceCertTable 1 }

      DocsBpi2CmDeviceCertEntry ::= SEQUENCE {
           docsBpi2CmDeviceCmCert
                                 DocsX509ASN1DEREncodedCertificate,
           docsBpi2CmDeviceManufCert
                                 DocsX509ASN1DEREncodedCertificate
           }

      docsBpi2CmDeviceCmCert   OBJECT-TYPE
           SYNTAX        DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS         read-write
           STATUS              current
           DESCRIPTION
                "The X509 DER-encoded cable modem certificate.
           Note:  This object can be set only when the value is the
           zero-length OCTET STRING; otherwise, an error of
           'inconsistentValue' is returned.  Once the object
           contains the certificate, its access MUST be read-only
           and persists after re-initialization of the
           managed system."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.1."
           ::= { docsBpi2CmDeviceCertEntry 1 }

      docsBpi2CmDeviceManufCert     OBJECT-TYPE
           SYNTAX         DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The X509 DER-encoded manufacturer certificate that
           signed the cable modem certificate."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.1."
           ::= { docsBpi2CmDeviceCertEntry 2 }

      --
      -- CM Crypto Suite Table
      --
      docsBpi2CmCryptoSuiteTable    OBJECT-TYPE
           SYNTAX         SEQUENCE OF    DocsBpi2CmCryptoSuiteEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table describes the Baseline Privacy Plus
           cryptographic suite capabilities for each CM MAC
           interface."
           ::= { docsBpi2CmObjects 5 }

      docsBpi2CmCryptoSuiteEntry    OBJECT-TYPE
           SYNTAX         DocsBpi2CmCryptoSuiteEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains a cryptographic suite pair
           that this CM MAC supports."
           INDEX     { ifIndex, docsBpi2CmCryptoSuiteIndex }
           ::= { docsBpi2CmCryptoSuiteTable 1 }

      DocsBpi2CmCryptoSuiteEntry ::= SEQUENCE {
           docsBpi2CmCryptoSuiteIndex              Unsigned32,
           docsBpi2CmCryptoSuiteDataEncryptAlg
                                       DocsBpkmDataEncryptAlg,
           docsBpi2CmCryptoSuiteDataAuthentAlg
                                       DocsBpkmDataAuthentAlg
           }

      docsBpi2CmCryptoSuiteIndex OBJECT-TYPE
           SYNTAX         Unsigned32 (1..1000)
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The index for a cryptographic suite row."
           ::= { docsBpi2CmCryptoSuiteEntry 1 }

      docsBpi2CmCryptoSuiteDataEncryptAlg     OBJECT-TYPE
           SYNTAX    DocsBpkmDataEncryptAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the data encryption
           algorithm for this cryptographic suite capability."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmCryptoSuiteEntry 2 }

      docsBpi2CmCryptoSuiteDataAuthentAlg     OBJECT-TYPE
           SYNTAX    DocsBpkmDataAuthentAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the data authentication
           algorithm for this cryptographic suite capability."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmCryptoSuiteEntry 3 }

      -- Cable Modem Termination System Group

   docsBpi2CmtsObjects OBJECT IDENTIFIER ::= { docsBpi2MIBObjects 2 }

      --
      -- SPECIAL NOTE:  For the following CMTS tables, when a CM is
      -- running in BPI mode, replace SAID (Security Association ID)
      -- with SID (Service ID).  The CMTS is required to map SAIDs and
      -- SIDs to one contiguous space.
      --

      --
      -- The BPI+ base table for CMTSs, indexed by ifIndex
      --

      docsBpi2CmtsBaseTable    OBJECT-TYPE
           SYNTAX              SEQUENCE OF    DocsBpi2CmtsBaseEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "This table describes the basic Baseline Privacy
           attributes of each CMTS MAC interface."
           ::= { docsBpi2CmtsObjects 1 }

      docsBpi2CmtsBaseEntry    OBJECT-TYPE
           SYNTAX              DocsBpi2CmtsBaseEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "Each entry contains objects describing attributes of
           one CMTS MAC interface.  An entry in this table exists for
           each ifEntry with an ifType of docsCableMaclayer(127)."
           INDEX     { ifIndex }
           ::= { docsBpi2CmtsBaseTable 1 }

      DocsBpi2CmtsBaseEntry ::= SEQUENCE {

           docsBpi2CmtsDefaultAuthLifetime              Integer32,
           docsBpi2CmtsDefaultTEKLifetime               Integer32,
           docsBpi2CmtsDefaultSelfSignedManufCertTrust  INTEGER,
               docsBpi2CmtsCheckCertValidityPeriods         TruthValue,
               docsBpi2CmtsAuthentInfos                     Counter32,
               docsBpi2CmtsAuthRequests                     Counter32,
               docsBpi2CmtsAuthReplies                      Counter32,
               docsBpi2CmtsAuthRejects                      Counter32,
               docsBpi2CmtsAuthInvalids                     Counter32,
               docsBpi2CmtsSAMapRequests                    Counter32,
               docsBpi2CmtsSAMapReplies                     Counter32,
               docsBpi2CmtsSAMapRejects                     Counter32
               }

      docsBpi2CmtsDefaultAuthLifetime    OBJECT-TYPE
           SYNTAX         Integer32 (1..6048000)
           UNITS          "seconds"
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "The value of this object is the default lifetime, in
           seconds, that the CMTS assigns to a new authorization key.
           This object value persists after re-initialization of the
           managed system."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.2."
           DEFVAL { 604800 }
           ::= { docsBpi2CmtsBaseEntry 1 }

      docsBpi2CmtsDefaultTEKLifetime     OBJECT-TYPE
           SYNTAX         Integer32 (1..604800)
           UNITS          "seconds"
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "The value of this object is the default lifetime, in
           seconds, that the CMTS assigns to a new Traffic Encryption
           Key (TEK).
           This object value persists after re-initialization of the
           managed system."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Appendix A.2."
           DEFVAL { 43200 }
           ::= { docsBpi2CmtsBaseEntry 2 }

      docsBpi2CmtsDefaultSelfSignedManufCertTrust  OBJECT-TYPE

           SYNTAX    INTEGER {
                     trusted (1),
                     untrusted (2)
                     }
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "This object determines the default trust of
           self-signed manufacturer certificate entries, contained
           in docsBpi2CmtsCACertTable, and created after this
           object is set.
           This object need not persist after re-initialization
           of the managed system."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.1"
           ::= { docsBpi2CmtsBaseEntry 3 }

      docsBpi2CmtsCheckCertValidityPeriods    OBJECT-TYPE
           SYNTAX         TruthValue
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "Setting this object to 'true' causes all chained and
           root certificates in the chain to have their validity
           periods checked against the current time of day, when
           the CMTS receives an Authorization Request from the
           CM.
           A 'false' setting causes all certificates in the chain
           not to have their validity periods checked against the
           current time of day.
           This object need not persist after re-initialization
           of the managed system."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.2"
           ::= { docsBpi2CmtsBaseEntry 4 }

      docsBpi2CmtsAuthentInfos OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received an Authentication Information message
           from any CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.9."
           ::= { docsBpi2CmtsBaseEntry 5 }

      docsBpi2CmtsAuthRequests OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                   "The value of this object is the number of times the
           CMTS has received an Authorization Request message from any
           CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.1."
           ::= { docsBpi2CmtsBaseEntry 6 }

      docsBpi2CmtsAuthReplies  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                  "The value of this object is the number of times the
           CMTS has transmitted an Authorization Reply message to any
           CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.2."
           ::= { docsBpi2CmtsBaseEntry 7 }

Okay bestie, the CMTS counters are giving main character energy ๐Ÿ’– Every one of these counts something the CMTS sends or gets, and the discontinuity rules are the same for all of them. Here's the next batch ๐ŸŽ€

      docsBpi2CmtsAuthRejects  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                   "The value of this object is the number of times the
           CMTS has transmitted an Authorization Reject message to any
           CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.3."
           ::= { docsBpi2CmtsBaseEntry 8 }

      docsBpi2CmtsAuthInvalids OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                    "The value of this object is the number of times
           the CMTS has transmitted an Authorization Invalid message
           to any CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.7."
           ::= { docsBpi2CmtsBaseEntry 9 }

      docsBpi2CmtsSAMapRequests     OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received an SA Map Request message from any CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.10."
           ::= { docsBpi2CmtsBaseEntry 10 }

      docsBpi2CmtsSAMapReplies OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The value of this object is the number of times the
           CMTS has transmitted an SA Map Reply message to any CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.11."
           ::= { docsBpi2CmtsBaseEntry 11 }

      docsBpi2CmtsSAMapRejects OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an SA Map Reject message to any CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.12."
           ::= { docsBpi2CmtsBaseEntry 12 }

      --
      -- The CMTS Authorization Table, indexed by ifIndex and CM MAC
      -- address
      --

      docsBpi2CmtsAuthTable    OBJECT-TYPE
           SYNTAX         SEQUENCE OF    DocsBpi2CmtsAuthEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table describes the attributes of each CM
           authorization association.  The CMTS maintains one
           authorization association with each Baseline Privacy-
           enabled CM, registered on each CMTS MAC interface,
           regardless of whether the CM is authorized or rejected."
           ::= { docsBpi2CmtsObjects 2 }

      docsBpi2CmtsAuthEntry    OBJECT-TYPE
           SYNTAX              DocsBpi2CmtsAuthEntry
           MAX-ACCESS          not-accessible
           STATUS              current
           DESCRIPTION
                "Each entry contains objects describing attributes of
           one authorization association.  The CMTS MUST create one
           entry per CM per MAC interface, based on the receipt of an
           Authorization Request message, and MUST not delete the
           entry until the CM loses registration."
           INDEX     { ifIndex, docsBpi2CmtsAuthCmMacAddress }
           ::= { docsBpi2CmtsAuthTable 1 }

      DocsBpi2CmtsAuthEntry ::= SEQUENCE {
           docsBpi2CmtsAuthCmMacAddress        MacAddress,
           docsBpi2CmtsAuthCmBpiVersion        INTEGER,
           docsBpi2CmtsAuthCmPublicKey         OCTET STRING,
           docsBpi2CmtsAuthCmKeySequenceNumber Integer32,
           docsBpi2CmtsAuthCmExpiresOld        DateAndTime,
           docsBpi2CmtsAuthCmExpiresNew        DateAndTime,
           docsBpi2CmtsAuthCmLifetime          Integer32,
           docsBpi2CmtsAuthCmReset             INTEGER,
           docsBpi2CmtsAuthCmInfos             Counter32,
           docsBpi2CmtsAuthCmRequests          Counter32,
           docsBpi2CmtsAuthCmReplies           Counter32,
           docsBpi2CmtsAuthCmRejects           Counter32,
           docsBpi2CmtsAuthCmInvalids          Counter32,
           docsBpi2CmtsAuthRejectErrorCode     INTEGER,
           docsBpi2CmtsAuthRejectErrorString   SnmpAdminString,
           docsBpi2CmtsAuthInvalidErrorCode    INTEGER,
           docsBpi2CmtsAuthInvalidErrorString  SnmpAdminString,
           docsBpi2CmtsAuthPrimarySAId         DocsSAIdOrZero,
           docsBpi2CmtsAuthBpkmCmCertValid     INTEGER,
           docsBpi2CmtsAuthBpkmCmCert
                                DocsX509ASN1DEREncodedCertificate,
           docsBpi2CmtsAuthCACertIndexPtr      Unsigned32
           }

      docsBpi2CmtsAuthCmMacAddress  OBJECT-TYPE
           SYNTAX         MacAddress
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The value of this object is the physical address of
           the CM to which the authorization association applies."
           ::= { docsBpi2CmtsAuthEntry 1 }

      docsBpi2CmtsAuthCmBpiVersion  OBJECT-TYPE
           SYNTAX         INTEGER {
                            bpi (0),
                            bpiPlus (1)
                             }

           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the version of Baseline
           Privacy for which this CM has registered.  The value
           'bpiplus' represents the value of BPI-Version Attribute of
           the Baseline Privacy Key Management BPKM attribute
           BPI-Version (1).  The value 'bpi' is used to represent the
           CM registered using DOCSIS 1.0 Baseline Privacy."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.22; ANSI/SCTE 22-2 2002(formerly DSS 02-03)
           Data-Over-Cable Service Interface Specification DOCSIS 1.0
           Baseline Privacy Interface (BPI)"
           ::= { docsBpi2CmtsAuthEntry 2 }

      docsBpi2CmtsAuthCmPublicKey   OBJECT-TYPE
           SYNTAX         OCTET STRING (SIZE (0..524))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is a DER-encoded
           RSAPublicKey ASN.1 type string, as defined in the RSA
           Encryption Standard (PKCS #1), corresponding to the
           public key of the CM.  This is the zero-length OCTET
           STRING if the CMTS does not retain the public key."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.4."
           ::= { docsBpi2CmtsAuthEntry 3 }

      docsBpi2CmtsAuthCmKeySequenceNumber     OBJECT-TYPE
           SYNTAX         Integer32 (0..15)
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the most recent
           authorization key sequence number for this CM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.10."
           ::= { docsBpi2CmtsAuthEntry 4 }

      docsBpi2CmtsAuthCmExpiresOld  OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The value of this object is the actual clock time
           for expiration of the immediate predecessor of the most
           recent authorization key for this FSM.  If this FSM has only
           one authorization key, then the value is the time of
           activation of this FSM.
           Note: This object has no meaning for CMs running in BPI
           mode; therefore, this object is not instantiated for entries
           associated to those CMs."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.9."
           ::= { docsBpi2CmtsAuthEntry 5 }

      docsBpi2CmtsAuthCmExpiresNew  OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                     "The value of this object is the actual clock
           time for expiration of the most recent authorization key
           for this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.2 and 4.2.2.9."
           ::= { docsBpi2CmtsAuthEntry 6 }

      docsBpi2CmtsAuthCmLifetime    OBJECT-TYPE
           SYNTAX         Integer32 (1..6048000)
           UNITS          "seconds"
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "The value of this object is the lifetime, in seconds,
           that the CMTS assigns to an authorization key for this CM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.2 and Appendix A.2."
           ::= { docsBpi2CmtsAuthEntry 7 }

Next up, the rest of the CMTS Authorization Table columns ๐Ÿงšโœจ

okay the auth table keeps going and it's giving ๐ŸŽ€

      docsBpi2CmtsAuthCmReset  OBJECT-TYPE
           SYNTAX    INTEGER   {
                               noResetRequested(1),
                               invalidateAuth(2),
                               sendAuthInvalid(3),
                               invalidateTeks(4)
                               }
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "Setting this object to invalidateAuth(2) causes the
           CMTS to invalidate the current CM authorization key(s), but
           not to transmit an Authorization Invalid message nor to
           invalidate the primary SAID's TEKs.  Setting this object to
           sendAuthInvalid(3) causes the CMTS to invalidate the
           current CM authorization key(s), and to transmit an
           Authorization Invalid message to the CM, but not to
           invalidate the primary SAID's TEKs.  Setting this object to
           invalidateTeks(4) causes the CMTS to invalidate the current
           CM authorization key(s), to transmit an Authorization
           Invalid message to the CM, and to invalidate the TEKs
           associated with this CM's primary SAID.
           For BPI mode, substitute all of the CM's unicast
           TEKs for the primary SAID's TEKs in the previous
           paragraph.
           Reading this object returns the most recently set
           value of this object or, if the object has not been set
           since entry creation, returns noResetRequested(1)."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.1.2.3.4, 4.1.2.3.5, and 4.1.3.3.5."
           ::= { docsBpi2CmtsAuthEntry 8 }

      docsBpi2CmtsAuthCmInfos       OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received an Authentication Information message
           from this CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.9."
           ::= { docsBpi2CmtsAuthEntry 9 }

      docsBpi2CmtsAuthCmRequests    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received an Authorization Request message from
           this CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.1."
           ::= { docsBpi2CmtsAuthEntry 10 }

      docsBpi2CmtsAuthCmReplies     OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an Authorization Reply message to this
           CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.2."
           ::= { docsBpi2CmtsAuthEntry 11 }

      docsBpi2CmtsAuthCmRejects     OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an Authorization Reject message to
           this CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.3."
           ::= { docsBpi2CmtsAuthEntry 12 }

      docsBpi2CmtsAuthCmInvalids    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an Authorization Invalid message to
           this CM.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.7."
           ::= { docsBpi2CmtsAuthEntry 13 }

      docsBpi2CmtsAuthRejectErrorCode    OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  unauthorizedCm(3),
                                  unauthorizedSaid(4),
                                  permanentAuthorizationFailure(8),
                                  timeOfDayNotAcquired(11)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent
           Authorization Reject message transmitted to the CM.  This has
           the value unknown(2) if the last Error-Code value was 0 and
           none(1) if no Authorization Reject message has been
           transmitted to the CM since entry creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.3 and 4.2.2.15."
           ::= { docsBpi2CmtsAuthEntry 14 }

      docsBpi2CmtsAuthRejectErrorString  OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent Authorization Reject message transmitted to the
           CM.  This is a zero length string if no Authorization
           Reject message has been transmitted to the CM since entry
           creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,

           Sections 4.2.1.3 and 4.2.2.6."
           ::= { docsBpi2CmtsAuthEntry 15 }

      docsBpi2CmtsAuthInvalidErrorCode   OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  unauthorizedCm(3),
                                  unsolicited(5),
                                  invalidKeySequence(6),
                                  keyRequestAuthenticationFailure(7)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent
           Authorization Invalid message transmitted to the CM.  This
           has the value unknown(2) if the last Error-Code value was 0
           and none(1) if no Authorization Invalid message has been
           transmitted to the CM since entry creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.7 and 4.2.2.15."
           ::= { docsBpi2CmtsAuthEntry 16 }

      docsBpi2CmtsAuthInvalidErrorString OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in the
           most recent Authorization Invalid message transmitted to
           the CM.  This is a zero length string if no Authorization
           Invalid message has been transmitted to the CM since entry
           creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.7 and 4.2.2.6."
           ::= { docsBpi2CmtsAuthEntry 17 }

      docsBpi2CmtsAuthPrimarySAId   OBJECT-TYPE
           SYNTAX         DocsSAIdOrZero
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the Primary Security
           Association identifier.  For BPI mode, the value must be
           any unicast SID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 2.1.3."
           ::= { docsBpi2CmtsAuthEntry 18 }

      docsBpi2CmtsAuthBpkmCmCertValid         OBJECT-TYPE
           SYNTAX    INTEGER {
                             unknown (0),
                             validCmChained (1),
                             validCmTrusted (2),
                             invalidCmUntrusted (3),
                             invalidCAUntrusted (4),
                             invalidCmOther (5),
                             invalidCAOther (6)
                             }
           MAX-ACCESS     read-only
           STATUS    current
           DESCRIPTION
                "Contains the reason why a CM's certificate is deemed
           valid or invalid.
           Return unknown(0) if the CM is running BPI mode.
           ValidCmChained(1) means the certificate is valid
              because it chains to a valid certificate.
           ValidCmTrusted(2) means the certificate is valid
              because it has been provisioned (in the
              docsBpi2CmtsProvisionedCmCert table) to be trusted.
           InvalidCmUntrusted(3) means the certificate is invalid
              because it has been provisioned (in the
              docsBpi2CmtsProvisionedCmCert table) to be untrusted.
           InvalidCAUntrusted(4) means the certificate is invalid
              because it chains to an untrusted certificate.
           InvalidCmOther(5) and InvalidCAOther(6) refer to
              errors in parsing, validity periods, etc., which are
              attributable to the CM certificate or its chain,
              respectively; additional information may be found
              in docsBpi2AuthRejectErrorString for these types
              of errors."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.2."
           ::= { docsBpi2CmtsAuthEntry 19 }

      docsBpi2CmtsAuthBpkmCmCert    OBJECT-TYPE
           SYNTAX         DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION

                "The X509 CM Certificate sent as part of a BPKM
           Authorization Request.
           Note: The zero-length OCTET STRING must be returned if the
           Entire certificate is not retained in the CMTS."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2."
           ::= { docsBpi2CmtsAuthEntry 20 }

okay bestie, we're still in the MIB definitions, so grab your snacks ๐Ÿ“ this part is all about the CMTS-side objects (the CA cert pointer, the TEK table and its counters) and every single line matters ๐Ÿ’…

      docsBpi2CmtsAuthCACertIndexPtr    OBJECT-TYPE
           SYNTAX         Unsigned32 (0..4294967295)
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "A row index into docsBpi2CmtsCACertTable.
                 Returns the index in docsBpi2CmtsCACertTable to which
                 CA certificate this CM is chained to.  A value of
                 0 means it could not be found or not applicable."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2."
           ::= { docsBpi2CmtsAuthEntry 21 }

      --
      -- The CMTS TEK Table, indexed by ifIndex and SAID
      --

      docsBpi2CmtsTEKTable     OBJECT-TYPE
           SYNTAX         SEQUENCE OF    DocsBpi2CmtsTEKEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table describes the attributes of each
           Traffic Encryption Key (TEK) association.  The CMTS
           Maintains one TEK association per SAID on each CMTS MAC
           interface."
           ::= { docsBpi2CmtsObjects 3 }

      docsBpi2CmtsTEKEntry     OBJECT-TYPE
           SYNTAX         DocsBpi2CmtsTEKEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains objects describing attributes of
           one TEK association on a particular CMTS MAC interface.  The
           CMTS MUST create one entry per SAID per MAC interface,
           based on the receipt of a Key Request message, and MUST not
           delete the entry before the CM authorization for the SAID
           permanently expires."
           INDEX     { ifIndex, docsBpi2CmtsTEKSAId }
           ::= { docsBpi2CmtsTEKTable 1 }

      DocsBpi2CmtsTEKEntry ::= SEQUENCE {
           docsBpi2CmtsTEKSAId                DocsSAId,
           docsBpi2CmtsTEKSAType              DocsBpkmSAType,
           docsBpi2CmtsTEKDataEncryptAlg      DocsBpkmDataEncryptAlg,
           docsBpi2CmtsTEKDataAuthentAlg      DocsBpkmDataAuthentAlg,
           docsBpi2CmtsTEKLifetime            Integer32,
           docsBpi2CmtsTEKKeySequenceNumber   Integer32,
           docsBpi2CmtsTEKExpiresOld          DateAndTime,
           docsBpi2CmtsTEKExpiresNew          DateAndTime,
           docsBpi2CmtsTEKReset               TruthValue,
           docsBpi2CmtsKeyRequests            Counter32,
           docsBpi2CmtsKeyReplies             Counter32,
           docsBpi2CmtsKeyRejects             Counter32,
           docsBpi2CmtsTEKInvalids            Counter32,
           docsBpi2CmtsKeyRejectErrorCode     INTEGER,
           docsBpi2CmtsKeyRejectErrorString   SnmpAdminString,
           docsBpi2CmtsTEKInvalidErrorCode    INTEGER,
           docsBpi2CmtsTEKInvalidErrorString  SnmpAdminString
      }

      docsBpi2CmtsTEKSAId OBJECT-TYPE
           SYNTAX         DocsSAId
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The value of this object is the DOCSIS Security
           Association ID (SAID)."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.12."
           ::= { docsBpi2CmtsTEKEntry 1 }

      docsBpi2CmtsTEKSAType    OBJECT-TYPE
           SYNTAX         DocsBpkmSAType
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the type of security
           association.  'dynamic' does not apply to CMs running in
           BPI mode.  Unicast BPI TEKs must utilize the 'primary'
           encoding, and multicast BPI TEKs must utilize the 'static'
           encoding."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,

           Section 2.1.3."
           ::= { docsBpi2CmtsTEKEntry 2 }

      docsBpi2CmtsTEKDataEncryptAlg OBJECT-TYPE
           SYNTAX    DocsBpkmDataEncryptAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the data encryption
           algorithm for this SAID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmtsTEKEntry 3 }

      docsBpi2CmtsTEKDataAuthentAlg OBJECT-TYPE
           SYNTAX    DocsBpkmDataAuthentAlg
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the data authentication
           algorithm for this SAID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           ::= { docsBpi2CmtsTEKEntry 4 }

      docsBpi2CmtsTEKLifetime  OBJECT-TYPE
           SYNTAX         Integer32 (1..604800)
           UNITS          "seconds"
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "The value of this object is the lifetime, in
           seconds, that the CMTS assigns to keys for this TEK
           association."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.5 and Appendix A.2."
           ::= { docsBpi2CmtsTEKEntry 5 }


      docsBpi2CmtsTEKKeySequenceNumber   OBJECT-TYPE
           SYNTAX              Integer32 (0..15)
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the most recent TEK

           key sequence number for this SAID."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.2.10 and 4.2.2.13."
           ::= { docsBpi2CmtsTEKEntry 6 }

      docsBpi2CmtsTEKExpiresOld     OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the actual clock time
           for expiration of the immediate predecessor of the most
           recent TEK for this FSM.  If this FSM has only one TEK, then
           the value is the time of activation of this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.5 and 4.2.2.9."
           ::= { docsBpi2CmtsTEKEntry 7 }

      docsBpi2CmtsTEKExpiresNew     OBJECT-TYPE
           SYNTAX         DateAndTime
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the actual clock time
           for expiration of the most recent TEK for this FSM."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.5 and 4.2.2.9."
           ::= { docsBpi2CmtsTEKEntry 8 }

      docsBpi2CmtsTEKReset     OBJECT-TYPE
           SYNTAX         TruthValue
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
                "Setting this object to 'true' causes the CMTS to
           invalidate all currently active TEKs and to generate new
           TEKs for the associated SAID; the CMTS MAY also generate
           unsolicited TEK Invalid messages, to optimize the TEK
           synchronization between the CMTS and the CM(s).  Reading
           this object always returns FALSE."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.1.3.3.5."
           ::= { docsBpi2CmtsTEKEntry 9 }

      docsBpi2CmtsKeyRequests  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received a Key Request message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.4."
           ::= { docsBpi2CmtsTEKEntry 10 }

      docsBpi2CmtsKeyReplies   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted a Key Reply message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.5."
           ::= { docsBpi2CmtsTEKEntry 11 }

      docsBpi2CmtsKeyRejects   OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted a Key Reject message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.6."
           ::= { docsBpi2CmtsTEKEntry 12 }

      docsBpi2CmtsTEKInvalids  OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted a TEK Invalid message.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.8."
           ::= { docsBpi2CmtsTEKEntry 13 }

      docsBpi2CmtsKeyRejectErrorCode     OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  unauthorizedSaid(4)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent Key Reject
           message sent in response to a Key Request for this SAID.
           This has the value unknown(2) if the last Error-Code value
           was 0 and none(1) if no Key Reject message has been
           received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.6 and 4.2.2.15."
           ::= { docsBpi2CmtsTEKEntry 14 }

      docsBpi2CmtsKeyRejectErrorString   OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in
           the most recent Key Reject message sent in response to a
           Key Request for this SAID.  This is a zero length string if
           no Key Reject message has been received since
           registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.6 and 4.2.2.6."
           ::= { docsBpi2CmtsTEKEntry 15 }

      docsBpi2CmtsTEKInvalidErrorCode    OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  invalidKeySequence(6)
                                  }
           MAX-ACCESS          read-only
           STATUS              current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent TEK
           Invalid message sent in association with this SAID.  This
           has the value unknown(2) if the last Error-Code value was 0
           and none(1) if no TEK Invalid message has been received
           since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.8 and 4.2.2.15."
           ::= { docsBpi2CmtsTEKEntry 16 }

      docsBpi2CmtsTEKInvalidErrorString  OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in
           the most recent TEK Invalid message sent in association
           with this SAID.  This is a zero length string if no TEK
           Invalid message has been received since registration."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.8 and 4.2.2.6."
           ::= { docsBpi2CmtsTEKEntry 17 }

Okay so that wraps up the TEK error stuff ๐Ÿ’… The error code tells you the enumerated description of the most recent TEK Invalid message for that SAID, and the error string is the text from that same message. If nothing's been received since registration, the code is none(1) and the string is zero length. Lowkey iconic that they just keep track of it all for you ๐Ÿซถ


      --
      -- The CMTS Multicast Objects Group
      --

      docsBpi2CmtsMulticastObjects OBJECT IDENTIFIER
           ::= { docsBpi2CmtsObjects 4 }

      --
      -- The CMTS IP Multicast Mapping Table, indexed by
      -- docsBpi2CmtsIpMulticastIndex, and by ifIndex
      --
      docsBpi2CmtsIpMulticastMapTable         OBJECT-TYPE
           SYNTAX         SEQUENCE OF DocsBpi2CmtsIpMulticastMapEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table maps multicast IP addresses to SAIDs.
           If a multicast IP address is mapped by multiple rows
           in the table, the row with the lowest
           docsBpi2CmtsIpMulticastIndex must be utilized for the
           mapping."
           ::= { docsBpi2CmtsMulticastObjects 1 }

      docsBpi2CmtsIpMulticastMapEntry         OBJECT-TYPE
           SYNTAX         DocsBpi2CmtsIpMulticastMapEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains objects describing the mapping of
           a set of multicast IP address and the mask to one SAID
           associated to a CMTS MAC Interface, as well as associated
           message counters and error information."
           INDEX     { ifIndex, docsBpi2CmtsIpMulticastIndex }
           ::= { docsBpi2CmtsIpMulticastMapTable 1 }

Now we're in the multicast era ๐Ÿฆ‹ The mapping table is indexed by ifIndex and docsBpi2CmtsIpMulticastIndex, and when a multicast IP address matches more than one row, the row with the lowest index is the one that gets used. Main character energy, the lowest index wins ๐Ÿ‘‘

      DocsBpi2CmtsIpMulticastMapEntry ::= SEQUENCE {
           docsBpi2CmtsIpMulticastIndex            Unsigned32,
           docsBpi2CmtsIpMulticastAddressType      InetAddressType,
           docsBpi2CmtsIpMulticastAddress          InetAddress,
           docsBpi2CmtsIpMulticastMask             InetAddress,
           docsBpi2CmtsIpMulticastSAId             DocsSAIdOrZero,
           docsBpi2CmtsIpMulticastSAType           DocsBpkmSAType,
           docsBpi2CmtsIpMulticastDataEncryptAlg
                                           DocsBpkmDataEncryptAlg,
           docsBpi2CmtsIpMulticastDataAuthentAlg
                                           DocsBpkmDataAuthentAlg,
           docsBpi2CmtsIpMulticastSAMapRequests    Counter32,
           docsBpi2CmtsIpMulticastSAMapReplies     Counter32,
           docsBpi2CmtsIpMulticastSAMapRejects     Counter32,
           docsBpi2CmtsIpMulticastSAMapRejectErrorCode
                                                      INTEGER,
           docsBpi2CmtsIpMulticastSAMapRejectErrorString
                                                      SnmpAdminString,
           docsBpi2CmtsIpMulticastMapControl          RowStatus,
           docsBpi2CmtsIpMulticastMapStorageType      StorageType
           }

      docsBpi2CmtsIpMulticastIndex       OBJECT-TYPE
           SYNTAX         Unsigned32 (1..4294967295)
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The index of this row.  Conceptual rows having the
           value 'permanent' need not allow write-access to any
           columnar objects in the row."
           ::= { docsBpi2CmtsIpMulticastMapEntry 1 }

      docsBpi2CmtsIpMulticastAddressType OBJECT-TYPE
           SYNTAX         InetAddressType
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The type of Internet address for
           docsBpi2CmtsIpMulticastAddress
           and docsBpi2CmtsIpMulticastMask."
           DEFVAL { ipv4 }
           ::= { docsBpi2CmtsIpMulticastMapEntry 2 }

      docsBpi2CmtsIpMulticastAddress          OBJECT-TYPE
           SYNTAX         InetAddress
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "This object represents the IP multicast address
           to be mapped, in conjunction with
           docsBpi2CmtsIpMulticastMask.  The type of this address is
           determined by the value of the object
           docsBpi2CmtsIpMulticastAddressType."
           ::= { docsBpi2CmtsIpMulticastMapEntry 3 }

      docsBpi2CmtsIpMulticastMask        OBJECT-TYPE
           SYNTAX         InetAddress
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "This object represents the IP multicast address mask
           for this row.
           An IP multicast address matches this row if the logical
           AND of the address with docsBpi2CmtsIpMulticastMask is
           identical to the logical AND of
           docsBpi2CmtsIpMulticastAddr with
           docsBpi2CmtsIpMulticastMask.  The type of this address is
           determined by the value of the object
           docsBpi2CmtsIpMulticastAddressType.
           Note: For IPv6, this object need not represent a
           contiguous netmask; e.g., to associate a SAID to a
           multicast group matching 'any' multicast scope.  The TC
           InetAddressPrefixLength is not used, as it only
           represents contiguous netmask."
           ::= { docsBpi2CmtsIpMulticastMapEntry 4 }

      docsBpi2CmtsIpMulticastSAId        OBJECT-TYPE
           SYNTAX         DocsSAIdOrZero
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "This object represents the multicast SAID to be
           used in this IP multicast address mapping entry."
           ::= { docsBpi2CmtsIpMulticastMapEntry 5 }

Okay the row columns are giving full row-builder vibes ๐Ÿงš The address and mask pair decides which multicast addresses a row matches, and the mask can be non-contiguous for IPv6 (so you can grab an "any" multicast scope ๐ŸŒˆ). The SAID column is the multicast SAID that gets used for that mapping.

      docsBpi2CmtsIpMulticastSAType OBJECT-TYPE
           SYNTAX         DocsBpkmSAType
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The value of this object is the type of security
           association.  'dynamic' does not apply to CMs running in
           BPI mode.  Unicast BPI TEKs must utilize the 'primary'
           encoding, and multicast BPI TEKs must utilize the 'static'
           encoding.  By default, SNMP created entries set this object
           to 'static' if not set at row creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 2.1.3."
           ::= { docsBpi2CmtsIpMulticastMapEntry 6 }

      docsBpi2CmtsIpMulticastDataEncryptAlg   OBJECT-TYPE
           SYNTAX    DocsBpkmDataEncryptAlg
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The value of this object is the data encryption
           algorithm for this IP."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           DEFVAL { des56CbcMode }
           ::= { docsBpi2CmtsIpMulticastMapEntry 7 }

      docsBpi2CmtsIpMulticastDataAuthentAlg   OBJECT-TYPE
           SYNTAX    DocsBpkmDataAuthentAlg
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The value of this object is the data authentication

           algorithm for this IP."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.2.20."
           DEFVAL { none }
           ::= { docsBpi2CmtsIpMulticastMapEntry 8 }

The SA type is where the encoding rules live ๐Ÿ” Unicast BPI TEKs use the 'primary' encoding, multicast BPI TEKs use 'static', and 'dynamic' doesn't apply to CMs in BPI mode. Encryption defaults to des56CbcMode and authentication defaults to none, which is giving very retro vibes ๐Ÿ’€

      docsBpi2CmtsIpMulticastSAMapRequests    OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has received an SA Map Request message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.10."
           ::= { docsBpi2CmtsIpMulticastMapEntry 9 }

      docsBpi2CmtsIpMulticastSAMapReplies     OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an SA Map Reply message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.11."
           ::= { docsBpi2CmtsIpMulticastMapEntry 10 }

      docsBpi2CmtsIpMulticastSAMapRejects     OBJECT-TYPE
           SYNTAX         Counter32
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the number of times the
           CMTS has transmitted an SA Map Reject message for this IP.
           Discontinuities in the value of this counter can occur at
           re-initialization of the management system, and at other
           times as indicated by the value of
           ifCounterDiscontinuityTime."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 4.2.1.12."
           ::= { docsBpi2CmtsIpMulticastMapEntry 11 }

Last but not least, the counters ๐Ÿ“Š Requests, replies, and rejects are all Counter32s that count what the CMTS sent or received for each IP, and they can reset at re-initialization or whenever ifCounterDiscontinuityTime says so. Periodt, that's the tea ๐Ÿ“

okay so the IP multicast SA map section is where the CMTS keeps receipts ๐Ÿงพโœจ Every multicast SA map entry gets its own reject error code and reject text, so you can see exactly why a request got turned down. Then we get the authorization table, which is indexed by ifIndex, multicast SAID, and CM MAC address ๐Ÿ”ฅ, and the CMTS cert objects, which are giving full trust-management main character energy ๐Ÿ‘‘

      docsBpi2CmtsIpMulticastSAMapRejectErrorCode  OBJECT-TYPE
           SYNTAX         INTEGER {
                                  none(1),
                                  unknown(2),
                                  noAuthForRequestedDSFlow(9),
                                  dsFlowNotMappedToSA(10)
                                  }
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the enumerated
           description of the Error-Code in the most recent SA Map
           Reject message sent in response to an SA Map Request for
           this IP.  It has the value unknown(2) if the last Error-Code
           Value was 0 and none(1) if no SA MAP Reject message has
           been received since entry creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.12 and 4.2.2.15."
           ::= { docsBpi2CmtsIpMulticastMapEntry 12 }

      docsBpi2CmtsIpMulticastSAMapRejectErrorString     OBJECT-TYPE
           SYNTAX         SnmpAdminString (SIZE (0..128))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The value of this object is the text string in
           the most recent SA Map Reject message sent in response to
           an SA Map Request for this IP.  It is a zero length string
           if no SA Map Reject message has been received since entry
           creation."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections 4.2.1.12 and 4.2.2.6."
           ::= { docsBpi2CmtsIpMulticastMapEntry 13 }

      docsBpi2CmtsIpMulticastMapControl  OBJECT-TYPE
           SYNTAX         RowStatus
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION

                "This object controls and reflects the IP multicast
           address mapping entry.  There is no restriction on the
           ability to change values in this row while the row is
           active.
           A created row can be set to active only after the
           Corresponding instances of docsBpi2CmtsIpMulticastAddress,
           docsBpi2CmtsIpMulticastMask, docsBpi2CmtsIpMulticastSAId,
           and docsBpi2CmtsIpMulticastSAType have all been set."
           ::= { docsBpi2CmtsIpMulticastMapEntry 14 }

      docsBpi2CmtsIpMulticastMapStorageType     OBJECT-TYPE
           SYNTAX         StorageType
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The storage type for this conceptual row.
           Conceptual rows having the value 'permanent' need not allow
           write-access to any columnar objects in the row."
           ::= { docsBpi2CmtsIpMulticastMapEntry 15 }

      --
      -- The CMTS Multicast SAID Authorization Table,
      -- indexed by ifIndex by
      -- multicast SAID by CM MAC address
      --

      docsBpi2CmtsMulticastAuthTable          OBJECT-TYPE
           SYNTAX         SEQUENCE OF DocsBpi2CmtsMulticastAuthEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This table describes the multicast SAID
           authorization for each CM on each CMTS MAC interface."
           ::= { docsBpi2CmtsMulticastObjects 2 }

      docsBpi2CmtsMulticastAuthEntry          OBJECT-TYPE
           SYNTAX         DocsBpi2CmtsMulticastAuthEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "Each entry contains objects describing the key
           authorization of one cable modem for one multicast SAID
           for one CMTS MAC interface.
           Row entries persist after re-initialization of
           the managed system."
           INDEX     { ifIndex, docsBpi2CmtsMulticastAuthSAId,
                  docsBpi2CmtsMulticastAuthCmMacAddress }
           ::= { docsBpi2CmtsMulticastAuthTable 1 }

      DocsBpi2CmtsMulticastAuthEntry ::= SEQUENCE
           {
           docsBpi2CmtsMulticastAuthSAId                DocsSAId,
           docsBpi2CmtsMulticastAuthCmMacAddress        MacAddress,
           docsBpi2CmtsMulticastAuthControl             RowStatus
           }

      docsBpi2CmtsMulticastAuthSAId OBJECT-TYPE
           SYNTAX         DocsSAId
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This object represents the multicast SAID for
           authorization."
           ::= { docsBpi2CmtsMulticastAuthEntry 1 }

      docsBpi2CmtsMulticastAuthCmMacAddress   OBJECT-TYPE
           SYNTAX         MacAddress
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "This object represents the MAC address of the CM
           to which the multicast SAID authorization applies."
           ::= { docsBpi2CmtsMulticastAuthEntry 2 }

      docsBpi2CmtsMulticastAuthControl   OBJECT-TYPE
           SYNTAX         RowStatus
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The status of this conceptual row for the
           authorization of multicast SAIDs to CMs."
           ::= { docsBpi2CmtsMulticastAuthEntry 3 }

      --
      -- CMTS Cert Objects
      --

      docsBpi2CmtsCertObjects OBJECT IDENTIFIER
           ::= { docsBpi2CmtsObjects 5 }

      --
      -- CMTS Provisioned CM Cert Table
      --

      docsBpi2CmtsProvisionedCmCertTable OBJECT-TYPE
           SYNTAX         SEQUENCE OF
                           DocsBpi2CmtsProvisionedCmCertEntry

           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "A table of CM certificate trust entries provisioned
           to the CMTS.  The trust object for a certificate in this
           table has an overriding effect on the validity object of a
           certificate in the authorization table, as long as the
           entire contents of the two certificates are identical."
           ::= { docsBpi2CmtsCertObjects 1 }

      docsBpi2CmtsProvisionedCmCertEntry OBJECT-TYPE
           SYNTAX         DocsBpi2CmtsProvisionedCmCertEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "An entry in the CMTS's provisioned CM certificate
           table.  Row entries persist after re-initialization of
           the managed system."
           REFERENCE
                "Data-Over-Cable Service Interface Specifications:
           Operations Support System Interface Specification
           SP-OSSIv2.0-I05-040407, Section 6.2.14"
           INDEX { docsBpi2CmtsProvisionedCmCertMacAddress }
           ::= { docsBpi2CmtsProvisionedCmCertTable 1 }

      DocsBpi2CmtsProvisionedCmCertEntry ::= SEQUENCE
           {
           docsBpi2CmtsProvisionedCmCertMacAddress MacAddress,
           docsBpi2CmtsProvisionedCmCertTrust      INTEGER,
           docsBpi2CmtsProvisionedCmCertSource     INTEGER,
           docsBpi2CmtsProvisionedCmCertStatus     RowStatus,
           docsBpi2CmtsProvisionedCmCert
                                     DocsX509ASN1DEREncodedCertificate
           }

      docsBpi2CmtsProvisionedCmCertMacAddress OBJECT-TYPE
           SYNTAX         MacAddress
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The index of this row."
           ::= { docsBpi2CmtsProvisionedCmCertEntry 1 }

      docsBpi2CmtsProvisionedCmCertTrust      OBJECT-TYPE
           SYNTAX    INTEGER {
                             trusted(1),
                             untrusted(2)
                             }

           MAX-ACCESS     read-create
           STATUS    current
           DESCRIPTION
                "Trust state for the provisioned CM certificate entry.
           Note: Setting this object need only override the validity
           of CM certificates sent in future authorization requests;
           instantaneous effect need not occur."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.1."
           DEFVAL { untrusted }
           ::= { docsBpi2CmtsProvisionedCmCertEntry 2 }

      docsBpi2CmtsProvisionedCmCertSource     OBJECT-TYPE
           SYNTAX    INTEGER {
                             snmp(1),
                             configurationFile(2),
                             externalDatabase(3),
                             other(4)
                             }
           MAX-ACCESS read-only
           STATUS  current
           DESCRIPTION
                "This object indicates how the certificate reached the
           CMTS.  Other(4) means that it originated from a source not
           identified above."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.1."
           ::= { docsBpi2CmtsProvisionedCmCertEntry 3 }

      docsBpi2CmtsProvisionedCmCertStatus OBJECT-TYPE
           SYNTAX  RowStatus
           MAX-ACCESS read-create
           STATUS  current
           DESCRIPTION
                "The status of this conceptual row.  Values in this row
           cannot be changed while the row is 'active'."
           ::= { docsBpi2CmtsProvisionedCmCertEntry 4 }

      docsBpi2CmtsProvisionedCmCert OBJECT-TYPE
           SYNTAX         DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "An X509 DER-encoded Certificate Authority
           certificate.
           Note: The zero-length OCTET STRING must be returned, on
           reads, if the entire certificate is not retained in the
           CMTS."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2."
           ::= { docsBpi2CmtsProvisionedCmCertEntry 5 }

      --
      -- CMTS CA Cert Table
      --

      docsBpi2CmtsCACertTable OBJECT-TYPE
           SYNTAX         SEQUENCE OF DocsBpi2CmtsCACertEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The table of known Certificate Authority certificates
           acquired by this device."
           ::= { docsBpi2CmtsCertObjects 2 }

      docsBpi2CmtsCACertEntry OBJECT-TYPE
           SYNTAX         DocsBpi2CmtsCACertEntry
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "A row in the Certificate Authority certificate
           table.  Row entries with the trust status 'trusted',
           'untrusted', or 'root' persist after re-initialization
            of the managed system."
           REFERENCE
                "Data-Over-Cable Service Interface Specifications:
           Operations Support System Interface Specification
           SP-OSSIv2.0-I05-040407, Section 6.2.14"
           INDEX   { docsBpi2CmtsCACertIndex }
           ::= {docsBpi2CmtsCACertTable 1 }

Okay bestie, we're picking up right where the last part left off, and this is where the CA certificate table gets really good ๐Ÿ”โœจ

      DocsBpi2CmtsCACertEntry ::= SEQUENCE {
           docsBpi2CmtsCACertIndex            Unsigned32,
           docsBpi2CmtsCACertSubject          SnmpAdminString,
           docsBpi2CmtsCACertIssuer           SnmpAdminString,
           docsBpi2CmtsCACertSerialNumber     OCTET STRING,
           docsBpi2CmtsCACertTrust            INTEGER,
           docsBpi2CmtsCACertSource           INTEGER,
           docsBpi2CmtsCACertStatus           RowStatus,
           docsBpi2CmtsCACert
                                 DocsX509ASN1DEREncodedCertificate,
           docsBpi2CmtsCACertThumbprint       OCTET STRING
      }
      docsBpi2CmtsCACertIndex OBJECT-TYPE
           SYNTAX         Unsigned32 (1.. 4294967295)
           MAX-ACCESS     not-accessible
           STATUS         current
           DESCRIPTION
                "The index for this row."
           ::= { docsBpi2CmtsCACertEntry 1 }

      docsBpi2CmtsCACertSubject OBJECT-TYPE
           SYNTAX         SnmpAdminString
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The subject name exactly as it is encoded in the
           X509 certificate.
           The organizationName portion of the certificate's subject
           name must be present.  All other fields are optional.  Any
           optional field present must be prepended with <CR>
           (carriage return, U+000D) <LF> (line feed, U+000A).
           Ordering of fields present must conform to the following:

           organizationName <CR> <LF>
           countryName <CR> <LF>
           stateOrProvinceName <CR> <LF>
           localityName <CR> <LF>
           organizationalUnitName <CR> <LF>
           organizationalUnitName=<Manufacturing Location> <CR> <LF>
           commonName"
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2.4"
           ::= { docsBpi2CmtsCACertEntry 2 }

      docsBpi2CmtsCACertIssuer OBJECT-TYPE
           SYNTAX         SnmpAdminString
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The issuer name exactly as it is encoded in the
           X509 certificate.
           The commonName portion of the certificate's issuer
           name must be present.  All other fields are optional.  Any
           optional field present must be prepended with <CR>
           (carriage return, U+000D) <LF> (line feed, U+000A).
           Ordering of fields present must conform to the following:

           CommonName <CR><LF>
           countryName <CR><LF>
           stateOrProvinceName <CR><LF>
           localityName <CR><LF>
           organizationName <CR><LF>
           organizationalUnitName <CR><LF>
           organizationalUnitName=<Manufacturing Location>"
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2.4"
           ::= { docsBpi2CmtsCACertEntry 3 }

      docsBpi2CmtsCACertSerialNumber OBJECT-TYPE
           SYNTAX         OCTET STRING (SIZE (1..32))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "This CA certificate's serial number, represented as
           an octet string."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.2.2"
           ::= { docsBpi2CmtsCACertEntry 4 }

Okay so the subject and issuer objects are giving layers ๐Ÿ’…๐ŸŽ€ The subject name is basically the certificate's own ID card, and it has to start with the organizationName, while the issuer has to start with the commonName instead. Every optional field gets its own little <CR> <LF> line-break moment, and the order is locked in, no freestyling ๐Ÿ™ˆ

      docsBpi2CmtsCACertTrust OBJECT-TYPE
           SYNTAX    INTEGER {
                             trusted (1),
                             untrusted (2),
                             chained (3),
                             root (4)
                             }
           MAX-ACCESS     read-create
           STATUS    current
           DESCRIPTION
                "This object controls the trust status of this
           certificate.  Root certificates must be given root(4)
           trust; manufacturer certificates must not be given root(4)
           trust.  Trust on root certificates must not change.
           Note: Setting this object need only affect the validity of
           CM certificates sent in future authorization requests;
           instantaneous effect need not occur."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.1"
           DEFVAL { chained }
           ::= { docsBpi2CmtsCACertEntry 5 }

      docsBpi2CmtsCACertSource OBJECT-TYPE
           SYNTAX    INTEGER {
                     snmp (1),
                     configurationFile (2),
                     externalDatabase (3),
                     other (4),
                     authentInfo (5),
                     compiledIntoCode (6)
                     }
           MAX-ACCESS     read-only
           STATUS    current
           DESCRIPTION
                "This object indicates how the certificate reached
           the CMTS.  Other(4) means that it originated from a source
           not identified above."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.1"
           ::= { docsBpi2CmtsCACertEntry 6 }

Now the trust knob is the main character here ๐Ÿ‘‘ It's read-create, so you can actually change it, and the default is chained. The source object just tells you how the certificate got to the CMTS, with other(4) as the catch-all for anything not listed. Iconic behavior ๐Ÿ’œ

      docsBpi2CmtsCACertStatus OBJECT-TYPE
           SYNTAX         RowStatus
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "The status of this conceptual row.  An attempt
           to set writable columnar values while this row is active
           behaves as follows:
           - Sets to the object docsBpi2CmtsCACertTrust are allowed.
           - Sets to the object docsBpi2CmtsCACert will return an
             error of 'inconsistentValue'.
           A newly created entry cannot be set to active until the
           value of docsBpi2CmtsCACert is being set."
           ::= { docsBpi2CmtsCACertEntry 7 }

      docsBpi2CmtsCACert  OBJECT-TYPE
           SYNTAX         DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS     read-create
           STATUS         current
           DESCRIPTION
                "An X509 DER-encoded Certificate Authority
           certificate.
           To help identify certificates, either this object or
           docsBpi2CmtsCACertThumbprint must be returned by a CMTS for
           self-signed CA certificates.

           Note: The zero-length OCTET STRING must be returned, on
           reads, if the entire certificate is not retained in the
           CMTS."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,

           Section 9.2."
           ::= { docsBpi2CmtsCACertEntry 8 }

      docsBpi2CmtsCACertThumbprint OBJECT-TYPE
           SYNTAX         OCTET STRING (SIZE (20))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
                "The SHA-1 hash of a CA certificate.
           To help identify certificates, either this object or
           docsBpi2CmtsCACert must be returned by a CMTS for
           self-signed CA certificates.

           Note: The zero-length OCTET STRING must be returned, on
           reads, if the CA certificate thumb print is not retained
           in the CMTS."
           REFERENCE
                "DOCSIS Baseline Privacy Plus Interface Specification,
           Section 9.4.3"
           ::= { docsBpi2CmtsCACertEntry 9 }

The status column is basically the gatekeeper of the row ๐Ÿšฆ You can tweak the trust value while the row is active, but poking the certificate itself gives you an inconsistentValue error, and a brand-new row can't go active until that certificate is set. The certificate and thumbprint are the two ways to identify a self-signed CA, and both can come back as zero-length strings if the CMTS didn't keep the full thing. Lowkey a whole mood ๐ŸŒธ

      --
      -- Authenticated Software Download Objects
      --

      --
      -- Note: the authenticated software download objects are a
      -- CM requirement only.
      --

      docsBpi2CodeDownloadControl OBJECT IDENTIFIER
           ::= { docsBpi2MIBObjects 4 }

      docsBpi2CodeDownloadStatusCode     OBJECT-TYPE
           SYNTAX    INTEGER {
                             configFileCvcVerified (1),
                             configFileCvcRejected (2),
                             snmpCvcVerified (3),
                             snmpCvcRejected (4),
                             codeFileVerified (5),
                             codeFileRejected (6),
                             other (7)
                             }
           MAX-ACCESS     read-only
           STATUS    current
           DESCRIPTION
               "The value indicates the result of the latest config
           file CVC verification, SNMP CVC verification, or code file
           verification."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Sections D.3.3.2 and D.3.5.1."
           ::= { docsBpi2CodeDownloadControl 1 }

      docsBpi2CodeDownloadStatusString   OBJECT-TYPE
           SYNTAX         SnmpAdminString
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object indicates the additional
           information to the status code.  The value will include
           the error code and error description, which will be defined
           separately."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.7"
           ::= { docsBpi2CodeDownloadControl 2 }

      docsBpi2CodeMfgOrgName   OBJECT-TYPE
           SYNTAX         SnmpAdminString
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the device manufacturer's
           organizationName."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 3 }

      docsBpi2CodeMfgCodeAccessStart     OBJECT-TYPE
           SYNTAX         DateAndTime  (SIZE(11))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the device manufacturer's
           current codeAccessStart value.  This value will always
           refer to Greenwich Mean Time (GMT), and the value
           format must contain TimeZone information (fields 8-10)."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 4 }

      docsBpi2CodeMfgCvcAccessStart OBJECT-TYPE
           SYNTAX         DateAndTime (SIZE(11))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the device manufacturer's
           current cvcAccessStart value.  This value will always
           refer to Greenwich Mean Time (GMT), and the value
           format must contain TimeZone information (fields 8-10)."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 5 }

      docsBpi2CodeCoSignerOrgName   OBJECT-TYPE
           SYNTAX         SnmpAdminString
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the co-signer's
           organizationName.  The value is a zero length string if
           the co-signer is not specified."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 6 }

Last stop for this part: the authenticated software download objects ๐Ÿงš The note says they're a CM-only requirement, so this is the cable modem's territory. The code download control group has six objects covering the status codes, the manufacturer's org name and access start times, and the co-signer's org name. Everything is GMT, and the date fields have to carry their timezone info too ๐ŸŒˆ๐Ÿ’…

Okay so bestie, this is where the co-signer objects and the code-download controls start getting real ๐Ÿ”โœจ

      docsBpi2CodeCoSignerCodeAccessStart     OBJECT-TYPE
           SYNTAX         DateAndTime (SIZE(11))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the co-signer's current
           codeAccessStart value.  This value will always refer to
           Greenwich Mean Time (GMT), and the value format must contain
           TimeZone information (fields 8-10).
           If docsBpi2CodeCoSignerOrgName is a zero
           length string, the value of this object is meaningless."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 7 }

      docsBpi2CodeCoSignerCvcAccessStart OBJECT-TYPE
           SYNTAX         DateAndTime (SIZE(11))
           MAX-ACCESS     read-only
           STATUS         current
           DESCRIPTION
               "The value of this object is the co-signer's current
           cvcAccessStart value.  This value will always refer to
           Greenwich Mean Time (GMT), and the value format must contain
           TimeZone information (fields 8-10).
           If docsBpi2CodeCoSignerOrgName is a zero
           length string, the value of this object is meaningless."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.2.2."
           ::= { docsBpi2CodeDownloadControl 8 }

      docsBpi2CodeCvcUpdate    OBJECT-TYPE
           SYNTAX         DocsX509ASN1DEREncodedCertificate
           MAX-ACCESS     read-write
           STATUS         current
           DESCRIPTION
               "Setting a CVC to this object triggers the device
           to verify the CVC and update the cvcAccessStart values.
           The content of this object is then discarded.
           If the device is not enabled to upgrade codefiles, or if
           the CVC verification fails, the CVC will be rejected.
           Reading this object always returns the zero-length OCTET
           STRING."
           REFERENCE
               "DOCSIS Baseline Privacy Plus Interface Specification,
           Section D.3.3.2.2."
           ::= { docsBpi2CodeDownloadControl 9 }

Next up are the conformance statements ๐ŸŽ€ Think of these as the "what counts as a valid implementation" checklists. The first one is for cable modems (CMs) that do BPI+ ๐Ÿ’…

      --
      -- The BPI+ MIB Conformance Statements (with a placeholder for
      -- notifications)
      --

      docsBpi2Notification     OBJECT IDENTIFIER
           ::= { docsBpi2MIB 0 }
      docsBpi2Conformance OBJECT IDENTIFIER
           ::= { docsBpi2MIB 2 }
      docsBpi2Compliances OBJECT IDENTIFIER
           ::= { docsBpi2Conformance 1 }
      docsBpi2Groups      OBJECT IDENTIFIER
           ::= { docsBpi2Conformance 2 }


      docsBpi2CmCompliance MODULE-COMPLIANCE
           STATUS         current
           DESCRIPTION
                "This is the compliance statement for CMs that
           implement the DOCSIS Baseline Privacy Interface Plus."

           MODULE  -- docsBpi2MIB
           -- unconditionally mandatory group
           MANDATORY-GROUPS {
                  docsBpi2CmGroup,
                  docsBpi2CodeDownloadGroup
           }

      -- constrain on Encryption algorithms
      OBJECT docsBpi2CmTEKDataEncryptAlg
           SYNTAX    DocsBpkmDataEncryptAlg {
                                  none(0),
                                  des56CbcMode(1),
                                  des40CbcMode(2)
                     }
           DESCRIPTION
                "It is compliant to support des56CbcMode(1) and
           des40CbcMode(2) for data encryption algorithms."

      -- constrain on Integrity algorithms
      OBJECT docsBpi2CmTEKDataAuthentAlg
           SYNTAX    DocsBpkmDataAuthentAlg {
                                  none(0)
                     }
           DESCRIPTION
                "It is compliant to not support data message
           authentication algorithms."

      -- constrain on IP addressing
      OBJECT    docsBpi2CmIpMulticastAddressType
           SYNTAX InetAddressType { ipv4(1) }
           DESCRIPTION
                "An implementation is only required to support IPv4
           addresses.  Support for other address types may be defined
           in future versions of this MIB module."

      -- constrain on IP addressing
      OBJECT    docsBpi2CmIpMulticastAddress
           SYNTAX  InetAddress (SIZE(4))
           DESCRIPTION
                "An implementation is only required to support IPv4
           addresses Other address types support may be defined
           in future versions of this MIB module."

      -- constrain on Encryption algorithms
      OBJECT docsBpi2CmCryptoSuiteDataEncryptAlg
           SYNTAX    DocsBpkmDataEncryptAlg {
                                  none(0),
                                  des56CbcMode(1),
                                  des40CbcMode(2)

                     }
           DESCRIPTION
                "It is compliant to only support des56CbcMode(1)
           and des40CbcMode(2) for data encryption algorithms."

      -- constrain on Integrity algorithms
      OBJECT docsBpi2CmCryptoSuiteDataAuthentAlg
           SYNTAX    DocsBpkmDataAuthentAlg {
                                  none(0)
                     }
           DESCRIPTION
                "It is compliant to not support data message
           authentication algorithms."

      ::= { docsBpi2Compliances 1 }

Now the CMTS side ๐ŸŒธ This one has a bunch of "constrain on" notes, where the ranges and algorithm lists get narrowed down for CMTSes specifically ๐Ÿงš

      docsBpi2CmtsCompliance MODULE-COMPLIANCE
           STATUS         current
           DESCRIPTION
                "This is the compliance statement for CMTSs that
           implement the DOCSIS Baseline Privacy Interface Plus."

           MODULE  -- docsBpi2MIB
           -- unconditionally mandatory group
           MANDATORY-GROUPS {
                  docsBpi2CmtsGroup
           }

      -- unconditionally optional group
      GROUP     docsBpi2CodeDownloadGroup
           DESCRIPTION
                "This group is optional for CMTSes.  The implementation
           decision of this group is left to the vendor"

      -- constrain on mandatory range

      OBJECT    docsBpi2CmtsDefaultAuthLifetime
           SYNTAX    Integer32 (86400..6048000)
           DESCRIPTION
                "The refined range corresponds to the minimum and
           maximum values in operational networks."

      -- constrain on mandatory range

      OBJECT    docsBpi2CmtsDefaultTEKLifetime
           SYNTAX    Integer32 (1800..604800)
           DESCRIPTION

               "The refined range corresponds to the minimum and
           maximum values in operational networks."

      -- constrain on mandatory range

      OBJECT    docsBpi2CmtsAuthCmLifetime
           SYNTAX    Integer32 (86400..6048000)
           DESCRIPTION
               "The refined range corresponds to the minimum and
           maximum values in operational networks."

      -- constrain on Encryption algorithms

   OBJECT   docsBpi2CmtsTEKDataEncryptAlg
           SYNTAX    DocsBpkmDataEncryptAlg {
                                  none(0),
                                  des56CbcMode(1),
                                  des40CbcMode(2)
                     }
           DESCRIPTION
                "It is compliant to only support des56CbcMode(1)
           and des40CbcMode(2) for data encryption."

      -- constrain on Integrity algorithms

   OBJECT docsBpi2CmtsTEKDataAuthentAlg
           SYNTAX    DocsBpkmDataAuthentAlg {
                                  none(0)
                     }
           DESCRIPTION
                "It is compliant to not support data message
           authentication algorithms."

      -- constrain on mandatory range

      OBJECT    docsBpi2CmtsTEKLifetime
           SYNTAX    Integer32 (1800..604800)
           DESCRIPTION
               "The refined range corresponds to the minimum and
           maximum values in operational networks."

      -- constrain on access
      -- constrain on IP Addressing

      OBJECT    docsBpi2CmtsIpMulticastAddressType
           SYNTAX      InetAddressType { ipv4(1) }
           MIN-ACCESS  read-only
           DESCRIPTION

               "Write access is not required.
           An implementation is only required to support IPv4
           addresses.  Support for other address types may be defined
           in future versions of this MIB module."

      OBJECT    docsBpi2CmtsIpMulticastAddress
           SYNTAX  InetAddress (SIZE(4))
           MIN-ACCESS  read-only
           DESCRIPTION
               "Write access is not required.
           An implementation is only required to support IPv4
           addresses.  Support for other address types may be defined
           in future versions of this MIB module."

      OBJECT    docsBpi2CmtsIpMulticastMask
           SYNTAX  InetAddress (SIZE(4))
           MIN-ACCESS  read-only
           DESCRIPTION
               "Write access is not required.
           An implementation is only required to support IPv4
           addresses.  Support for other address types may be defined
           in future versions of this MIB module."

      -- constrain on access

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

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

      -- constrain on access
      -- constrain on Encryption algorithms

      OBJECT    docsBpi2CmtsIpMulticastDataEncryptAlg
           SYNTAX    DocsBpkmDataEncryptAlg {
                                  none(0),
                                  des56CbcMode(1),
                                  des40CbcMode(2)
                     }
           MIN-ACCESS  read-only
           DESCRIPTION
               "Write access is not required.
           It is compliant to only support des56CbcMode(1)
           and des40CbcMode(2) for data encryption"

      -- constrain on access
      -- constrain on Integrity algorithms

      OBJECT    docsBpi2CmtsIpMulticastDataAuthentAlg
           SYNTAX    DocsBpkmDataAuthentAlg {
                                  none(0)
                     }
           MIN-ACCESS  read-only
           DESCRIPTION
               "Write access is not required.
           It is compliant to not support data message
           authentication algorithms."

      -- constrain on access

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

           ::= { docsBpi2Compliances 2 }
      docsBpi2CmGroup     OBJECT-GROUP
           OBJECTS   {
                docsBpi2CmPrivacyEnable,
                docsBpi2CmPublicKey,
                docsBpi2CmAuthState,
                docsBpi2CmAuthKeySequenceNumber,
                docsBpi2CmAuthExpiresOld,
                docsBpi2CmAuthExpiresNew,
                docsBpi2CmAuthReset,
                docsBpi2CmAuthGraceTime,
                docsBpi2CmTEKGraceTime,
                docsBpi2CmAuthWaitTimeout,
                docsBpi2CmReauthWaitTimeout,
                docsBpi2CmOpWaitTimeout,
                docsBpi2CmRekeyWaitTimeout,
                docsBpi2CmAuthRejectWaitTimeout,
                docsBpi2CmSAMapWaitTimeout,
                docsBpi2CmSAMapMaxRetries,
                docsBpi2CmAuthentInfos,
                docsBpi2CmAuthRequests,
                docsBpi2CmAuthReplies,
                docsBpi2CmAuthRejects,
                docsBpi2CmAuthInvalids,
                docsBpi2CmAuthRejectErrorCode,
                docsBpi2CmAuthRejectErrorString,
                docsBpi2CmAuthInvalidErrorCode,
                docsBpi2CmAuthInvalidErrorString,
                docsBpi2CmTEKSAType,
                docsBpi2CmTEKDataEncryptAlg,
                docsBpi2CmTEKDataAuthentAlg,
                docsBpi2CmTEKState,
                docsBpi2CmTEKKeySequenceNumber,
                docsBpi2CmTEKExpiresOld,
                docsBpi2CmTEKExpiresNew,
                docsBpi2CmTEKKeyRequests,
                docsBpi2CmTEKKeyReplies,
                docsBpi2CmTEKKeyRejects,
                docsBpi2CmTEKInvalids,
                docsBpi2CmTEKAuthPends,
                docsBpi2CmTEKKeyRejectErrorCode,
                docsBpi2CmTEKKeyRejectErrorString,
                docsBpi2CmTEKInvalidErrorCode,
                docsBpi2CmTEKInvalidErrorString,
                docsBpi2CmIpMulticastAddressType,
                docsBpi2CmIpMulticastAddress,
                docsBpi2CmIpMulticastSAId,
                docsBpi2CmIpMulticastSAMapState,
                docsBpi2CmIpMulticastSAMapRequests,
                docsBpi2CmIpMulticastSAMapReplies,
                docsBpi2CmIpMulticastSAMapRejects,
                docsBpi2CmIpMulticastSAMapRejectErrorCode,
                docsBpi2CmIpMulticastSAMapRejectErrorString,
                docsBpi2CmDeviceCmCert,
                docsBpi2CmDeviceManufCert,
                docsBpi2CmCryptoSuiteDataEncryptAlg,
                docsBpi2CmCryptoSuiteDataAuthentAlg
                }
           STATUS         current
           DESCRIPTION
                "This collection of objects provides CM BPI+ status
           and control."
      ::= { docsBpi2Groups 1 }

      docsBpi2CmtsGroup   OBJECT-GROUP
           OBJECTS {
                docsBpi2CmtsDefaultAuthLifetime,
                docsBpi2CmtsDefaultTEKLifetime,
                docsBpi2CmtsDefaultSelfSignedManufCertTrust,
                docsBpi2CmtsCheckCertValidityPeriods,
                docsBpi2CmtsAuthentInfos,
                docsBpi2CmtsAuthRequests,
                docsBpi2CmtsAuthReplies,
                docsBpi2CmtsAuthRejects,
                docsBpi2CmtsAuthInvalids,
                docsBpi2CmtsSAMapRequests,
                docsBpi2CmtsSAMapReplies,
                docsBpi2CmtsSAMapRejects,
                docsBpi2CmtsAuthCmBpiVersion,
                docsBpi2CmtsAuthCmPublicKey,
                docsBpi2CmtsAuthCmKeySequenceNumber,
                docsBpi2CmtsAuthCmExpiresOld,
                docsBpi2CmtsAuthCmExpiresNew,
                docsBpi2CmtsAuthCmLifetime,
                docsBpi2CmtsAuthCmReset,
                docsBpi2CmtsAuthCmInfos,
                docsBpi2CmtsAuthCmRequests,
                docsBpi2CmtsAuthCmReplies,
                docsBpi2CmtsAuthCmRejects,
                docsBpi2CmtsAuthCmInvalids,
                docsBpi2CmtsAuthRejectErrorCode,
                docsBpi2CmtsAuthRejectErrorString,
                docsBpi2CmtsAuthInvalidErrorCode,
                docsBpi2CmtsAuthInvalidErrorString,
                docsBpi2CmtsAuthPrimarySAId,
                docsBpi2CmtsAuthBpkmCmCertValid,
                docsBpi2CmtsAuthBpkmCmCert,
                docsBpi2CmtsAuthCACertIndexPtr,
                docsBpi2CmtsTEKSAType,
                docsBpi2CmtsTEKDataEncryptAlg,
                docsBpi2CmtsTEKDataAuthentAlg,
                docsBpi2CmtsTEKLifetime,
                docsBpi2CmtsTEKKeySequenceNumber,
                docsBpi2CmtsTEKExpiresOld,
                docsBpi2CmtsTEKExpiresNew,
                docsBpi2CmtsTEKReset,
                docsBpi2CmtsKeyRequests,
                docsBpi2CmtsKeyReplies,
                docsBpi2CmtsKeyRejects,
                docsBpi2CmtsTEKInvalids,
                docsBpi2CmtsKeyRejectErrorCode,
                docsBpi2CmtsKeyRejectErrorString,
                docsBpi2CmtsTEKInvalidErrorCode,
                docsBpi2CmtsTEKInvalidErrorString,
                docsBpi2CmtsIpMulticastAddressType,
                docsBpi2CmtsIpMulticastAddress,
                docsBpi2CmtsIpMulticastMask,
                docsBpi2CmtsIpMulticastSAId,
                docsBpi2CmtsIpMulticastSAType,
                docsBpi2CmtsIpMulticastDataEncryptAlg,
                docsBpi2CmtsIpMulticastDataAuthentAlg,
                docsBpi2CmtsIpMulticastSAMapRequests,
                docsBpi2CmtsIpMulticastSAMapReplies,
                docsBpi2CmtsIpMulticastSAMapRejects,
                docsBpi2CmtsIpMulticastSAMapRejectErrorCode,
                docsBpi2CmtsIpMulticastSAMapRejectErrorString,
                docsBpi2CmtsIpMulticastMapControl,
                docsBpi2CmtsIpMulticastMapStorageType,
                docsBpi2CmtsMulticastAuthControl,
                docsBpi2CmtsProvisionedCmCertTrust,
                docsBpi2CmtsProvisionedCmCertSource,
                docsBpi2CmtsProvisionedCmCertStatus,
                docsBpi2CmtsProvisionedCmCert,
                docsBpi2CmtsCACertSubject,
                docsBpi2CmtsCACertIssuer,
                docsBpi2CmtsCACertSerialNumber,
                docsBpi2CmtsCACertTrust,
                docsBpi2CmtsCACertSource,
                docsBpi2CmtsCACertStatus,
                docsBpi2CmtsCACert,
                docsBpi2CmtsCACertThumbprint
                }
           STATUS         current
           DESCRIPTION
                "This collection of objects provides CMTS BPI+ status
           and control."
      ::= { docsBpi2Groups 2 }

      docsBpi2CodeDownloadGroup OBJECT-GROUP
              OBJECTS {
                docsBpi2CodeDownloadStatusCode,
                docsBpi2CodeDownloadStatusString,
                docsBpi2CodeMfgOrgName,
                docsBpi2CodeMfgCodeAccessStart,
                docsBpi2CodeMfgCvcAccessStart,
                docsBpi2CodeCoSignerOrgName,
                docsBpi2CodeCoSignerCodeAccessStart,
                docsBpi2CodeCoSignerCvcAccessStart,
                docsBpi2CodeCvcUpdate
                }
           STATUS         current
           DESCRIPTION
                "This collection of objects provides authenticated
           software download support."
      ::= { docsBpi2Groups 3 }

      END

And that's the MIB wrapped up, bestie ๐ŸŽ€โœจ All those object groups are the building blocks for the BPI+ status and control stuff, so the CM side, the CMTS side, and the authenticated software download side each get their own group ๐Ÿ’…


4. Acknowledgements ๐Ÿซถ

Big shoutout to the people who made this happen, because the credits deserve the spotlight ๐ŸŒธ

Kaz Ozawa gets the love for the Authenticated Software Download objects and general suggestions ๐Ÿ”ฅ

Rich Woundy brought the BPI MIB and general MIB expertise ๐Ÿงš

Mike St. Johns did the BPI MIB and the first version of the BPI+ MIB ๐Ÿ‘‘

Bert Wijnen went through the MIB syntax and accuracy with extensive comments ๐Ÿ’œ

And thanks to Mike Sabin and Manson Wong for reviewing the early BPI+ MIB drafts, plus Jean-Francois Mule for contributing to the last versions ๐Ÿฆ‹


5. Normative References ๐Ÿ“š

These are the references that you NEED to read to actually get this, so here they are, no cap ๐Ÿ’–

  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC2578] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Structure of Management Information Version 2 (SMIv2)", STD 58, RFC 2578, April 1999.
  • [RFC2579] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.
  • [RFC2580] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Conformance Statements for SMIv2", STD 58, RFC 2580, April 1999.
  • [RFC3411] Harrington, D., Presuhn, R., and B. Wijnen, "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks", STD 62, RFC 3411, December 2002.
  • [RFC4001] Daniele, M., Haberman, B., Routhier, S., and J. Schoenwaelder, "Textual Conventions for Internet Network Addresses", RFC 4001, February 2005.
  • [RFC2863] McCloghrie, K. and F. Kastenholz, "The Interfaces Group MIB", RFC 2863, June 2000.
  • [RFC2670] St. Johns, M., "Radio Frequency (RF) Interface Management Information Base for MCNS/DOCSIS compliant RF interfaces", RFC 2670, August 1999.
  • [DOCSIS] "Data-Over-Cable Service Interface Specifications: Baseline Privacy Plus Interface Specification SP-BPI+-I11-040407", DOCSIS, April 2004, available at http://www.cablemodem.com. http://www.cablelabs.com/specifications/archives.

6. Informative References ๐ŸŒˆ

These ones are extra juicy background reading, not required, but they're giving context ๐Ÿ“

7. Security Considerations ๐Ÿ”โœจ

okay bestie, this section is the serious one ๐Ÿฅบ the MIB has a bunch of objects marked read-write and/or read-create, and those can be sensitive or vulnerable in some network setups. SET operations in a non-secure environment without proper protection can mess with network operations, so here's the full list of tables and objects with their sensitivity/vulnerability breakdown ๐Ÿ’…

  • The following objects, if SNMP SET maliciously, could constitute denial of service or theft of service attacks or compromise the intended data privacy of users:

Objects related to the Baseline Privacy Key Management (BPKM):

  • docsBpi2CmAuthReset, docsBpi2CmtsAuthCmReset, docsBpi2CmtsTEKReset: these are used to kick off a re-key process ๐Ÿ”‘ a malicious massive SET attack could overload CMTS processing and mess with the service ๐Ÿ˜ญ
  • docsBpi2CmtsDefaultAuthLifetime, docsBpi2CmtsDefaultTEKLifetime, docsBpi2CmtsAuthCmLifetime, docsBpi2CmtsTEKLifetime: to lower the risk of short windows where key updates could cause degradation or denial of service (malicious or unintended), implementers are encouraged to follow these objects' range constraints, as defined in the docsBpi2CmtsCompliance MODULE-COMPLIANCE clause for operational deployments ๐ŸŽ€
  • docsBpi2CmtsDefaultSelfSignedManufCertTrust: a malicious SET on this one, in a self-signed certificate as a reject message, could cause denial of service ๐Ÿ™ˆ this object is designed for testing, so it is not RECOMMENDED for use in commercial deployments [DOCSIS]. admins can use View-based Access Control (VACM) introduced in section 7.9 of [RFC3410] to restrict write access to it ๐Ÿ”’
  • docsBpi2CmtsCheckCertValidityPeriods: a malicious SET that turns on period validity, paired with a wrong clock time in the CMTS, could cause denial of service because CM authorization requests get rejected ๐Ÿ’€
  • for more details on validating CM certificates, refer to section 9 of [DOCSIS] .

Objects related to the CM only:

  • Objects in docsBpi2CmDeviceCertTable
  • docsBpi2CmDeviceCmCert: this one isn't harmful, since a CM received a Certificate during the manufacturing process. so the object access becomes read-only ๐Ÿฅฐ see the object DESCRIPTION clause in section 3 for details.
  • Objects for Secure Software Download in table docsBpi2CodeDownloadControl:
  • docsBpi2CodeCvcUpdate: a malicious SET on this object may not be a real risk, because the CM holds the DOCSIS root key to verify the CVC authenticity โœจ the operator, if configured, could get a notification for event occurrences, which may help detect the source of the attack ๐Ÿ•ต๏ธโ€โ™€๏ธ also, [DOCSIS] recommends that CMs CVC be regularly updated to minimize the risk of potential code-signing keys being compromised (e.g., by configuration file).

Objects related to the CMTS only:

  • Objects in docsBpi2CmtsProvisionedCmCertTable and docsBpi2CmtsCACertTable, which hold CM Certificates and Certificate Authority information, respectively:
  • docsBpi2CmtsProvisionedCmCertTrust, docsBpi2CmtsProvisionedCmCertStatus, docsBpi2CmtsProvisionedCmCert, docsBpi2CmtsCACertStatus, docsBpi2CmtsCACert: a malicious SET on these may be a denial of service attack that shows up after the CMs perform authorization requests ๐Ÿ˜ค it does not affect CMs that are already in the authorized state.
  • Objects in multicast tables docsBpi2CmtsIpMulticastMapTable and docsBpi2CmtsMulticastAuthTable:
  • docsBpi2CmtsIpMulticastAddressType, docsBpi2CmtsIpMulticastAddress, docsBpi2CmtsIpMulticastMaskType, docsBpi2CmtsIpMulticastMask, docsBpi2CmtsIpMulticastSAId, docsBpi2CmtsIpMulticastSAType: a malicious SET here may cause misconfiguration and interrupt users' active multicast applications ๐Ÿ“บ
  • docsBpi2CmtsIpMulticastDataEncryptAlg, docsBpi2CmtsIpMulticastDataAuthentAlg: malicious SETs could create service misconfiguration, causing service interruption or theft of service if encryption algorithms are removed for the multicast groups ๐Ÿšจ
  • docsBpi2CmtsIpMulticastMapControl, docsBpi2CmtsMulticastAuthControl: malicious SETs may remove and/or disable customers and/or multicast groups, causing service disruption ๐Ÿ’” this may also be theft of service, by authorizing non-subscribed users to multicast groups or by adding other multicast groups in the forward path.

Some of the readable objects in this MIB module (the ones with a MAX-ACCESS other than not-accessible) may also be sensitive or vulnerable in some network environments ๐Ÿ‘€ so it's important to control even GET and/or NOTIFY access to these objects, and possibly even encrypt their values when sending them over the network via SNMP ๐Ÿ” here are the tables and objects with their sensitivity/vulnerability:

  • Objects in docsBpi2CmBaseTable, docsBpi2CmTEKTable, docsBpi2CmtsBaseTable, docsBpi2CmtsAuthTable, docsBpi2CmtsTEKTable, docsBpi2CmtsProvisionedCmCertTable, and docsBpi2CmtsCACertTable: if this info is accessible, attackers could use it to tell apart users configured to work without data encryption (e.g., docsBpi2CmPrivacyEnable) and to learn the current Baseline Privacy parameters in the network ๐Ÿ‘€
  • Objects in docsBpi2CmIpMulticastMapTable and docsBpi2CmtsMulticastAuthTable: on top of the vulnerabilities around BPI plus multicast objects described in the previous part, the read-only objects in this table may help attackers monitor the status of the intrusion ๐Ÿ•ต๏ธ
  • Objects in docsBpi2CodeDownloadControl: on top of the vulnerability of the read-write object docsBpi2CodeCvcUpdate, attackers may be able to monitor the status of a denial of service using Secure Software Download ๐Ÿ˜ฉ

SNMP versions before SNMPv3 did not include adequate security ๐Ÿ™ƒ even if the network itself is secure (for example, by using IPSec), there's still no control over who on that secure network is allowed to access and GET/SET (read/change/create/delete) the objects in this MIB module. no cap, that's a lot of trust to put in one network ๐Ÿฅด

It is RECOMMENDED that implementers consider the security features provided by the SNMPv3 framework (see [RFC3410], section 8), including full support for the SNMPv3 cryptographic mechanisms (for authentication and privacy) ๐Ÿ”โœจ

Further, deployment of SNMP versions prior to SNMPv3 is NOT RECOMMENDED ๐Ÿšซ instead, it is RECOMMENDED to deploy SNMPv3 and to enable cryptographic security. then it's a customer/operator responsibility to make sure the SNMP entity giving access to an instance of this MIB module is properly configured, so the objects are only accessible to the principals (users) who legitimately have the rights to GET or SET (change/create/delete) them ๐Ÿ’…

BPI+ Encryption Algorithms:

The BPI+ Traffic Encryption Keys (TEK) defined in the DOCSIS BPI+ specification [DOCSIS] use 40-bit or 56-bit DES for encryption (DES CBC mode) ๐Ÿ™ˆ currently, there is no mechanism or algorithm defined for data integrity ๐Ÿ’€

because of the DES cryptographic weaknesses, future revisions of the DOCSIS BPI+ specification should introduce more advanced encryption algorithms, as proposed in the DocsBpkmDataEncryptAlg textual convention, to keep up with cheaper and faster hardware or software decryption tools โšก future revisions of the DOCSIS BPI+ specification [DOCSIS] should also adopt authentication algorithms, as described in the DocsBpkmDataAuthentAlg textual convention ๐Ÿซถ

it's important to note that frequent key changes don't necessarily help mitigate or reduce the risks of a DES attack ๐Ÿ™…โ€โ™€๏ธ the traffic encryption keys, which are configured on a per cable modem basis and per BPI+ multicast group, can be used to decrypt old traffic even when they're no longer in active use ๐Ÿ˜ฑ

note that, not exempt to the same recommendations above, the CM BPI+ authorization protocol uses triple DES encryption, which offers improved robustness compared to DES for CM authorization and TEK re-key management ๐Ÿ’œ


8. IANA Considerations ๐ŸŒธ

the MIB module in this document uses the following IANA-assigned OBJECT IDENTIFIER value, recorded in the SMI Numbers registry ๐Ÿ“‹

Descriptor     OBJECT IDENTIFIER Value
----------     -----------------------
docsBpi2MIB    { mib-2 126 }

Authors' Addresses ๐Ÿฆ‹

Stuart M. Green

EMail: rubbersoul3@yahoo.com


Kaz Ozawa
Automotive Systems Development Center
TOSHIBA CORPORATION
1-1, Shibaura 1-Chome
Minato-ku, Tokyo 105-8001
Japan

Phone: +81-3-3457-8569
Fax: +81-3-5444-9325
EMail: Kazuyoshi.Ozawa@toshiba.co.jp


Alexander Katsnelson

Phone: +1-303-680-3924
EMail: katsnelson6@peoplepc.com


Eduardo Cardona
Cable Television Laboratories, Inc.
858 Coal Creek Circle
Louisville, CO 80027- 9750
U.S.A.

Phone: +1 303 661 9100
EMail: e.cardona@cablelabs.com

Copyright (C) The Internet Society (2005).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property ๐Ÿงš

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement ๐ŸŽ€

Funding for the RFC Editor function is currently provided by the Internet Society.

and that's a wrap on RFC 4131! ๐ŸŒˆ๐Ÿ‘‘ you made it bestie, we are SO done ๐Ÿ’–

๐Ÿ“ฆ where this page comes from