// Copyright 2018 The GoPacket Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file in the root of the source // tree. package layers import ( "errors" "fmt" "github.com/google/gopacket" ) // TLSAlertLevel defines the alert level data type type TLSAlertLevel uint8 // TLSAlertDescr defines the alert descrption data type type TLSAlertDescr uint8 const ( TLSAlertWarning TLSAlertLevel = 1 TLSAlertFatal TLSAlertLevel = 2 TLSAlertUnknownLevel TLSAlertLevel = 255 TLSAlertCloseNotify TLSAlertDescr = 0 TLSAlertUnexpectedMessage TLSAlertDescr = 10 TLSAlertBadRecordMac TLSAlertDescr = 20 TLSAlertDecryptionFailedRESERVED TLSAlertDescr = 21 TLSAlertRecordOverflow TLSAlertDescr = 22 TLSAlertDecompressionFailure TLSAlertDescr = 30 TLSAlertHandshakeFailure TLSAlertDescr = 40 TLSAlertNoCertificateRESERVED TLSAlertDescr = 41 TLSAlertBadCertificate TLSAlertDescr = 42 TLSAlertUnsupportedCertificate TLSAlertDescr = 43 TLSAlertCertificateRevoked TLSAlertDescr = 44 TLSAlertCertificateExpired TLSAlertDescr = 45 TLSAlertCertificateUnknown TLSAlertDescr = 46 TLSAlertIllegalParameter TLSAlertDescr = 47 TLSAlertUnknownCa TLSAlertDescr = 48 TLSAlertAccessDenied TLSAlertDescr = 49 TLSAlertDecodeError TLSAlertDescr = 50 TLSAlertDecryptError TLSAlertDescr = 51 TLSAlertExportRestrictionRESERVED TLSAlertDescr = 60 TLSAlertProtocolVersion TLSAlertDescr = 70 TLSAlertInsufficientSecurity TLSAlertDescr = 71 TLSAlertInternalError TLSAlertDescr = 80 TLSAlertUserCanceled TLSAlertDescr = 90 TLSAlertNoRenegotiation TLSAlertDescr = 100 TLSAlertUnsupportedExtension TLSAlertDescr = 110 TLSAlertUnknownDescription TLSAlertDescr = 255 ) // TLS Alert // 0 1 2 3 4 5 6 7 8 // +--+--+--+--+--+--+--+--+ // | Level | // +--+--+--+--+--+--+--+--+ // | Description | // +--+--+--+--+--+--+--+--+ // TLSAlertRecord contains all the information that each Alert Record type should have type TLSAlertRecord struct { TLSRecordHeader Level TLSAlertLevel Description TLSAlertDescr EncryptedMsg []byte } // DecodeFromBytes decodes the slice into the TLS struct. func (t *TLSAlertRecord) decodeFromBytes(h TLSRecordHeader, data []byte, df gopacket.DecodeFeedback) error { // TLS Record Header t.ContentType = h.ContentType t.Version = h.Version t.Length = h.Length if len(data) < 2 { df.SetTruncated() return errors.New("TLS Alert packet too short") } if t.Length == 2 { t.Level = TLSAlertLevel(data[0]) t.Description = TLSAlertDescr(data[1]) } else { t.Level = TLSAlertUnknownLevel t.Description = TLSAlertUnknownDescription t.EncryptedMsg = data } return nil } // Strings shows the TLS alert level nicely formatted func (al TLSAlertLevel) String() string { switch al { default: return fmt.Sprintf("Unknown(%d)", al) case TLSAlertWarning: return "Warning" case TLSAlertFatal: return "Fatal" } } // Strings shows the TLS alert description nicely formatted func (ad TLSAlertDescr) String() string { switch ad { default: return "Unknown" case TLSAlertCloseNotify: return "close_notify" case TLSAlertUnexpectedMessage: return "unexpected_message" case TLSAlertBadRecordMac: return "bad_record_mac" case TLSAlertDecryptionFailedRESERVED: return "decryption_failed_RESERVED" case TLSAlertRecordOverflow: return "record_overflow" case TLSAlertDecompressionFailure: return "decompression_failure" case TLSAlertHandshakeFailure: return "handshake_failure" case TLSAlertNoCertificateRESERVED: return "no_certificate_RESERVED" case TLSAlertBadCertificate: return "bad_certificate" case TLSAlertUnsupportedCertificate: return "unsupported_certificate" case TLSAlertCertificateRevoked: return "certificate_revoked" case TLSAlertCertificateExpired: return "certificate_expired" case TLSAlertCertificateUnknown: return "certificate_unknown" case TLSAlertIllegalParameter: return "illegal_parameter" case TLSAlertUnknownCa: return "unknown_ca" case TLSAlertAccessDenied: return "access_denied" case TLSAlertDecodeError: return "decode_error" case TLSAlertDecryptError: return "decrypt_error" case TLSAlertExportRestrictionRESERVED: return "export_restriction_RESERVED" case TLSAlertProtocolVersion: return "protocol_version" case TLSAlertInsufficientSecurity: return "insufficient_security" case TLSAlertInternalError: return "internal_error" case TLSAlertUserCanceled: return "user_canceled" case TLSAlertNoRenegotiation: return "no_renegotiation" case TLSAlertUnsupportedExtension: return "unsupported_extension" } }