- case TCPOPT_AUTH:
- ND_PRINT((ndo, " keyid %d", *cp++));
- datalen = len - 3;
- for (i = 0; i < datalen; ++i) {
- LENCHECK(i);
- ND_PRINT((ndo, "%02x", cp[i]));
+ case TCPOPT_TCPAO:
+ datalen = len - 2;
+ /* RFC 5925 Section 2.2:
+ * "The Length value MUST be greater than or equal to 4."
+ * (This includes the Kind and Length fields already processed
+ * at this point.)
+ */
+ if (datalen < 2) {
+ ND_PRINT((ndo, " invalid"));
+ } else {
+ LENCHECK(1);
+ ND_PRINT((ndo, " keyid %u", cp[0]));
+ LENCHECK(2);
+ ND_PRINT((ndo, " rnextkeyid %u", cp[1]));
+ if (datalen > 2) {
+ ND_PRINT((ndo, " mac 0x"));
+ for (i = 2; i < datalen; i++) {
+ LENCHECK(i + 1);
+ ND_PRINT((ndo, "%02x", cp[i]));
+ }
+ }