-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path21.js
More file actions
118 lines (105 loc) · 3.79 KB
/
Copy path21.js
File metadata and controls
118 lines (105 loc) · 3.79 KB
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
114
115
116
117
118
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
/* HelloVerifyRequest message layout:
* 00: Version_Major (MSB)
* 01: Version_Minor (LSB)
* 02: Cookie length
* .......: Cookie (if a cookie ID is present)
*/
let enums = require('../../enums.js');
// constants
const MIN_LENGTH = 3;
function HelloVerifyRequestMessage() {
this.dtlsVersion = null;
this.cookie = null;
}
exports.create = function(dtlsVersion, cookie) {
// validate inputs
//
// dtlsVersion
if (!enums.isVersionValid(dtlsVersion)) {
throw new RangeError();
}
// cookie
if (typeof cookie === "undefined") {
throw new TypeError();
} else if (cookie === null) {
// null cookie (i.e. no cookie) is NOT acceptable
throw new TypeError();
} else if (!Array.isArray(cookie)) {
throw new TypeError();
} else if (cookie.length > enums.getMaximumCookieLength(dtlsVersion)) {
throw new RangeError();
}
// create and initialize the new HelloVerifyRequestMessage object
let result = new HelloVerifyRequestMessage();
result.dtlsVersion = dtlsVersion;
result.cookie = cookie;
// return the new HelloVerifyRequestMessage object
return result;
}
// NOTE: this function returns null if a complete message could not be parsed (and does not validate any data in the returned message)
// NOTE: offset is optional (default: 0)
exports.fromBuffer = function(buffer, offset) {
// use currentOffset to track the current offset while reading from the buffer
let initialOffset;
let currentOffset;
// validate inputs
//
// offset
if (typeof offset === "undefined") {
initialOffset = 0;
} else if (typeof offset !== "number") {
// if the offset is provided, but is not a number, then return an error
throw new TypeError();
} else if (offset >= buffer.length) {
throw new RangeError();
} else {
initialOffset = offset;
}
currentOffset = initialOffset;
// buffer
if (typeof buffer === "undefined") {
throw new TypeError();
} else if (buffer === null) {
// null buffer is NOT acceptable
} else if (Object.prototype.toString.call(buffer) != "[object Uint8Array]") {
throw new TypeError();
} else if (buffer.length - currentOffset < MIN_LENGTH) {
// buffer is not long enough for a full message; return null.
return null;
}
// create the new HelloVerifyRequestMessage object
let result = new HelloVerifyRequestMessage();
// parse buffer
//
// dtlsVersion (octets 0-1)
result.dtlsVersion = buffer.readUInt16LE(currentOffset);
currentOffset += 2;
// cookie length (octet 2)
let cookieLength = buffer[currentOffset];
currentOffset += 1;
// verify that the buffer length is long enough to fit the cookie
if (buffer.length - currentOffset < cookieLength) {
// if the buffer is not big enough, return null
return null;
}
// cookie
result.cookie = Buffer.alloc(cookieLength);
buffer.copy(result.cookie, 0, currentOffset, currentOffset + cookieLength);
currentOffset += cookieLength;
// return the new HelloVerifyRequestMessage object
return {message: result, bytesConsumed: currentOffset - initialOffset};
}