├── .gitignore
├── CNAME
├── _config.yml
├── output
├── noisesocket.pdf
└── noisesocket.html
├── make.html.bat
├── make.pdf.bat
├── Makefile
├── README.md
├── template_pandoc.html
├── spec_markdown.css
├── my.bib
├── template_pandoc.latex
├── noisesocket.md
├── ieee-with-url.csl
└── test_vectors.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/*
2 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 | noisesocket.com
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-slate
--------------------------------------------------------------------------------
/output/noisesocket.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/noisesocket/spec/HEAD/output/noisesocket.pdf
--------------------------------------------------------------------------------
/make.html.bat:
--------------------------------------------------------------------------------
1 | c:\pandoc\pandoc noisesocket.md -s --toc -f markdown --template template_pandoc.html --css=spec_markdown.css --filter pandoc-citeproc --bibliography=my.bib -o output\noisesocket.html
--------------------------------------------------------------------------------
/make.pdf.bat:
--------------------------------------------------------------------------------
1 | c:\pandoc\pandoc.exe noisesocket.md -s --toc -f markdown --template template_pandoc.latex --css=spec_markdown.css --filter pandoc-citeproc --bibliography=my.bib -o output\noisesocket.pdf
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 |
2 | default: output/noisesocket.html output/noisesocket.pdf
3 |
4 | # Pandoc 1.17.2, Pandoc-citeproc
5 |
6 | output/noisesocket.html: noisesocket.md template_pandoc.html spec_markdown.css my.bib
7 | pandoc noisesocket.md -s --toc \
8 | -f markdown\
9 | --template template_pandoc.html \
10 | --css=spec_markdown.css \
11 | --filter pandoc-citeproc \
12 | -o output/noisesocket.html
13 |
14 | output/noisesocket.pdf: noisesocket.md template_pandoc.latex my.bib
15 | pandoc noisesocket.md -s --toc \
16 | -f markdown\
17 | --template template_pandoc.latex \
18 | --filter pandoc-citeproc \
19 | -o output/noisesocket.pdf
20 |
21 | clean:
22 | rm output/noisesocket.html output/noisesocket.pdf
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Noise Socket
2 | ---------
3 | NoiseSocket is an extension of the Noise Protocol Framework that enables quick and seamless secure connections with minimal code size, small keys, modern ciphers and hash functions, and extremely fast speed. It can be used with raw public keys instead of X.509 infrastructure and targets IoT devices, microservices, and back-end applications such as datacenter-to-datacenter communications.
4 |
5 | See [noisesocket.pdf](https://github.com/noiseprotocol/noisesocket_spec/blob/master/output/noisesocket.pdf) for full spec
6 |
7 | Implementations
8 | --------------
9 |
10 | [Golang library](https://github.com/go-noisesocket/noisesocket/)
11 |
12 | [NGINX Module](https://github.com/VirgilSecurity/virgil-nginx-noise-socket)
13 |
14 | [PKI Integration](https://github.com/go-noisesocket/noisesocket/tree/master/virgil)
15 |
--------------------------------------------------------------------------------
/template_pandoc.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | $for(author-meta)$
8 |
9 | $endfor$
10 | $if(date-meta)$
11 |
12 | $endif$
13 | $if(keywords)$
14 |
15 | $endif$
16 | $if(title-prefix)$$title-prefix$ – $endif$$pagetitle$
17 |
18 | $if(quotes)$
19 |
20 | $endif$
21 | $if(highlighting-css)$
22 |
25 | $endif$
26 | $for(css)$
27 |
28 | $endfor$
29 | $if(math)$
30 | $math$
31 | $endif$
32 | $for(header-includes)$
33 | $header-includes$
34 | $endfor$
35 |
36 |
37 | $for(include-before)$
38 | $include-before$
39 | $endfor$
40 | $if(title)$
41 |
59 | $endif$
60 | $if(toc)$
61 |
62 |
Table of Contents
63 | $toc$
64 |
65 | $endif$
66 | $body$
67 | $for(include-after)$
68 | $include-after$
69 | $endfor$
70 |
71 |
--------------------------------------------------------------------------------
/spec_markdown.css:
--------------------------------------------------------------------------------
1 | html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
2 |
3 | body{
4 | color:#444;
5 | font-family:'Helvetica Neue', 'Helvetica', 'Arial';
6 | font-size:12px;
7 | line-height:1.5em;
8 | padding:1em;
9 | margin:auto;
10 | max-width:42em;
11 | background:#ffffff;
12 | }
13 |
14 | a{ color: #0645ad; text-decoration:none;}
15 | a:hover{ color: #06e; }
16 | a:active{ color:#faa700; }
17 | a:focus{ outline: thin dotted; }
18 | a:hover, a:active{ outline: 0; }
19 |
20 | ::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
21 | ::selection{background:rgba(255,255,0,0.3);color:#000}
22 |
23 | a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
24 | a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
25 |
26 | p{
27 | margin:1em 0;
28 | }
29 |
30 | img{
31 | max-width:100%;
32 | }
33 |
34 | h1,h2,h3,h4,h5,h6{
35 | font-weight:normal;
36 | color:#111;
37 | line-height:1em;
38 | }
39 | h4,h5,h6{ font-weight: bold; }
40 | h1{ font-size:2.5em; }
41 | h2{ font-size:2em; }
42 | h3{ font-size:1.5em; }
43 | h4{ font-size:1.2em; }
44 | h5{ font-size:1em; }
45 | h6{ font-size:0.9em; }
46 |
47 | blockquote{
48 | color:#666666;
49 | margin:0;
50 | padding-left: 3em;
51 | border-left: 0.5em #EEE solid;
52 | }
53 | hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
54 | pre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 0.98em; line-height: 1.25em; }
55 | pre { background-color: #FFF; white-space: pre; white-space: pre-wrap; word-wrap: break-word; margin: 0 0; }
56 |
57 | b, strong { font-weight: bold; }
58 |
59 | dfn { font-style: italic; }
60 |
61 | ins { background: #ff9; color: #000; text-decoration: none; }
62 |
63 | mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
64 |
65 | sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
66 | sup { top: -0.5em; }
67 | sub { bottom: -0.25em; }
68 |
69 | ul, ol { margin: 1em 1; padding: 0 0 0 2em; }
70 | li p:last-child { margin:1 }
71 | dd { margin: 0 0 0 2em; }
72 |
73 | img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
74 |
75 | table { border-collapse: collapse; border-spacing: 0; border: 1px solid black; }
76 | td { vertical-align: top; padding: 12px; border: 1px solid black;}
77 |
78 | @media only screen and (min-width: 480px) {
79 | body{font-size:14px;}
80 | }
81 |
82 | @media only screen and (min-width: 768px) {
83 | body{font-size:16px;}
84 | }
85 |
86 | @media print {
87 | * { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
88 | body{font-size:12pt; max-width:100%;}
89 | a, a:visited { text-decoration: underline; }
90 | hr { height: 1px; border:0; border-bottom:1px solid black; }
91 | a[href]:after { content: " (" attr(href) ")"; }
92 | abbr[title]:after { content: " (" attr(title) ")"; }
93 | .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
94 | pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
95 | tr, img { page-break-inside: avoid; }
96 | img { max-width: 100% !important; }
97 | @page :left { margin: 15mm 20mm 15mm 10mm; }
98 | @page :right { margin: 15mm 10mm 15mm 20mm; }
99 | p, h2, h3 { orphans: 3; widows: 3; }
100 | h2, h3 { page-break-after: avoid; }
101 | }
--------------------------------------------------------------------------------
/my.bib:
--------------------------------------------------------------------------------
1 |
2 | @inproceedings{Rogaway:2002,
3 | author = {Rogaway, Phillip},
4 | title = "{Authenticated-encryption with Associated-data}",
5 | booktitle = "{Proceedings of the 9th {ACM} Conference on Computer and Communications Security}",
6 | series = {CCS '02},
7 | year = {2002},
8 | isbn = {1-58113-612-9},
9 | location = {Washington, DC, USA},
10 | doi = {10.1145/586110.586125},
11 | acmid = {586125},
12 | publisher = {ACM},
13 | address = {New York, NY, USA},
14 | keywords = {OCB, associated-data problem, authenticated-encryption, block-cipher usage, key separation, modes of operation},
15 | url="http://web.cs.ucdavis.edu/~rogaway/papers/ad.pdf"
16 | }
17 |
18 |
19 | @misc{rfc7748,
20 | author="A. Langley and M. Hamburg and S. Turner",
21 | title="{Elliptic Curves for Security}",
22 | series="Request for Comments",
23 | number="7748",
24 | howpublished="RFC 7748 (Informational)",
25 | publisher="IETF",
26 | organization="Internet Engineering Task Force",
27 | year=2016,
28 | month=jan,
29 | url="http://www.ietf.org/rfc/rfc7748.txt",
30 | }
31 |
32 | @misc{rfc2104,
33 | author="H. Krawczyk and M. Bellare and R. Canetti",
34 | title="{HMAC: Keyed-Hashing for Message Authentication}",
35 | series="Request for Comments",
36 | number="2104",
37 | howpublished="RFC 2104 (Informational)",
38 | publisher="IETF",
39 | organization="Internet Engineering Task Force",
40 | year=1997,
41 | month=feb,
42 | note="Updated by RFC 6151",
43 | url="http://www.ietf.org/rfc/rfc2104.txt",
44 | }
45 |
46 | @misc{rfc5869,
47 | author="H. Krawczyk and P. Eronen",
48 | title="{HMAC-based Extract-and-Expand Key Derivation Function (HKDF)}",
49 | series="Request for Comments",
50 | number="5869",
51 | howpublished="RFC 5869 (Informational)",
52 | publisher="IETF",
53 | organization="Internet Engineering Task Force",
54 | year=2010,
55 | month=may,
56 | url="http://www.ietf.org/rfc/rfc5869.txt",
57 | }
58 |
59 | @misc{elligator,
60 | author = {Daniel J. Bernstein and Mike Hamburg and Anna Krasnova and Tanja Lange},
61 | title = "{Elligator: Elliptic-curve points indistinguishable from uniform random strings}",
62 | howpublished = {Cryptology ePrint Archive, Report 2013/325},
63 | year = {2013},
64 | url = "http://eprint.iacr.org/2013/325",
65 | }
66 |
67 | @misc{rfc7539,
68 | author="Y. Nir and A. Langley",
69 | title="{ChaCha20 and Poly1305 for IETF Protocols}",
70 | series="Request for Comments",
71 | number="7539",
72 | howpublished="RFC 7539 (Informational)",
73 | publisher="IETF",
74 | organization="Internet Engineering Task Force",
75 | year=2015,
76 | month=may,
77 | url="http://www.ietf.org/rfc/rfc7539.txt",
78 | }
79 |
80 | @techreport{nistgcm,
81 | author = {Dworkin, Morris J.},
82 | title = "{SP 800-38D. Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC}",
83 | year = {2007},
84 | publisher = {National Institute of Standards \& Technology},
85 | address = {Gaithersburg, MD, United States},
86 | url="http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf"
87 | }
88 |
89 | @TechReport{nistsha2,
90 | author = "NIST",
91 | key = "FIPS-180-4",
92 | title = "{FIPS 180-4. Secure Hash Standard (SHS)}",
93 | publisher = {National Institute of Standards \& Technology},
94 | address = {Gaithersburg, MD, United States},
95 | year = "2012",
96 | URL = "http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf"
97 | }
98 |
99 | @misc{rfc7693,
100 |
101 | author="M-J. Saarinen and J-P. Aumasson",
102 | title="{The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)}",
103 | series="Request for Comments",
104 | number="7693",
105 | howpublished="RFC 7693 (Informational)",
106 | publisher="IETF",
107 | organization="Internet Engineering Task Force",
108 | year=2015,
109 | month=nov,
110 | url="http://www.ietf.org/rfc/rfc7693.txt",
111 | }
112 |
113 | @misc{nacl,
114 | author="Daniel J. Bernstein and Tanja Lange and Peter Schwabe",
115 | title="{NaCl: Networking and Cryptography Library}",
116 | url="https://nacl.cr.yp.to/"
117 | }
118 |
119 | @misc{curvecp,
120 | author="Daniel J. Bernstein",
121 | title="{CurveCP: Usable security for the Internet}",
122 | url="https://curvecp.org"
123 | }
124 |
125 | @Inbook{sigma,
126 | author="Krawczyk, Hugo",
127 | title="{SIGMA: The `SIGn-and-MAc' Approach to Authenticated Diffie-Hellman and Its Use in the IKE Protocols}",
128 | bookTitle="{Advances in Cryptology - CRYPTO 2003}",
129 | year="2003",
130 | url="http://webee.technion.ac.il/~hugo/sigma.html"
131 | }
132 |
133 | @misc{homqv,
134 | author = {Shai Halevi and Hugo Krawczyk},
135 | title = "{One-Pass HMQV and Asymmetric Key-Wrapping}",
136 | howpublished = {Cryptology ePrint Archive, Report 2010/638},
137 | year = {2010},
138 | url = {http://eprint.iacr.org/2010/638},
139 | }
140 |
141 | @article{ntor,
142 | author = {Goldberg, Ian and Stebila, Douglas and Ustaoglu, Berkant},
143 | title = "{Anonymity and One-way Authentication in Key Exchange Protocols}",
144 | journal = {Design, Codes, and Cryptography},
145 | issue_date = {May 2013},
146 | volume = {67},
147 | number = {2},
148 | month = may,
149 | year = {2013},
150 | issn = {0925-1022},
151 | numpages = {25},
152 | doi = {10.1007/s10623-011-9604-z},
153 | acmid = {2458069},
154 | publisher = {Kluwer Academic Publishers},
155 | address = {Norwell, MA, USA},
156 | url="http://cacr.uwaterloo.ca/techreports/2011/cacr2011-11.pdf"
157 | }
158 |
159 | @inproceedings{otr,
160 | author = {Di Raimondo, Mario and Gennaro, Rosario and Krawczyk, Hugo},
161 | title = "{Secure Off-the-record Messaging}",
162 | booktitle = "{Proceedings of the 2005 ACM Workshop on Privacy in the Electronic Society}",
163 | series = {WPES '05},
164 | year = {2005},
165 | isbn = {1-59593-228-3},
166 | address = {New York, NY, USA},
167 | url="http://www.dmi.unict.it/diraimondo/web/wp-content/uploads/papers/otr.pdf"
168 | }
169 |
170 | @Inbook{kudla2005,
171 | author="Kudla, Caroline and Paterson, Kenneth G.",
172 | title="{Modular Security Proofs for Key Agreement Protocols}",
173 | bookTitle="{Advances in Cryptology - ASIACRYPT 2005: 11th International Conference on the Theory and Application of Cryptology and Information Security}",
174 | year="2005",
175 | isbn="978-3-540-32267-2",
176 | doi="10.1007/11593447_30",
177 | url="http://www.isg.rhul.ac.uk/~kp/ModularProofs.pdf"
178 | }
179 |
180 | @Inbook{blakewilson1997,
181 | author="Blake-Wilson, Simon and Johnson, Don and Menezes, Alfred",
182 | title="Key agreement protocols and their security analysis",
183 | bookTitle="{Crytography and Coding: 6th IMA International Conference Cirencester, UK, December 17--19, 1997 Proceedings}",
184 | year="1997",
185 | url="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.25.387"
186 | }
187 |
188 | @misc{noise,
189 | author="T. Perrin",
190 | title="{The Noise Protocol Framework}",
191 | year=2017,
192 | url="https://noiseprotocol.org",
193 | }
194 |
195 |
--------------------------------------------------------------------------------
/template_pandoc.latex:
--------------------------------------------------------------------------------
1 | \documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
2 | $if(fontfamily)$
3 | \usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
4 | $else$
5 | \usepackage{lmodern}
6 | $endif$
7 | $if(linestretch)$
8 | \usepackage{setspace}
9 | \setstretch{$linestretch$}
10 | $endif$
11 | \usepackage{amssymb,amsmath}
12 | \usepackage{ifxetex,ifluatex}
13 | \usepackage{fixltx2e} % provides \textsubscript
14 | \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
15 | \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
16 | \usepackage[utf8]{inputenc}
17 | $if(euro)$
18 | \usepackage{eurosym}
19 | $endif$
20 | \else % if luatex or xelatex
21 | \ifxetex
22 | \usepackage{mathspec}
23 | \else
24 | \usepackage{fontspec}
25 | \fi
26 | \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
27 | $if(euro)$
28 | \newcommand{\euro}{€}
29 | $endif$
30 | $if(mainfont)$
31 | \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
32 | $endif$
33 | $if(sansfont)$
34 | \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}
35 | $endif$
36 | $if(monofont)$
37 | \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$}
38 | $endif$
39 | $if(mathfont)$
40 | \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
41 | $endif$
42 | $if(CJKmainfont)$
43 | \usepackage{xeCJK}
44 | \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
45 | $endif$
46 | \fi
47 | % use upquote if available, for straight quotes in verbatim environments
48 | \IfFileExists{upquote.sty}{\usepackage{upquote}}{}
49 | % use microtype if available
50 | \IfFileExists{microtype.sty}{%
51 | \usepackage{microtype}
52 | \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
53 | }{}
54 | $if(geometry)$
55 | \usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
56 | $endif$
57 | \usepackage{hyperref}
58 | $if(colorlinks)$
59 | \PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref
60 | $endif$
61 | \hypersetup{unicode=true,
62 | $if(title-meta)$
63 | pdftitle={$title-meta$},
64 | $endif$
65 | $if(author-meta)$
66 | pdfauthor={$author-meta$},
67 | $endif$
68 | $if(keywords)$
69 | pdfkeywords={$for(keywords)$$keywords$$sep$; $endfor$},
70 | $endif$
71 | $if(colorlinks)$
72 | colorlinks=true,
73 | linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,
74 | citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,
75 | urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,
76 | $else$
77 | pdfborder={0 0 0},
78 | $endif$
79 | breaklinks=true}
80 | \urlstyle{same} % don't use monospace font for urls
81 | $if(lang)$
82 | \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
83 | \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
84 | $if(babel-newcommands)$
85 | $babel-newcommands$
86 | $endif$
87 | \else
88 | \usepackage{polyglossia}
89 | \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}
90 | $for(polyglossia-otherlangs)$
91 | \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
92 | $endfor$
93 | \fi
94 | $endif$
95 | $if(natbib)$
96 | \usepackage{natbib}
97 | \bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
98 | $endif$
99 | $if(biblatex)$
100 | \usepackage$if(biblio-style)$[style=$biblio-style$]$endif${biblatex}
101 | $if(biblatexoptions)$\ExecuteBibliographyOptions{$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$}$endif$
102 | $for(bibliography)$
103 | \addbibresource{$bibliography$}
104 | $endfor$
105 | $endif$
106 | $if(listings)$
107 | \usepackage{listings}
108 | $endif$
109 | $if(lhs)$
110 | \lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
111 | $endif$
112 | $if(highlighting-macros)$
113 | $highlighting-macros$
114 | $endif$
115 | $if(verbatim-in-note)$
116 | \usepackage{fancyvrb}
117 | \VerbatimFootnotes % allows verbatim text in footnotes
118 | $endif$
119 | $if(tables)$
120 | \usepackage{longtable,booktabs}
121 | $endif$
122 | $if(graphics)$
123 | \usepackage{graphicx,grffile}
124 | \makeatletter
125 | \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
126 | \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
127 | \makeatother
128 | % Scale images if necessary, so that they will not overflow the page
129 | % margins by default, and it is still possible to overwrite the defaults
130 | % using explicit options in \includegraphics[width, height, ...]{}
131 | \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
132 | $endif$
133 | $if(links-as-notes)$
134 | % Make links footnotes instead of hotlinks:
135 | \renewcommand{\href}[2]{#2\footnote{\url{#1}}}
136 | $endif$
137 | $if(strikeout)$
138 | \usepackage[normalem]{ulem}
139 | % avoid problems with \sout in headers with hyperref:
140 | \pdfstringdefDisableCommands{\renewcommand{\sout}{}}
141 | $endif$
142 | $if(indent)$
143 | $else$
144 | \IfFileExists{parskip.sty}{%
145 | \usepackage{parskip}
146 | }{% else
147 | \setlength{\parindent}{0pt}
148 | \setlength{\parskip}{6pt plus 2pt minus 1pt}
149 | }
150 | $endif$
151 | \setlength{\emergencystretch}{3em} % prevent overfull lines
152 | \providecommand{\tightlist}{%
153 | \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
154 | $if(numbersections)$
155 | \setcounter{secnumdepth}{5}
156 | $else$
157 | \setcounter{secnumdepth}{0}
158 | $endif$
159 | $if(subparagraph)$
160 | $else$
161 | % Redefines (sub)paragraphs to behave more like sections
162 | \ifx\paragraph\undefined\else
163 | \let\oldparagraph\paragraph
164 | \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
165 | \fi
166 | \ifx\subparagraph\undefined\else
167 | \let\oldsubparagraph\subparagraph
168 | \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
169 | \fi
170 | $endif$
171 | $if(dir)$
172 | \ifxetex
173 | % load bidi as late as possible as it modifies e.g. graphicx
174 | $if(latex-dir-rtl)$
175 | \usepackage[RTLdocument]{bidi}
176 | $else$
177 | \usepackage{bidi}
178 | $endif$
179 | \fi
180 | \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
181 | \TeXXeTstate=1
182 | \newcommand{\RL}[1]{\beginR #1\endR}
183 | \newcommand{\LR}[1]{\beginL #1\endL}
184 | \newenvironment{RTL}{\beginR}{\endR}
185 | \newenvironment{LTR}{\beginL}{\endL}
186 | \fi
187 | $endif$
188 | $for(header-includes)$
189 | $header-includes$
190 | $endfor$
191 |
192 | $if(title)$
193 | \title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
194 | $endif$
195 | $if(subtitle)$
196 | \providecommand{\subtitle}[1]{}
197 | \subtitle{$subtitle$}
198 | $endif$
199 | $if(author)$
200 | \author{$for(author)$$author$$sep$ \and $endfor$}
201 | $endif$
202 | $if(institute)$
203 | \institute{$for(institute)$$institute$$sep$ \and $endfor$}
204 | $endif$
205 | \date{Revision $revision$, $date$}
206 |
207 | \begin{document}
208 | $if(title)$
209 | \maketitle
210 | $endif$
211 | $if(abstract)$
212 | \begin{abstract}
213 | $abstract$
214 | \end{abstract}
215 | $endif$
216 |
217 | $for(include-before)$
218 | $include-before$
219 |
220 | $endfor$
221 | $if(toc)$
222 | {
223 | $if(colorlinks)$
224 | \hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
225 | $endif$
226 | \setcounter{tocdepth}{$toc-depth$}
227 | \tableofcontents
228 | }
229 | $endif$
230 | $if(lot)$
231 | \listoftables
232 | $endif$
233 | $if(lof)$
234 | \listoffigures
235 | $endif$
236 | $body$
237 |
238 | $if(natbib)$
239 | $if(bibliography)$
240 | $if(biblio-title)$
241 | $if(book-class)$
242 | \renewcommand\bibname{$biblio-title$}
243 | $else$
244 | \renewcommand\refname{$biblio-title$}
245 | $endif$
246 | $endif$
247 | \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
248 |
249 | $endif$
250 | $endif$
251 | $if(biblatex)$
252 | \printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
253 |
254 | $endif$
255 | $for(include-after)$
256 | $include-after$
257 |
258 | $endfor$
259 | \end{document}
--------------------------------------------------------------------------------
/noisesocket.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'The NoiseSocket Protocol'
3 | author:
4 | - 'Alexey Ermishkin'
5 | - 'Trevor Perrin'
6 | revision: '1'
7 | date: '2017-07-27'
8 | bibliography: 'my.bib'
9 | link-citations: 'true'
10 | csl: 'ieee-with-url.csl'
11 | ---
12 |
13 | **Abstract**
14 | ========================
15 |
16 | NoiseSocket is an extension of the Noise Protocol Framework that enables quick
17 | and seamless secure connections with minimal code size, small keys,
18 | modern ciphers and hash functions, and extremely fast speed. It can be used
19 | with raw public keys instead of X.509 infrastructure and targets IoT devices,
20 | microservices, and back-end applications such as datacenter-to-datacenter
21 | communications.
22 |
23 |
24 | \pagebreak
25 |
26 |
27 | 1. Overview
28 | ====================
29 |
30 | The Noise Protocol Framework [@noise] describes simple **Noise protocols**. A Noise
31 | protocol sends a fixed sequence of handshake messages based on a fixed set of
32 | cryptographic choices. In some situations this is too rigid, and the responder
33 | needs flexibility to accept or reject the initiator's Noise protocol choice, or
34 | make its own choice based on options offered by the initiator.
35 |
36 | The **NoiseSocket** framework allows the initiator and responder to negotiate a particular Noise protocol. This is a two-step process:
37 |
38 | * The initiator begins executing an initial Noise protocol and sends an initial Noise handshake message. As a preamble to this message, the initiator can send some **negotiation data** which indicates the initial Noise protocol and can advertise support for other Noise protocols.
39 |
40 | * The responder can **accept** the initiator's choice of initial Noise protocol, **change** to a different Noise protocol, or **reject** the initiator's message entirely. The responder indicates this choice by sending some negotiation data back to the initiator, or closing the connection.
41 |
42 | NoiseSocket doesn't specify the contents of negotiation data, since different applications will encode versions and advertise protocol support in different ways. NoiseSocket just defines a message format to transport this data, and APIs to access it.
43 |
44 | NoiseSocket handles two other low-level issues:
45 |
46 | * NoiseSocket defines length fields for all messages, so NoiseSocket messages can be used with stream-based protocols like TCP.
47 |
48 | * NoiseSocket defines padding fields which are included in every ciphertext, so that applications can pad their messages to avoid revealing plaintext lengths to an eavesdropper.
49 |
50 |
51 | 2. Message Formats
52 | ===================
53 | A NoiseSocket protocol begins with a **handshake phase**. During the handshake phase each NoiseSocket message contains a single **handshake message** from some underlying Noise protocol, plus optional negotiation data.
54 |
55 | After the handshake completes, NoiseSocket enters the **transport phase** where each NoiseSocket message contains a **transport message** from some underlying Noise protocol.
56 |
57 | All transport messages and some handshake messages contain an encrypted Noise **payload**. Each encrypted payload contains a plaintext with a **body** (its actual contents) followed by **padding**.
58 |
59 | The following sections describe the format for NoiseSocket handshake and transport messages, and encrypted payloads.
60 |
61 | 2.1. Handshake messages
62 | --------------------------------
63 |
64 | All NoiseSocket handshake messages have the same structure:
65 |
66 | - negotiation_data_len (2 bytes)
67 | - negotiation_data
68 | - noise_message_len (2 bytes)
69 | - noise_message
70 |
71 | The `negotiation_data_len` and `noise_message_len` fields are 2-byte unsigned
72 | integers, encoded in big-endian, that store the number of bytes for the following
73 | `negotiation_data` and `noise_message` fields.
74 |
75 | 2.2. Transport messages
76 | -------------------------
77 |
78 | All NoiseSocket transport messages have the same structure:
79 |
80 | - noise_message_len (2 bytes)
81 | - noise_message
82 |
83 | The `noise_message_len` field is a 2-byte unsigned integer, encoded in big-endian, that stores the number of bytes for the following `noise_message` field.
84 |
85 | 2.3. Encrypted payloads
86 | ----------------------
87 | Some Noise messages will carry an encrypted payload. When this payload is decrypted, the plaintext will have the following structure:
88 |
89 | - body_len (2 bytes)
90 | - body
91 | - padding
92 |
93 | The `body_len` field is a 2-byte unsigned integer, encoded in big-endian, that stores the number of bytes for the following `body` field. Following the `body` field the remainder of the plaintext will be padding bytes, which may contain arbitrary data and must be ignored by the recipient.
94 |
95 | 3. Negotiation
96 | ===============
97 |
98 | The initiator will choose the initial underlying Noise protocol, and will indicate this to the responder using the `negotiation_data` field.
99 |
100 | Upon receiving an initial NoiseSocket message, the responder has five options:
101 |
102 | * **Silent rejection**: The responder closes the network connection.
103 |
104 | * **Explicit rejection**: The responder sends a single NoiseSocket handshake message. The `negotiation_data` field must be non-empty and contain an error message. The `noise_message` field must be empty. After sending this message, the responder closes the network connection.
105 |
106 | * **Acceptance**: The responder sends a NoiseSocket handshake message containing the next handshake message in the initial Noise protocol. The `negotiation_data` field must be empty.
107 |
108 | * **Change protocol and send fallback message**: The responder sends a NoiseSocket handshake message containing a handshake message from a new Noise protocol, different from the initial Noise protocol. The `negotiation_data` field must be non-empty. The `noise_message` field must be non-empty.
109 |
110 | * **Change protocol and send reinitialization request**: The responder requests the initiator to send a NoiseSocket handshake message containing a handshake message from a new Noise protocol, different from the initial Noise protocol. The `negotiation_data` field must be non-empty. The `noise_message` field must be empty.
111 |
112 | The initiator's first `negotiation_data` field must indicate the initial Noise protocol and what other Noise protocols the initiator can support. How this is encoded is up to the application.
113 |
114 | If the responder's first `negotiation_data` field is empty, then the initial protocol was accepted. If the field is non-empty, it must encode values that distinguish betwen the "explicit rejection", "fallback", and "reinitialization request" cases. In the first case, the `negotiation_data` must encode an error message. In the latter two cases, the `negotiation_data` must encode the Noise protocol the initiator should fallback to or reinitialize with.
115 |
116 | When the initiator receives the first NoiseSocket response message, and for all later handshake messages received by both parties, the only options are silent rejection, explicit rejection, or acceptance.
117 |
118 | Example negotiation flows:
119 |
120 | * It's easy for the responder to change symmetric crypto options using a fallback protocol. For example, if the initial Noise protocol is `Noise_XX_25519_AESGCM_SHA256`, the responder can fallback to `Noise_XX+fallback_25519_ChaChaPoly_BLAKE2s`. This reuses the ephemeral public key from the initiator's initial message.
121 |
122 | * If the initiator attempts 0-RTT encryption that the responder fails to decrypt, the responder can use a fallback protocol. For example, if the initial Noise protocol is `Noise_IK_25519_AESGCM_SHA256`, the responder can fallback to `Noise_XX+fallback_25519_AESGCM_SHA256`. This reuses the ephemeral public key from the initiator's initial message.
123 |
124 | * If the responder wants to use a DH function that the initiator supports but did not send an ephemeral public key for, in the initial message, then the responder might need to request reinitialization. For example, if the initial Noise protocol is `Noise_XX_25519_AESGCM_SHA256`, the responder can request reinitialization to `Noise_XX_448_AESGCM_SHA256`, causing the initiator to respond with a NoiseSocket message containing the initial message from the `Noise_XX` pattern with a Curve448 ephemeral public key.
125 |
126 |
127 |
128 |
129 | 4. Prologue
130 | ============
131 |
132 | Noise protocols take a **prologue** input. The prologue is cryptographically authenticated to make sure both parties have the same view of it.
133 |
134 | The prologue for the initial Noise protocol is set to the UTF-8 string "NoiseSocketInit1" followed by all bytes transmitted prior to the `noise_message_len`. This consists of the following values concatenated together:
135 |
136 | * The UTF-8 string "NoiseSocketInit1"
137 | * The initial message's `negotiation_data_len`
138 | * The initial message's `negotiation_data`
139 |
140 | If the responder changes the Noise protocol, the prologue is set to the UTF-8 string "NoiseSocketInit2" followed by all bytes received and transmitted prior to the `noise_message_len`. This consists of the following values concatenated together:
141 |
142 | * The UTF-8 string "NoiseSocketInit2"
143 | * The initial message's `negotiation_data_len`
144 | * The initial message's `negotiation_data`
145 | * The initial message's `noise_message_len`
146 | * The initial message's `noise_message`
147 | * The responding message's `negotiation_data_len`
148 | * The responding message's `negotiation_data`
149 |
150 |
151 | 5. API
152 | ======
153 |
154 | The initiator uses the following functions during the handshake phase. These functions are described in the order they would typically be used to send the initial handshake message and process the first response. In particular, the initiator would "peek" at the negotiation data in the first response message, then decide whether reinitialization is necessary (if the negotiation data indicates a reinitialization request or a fallback message).
155 |
156 | **`Initialize`**:
157 |
158 | * INPUT: pattern, dh, cipher, hash
159 | * OUTPUT: session object
160 |
161 | **`WriteHandshakeMessage`**:
162 |
163 | * INPUT: negotiation_data, message_body, padded_len
164 | - `negotiation_data` is zero-length if omitted
165 | - `message_body` is zero-length if omitted
166 | - If this message has an encrypted payload and `noise_message_len` would be less than `padded_len`, padding is added to make `noise_message_len` equal `padded_len`.
167 | * OUTPUT: handshake_message
168 |
169 | **`PeekHandshakeMessage`**:
170 |
171 | * INPUT: handshake_message
172 | * OUTPUT: negotiation_data
173 |
174 | **`Reinitialize`**:
175 |
176 | * INPUT: fallback pattern or reinitialization pattern, dh, cipher, hash
177 | * OUTPUT: session object
178 |
179 | **`ReadHandshakeMessage`**:
180 |
181 | * INPUT: handshake_message
182 | * OUTPUT: message_body
183 |
184 | The server will use the same functions, except it will first "peek" at the initial message, then call `Initialize` if it is accepting the initial protocol, or `Reinitialize` if it is changing protocols with a fallback message or reinitialization request.
185 |
186 | If the responder is sending an explicit rejection or reinitialization request, it will use the following function:
187 |
188 | **`WriteEmptyHandshakeMessage`**:
189 |
190 | * INPUT: negotiation_data
191 | * OUTPUT: handshake_message
192 |
193 | Following the first exchange of handshake messages, the parties will continue calling `ReadHandshakeMessage` and `WriteHandshakeMessage` until the handshake is complete.
194 |
195 | After the handshake is complete, both parties will call `WriteMessage` and `ReadMessage` to send transport messages. Every call to `WriteMessage` will produce a NoiseSocket transport message, and every call to `ReadMessage` will decrypt a NoiseSocket transport message and return its body.
196 |
197 | \newpage
198 |
199 | **`WriteMessage`**:
200 |
201 | * INPUT: message_body, padded_len
202 | - `padded_len` is zero (no padding) if omitted
203 | - If `noise_message_len` would be less than `padded_len`, padding is added to make `noise_message_len` equal `padded_len`.
204 | * OUTPUT: transport_message
205 |
206 | **`ReadMessage`**:
207 |
208 | * INPUT: transport_message
209 | * OUTPUT: message_body
210 |
211 |
212 | 6. IPR
213 | ========
214 |
215 | The NoiseSocket specification (this document) is hereby placed in the public domain.
216 |
217 | 7. Acknowledgements
218 | ========
219 |
220 | Thanks to Rhys Weatherley for helpful discussion.
221 |
222 | 8. References
223 | ========
224 |
--------------------------------------------------------------------------------
/ieee-with-url.csl:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/output/noisesocket.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | The NoiseSocket Protocol
11 |
12 |
13 |
14 |
15 |
22 |
23 |
Table of Contents
24 |
39 |
40 | Abstract
41 | NoiseSocket is an extension of the Noise Protocol Framework that enables quick and seamless secure connections with minimal code size, small keys, modern ciphers and hash functions, and extremely fast speed. It can be used with raw public keys instead of X.509 infrastructure and targets IoT devices, microservices, and back-end applications such as datacenter-to-datacenter communications.
42 |
43 | 1. Overview
44 | The Noise Protocol Framework [1 ] describes simple Noise protocols . A Noise protocol sends a fixed sequence of handshake messages based on a fixed set of cryptographic choices. In some situations this is too rigid, and the responder needs flexibility to accept or reject the initiator's Noise protocol choice, or make its own choice based on options offered by the initiator.
45 | The NoiseSocket framework allows the initiator and responder to negotiate a particular Noise protocol. This is a two-step process:
46 |
47 | The initiator begins executing an initial Noise protocol and sends an initial Noise handshake message. As a preamble to this message, the initiator can send some negotiation data which indicates the initial Noise protocol and can advertise support for other Noise protocols.
48 | The responder can accept the initiator's choice of initial Noise protocol, change to a different Noise protocol, or reject the initiator's message entirely. The responder indicates this choice by sending some negotiation data back to the initiator, or closing the connection.
49 |
50 | NoiseSocket doesn't specify the contents of negotiation data, since different applications will encode versions and advertise protocol support in different ways. NoiseSocket just defines a message format to transport this data, and APIs to access it.
51 | NoiseSocket handles two other low-level issues:
52 |
53 | NoiseSocket defines length fields for all messages, so NoiseSocket messages can be used with stream-based protocols like TCP.
54 | NoiseSocket defines padding fields which are included in every ciphertext, so that applications can pad their messages to avoid revealing plaintext lengths to an eavesdropper.
55 |
56 |
57 | A NoiseSocket protocol begins with a handshake phase . During the handshake phase each NoiseSocket message contains a single handshake message from some underlying Noise protocol, plus optional negotiation data.
58 | After the handshake completes, NoiseSocket enters the transport phase where each NoiseSocket message contains a transport message from some underlying Noise protocol.
59 | All transport messages and some handshake messages contain an encrypted Noise payload . Each encrypted payload contains a plaintext with a body (its actual contents) followed by padding .
60 | The following sections describe the format for NoiseSocket handshake and transport messages, and encrypted payloads.
61 | 2.1. Handshake messages
62 | All NoiseSocket handshake messages have the same structure:
63 |
64 | negotiation_data_len (2 bytes)
65 | negotiation_data
66 | noise_message_len (2 bytes)
67 | noise_message
68 |
69 | The negotiation_data_len and noise_message_len fields are 2-byte unsigned integers, encoded in big-endian, that store the number of bytes for the following negotiation_data and noise_message fields.
70 | 2.2. Transport messages
71 | All NoiseSocket transport messages have the same structure:
72 |
73 | noise_message_len (2 bytes)
74 | noise_message
75 |
76 | The noise_message_len field is a 2-byte unsigned integer, encoded in big-endian, that stores the number of bytes for the following noise_message field.
77 | 2.3. Encrypted payloads
78 | Some Noise messages will carry an encrypted payload. When this payload is decrypted, the plaintext will have the following structure:
79 |
80 | body_len (2 bytes)
81 | body
82 | padding
83 |
84 | The body_len field is a 2-byte unsigned integer, encoded in big-endian, that stores the number of bytes for the following body field. Following the body field the remainder of the plaintext will be padding bytes, which may contain arbitrary data and must be ignored by the recipient.
85 | 3. Negotiation
86 | The initiator will choose the initial underlying Noise protocol, and will indicate this to the responder using the negotiation_data field.
87 | Upon receiving an initial NoiseSocket message, the responder has five options:
88 |
89 | Silent rejection : The responder closes the network connection.
90 | Explicit rejection : The responder sends a single NoiseSocket handshake message. The negotiation_data field must be non-empty and contain an error message. The noise_message field must be empty. After sending this message, the responder closes the network connection.
91 | Acceptance : The responder sends a NoiseSocket handshake message containing the next handshake message in the initial Noise protocol. The negotiation_data field must be empty.
92 | Change protocol and send fallback message : The responder sends a NoiseSocket handshake message containing a handshake message from a new Noise protocol, different from the initial Noise protocol. The negotiation_data field must be non-empty. The noise_message field must be non-empty.
93 | Change protocol and send reinitialization request : The responder requests the initiator to send a NoiseSocket handshake message containing a handshake message from a new Noise protocol, different from the initial Noise protocol. The negotiation_data field must be non-empty. The noise_message field must be empty.
94 |
95 | The initiator's first negotiation_data field must indicate the initial Noise protocol and what other Noise protocols the initiator can support. How this is encoded is up to the application.
96 | If the responder's first negotiation_data field is empty, then the initial protocol was accepted. If the field is non-empty, it must encode values that distinguish betwen the "explicit rejection", "fallback", and "reinitialization request" cases. In the first case, the negotiation_data must encode an error message. In the latter two cases, the negotiation_data must encode the Noise protocol the initiator should fallback to or reinitialize with.
97 | When the initiator receives the first NoiseSocket response message, and for all later handshake messages received by both parties, the only options are silent rejection, explicit rejection, or acceptance.
98 | Example negotiation flows:
99 |
100 | It's easy for the responder to change symmetric crypto options using a fallback protocol. For example, if the initial Noise protocol is Noise_XX_25519_AESGCM_SHA256, the responder can fallback to Noise_XX+fallback_25519_ChaChaPoly_BLAKE2s. This reuses the ephemeral public key from the initiator's initial message.
101 | If the initiator attempts 0-RTT encryption that the responder fails to decrypt, the responder can use a fallback protocol. For example, if the initial Noise protocol is Noise_IK_25519_AESGCM_SHA256, the responder can fallback to Noise_XX+fallback_25519_AESGCM_SHA256. This reuses the ephemeral public key from the initiator's initial message.
102 | If the responder wants to use a DH function that the initiator supports but did not send an ephemeral public key for, in the initial message, then the responder might need to request reinitialization. For example, if the initial Noise protocol is Noise_XX_25519_AESGCM_SHA256, the responder can request reinitialization to Noise_XX_448_AESGCM_SHA256, causing the initiator to respond with a NoiseSocket message containing the initial message from the Noise_XX pattern with a Curve448 ephemeral public key.
103 |
104 | 4. Prologue
105 | Noise protocols take a prologue input. The prologue is cryptographically authenticated to make sure both parties have the same view of it.
106 | The prologue for the initial Noise protocol is set to the UTF-8 string "NoiseSocketInit1" followed by all bytes transmitted prior to the noise_message_len. This consists of the following values concatenated together:
107 |
108 | The UTF-8 string "NoiseSocketInit1"
109 | The initial message's negotiation_data_len
110 | The initial message's negotiation_data
111 |
112 | If the responder changes the Noise protocol, the prologue is set to the UTF-8 string "NoiseSocketInit2" followed by all bytes received and transmitted prior to the noise_message_len. This consists of the following values concatenated together:
113 |
114 | The UTF-8 string "NoiseSocketInit2"
115 | The initial message's negotiation_data_len
116 | The initial message's negotiation_data
117 | The initial message's noise_message_len
118 | The initial message's noise_message
119 | The responding message's negotiation_data_len
120 | The responding message's negotiation_data
121 |
122 | 5. API
123 | The initiator uses the following functions during the handshake phase. These functions are described in the order they would typically be used to send the initial handshake message and process the first response. In particular, the initiator would "peek" at the negotiation data in the first response message, then decide whether reinitialization is necessary (if the negotiation data indicates a reinitialization request or a fallback message).
124 | Initialize :
125 |
126 | INPUT: pattern, dh, cipher, hash
127 | OUTPUT: session object
128 |
129 | WriteHandshakeMessage :
130 |
131 | INPUT: negotiation_data, message_body, padded_len
132 |
133 | negotiation_data is zero-length if omitted
134 | message_body is zero-length if omitted
135 | If this message has an encrypted payload and noise_message_len would be less than padded_len, padding is added to make noise_message_len equal padded_len.
136 |
137 | OUTPUT: handshake_message
138 |
139 | PeekHandshakeMessage :
140 |
141 | INPUT: handshake_message
142 | OUTPUT: negotiation_data
143 |
144 | Reinitialize :
145 |
146 | INPUT: fallback pattern or reinitialization pattern, dh, cipher, hash
147 | OUTPUT: session object
148 |
149 | ReadHandshakeMessage :
150 |
151 | INPUT: handshake_message
152 | OUTPUT: message_body
153 |
154 | The server will use the same functions, except it will first "peek" at the initial message, then call Initialize if it is accepting the initial protocol, or Reinitialize if it is changing protocols with a fallback message or reinitialization request.
155 | If the responder is sending an explicit rejection or reinitialization request, it will use the following function:
156 | WriteEmptyHandshakeMessage :
157 |
158 | INPUT: negotiation_data
159 | OUTPUT: handshake_message
160 |
161 | Following the first exchange of handshake messages, the parties will continue calling ReadHandshakeMessage and WriteHandshakeMessage until the handshake is complete.
162 | After the handshake is complete, both parties will call WriteMessage and ReadMessage to send transport messages. Every call to WriteMessage will produce a NoiseSocket transport message, and every call to ReadMessage will decrypt a NoiseSocket transport message and return its body.
163 |
164 | WriteMessage :
165 |
166 | INPUT: message_body, padded_len
167 |
168 | padded_len is zero (no padding) if omitted
169 | If noise_message_len would be less than padded_len, padding is added to make noise_message_len equal padded_len.
170 |
171 | OUTPUT: transport_message
172 |
173 | ReadMessage :
174 |
175 | INPUT: transport_message
176 | OUTPUT: message_body
177 |
178 | 6. IPR
179 | The NoiseSocket specification (this document) is hereby placed in the public domain.
180 | 7. Acknowledgements
181 | Thanks to Rhys Weatherley for helpful discussion.
182 | 8. References
183 |
188 |
189 |
--------------------------------------------------------------------------------
/test_vectors.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NoiseSocket",
3 | "init_prologue": "101c4e6f6973655f58585f32353531395f41455347434d5f5348413235361d4e6f6973655f58585f32353531395f41455347434d5f424c414b4532621c4e6f6973655f58585f32353531395f41455347434d5f5348413531321d4e6f6973655f58585f32353531395f41455347434d5f424c414b453273204e6f6973655f58585f32353531395f436861436861506f6c795f534841323536214e6f6973655f58585f32353531395f436861436861506f6c795f424c414b453262204e6f6973655f58585f32353531395f436861436861506f6c795f534841353132214e6f6973655f58585f32353531395f436861436861506f6c795f424c414b4532731c4e6f6973655f494b5f32353531395f41455347434d5f5348413235361d4e6f6973655f494b5f32353531395f41455347434d5f424c414b4532621c4e6f6973655f494b5f32353531395f41455347434d5f5348413531321d4e6f6973655f494b5f32353531395f41455347434d5f424c414b453273204e6f6973655f494b5f32353531395f436861436861506f6c795f534841323536214e6f6973655f494b5f32353531395f436861436861506f6c795f424c414b453262204e6f6973655f494b5f32353531395f436861436861506f6c795f534841353132214e6f6973655f494b5f32353531395f436861436861506f6c795f424c414b453273",
4 | "init_static": "0001020300010203000102030001020300010203000102030001020300010203",
5 | "init_ephemeral": "0001000100010001000100010001000100010001000100010001000100010001",
6 | "init_remote_static": "7f1844536de13929d289ed6e904e080f9e44cad25edd1fb2cd03a8758df2b527",
7 | "resp_static": "0001020304000102030400010203040001020304000102030400010203040001",
8 | "resp_ephemeral": "0001020001020001020001020001020001020001020001020001020001020001",
9 | "initial_message": "07081c4e6f6973655f58585f32353531395f41455347434d5f53484132353600206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e771d4e6f6973655f58585f32353531395f41455347434d5f424c414b45326200206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e771c4e6f6973655f58585f32353531395f41455347434d5f53484135313200206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e771d4e6f6973655f58585f32353531395f41455347434d5f424c414b45327300206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77204e6f6973655f58585f32353531395f436861436861506f6c795f53484132353600206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77214e6f6973655f58585f32353531395f436861436861506f6c795f424c414b45326200206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77204e6f6973655f58585f32353531395f436861436861506f6c795f53484135313200206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77214e6f6973655f58585f32353531395f436861436861506f6c795f424c414b45327300206e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e771c4e6f6973655f494b5f32353531395f41455347434d5f534841323536007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77ded33f2edf815b80a131f4aa4bccd0ff6ba435af788d31c8b3ded3d2e125ca10612a1ba16321d54abf0859f8dc7f9e0668630e67d96630061d31ff896256b90d3316afff955959a0827189e6af40a10aa1766f042b321a2b22e3018590331d4e6f6973655f494b5f32353531395f41455347434d5f424c414b453262007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e7717451186a32c7e6daf4ac9a94193e693ea9e83cae1446cef4ea45f545ba07f521f7fb8cac87f8ea1e0deb2b4486aad006bb0282a755347160fc340793958276e59786b09839015df030d5f63a0672a0b102cd8930b07ec768ef99f3d70781c4e6f6973655f494b5f32353531395f41455347434d5f534841353132007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e777f89a3bf0ec848072b6afc56215d705e4e6e7148336af16dc3b0eaf82745ab96d8a41ac8ee06df2356e284c93c565aa5087376b2b04beb3680afd499b5bd9542881d18756783706d97f3786b6068b6ce595f652953290db4b994417a9ed41d4e6f6973655f494b5f32353531395f41455347434d5f424c414b453273007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e7791ffd98836d76a63b1ae6cf7c8d152bc8d1bf91af7e3db5a04721e8a1432814e1697054ce5a625e6c94191146c4a93ccf00e3eb37f287157f9990a5b841d7df4f34891082ee00736986bf19c7943ee60fad68a3954216405137b8108b825204e6f6973655f494b5f32353531395f436861436861506f6c795f534841323536007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e777c5e631b5fd5e369983f6a083743be4c0a0bb51327878ccb91aa05222b51ed832510c7e6d122452985654f8b44470099d07abff359645161d2483381850fba2b43910dbdcc86a5f58152cf87ddec06af49292639b878913276873f28e1d2214e6f6973655f494b5f32353531395f436861436861506f6c795f424c414b453262007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e7710808dd51c7ebd4e9beab9e8c46b2a7cad34fb3ad9b78d855c3af2367c1b480393d78e73dbb65f79ae21ec14051554df296f9208723d424a523ae3dd6c7b554bdb47feaf7d0bc8b4b1b7192c0f12554fdd869c24290ef528eb72bebd889a204e6f6973655f494b5f32353531395f436861436861506f6c795f534841353132007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77af9ed1cbc554ac6507691741749ed940c92dca6d1510059b599e373b1e6d612bab02e72c9cff7d0da1a5c01277eeb7511e88da5cab50d8317f667f90e7b4876835396d02deded3a022a61707d398d15e1a8d8ee12f33c0bc5853f8e405c4214e6f6973655f494b5f32353531395f436861436861506f6c795f424c414b453273007e6e230d8b0503d567a6be48ec5d0cb6f97979784ae6de477a2096c0bdaa6a9e77088ed6a74cba961243cee1fc1cd76497457a5746d95082553d4948e3ac4b5417ffcd47a0d9997d6c2f88eeef0d2339be0867f7b452b5baac1fe0554d40ec07c923a105c66ed7775a1080e3850373345eccebfc2fab9ecc812a4e8223f8a3",
10 | "protocols": [
11 | "Noise_XX_25519_AESGCM_SHA256",
12 | "Noise_XX_25519_AESGCM_BLAKE2b",
13 | "Noise_XX_25519_AESGCM_SHA512",
14 | "Noise_XX_25519_AESGCM_BLAKE2s",
15 | "Noise_XX_25519_ChaChaPoly_SHA256",
16 | "Noise_XX_25519_ChaChaPoly_BLAKE2b",
17 | "Noise_XX_25519_ChaChaPoly_SHA512",
18 | "Noise_XX_25519_ChaChaPoly_BLAKE2s",
19 | "Noise_IK_25519_AESGCM_SHA256",
20 | "Noise_IK_25519_AESGCM_BLAKE2b",
21 | "Noise_IK_25519_AESGCM_SHA512",
22 | "Noise_IK_25519_AESGCM_BLAKE2s",
23 | "Noise_IK_25519_ChaChaPoly_SHA256",
24 | "Noise_IK_25519_ChaChaPoly_BLAKE2b",
25 | "Noise_IK_25519_ChaChaPoly_SHA512",
26 | "Noise_IK_25519_ChaChaPoly_BLAKE2s"
27 | ],
28 | "sessions": [
29 | {
30 | "index": 0,
31 | "pattern": "XX",
32 | "dh": "25519",
33 | "cipher": "AESGCM",
34 | "hash": "SHA256",
35 | "handshake_hash": "3b44b1f231e67ee0bd0ec1fa5c8cbe35c7db48f4482bfc7ae4c6898924beb1c9",
36 | "messages": [
37 | {
38 | "payload": "",
39 | "fields": null
40 | },
41 | {
42 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
43 | "fields": [
44 | {
45 | "Type": 1024,
46 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
47 | }
48 | ],
49 | "packet": "007d009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a48e9839afd84d5df2f70ceca8ad5236c18a398c2fd739f6bf9d5671e1534d21f02d943bd4dee25f03311c812a54e28b6b00b0d030b69c817b22051cb8a371a5c3656666663dac517548a978066c2a686f44a214b685eb0ab49f0b9e2"
50 | },
51 | {
52 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
53 | "fields": [
54 | {
55 | "Type": 1024,
56 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
57 | }
58 | ],
59 | "packet": "005e5a02b1c707786c72897fbe7eb0a288593d15f5992b7d3112d7da33bd518ef31551db2e9224a3797cd4a7b25355e7768b1bd635e932118b5bb2245274c8c920b8290d09cba59bb5fbb8815975b51aa1af3e20e27e05febd16b75031df95ea"
60 | },
61 | {
62 | "payload": "000d00006797c68ed7ba6c4f7c1d94000700010000000000",
63 | "fields": [
64 | {
65 | "Type": 0,
66 | "Data": "6797c68ed7ba6c4f7c1d94"
67 | },
68 | {
69 | "Type": 1,
70 | "Data": "0000000000"
71 | }
72 | ],
73 | "packet": "00285aa201e9a158e10459efe9629bccb04e15b631aa45d8ec568d9e2e0c3627d83a0bb2f700b2b75999"
74 | },
75 | {
76 | "payload": "000f000078386c14fe4f4cc2bb949653cf00050001000000",
77 | "fields": [
78 | {
79 | "Type": 0,
80 | "Data": "78386c14fe4f4cc2bb949653cf"
81 | },
82 | {
83 | "Type": 1,
84 | "Data": "000000"
85 | }
86 | ],
87 | "packet": "002862608c992e84ea89175f66cfad65ab9801919f0ef0db7dce56f655d06e2d64cb374f31447860a056"
88 | },
89 | {
90 | "payload": "000d000087871fb0a634905cb0428e000700010000000000",
91 | "fields": [
92 | {
93 | "Type": 0,
94 | "Data": "87871fb0a634905cb0428e"
95 | },
96 | {
97 | "Type": 1,
98 | "Data": "0000000000"
99 | }
100 | ],
101 | "packet": "0028ee443bf2dbcbbdab052c8a4a3b86660a7281ada98ac84da5c71c50c74508e952442c42bfa791eb9e"
102 | },
103 | {
104 | "payload": "000f0000d9b9c561f2820c5cc71d653ff900050001000000",
105 | "fields": [
106 | {
107 | "Type": 0,
108 | "Data": "d9b9c561f2820c5cc71d653ff9"
109 | },
110 | {
111 | "Type": 1,
112 | "Data": "000000"
113 | }
114 | ],
115 | "packet": "0028f96c12d222788a2d70195be66d2e25c67d2fc532318efdca1413ba9ff7d2ad55659b5d53cd905259"
116 | }
117 | ]
118 | },
119 | {
120 | "index": 1,
121 | "pattern": "XX",
122 | "dh": "25519",
123 | "cipher": "AESGCM",
124 | "hash": "BLAKE2b",
125 | "handshake_hash": "089c39a76a002c3122d761a52adde63de973d89ab03a1ab6503785ea812dcae9c3aceac0cd0085ea88a83aa0172a92f48a03177b78d929c8555c726ac57e2a12",
126 | "messages": [
127 | {
128 | "payload": "",
129 | "fields": null
130 | },
131 | {
132 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
133 | "fields": [
134 | {
135 | "Type": 1024,
136 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
137 | }
138 | ],
139 | "packet": "007d019f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a9bb2835a6557d896981d5bb858298c1718c478b15c9688fcb470ff8c5f4fa1c935e9c803b83f1e621ec91134d739456bfcd11e7cc8c028b27bbb70ce7c3f4243dfeb9913aacb2454fdaa2272e5b00f16bb054c1918e0dcdde1d9f7a4"
140 | },
141 | {
142 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
143 | "fields": [
144 | {
145 | "Type": 1024,
146 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
147 | }
148 | ],
149 | "packet": "005e476495c37dd895f168e56c9823ed21d51f7c37add00ea37dba93bf4eb96b702e8649e495720561fcbe8ade4af2e223d5f4bf2aafcbe96dcb5068e9dc9301d8b921083e6a182726406d34d24e7c0b003dd1c001d214c472be32c8f9f58d87"
150 | },
151 | {
152 | "payload": "000d000047537ac86dca9aacfef24d000700010000000000",
153 | "fields": [
154 | {
155 | "Type": 0,
156 | "Data": "47537ac86dca9aacfef24d"
157 | },
158 | {
159 | "Type": 1,
160 | "Data": "0000000000"
161 | }
162 | ],
163 | "packet": "0028b4238b5724a8b31694e313250816c05512e0695c0267da85f423c9d0e43d89a77aa33ae34840e94f"
164 | },
165 | {
166 | "payload": "000f0000a2a409f071f8ebaf191f59befb00050001000000",
167 | "fields": [
168 | {
169 | "Type": 0,
170 | "Data": "a2a409f071f8ebaf191f59befb"
171 | },
172 | {
173 | "Type": 1,
174 | "Data": "000000"
175 | }
176 | ],
177 | "packet": "0028f3d64923d2fefc556b506b6b2905e01d5a6e59b2813a02a821161de49fcbd4f61eca6a911bb1d359"
178 | },
179 | {
180 | "payload": "000d0000451f2b765bb2c3b73c49ff000700010000000000",
181 | "fields": [
182 | {
183 | "Type": 0,
184 | "Data": "451f2b765bb2c3b73c49ff"
185 | },
186 | {
187 | "Type": 1,
188 | "Data": "0000000000"
189 | }
190 | ],
191 | "packet": "002822823c6bcdd22dea71f0be9e351b4e4dbef80e0bddabf03589903852cc1b0430f8798c8b06c433bd"
192 | },
193 | {
194 | "payload": "000f00006cac0a4203d8b8efaed87d9d4a00050001000000",
195 | "fields": [
196 | {
197 | "Type": 0,
198 | "Data": "6cac0a4203d8b8efaed87d9d4a"
199 | },
200 | {
201 | "Type": 1,
202 | "Data": "000000"
203 | }
204 | ],
205 | "packet": "00287750240b1ec1d6330f3a196db780046572bb2ace4f0fd0925c4b7031cb302dacbf7927f6a6991609"
206 | }
207 | ]
208 | },
209 | {
210 | "index": 2,
211 | "pattern": "XX",
212 | "dh": "25519",
213 | "cipher": "AESGCM",
214 | "hash": "SHA512",
215 | "handshake_hash": "d72f88fc688265d18e9b2905dfb6a9ccb73cc282bace23c9386942e6f90a7abf06b4bd65406aa186528ac75147035a1271a73e672e33fb5bce504e1ba4ee12cd",
216 | "messages": [
217 | {
218 | "payload": "",
219 | "fields": null
220 | },
221 | {
222 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
223 | "fields": [
224 | {
225 | "Type": 1024,
226 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
227 | }
228 | ],
229 | "packet": "007d029f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a7c8d8234d7c888305ff4f2d3ad610c99e5eae374216f9da46078ad01a14a7f82bce0a78d200c8417ce256ed48db0b7fc556c229f0758c31599af9edff3b20d579bbee6274636210d69be04d075bdfe9fb0481b1dcff78675f14f3dc2"
230 | },
231 | {
232 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
233 | "fields": [
234 | {
235 | "Type": 1024,
236 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
237 | }
238 | ],
239 | "packet": "005e5ff72f3c0fd52f7c095aa3341174d950f0e0fa62344b57425b0a82f3c9b8f98ea5ee999b7562c6092458361ec9bb02506e1003e6a6e8aa6d0d5307847bb523dc85d18e32278c33172d981e948fab5e510fad7ade2f6d0bd001cdd6553a85"
240 | },
241 | {
242 | "payload": "000d000044620781c920e7e8b55789000700010000000000",
243 | "fields": [
244 | {
245 | "Type": 0,
246 | "Data": "44620781c920e7e8b55789"
247 | },
248 | {
249 | "Type": 1,
250 | "Data": "0000000000"
251 | }
252 | ],
253 | "packet": "00289ef08bf2925c555effd787a470f3f176c9301de2764d3870ee11165d113eca783b9bd787a438e711"
254 | },
255 | {
256 | "payload": "000f0000d2fa4a46702718ce626030b05500050001000000",
257 | "fields": [
258 | {
259 | "Type": 0,
260 | "Data": "d2fa4a46702718ce626030b055"
261 | },
262 | {
263 | "Type": 1,
264 | "Data": "000000"
265 | }
266 | ],
267 | "packet": "0028094577c7191e945ff822d7d6fa816da9d399372dd530c84d87c1d87c5a38a3e97b1633cffd8d51e5"
268 | },
269 | {
270 | "payload": "000d00007d924f94164e4cb75b9e05000700010000000000",
271 | "fields": [
272 | {
273 | "Type": 0,
274 | "Data": "7d924f94164e4cb75b9e05"
275 | },
276 | {
277 | "Type": 1,
278 | "Data": "0000000000"
279 | }
280 | ],
281 | "packet": "002875d064b8f82dd05e5559cb2f9db77c9e61fc64edbede5d21c411f5a37c83a852ce8ed0f20aaf1b09"
282 | },
283 | {
284 | "payload": "000f0000837af78a57662b007f5872eaad00050001000000",
285 | "fields": [
286 | {
287 | "Type": 0,
288 | "Data": "837af78a57662b007f5872eaad"
289 | },
290 | {
291 | "Type": 1,
292 | "Data": "000000"
293 | }
294 | ],
295 | "packet": "00286518e0f1b2767ccff52511e52e232ec33f4359afbc8f92cf6d3e83b00df99802e693701e0fde77b2"
296 | }
297 | ]
298 | },
299 | {
300 | "index": 3,
301 | "pattern": "XX",
302 | "dh": "25519",
303 | "cipher": "AESGCM",
304 | "hash": "BLAKE2s",
305 | "handshake_hash": "41fcfaf0846924c1ab3ebeeeed173352e5c7fe2899ca376da9f787bec5621d08",
306 | "messages": [
307 | {
308 | "payload": "",
309 | "fields": null
310 | },
311 | {
312 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
313 | "fields": [
314 | {
315 | "Type": 1024,
316 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
317 | }
318 | ],
319 | "packet": "007d039f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a19228d756fa4f2776e5f70b2b9462b7a8ad3b670817a948808476d6757f7a387dd76b95bf580b3e189ba1f57a4555cce03f8d0cd4e1db1df45e2b36cbd7132c9454f74aad5cf132f855992ebb0830666bdf2489e03e4cd76f4c637bc"
320 | },
321 | {
322 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
323 | "fields": [
324 | {
325 | "Type": 1024,
326 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
327 | }
328 | ],
329 | "packet": "005e671642ea9deab04a02b17eb4c564c355702f8dd4fc8d645f2c2daf6c9969c556ed3fb820cbbfd0daec129f3bf0f4cfb46b8a88b9699d17902f76cceece03bca302e4cd43981a52cd2701325ac9806143d492062d2678d32f7b9a9652a0b9"
330 | },
331 | {
332 | "payload": "000d0000fcfb839e69fde6ea765c99000700010000000000",
333 | "fields": [
334 | {
335 | "Type": 0,
336 | "Data": "fcfb839e69fde6ea765c99"
337 | },
338 | {
339 | "Type": 1,
340 | "Data": "0000000000"
341 | }
342 | ],
343 | "packet": "00285f4051c933bb1f1becdbcef9ac77f278a6059fcf1f4e6131bcb07442d888650d0d5c1e5f10243843"
344 | },
345 | {
346 | "payload": "000f000016fe35a3d5674352e6da6a5a5200050001000000",
347 | "fields": [
348 | {
349 | "Type": 0,
350 | "Data": "16fe35a3d5674352e6da6a5a52"
351 | },
352 | {
353 | "Type": 1,
354 | "Data": "000000"
355 | }
356 | ],
357 | "packet": "002835bffa418324d5c3d1582095333e4d25685f51e7b6efe530056979bad7339335a6adb9754499ce69"
358 | },
359 | {
360 | "payload": "000d0000e09e770f381f29f078564b000700010000000000",
361 | "fields": [
362 | {
363 | "Type": 0,
364 | "Data": "e09e770f381f29f078564b"
365 | },
366 | {
367 | "Type": 1,
368 | "Data": "0000000000"
369 | }
370 | ],
371 | "packet": "00280855410edc55f2fa87754f5c0f9eff90efca2d82258d39ade98599bbc466231cf652b48e292cbd36"
372 | },
373 | {
374 | "payload": "000f000062cbbd3e4f6300a7f5ba214cd500050001000000",
375 | "fields": [
376 | {
377 | "Type": 0,
378 | "Data": "62cbbd3e4f6300a7f5ba214cd5"
379 | },
380 | {
381 | "Type": 1,
382 | "Data": "000000"
383 | }
384 | ],
385 | "packet": "00287de9f7412bba5e3f480be1e710fdfb93b224694793fef0b8c98d7519cd2e0b97b31d98eac362ae0d"
386 | }
387 | ]
388 | },
389 | {
390 | "index": 4,
391 | "pattern": "XX",
392 | "dh": "25519",
393 | "cipher": "ChaChaPoly",
394 | "hash": "SHA256",
395 | "handshake_hash": "59b90a690f5612a2be75f3e9bb8932cbe2239f2deeb49f2d809e0c1a0ff631e9",
396 | "messages": [
397 | {
398 | "payload": "",
399 | "fields": null
400 | },
401 | {
402 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
403 | "fields": [
404 | {
405 | "Type": 1024,
406 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
407 | }
408 | ],
409 | "packet": "007d049f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3af130d0113b994a37340a034d95a8f2c9774e23331c144b8065e940ee1e7a169de6a77073f64ca97f621d6e34ff3b847a390ee2ec285cde256830f2470572fb87fc225bb858551b8a170270ffeccf4146d924b6fc1156276bc5f2ad1f"
410 | },
411 | {
412 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
413 | "fields": [
414 | {
415 | "Type": 1024,
416 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
417 | }
418 | ],
419 | "packet": "005e29a69a0736f6f7f6908b59c1fde62737ac6d1d4eea10e997e04e096c8e6611682a279fa60c8a44a8f71fbf74705e305c1ab373a4a40e0142dc40cc8fb14100e6751b95a6aeb01c3ac2cc3fa6c52ed99f1ed32b38fbac32e5a328b6d386d2"
420 | },
421 | {
422 | "payload": "000d000010a7761ab22c9874d36ca1000700010000000000",
423 | "fields": [
424 | {
425 | "Type": 0,
426 | "Data": "10a7761ab22c9874d36ca1"
427 | },
428 | {
429 | "Type": 1,
430 | "Data": "0000000000"
431 | }
432 | ],
433 | "packet": "00283cf01776a7dce50307b17a3a4958f7e2ac5884a6e7e956dc3b75b10812344721d57874ba8d4cf9a4"
434 | },
435 | {
436 | "payload": "000f0000e3c3970c811e1adf10aea2fa8700050001000000",
437 | "fields": [
438 | {
439 | "Type": 0,
440 | "Data": "e3c3970c811e1adf10aea2fa87"
441 | },
442 | {
443 | "Type": 1,
444 | "Data": "000000"
445 | }
446 | ],
447 | "packet": "00287c62a6774c205e186d99137ec5a486d363c981bf8eaf413e5b1a00a9200d3ed686510c762b228e13"
448 | },
449 | {
450 | "payload": "000d0000cd012f8e98ac162926bdee000700010000000000",
451 | "fields": [
452 | {
453 | "Type": 0,
454 | "Data": "cd012f8e98ac162926bdee"
455 | },
456 | {
457 | "Type": 1,
458 | "Data": "0000000000"
459 | }
460 | ],
461 | "packet": "0028aa183cf6354d265fd483a9e4062a062d2d51d5b6d045c717564684fbadb10e761b228f37acc444c0"
462 | },
463 | {
464 | "payload": "000f000015f9c845a9836c825d7015033d00050001000000",
465 | "fields": [
466 | {
467 | "Type": 0,
468 | "Data": "15f9c845a9836c825d7015033d"
469 | },
470 | {
471 | "Type": 1,
472 | "Data": "000000"
473 | }
474 | ],
475 | "packet": "0028bf5b3513565825bde6fc30c703af04503523e289292414fb148c1d28edf21f22d34a2567029a451d"
476 | }
477 | ]
478 | },
479 | {
480 | "index": 5,
481 | "pattern": "XX",
482 | "dh": "25519",
483 | "cipher": "ChaChaPoly",
484 | "hash": "BLAKE2b",
485 | "handshake_hash": "fe1b12645c8db87746ae55c6776baa570edcd888a83768f7825d4353487d3c01a2b90ea443db049d2ad771a28a369189e12eab27a852ab1453cfa62a19c5a3ed",
486 | "messages": [
487 | {
488 | "payload": "",
489 | "fields": null
490 | },
491 | {
492 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
493 | "fields": [
494 | {
495 | "Type": 1024,
496 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
497 | }
498 | ],
499 | "packet": "007d059f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a6813b26874d1a4d73ddcacc5716fc298f34bd1338ce9f9a4499a4fbee2366a07f4a6591c33cf66533dcd7f9067c3a029613336081168bd048de625206de89d0c9b2f4bf96404ab385d3f54891764df9828e19a87c03915abd25ffc2c"
500 | },
501 | {
502 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
503 | "fields": [
504 | {
505 | "Type": 1024,
506 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
507 | }
508 | ],
509 | "packet": "005e96fc80bc903ada8b80d1652a9562d7cc9ec6c5c325e3d28b50fcba766fd1cdee0b91faf560fcc44eaa6e409720f0e0b4e8e1efdde2fc8f123fd016ebe79747c18dde32d74f970bad9ee5a0b87bdb799c66c0c40d0cb64abbcc75f5b2cf1b"
510 | },
511 | {
512 | "payload": "000d00005a0910e060f91a0157cb96000700010000000000",
513 | "fields": [
514 | {
515 | "Type": 0,
516 | "Data": "5a0910e060f91a0157cb96"
517 | },
518 | {
519 | "Type": 1,
520 | "Data": "0000000000"
521 | }
522 | ],
523 | "packet": "0028b6f0f2c9e748f542eba4f63625ef01dc255fa9a07b05f311387b2891677aa37243a81f7add2c9509"
524 | },
525 | {
526 | "payload": "000f0000aba4ca74402807c5c1c4f3912d00050001000000",
527 | "fields": [
528 | {
529 | "Type": 0,
530 | "Data": "aba4ca74402807c5c1c4f3912d"
531 | },
532 | {
533 | "Type": 1,
534 | "Data": "000000"
535 | }
536 | ],
537 | "packet": "002831889aa32491f67dfd425a729d1fe2ac63a915792441d3209652b3e480086cfe14f0698c52345378"
538 | },
539 | {
540 | "payload": "000d000097a24735c5ff94becc5142000700010000000000",
541 | "fields": [
542 | {
543 | "Type": 0,
544 | "Data": "97a24735c5ff94becc5142"
545 | },
546 | {
547 | "Type": 1,
548 | "Data": "0000000000"
549 | }
550 | ],
551 | "packet": "00285c80aa6468977dbfb7824e53444dffe539c8dddcdcf5886df94e5b7d3ba6cb7cd63d15823c9facc3"
552 | },
553 | {
554 | "payload": "000f0000a9fc15910c6161921de5074a3a00050001000000",
555 | "fields": [
556 | {
557 | "Type": 0,
558 | "Data": "a9fc15910c6161921de5074a3a"
559 | },
560 | {
561 | "Type": 1,
562 | "Data": "000000"
563 | }
564 | ],
565 | "packet": "00285374a61f9f2c2e16e2df4baed527cbe3a0445e8bbf5c56d06827288d48bf07eb9e406ac301733364"
566 | }
567 | ]
568 | },
569 | {
570 | "index": 6,
571 | "pattern": "XX",
572 | "dh": "25519",
573 | "cipher": "ChaChaPoly",
574 | "hash": "SHA512",
575 | "handshake_hash": "beb140a34947eee5d0a289ae579360ba481b286af7eacda397cce44d78f3f2af82efe007af67f7e7228520e09f1890ac5c3f26e289d93cf4ed4ffbbaa465581f",
576 | "messages": [
577 | {
578 | "payload": "",
579 | "fields": null
580 | },
581 | {
582 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
583 | "fields": [
584 | {
585 | "Type": 1024,
586 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
587 | }
588 | ],
589 | "packet": "007d069f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a11a1b55456eacf471fead7aac2e614ac97a29d13621e9880bb7fc3de2b12442d62a9fc35cea091a99dbffe3ff23aa67c9367acc68b5d3fab46fcc65e23cb8d69d06ca4e79f1a357114ef63371affa976d475c22fd89dd4e5e15a89cf"
590 | },
591 | {
592 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
593 | "fields": [
594 | {
595 | "Type": 1024,
596 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
597 | }
598 | ],
599 | "packet": "005e52c7780f48751543cccb4afa4dcc8fc35ff81f1058f0bceddb4702ccbded8a520bfe88b78a1dfdf9ec4980f7076bde01750757f6fb6f45beba3f3491c4a943f8b4ac19d15210d21e09a680e9610171c93f0ead8b523cc1469ee29216fd2c"
600 | },
601 | {
602 | "payload": "000d0000cc22fb91a0d4cfc70f6195000700010000000000",
603 | "fields": [
604 | {
605 | "Type": 0,
606 | "Data": "cc22fb91a0d4cfc70f6195"
607 | },
608 | {
609 | "Type": 1,
610 | "Data": "0000000000"
611 | }
612 | ],
613 | "packet": "0028fce4b41cb8e4fc5eab46fb2cf9dfb369f15c3748381c8cec4cf5ea94a2d2a57f60dfeefcaa5632fa"
614 | },
615 | {
616 | "payload": "000f00005ae2f5c95dc9c629061c1cb77e00050001000000",
617 | "fields": [
618 | {
619 | "Type": 0,
620 | "Data": "5ae2f5c95dc9c629061c1cb77e"
621 | },
622 | {
623 | "Type": 1,
624 | "Data": "000000"
625 | }
626 | ],
627 | "packet": "0028dd0ef266efb2ceb840ab1c36b083fb132457af1e078925d4dd9c58ee6dc2925290748269561a1c99"
628 | },
629 | {
630 | "payload": "000d0000d76fa652e8eb653efce933000700010000000000",
631 | "fields": [
632 | {
633 | "Type": 0,
634 | "Data": "d76fa652e8eb653efce933"
635 | },
636 | {
637 | "Type": 1,
638 | "Data": "0000000000"
639 | }
640 | ],
641 | "packet": "0028677fa684dbeea3f9f7cc27b7c50d61642a02693738458b776988293cee3717b77dac305f746ae26a"
642 | },
643 | {
644 | "payload": "000f0000df8374f48c5f5f2bd1d0af1cb900050001000000",
645 | "fields": [
646 | {
647 | "Type": 0,
648 | "Data": "df8374f48c5f5f2bd1d0af1cb9"
649 | },
650 | {
651 | "Type": 1,
652 | "Data": "000000"
653 | }
654 | ],
655 | "packet": "002866992731accf9fa330bda073e5f607be706e13f21ce27c3d3e77e003f9e3b146fd9510b264995a1c"
656 | }
657 | ]
658 | },
659 | {
660 | "index": 7,
661 | "pattern": "XX",
662 | "dh": "25519",
663 | "cipher": "ChaChaPoly",
664 | "hash": "BLAKE2s",
665 | "handshake_hash": "254e1dde4c707fa11130981e288c3295fa05d50f926219e2c093d149ec3d065f",
666 | "messages": [
667 | {
668 | "payload": "",
669 | "fields": null
670 | },
671 | {
672 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
673 | "fields": [
674 | {
675 | "Type": 1024,
676 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
677 | }
678 | ],
679 | "packet": "007d079f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3ad4e8d81765eee30028d58fdfb8940ab3baa77963349588fd2b1829a88f1b9f61ea7b69768bf6873b6fc4dea8b1f549da6f924d806d3fa61cd28bdbe381c8a8a4afaba94ace7548c24af97cca547a63239cdf49c636b2b30ad387b930"
680 | },
681 | {
682 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
683 | "fields": [
684 | {
685 | "Type": 1024,
686 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
687 | }
688 | ],
689 | "packet": "005e03cd4aa011897bd4c138606ed1c9e8ce20667b88a4d4ae0adc702ec5474912264993e7fa6b73923ab200fb219ffb74058dd16617aa09abd42582ab7173d6ff8f0c7e2d4300d3a2442a388366474b24c425a2c4f011f9ea94cd7ec2cf9725"
690 | },
691 | {
692 | "payload": "000d00006c21b5710d53a399265ace000700010000000000",
693 | "fields": [
694 | {
695 | "Type": 0,
696 | "Data": "6c21b5710d53a399265ace"
697 | },
698 | {
699 | "Type": 1,
700 | "Data": "0000000000"
701 | }
702 | ],
703 | "packet": "00285c2fa1b9ff15c78d51019a149bbfe25e522aa94ec1cf72f82efd7d3985514d4725a261c23036f1cd"
704 | },
705 | {
706 | "payload": "000f00003e86a7b7b41f1288bbace2013b00050001000000",
707 | "fields": [
708 | {
709 | "Type": 0,
710 | "Data": "3e86a7b7b41f1288bbace2013b"
711 | },
712 | {
713 | "Type": 1,
714 | "Data": "000000"
715 | }
716 | ],
717 | "packet": "00287419563f08c9f43c1053544729d999f6131049cca4e5580fce8e0c7886e3e7e4220c8d4c8cd94d32"
718 | },
719 | {
720 | "payload": "000d0000fa233a23857b5a4c32c7dd000700010000000000",
721 | "fields": [
722 | {
723 | "Type": 0,
724 | "Data": "fa233a23857b5a4c32c7dd"
725 | },
726 | {
727 | "Type": 1,
728 | "Data": "0000000000"
729 | }
730 | ],
731 | "packet": "0028adebb18050dc277717e70d819b39d07bb68412c0f16cc093c4e9dca45af4489a10d66e7e4cb111cc"
732 | },
733 | {
734 | "payload": "000f00009a8a104a59e6df15ded8d4a6e600050001000000",
735 | "fields": [
736 | {
737 | "Type": 0,
738 | "Data": "9a8a104a59e6df15ded8d4a6e6"
739 | },
740 | {
741 | "Type": 1,
742 | "Data": "000000"
743 | }
744 | ],
745 | "packet": "00288e233881d990d1afc08425f50294f197cab2d0c5e387091ca33a2c7a911f04ecd8dd4ab28222e61d"
746 | }
747 | ]
748 | },
749 | {
750 | "index": 8,
751 | "pattern": "IK",
752 | "dh": "25519",
753 | "cipher": "AESGCM",
754 | "hash": "SHA256",
755 | "handshake_hash": "8349776f04925ab666a298f37d692846d0a81ed1c35d0c49e96e4eac5390d2e3",
756 | "messages": [
757 | {
758 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
759 | "fields": [
760 | {
761 | "Type": 1024,
762 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
763 | }
764 | ]
765 | },
766 | {
767 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
768 | "fields": [
769 | {
770 | "Type": 1024,
771 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
772 | }
773 | ],
774 | "packet": "004e08009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3afd77e8b4d64ebf10f2cbe3f13308811b8c4df8d5aad0a69c57bf31041f5294cbf3de154e87adb5aa9cbe31f8"
775 | },
776 | {
777 | "payload": "000d00006ac653fa143ada034b47bd000700010000000000",
778 | "fields": [
779 | {
780 | "Type": 0,
781 | "Data": "6ac653fa143ada034b47bd"
782 | },
783 | {
784 | "Type": 1,
785 | "Data": "0000000000"
786 | }
787 | ],
788 | "packet": "0028f803d58746e50eead24c3f0d2e60a87c3990f8cf56bc5b0b8968dcf72cebc56bfb737a2ed747accd"
789 | },
790 | {
791 | "payload": "000f0000530e80c06d8620154d0513376c00050001000000",
792 | "fields": [
793 | {
794 | "Type": 0,
795 | "Data": "530e80c06d8620154d0513376c"
796 | },
797 | {
798 | "Type": 1,
799 | "Data": "000000"
800 | }
801 | ],
802 | "packet": "0028109f3207645d4b9f73bd8c6563b0cff225c2e2f6fb0d6585ef81354578e4b204c390f2d55c9a86bb"
803 | },
804 | {
805 | "payload": "000d0000923828678c7aede4e9ee27000700010000000000",
806 | "fields": [
807 | {
808 | "Type": 0,
809 | "Data": "923828678c7aede4e9ee27"
810 | },
811 | {
812 | "Type": 1,
813 | "Data": "0000000000"
814 | }
815 | ],
816 | "packet": "0028bc5b55ebdf8895f8af7015413c667682803b6ed4f248bebbb89aae927fc22266ffc9244da488ccb9"
817 | },
818 | {
819 | "payload": "000f0000bff8149d26dd6c6fb4bcee583100050001000000",
820 | "fields": [
821 | {
822 | "Type": 0,
823 | "Data": "bff8149d26dd6c6fb4bcee5831"
824 | },
825 | {
826 | "Type": 1,
827 | "Data": "000000"
828 | }
829 | ],
830 | "packet": "0028a6aa2713447b148dd56a3cee3b8a2566dcd77197c4677cdaca4537ba6e09d5981c28a688fae7a070"
831 | }
832 | ]
833 | },
834 | {
835 | "index": 9,
836 | "pattern": "IK",
837 | "dh": "25519",
838 | "cipher": "AESGCM",
839 | "hash": "BLAKE2b",
840 | "handshake_hash": "4b49b6d316c652d33d9e65119ceea52e4eda593d5daebda36783a162c230ec5e33879297c1d014690dde0ea26c99b783ac8054c8aa2911f3b6c787e23671e308",
841 | "messages": [
842 | {
843 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
844 | "fields": [
845 | {
846 | "Type": 1024,
847 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
848 | }
849 | ]
850 | },
851 | {
852 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
853 | "fields": [
854 | {
855 | "Type": 1024,
856 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
857 | }
858 | ],
859 | "packet": "004e09009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3ae52307c1c61668c73feb8b69690d48feef806dee286e054fd55111116eba31b95fc8d84b466649d100c8c282"
860 | },
861 | {
862 | "payload": "000d000058bb11f615a88bd120bcf2000700010000000000",
863 | "fields": [
864 | {
865 | "Type": 0,
866 | "Data": "58bb11f615a88bd120bcf2"
867 | },
868 | {
869 | "Type": 1,
870 | "Data": "0000000000"
871 | }
872 | ],
873 | "packet": "0028ea5a819e627701bf1bec4fe0569cf6488f0b36be38840336de35c0a4a3807414d80852f0d70b83ae"
874 | },
875 | {
876 | "payload": "000f0000c407a321f49950895d86772e7600050001000000",
877 | "fields": [
878 | {
879 | "Type": 0,
880 | "Data": "c407a321f49950895d86772e76"
881 | },
882 | {
883 | "Type": 1,
884 | "Data": "000000"
885 | }
886 | ],
887 | "packet": "0028ecb94178714013600fab085f794e934a60d58bc1e335188f0657b316fea3ba7de0f60f610a0053f6"
888 | },
889 | {
890 | "payload": "000d0000e184f895ba9e92b7a11350000700010000000000",
891 | "fields": [
892 | {
893 | "Type": 0,
894 | "Data": "e184f895ba9e92b7a11350"
895 | },
896 | {
897 | "Type": 1,
898 | "Data": "0000000000"
899 | }
900 | ],
901 | "packet": "0028af90d441e11984551aeb909e749285bdd447ec9a513be16ae44108d348b8e0f63b8929c5c8dcd166"
902 | },
903 | {
904 | "payload": "000f000068901b98c56ed6877780b7a89f00050001000000",
905 | "fields": [
906 | {
907 | "Type": 0,
908 | "Data": "68901b98c56ed6877780b7a89f"
909 | },
910 | {
911 | "Type": 1,
912 | "Data": "000000"
913 | }
914 | ],
915 | "packet": "00282d5b8c5242115f5512ddf7995265fbc82defbd0c58fcf10805a767c62fb30b01d0ed08102671deb9"
916 | }
917 | ]
918 | },
919 | {
920 | "index": 10,
921 | "pattern": "IK",
922 | "dh": "25519",
923 | "cipher": "AESGCM",
924 | "hash": "SHA512",
925 | "handshake_hash": "9c824d013a5f9700d0efc4b97ab90a7961e6e6873b9015d51426979a4fe7ae4322548aaff9e7227fce34bd953757588a4c574e99456cc1488281be748996e5d3",
926 | "messages": [
927 | {
928 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
929 | "fields": [
930 | {
931 | "Type": 1024,
932 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
933 | }
934 | ]
935 | },
936 | {
937 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
938 | "fields": [
939 | {
940 | "Type": 1024,
941 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
942 | }
943 | ],
944 | "packet": "004e0a009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a3acd8f20d5a813c437bdcbb99ae858c60d9d7567828061d82cc5f37426a1b3a80e9bd6a5dd6b96bad4672e1c"
945 | },
946 | {
947 | "payload": "000d00002bafd8aea2a64ef4665f7e000700010000000000",
948 | "fields": [
949 | {
950 | "Type": 0,
951 | "Data": "2bafd8aea2a64ef4665f7e"
952 | },
953 | {
954 | "Type": 1,
955 | "Data": "0000000000"
956 | }
957 | ],
958 | "packet": "0028f81bed171791161e98ac040e97503bca91820c6a65ac000518954b63ed5c6a4fd18d77303dfb0f31"
959 | },
960 | {
961 | "payload": "000f00007750bf08931ae40d70108fce0700050001000000",
962 | "fields": [
963 | {
964 | "Type": 0,
965 | "Data": "7750bf08931ae40d70108fce07"
966 | },
967 | {
968 | "Type": 1,
969 | "Data": "000000"
970 | }
971 | ],
972 | "packet": "00285e17086a762a53ca825ddd50800c6e1bfeb72ed366683c282b73ad9dd654d6e9edc5a9b77580df4a"
973 | },
974 | {
975 | "payload": "000d0000e18c21a37e55ecfad776e8000700010000000000",
976 | "fields": [
977 | {
978 | "Type": 0,
979 | "Data": "e18c21a37e55ecfad776e8"
980 | },
981 | {
982 | "Type": 1,
983 | "Data": "0000000000"
984 | }
985 | ],
986 | "packet": "0028e7fb3d2134e12937da8baf7ffa8182343a0037e1f04d326ca275f2f0a649ce6d50dfed5cfcbfe9e6"
987 | },
988 | {
989 | "payload": "000f0000b5a59ecb1ebe38a6c6381ecc5800050001000000",
990 | "fields": [
991 | {
992 | "Type": 0,
993 | "Data": "b5a59ecb1ebe38a6c6381ecc58"
994 | },
995 | {
996 | "Type": 1,
997 | "Data": "000000"
998 | }
999 | ],
1000 | "packet": "0028d158f352560d1df6515eac2549a7493704781b35ea76ef72bfe7e65e0303c3f69625b11cc45ba348"
1001 | }
1002 | ]
1003 | },
1004 | {
1005 | "index": 11,
1006 | "pattern": "IK",
1007 | "dh": "25519",
1008 | "cipher": "AESGCM",
1009 | "hash": "BLAKE2s",
1010 | "handshake_hash": "9bd14ad530ffa5bee06e3de2a2e82add907863d9a21ab753ea0f0d8ea0f9f7fd",
1011 | "messages": [
1012 | {
1013 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
1014 | "fields": [
1015 | {
1016 | "Type": 1024,
1017 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
1018 | }
1019 | ]
1020 | },
1021 | {
1022 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
1023 | "fields": [
1024 | {
1025 | "Type": 1024,
1026 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
1027 | }
1028 | ],
1029 | "packet": "004e0b009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3af68a70ca673daf8f07b919ecbf47c1d6b9ce1376ce2ab03d2f6ae7112fc2ea90aa1328b54e88cb3accab558c"
1030 | },
1031 | {
1032 | "payload": "000d000071d2b87b290539019524a7000700010000000000",
1033 | "fields": [
1034 | {
1035 | "Type": 0,
1036 | "Data": "71d2b87b290539019524a7"
1037 | },
1038 | {
1039 | "Type": 1,
1040 | "Data": "0000000000"
1041 | }
1042 | ],
1043 | "packet": "00288a1c9cc398eb5cbe4002a2299fe4a09598a178f1046a567fde8cfaf930dd5a518429ebc6515ffbac"
1044 | },
1045 | {
1046 | "payload": "000f00006754d027c241a892916848125b00050001000000",
1047 | "fields": [
1048 | {
1049 | "Type": 0,
1050 | "Data": "6754d027c241a892916848125b"
1051 | },
1052 | {
1053 | "Type": 1,
1054 | "Data": "000000"
1055 | }
1056 | ],
1057 | "packet": "002807dc5e496b307b94273c3cd29374d6487fc51b5f79d7cc9c9cdc2c8b1805f4a4365e5d22d8aa99d6"
1058 | },
1059 | {
1060 | "payload": "000d0000f21d991fb78ccdbfc607b5000700010000000000",
1061 | "fields": [
1062 | {
1063 | "Type": 0,
1064 | "Data": "f21d991fb78ccdbfc607b5"
1065 | },
1066 | {
1067 | "Type": 1,
1068 | "Data": "0000000000"
1069 | }
1070 | ],
1071 | "packet": "00289860fc4ab717d5e175e74ff165068d1fcce4e86b926e532c0e10f9abeba5f8870f40f7d6018d4bca"
1072 | },
1073 | {
1074 | "payload": "000f000001aa370b52ab9ade93d95b6cb300050001000000",
1075 | "fields": [
1076 | {
1077 | "Type": 0,
1078 | "Data": "01aa370b52ab9ade93d95b6cb3"
1079 | },
1080 | {
1081 | "Type": 1,
1082 | "Data": "000000"
1083 | }
1084 | ],
1085 | "packet": "002838cdf8034a930ffab6760c0f3b726ffb791555fd774d089693bb9c1f67edac8c419620d4f36ecdb5"
1086 | }
1087 | ]
1088 | },
1089 | {
1090 | "index": 12,
1091 | "pattern": "IK",
1092 | "dh": "25519",
1093 | "cipher": "ChaChaPoly",
1094 | "hash": "SHA256",
1095 | "handshake_hash": "57a8ae1540d2c434299ffcf85fbbc036da0ceac1eee9a45cc39c91d3224c33db",
1096 | "messages": [
1097 | {
1098 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
1099 | "fields": [
1100 | {
1101 | "Type": 1024,
1102 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
1103 | }
1104 | ]
1105 | },
1106 | {
1107 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
1108 | "fields": [
1109 | {
1110 | "Type": 1024,
1111 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
1112 | }
1113 | ],
1114 | "packet": "004e0c009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a0fb442a67d9e947a36bcbf1a4f8731a901d2d634c9b53aabcbde593468fefdf9e2c305ff8d3d268305f62aa4"
1115 | },
1116 | {
1117 | "payload": "000d0000af894ce738036893737808000700010000000000",
1118 | "fields": [
1119 | {
1120 | "Type": 0,
1121 | "Data": "af894ce738036893737808"
1122 | },
1123 | {
1124 | "Type": 1,
1125 | "Data": "0000000000"
1126 | }
1127 | ],
1128 | "packet": "0028ff93a6d062ac6598f4a2ba207fb98bcac5b5709c2894e64116f368f0f52ce1c4919cd45aea3c10be"
1129 | },
1130 | {
1131 | "payload": "000f0000d8b9c301fb2a3d53d6ae5fed4c00050001000000",
1132 | "fields": [
1133 | {
1134 | "Type": 0,
1135 | "Data": "d8b9c301fb2a3d53d6ae5fed4c"
1136 | },
1137 | {
1138 | "Type": 1,
1139 | "Data": "000000"
1140 | }
1141 | ],
1142 | "packet": "0028c9ceaa96a034ad17d6532be50f250866b06dd543c2cbeab19651fcbc8363caf731d9b3857298243c"
1143 | },
1144 | {
1145 | "payload": "000d00009b315bf437f0686ee417be000700010000000000",
1146 | "fields": [
1147 | {
1148 | "Type": 0,
1149 | "Data": "9b315bf437f0686ee417be"
1150 | },
1151 | {
1152 | "Type": 1,
1153 | "Data": "0000000000"
1154 | }
1155 | ],
1156 | "packet": "00281bc4b2caa55861050b82afabe94fa4cb0527cd65ccbdfbd19935f8cd9775d3c96b1a039b57d82475"
1157 | },
1158 | {
1159 | "payload": "000f000043ff589baf2aec53ea9387a6bd00050001000000",
1160 | "fields": [
1161 | {
1162 | "Type": 0,
1163 | "Data": "43ff589baf2aec53ea9387a6bd"
1164 | },
1165 | {
1166 | "Type": 1,
1167 | "Data": "000000"
1168 | }
1169 | ],
1170 | "packet": "0028d694e5931b86e1748490d602cb058d36a212231ee02ee0eb39cae5ed4f82b3d828ea9947fa0caee6"
1171 | }
1172 | ]
1173 | },
1174 | {
1175 | "index": 13,
1176 | "pattern": "IK",
1177 | "dh": "25519",
1178 | "cipher": "ChaChaPoly",
1179 | "hash": "BLAKE2b",
1180 | "handshake_hash": "247a00d5abfc8eef0221a5827a1303b9a0b607cbee46625ec33c27ae2ce2267cafe6bb4b6ddd12bf7613d71b9b23ac27a33d101f4c4891ecbc94dc55cfac2d2c",
1181 | "messages": [
1182 | {
1183 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
1184 | "fields": [
1185 | {
1186 | "Type": 1024,
1187 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
1188 | }
1189 | ]
1190 | },
1191 | {
1192 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
1193 | "fields": [
1194 | {
1195 | "Type": 1024,
1196 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
1197 | }
1198 | ],
1199 | "packet": "004e0d009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a58188a7096405cf5eb5dac32b9379ec2639759b6e4507dc4b8b7fc9642ccbee0b59f883f6c175ac7aef0b373"
1200 | },
1201 | {
1202 | "payload": "000d00006041e1b66fe6e2c1b0db3f000700010000000000",
1203 | "fields": [
1204 | {
1205 | "Type": 0,
1206 | "Data": "6041e1b66fe6e2c1b0db3f"
1207 | },
1208 | {
1209 | "Type": 1,
1210 | "Data": "0000000000"
1211 | }
1212 | ],
1213 | "packet": "00282cb830a71afe5a2f263ffef39caff9c548f6061f7befce77f5f6ce20b572f7db0a59a3fe9b3d690e"
1214 | },
1215 | {
1216 | "payload": "000f0000a81c12cc2e0b9af0befddc1f0200050001000000",
1217 | "fields": [
1218 | {
1219 | "Type": 0,
1220 | "Data": "a81c12cc2e0b9af0befddc1f02"
1221 | },
1222 | {
1223 | "Type": 1,
1224 | "Data": "000000"
1225 | }
1226 | ],
1227 | "packet": "0028cbfb61a74df05d85cda828be4a9888ca696fa885adb3bad2f34860f1c29f80abc5c76f5a6a3bdcb3"
1228 | },
1229 | {
1230 | "payload": "000d00005f2eb1ae38cf0ede0903ed000700010000000000",
1231 | "fields": [
1232 | {
1233 | "Type": 0,
1234 | "Data": "5f2eb1ae38cf0ede0903ed"
1235 | },
1236 | {
1237 | "Type": 1,
1238 | "Data": "0000000000"
1239 | }
1240 | ],
1241 | "packet": "0028d7ba7a3a1dd6a6ab2122cd6b7b173cdb073700f689500f32e767cad7adcd3591537a8dcd02fb17b7"
1242 | },
1243 | {
1244 | "payload": "000f000074d10fd868a4069f8c769d860300050001000000",
1245 | "fields": [
1246 | {
1247 | "Type": 0,
1248 | "Data": "74d10fd868a4069f8c769d8603"
1249 | },
1250 | {
1251 | "Type": 1,
1252 | "Data": "000000"
1253 | }
1254 | ],
1255 | "packet": "002857c8db9d127af322f663fc6a3bd4efb4c7ceba6c37dc199026e237b81b05c9dc9a0abc6a02f00ff1"
1256 | }
1257 | ]
1258 | },
1259 | {
1260 | "index": 14,
1261 | "pattern": "IK",
1262 | "dh": "25519",
1263 | "cipher": "ChaChaPoly",
1264 | "hash": "SHA512",
1265 | "handshake_hash": "6d8e64261eebb61ed3a9ec48069646b6eeacc87ea80a68d0d4fa15737e076db8cde8573473686db3d65ae6b491a66ccab365a7f5fb96c17bdc8ce360ab9f63ea",
1266 | "messages": [
1267 | {
1268 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
1269 | "fields": [
1270 | {
1271 | "Type": 1024,
1272 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
1273 | }
1274 | ]
1275 | },
1276 | {
1277 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
1278 | "fields": [
1279 | {
1280 | "Type": 1024,
1281 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
1282 | }
1283 | ],
1284 | "packet": "004e0e009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3adbd468df655765001bfa1d3d16b4b2197ebe7c48f7f94ed55209e31d8e9236625b67bc8ca0bc65a4df512c9c"
1285 | },
1286 | {
1287 | "payload": "000d0000a69ff8e92b5992df472075000700010000000000",
1288 | "fields": [
1289 | {
1290 | "Type": 0,
1291 | "Data": "a69ff8e92b5992df472075"
1292 | },
1293 | {
1294 | "Type": 1,
1295 | "Data": "0000000000"
1296 | }
1297 | ],
1298 | "packet": "00285420dec3203fb70a7c1268fb1ab49f702d7482647d438679f9d70e057195251fee3bbf01609ea71e"
1299 | },
1300 | {
1301 | "payload": "000f0000e6cb2377ceb58b57b75e6f61fa00050001000000",
1302 | "fields": [
1303 | {
1304 | "Type": 0,
1305 | "Data": "e6cb2377ceb58b57b75e6f61fa"
1306 | },
1307 | {
1308 | "Type": 1,
1309 | "Data": "000000"
1310 | }
1311 | ],
1312 | "packet": "002853cc59e5aeee8071502d85f7d48dbefed131f9a7bc8251221313589e5655a65963b7a869b9286477"
1313 | },
1314 | {
1315 | "payload": "000d0000e375925a7c3a71c010dff8000700010000000000",
1316 | "fields": [
1317 | {
1318 | "Type": 0,
1319 | "Data": "e375925a7c3a71c010dff8"
1320 | },
1321 | {
1322 | "Type": 1,
1323 | "Data": "0000000000"
1324 | }
1325 | ],
1326 | "packet": "002898323d665b13b5a0832b28bce63d21fc7f5f77b52b77283db84e52ba9ebf5691ea1ee48c6a3373ea"
1327 | },
1328 | {
1329 | "payload": "000f0000e4d1464865741cbbd9f3cc2ba400050001000000",
1330 | "fields": [
1331 | {
1332 | "Type": 0,
1333 | "Data": "e4d1464865741cbbd9f3cc2ba4"
1334 | },
1335 | {
1336 | "Type": 1,
1337 | "Data": "000000"
1338 | }
1339 | ],
1340 | "packet": "00287efeadf2ef04ea59529b545fb46dd79f7769a1151ece17cbce2dcbd4bfb34dda2311b04af5660b54"
1341 | }
1342 | ]
1343 | },
1344 | {
1345 | "index": 15,
1346 | "pattern": "IK",
1347 | "dh": "25519",
1348 | "cipher": "ChaChaPoly",
1349 | "hash": "BLAKE2s",
1350 | "handshake_hash": "19957cd9e67ac292451304209d6afbc8d289eb0672f62ed29deff66d24baad65",
1351 | "messages": [
1352 | {
1353 | "payload": "001c04007b6f776e65723a22616c69636540636c69656e742e636f6d227d",
1354 | "fields": [
1355 | {
1356 | "Type": 1024,
1357 | "Data": "7b6f776e65723a22616c69636540636c69656e742e636f6d227d"
1358 | }
1359 | ]
1360 | },
1361 | {
1362 | "payload": "001a04007b6f776e65723a22626f62407365727665722e636f6d227d",
1363 | "fields": [
1364 | {
1365 | "Type": 1024,
1366 | "Data": "7b6f776e65723a22626f62407365727665722e636f6d227d"
1367 | }
1368 | ],
1369 | "packet": "004e0f009f971588c6fe932c8908d6925522542c13dd3c2d9b84286b228ee76903bb1b3a63524ea203d6dc8557b952377eb5336b92308f6d988a8eae82105308f0784cd051e778207ad57d0218481ed2"
1370 | },
1371 | {
1372 | "payload": "000d000086d983f8f658dd630762f2000700010000000000",
1373 | "fields": [
1374 | {
1375 | "Type": 0,
1376 | "Data": "86d983f8f658dd630762f2"
1377 | },
1378 | {
1379 | "Type": 1,
1380 | "Data": "0000000000"
1381 | }
1382 | ],
1383 | "packet": "0028f86095fca86d8e37d44e3bc72e158d1aa0dd5be3574b2e7013b6e77d5a71ddd70e4abb017d7a30b9"
1384 | },
1385 | {
1386 | "payload": "000f0000073c6ca378542e46c9c2e1bebd00050001000000",
1387 | "fields": [
1388 | {
1389 | "Type": 0,
1390 | "Data": "073c6ca378542e46c9c2e1bebd"
1391 | },
1392 | {
1393 | "Type": 1,
1394 | "Data": "000000"
1395 | }
1396 | ],
1397 | "packet": "00288e4878ab54bca3a295f383899fce6679d40a4dfdfd6632309dce5b16aa5516fdb561929b47d00b4c"
1398 | },
1399 | {
1400 | "payload": "000d0000df86afb528743cf0584388000700010000000000",
1401 | "fields": [
1402 | {
1403 | "Type": 0,
1404 | "Data": "df86afb528743cf0584388"
1405 | },
1406 | {
1407 | "Type": 1,
1408 | "Data": "0000000000"
1409 | }
1410 | ],
1411 | "packet": "00284da08c00c7d9679c18c5fb1d9854f47eb9ead743bafb7b51bff70f9942fc5c8f3d844b2554e44936"
1412 | },
1413 | {
1414 | "payload": "000f0000b360fc378274dbc8cd2ebe53da00050001000000",
1415 | "fields": [
1416 | {
1417 | "Type": 0,
1418 | "Data": "b360fc378274dbc8cd2ebe53da"
1419 | },
1420 | {
1421 | "Type": 1,
1422 | "Data": "000000"
1423 | }
1424 | ],
1425 | "packet": "00284ee6b62acb2047caf41d5a041a535298da0bb4ad22d776fed30e4b320f37e4e9cf933d45c9f4f6c9"
1426 | }
1427 | ]
1428 | }
1429 | ]
1430 | }
1431 |
--------------------------------------------------------------------------------