1// Copyright 2018 The GoPacket Authors. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style license
4// that can be found in the LICENSE file in the root of the source
5// tree.
6
7package layers
8
9import (
10	"errors"
11
12	"github.com/google/gopacket"
13)
14
15// TLSchangeCipherSpec defines the message value inside ChangeCipherSpec Record
16type TLSchangeCipherSpec uint8
17
18const (
19	TLSChangecipherspecMessage TLSchangeCipherSpec = 1
20	TLSChangecipherspecUnknown TLSchangeCipherSpec = 255
21)
22
23//  TLS Change Cipher Spec
24//  0  1  2  3  4  5  6  7  8
25//  +--+--+--+--+--+--+--+--+
26//  |        Message        |
27//  +--+--+--+--+--+--+--+--+
28
29// TLSChangeCipherSpecRecord defines the type of data inside ChangeCipherSpec Record
30type TLSChangeCipherSpecRecord struct {
31	TLSRecordHeader
32
33	Message TLSchangeCipherSpec
34}
35
36// DecodeFromBytes decodes the slice into the TLS struct.
37func (t *TLSChangeCipherSpecRecord) decodeFromBytes(h TLSRecordHeader, data []byte, df gopacket.DecodeFeedback) error {
38	// TLS Record Header
39	t.ContentType = h.ContentType
40	t.Version = h.Version
41	t.Length = h.Length
42
43	if len(data) != 1 {
44		df.SetTruncated()
45		return errors.New("TLS Change Cipher Spec record incorrect length")
46	}
47
48	t.Message = TLSchangeCipherSpec(data[0])
49	if t.Message != TLSChangecipherspecMessage {
50		t.Message = TLSChangecipherspecUnknown
51	}
52
53	return nil
54}
55
56// String shows the message value nicely formatted
57func (ccs TLSchangeCipherSpec) String() string {
58	switch ccs {
59	default:
60		return "Unknown"
61	case TLSChangecipherspecMessage:
62		return "Change Cipher Spec Message"
63	}
64}
65