1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*
* Alert Message
* (C) 2004-2006,2011,2012 Jack Lloyd
*
* Released under the terms of the Botan license
*/
#ifndef BOTAN_TLS_ALERT_H__
#define BOTAN_TLS_ALERT_H__
#include <botan/secmem.h>
#include <string>
namespace Botan {
namespace TLS {
/**
* SSL/TLS Alert Message
*/
class BOTAN_DLL Alert
{
public:
/**
* Type codes for TLS alerts
*/
enum Type {
CLOSE_NOTIFY = 0,
UNEXPECTED_MESSAGE = 10,
BAD_RECORD_MAC = 20,
DECRYPTION_FAILED = 21,
RECORD_OVERFLOW = 22,
DECOMPRESSION_FAILURE = 30,
HANDSHAKE_FAILURE = 40,
NO_CERTIFICATE = 41, // SSLv3 only
BAD_CERTIFICATE = 42,
UNSUPPORTED_CERTIFICATE = 43,
CERTIFICATE_REVOKED = 44,
CERTIFICATE_EXPIRED = 45,
CERTIFICATE_UNKNOWN = 46,
ILLEGAL_PARAMETER = 47,
UNKNOWN_CA = 48,
ACCESS_DENIED = 49,
DECODE_ERROR = 50,
DECRYPT_ERROR = 51,
EXPORT_RESTRICTION = 60,
PROTOCOL_VERSION = 70,
INSUFFICIENT_SECURITY = 71,
INTERNAL_ERROR = 80,
USER_CANCELED = 90,
NO_RENEGOTIATION = 100,
UNSUPPORTED_EXTENSION = 110,
CERTIFICATE_UNOBTAINABLE = 111,
UNRECOGNIZED_NAME = 112,
BAD_CERTIFICATE_STATUS_RESPONSE = 113,
BAD_CERTIFICATE_HASH_VALUE = 114,
UNKNOWN_PSK_IDENTITY = 115,
// pseudo alert values
NULL_ALERT = 256,
HEARTBEAT_PAYLOAD = 257
};
/**
* @return true iff this alert is non-empty
*/
bool is_valid() const { return (m_type_code != NULL_ALERT); }
/**
* @return if this alert is a fatal one or not
*/
bool is_fatal() const { return m_fatal; }
/**
* @return type of alert
*/
Type type() const { return m_type_code; }
/**
* @return type of alert
*/
std::string type_string() const;
/**
* Serialize an alert
*/
std::vector<byte> serialize() const;
/**
* Deserialize an Alert message
* @param buf the serialized alert
*/
Alert(const secure_vector<byte>& buf);
/**
* Create a new Alert
* @param type_code the type of alert
* @param fatal specifies if this is a fatal alert
*/
Alert(Type type_code, bool fatal = false) :
m_fatal(fatal), m_type_code(type_code) {}
Alert() : m_fatal(false), m_type_code(NULL_ALERT) {}
private:
bool m_fatal;
Type m_type_code;
};
}
}
#endif
|