openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
696 lines (694 loc) • 27.3 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/api/keystore.coffee</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">All files</a> / <a href="index.html">src/api</a> keystore.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">14.95% </span>
<span class="quiet">Statements</span>
<span class='fraction'>16/107</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/13</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">14.95% </span>
<span class="quiet">Lines</span>
<span class='fraction'>16/107</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">Keystore = require('../model/keystore').Keystore
Q = require 'q'
logger = require 'winston'
authorisation = require './authorisation'
pem = require 'pem'
utils = require "../utils"
exports.getServerCert = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getServerCert denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().select('cert').exec()
this.body = keystoreDoc.cert
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch the server cert via the API: #{err}", 'error'
exports.getCACerts = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getCACerts denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().select('ca').exec()
this.body = keystoreDoc.ca
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch the ca certs trusted by this server via the API: #{err}", 'error'
exports.getCACert = <span class="fstat-no" title="function not covered" >(</span>certId) ->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getCACert by id denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().select('ca').exec()
<span class="cstat-no" title="statement not covered" > cert = k</span>eystoreDoc.ca.id(certId)
this.body = cert
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch ca cert by id via the API: #{err}", 'error'
exports.setServerPassphrase = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to setServerPassphrase denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > passphrase = this.request.body.p</span>assphrase
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().exec()
<span class="cstat-no" title="statement not covered" > keystoreDoc.passphrase = p</span>assphrase
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke keystoreDoc, 'save'</span>
this.status = 201
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not set the passphrase via the API: #{err}", 'error'
exports.setServerCert = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to setServerCert by id denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > cert = this.request.body.c</span>ert
<span class="cstat-no" title="statement not covered" > passphrase = this.request.body.p</span>assphrase
<span class="cstat-no" title="statement not covered" > readCertificateInfo = Q</span>.denodeify pem.readCertificateInfo
<span class="cstat-no" title="statement not covered" > getFingerprint = Q</span>.denodeify pem.getFingerprint
try
<span class="cstat-no" title="statement not covered" > certInfo = y</span>ield readCertificateInfo cert
<span class="cstat-no" title="statement not covered" > fingerprint = yield getFingerprint cert</span>
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, "Could not add server cert via the API: #{err}", 'error'</span>
<span class="cstat-no" title="statement not covered" > certInfo.data = c</span>ert
<span class="cstat-no" title="statement not covered" > certInfo.fingerprint = fingerprint.f</span>ingerprint
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().exec()
<span class="cstat-no" title="statement not covered" > keystoreDoc.cert = c</span>ertInfo
<span class="cstat-no" title="statement not covered" > keystoreDoc.passphrase = p</span>assphrase
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke keystoreDoc, 'save'</span>
this.status = 201
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not add server cert via the API: #{err}", 'error'
exports.setServerKey = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getServerKey by id denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > key = this.request.body.k</span>ey
<span class="cstat-no" title="statement not covered" > passphrase = this.request.body.p</span>assphrase
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().exec()
<span class="cstat-no" title="statement not covered" > keystoreDoc.key = k</span>ey
<span class="cstat-no" title="statement not covered" > keystoreDoc.passphrase = p</span>assphrase
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke keystoreDoc, 'save'</span>
this.status = 201
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not add server key via the API: #{err}", 'error'
exports.addTrustedCert = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to addTrustedCert by id denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > invalidCert = f</span>alse
<span class="cstat-no" title="statement not covered" > chain = this.request.body.c</span>ert
# Parse into an array in case this is a cert chain
# (code derived from: http://www.benjiegillam.com/2012/06/node-dot-js-ssl-certificate-chain/)
<span class="cstat-no" title="statement not covered" > certs = [</span>]
<span class="cstat-no" title="statement not covered" > chain = c</span>hain.split "\n"
<span class="cstat-no" title="statement not covered" > cert = [</span>]
<span class="cstat-no" title="statement not covered" > for line in chain when line.length isnt 0</span>
<span class="cstat-no" title="statement not covered" > cert.push line</span>
if line.match /-END CERTIFICATE-/
<span class="cstat-no" title="statement not covered" > certs.push ((cert.join "\n") + "\n")</span>
<span class="cstat-no" title="statement not covered" > cert = []</span>
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().exec()
<span class="cstat-no" title="statement not covered" > readCertificateInfo = Q</span>.denodeify pem.readCertificateInfo
<span class="cstat-no" title="statement not covered" > getFingerprint = Q</span>.denodeify pem.getFingerprint
if certs.length < 1
<span class="cstat-no" title="statement not covered" > invalidCert = true</span>
<span class="cstat-no" title="statement not covered" > for cert in certs</span>
try
<span class="cstat-no" title="statement not covered" > certInfo = y</span>ield readCertificateInfo cert
<span class="cstat-no" title="statement not covered" > fingerprint = yield getFingerprint cert</span>
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > invalidCert = t</span>rue
<span class="cstat-no" title="statement not covered" > continue</span>
<span class="cstat-no" title="statement not covered" > certInfo.data = c</span>ert
<span class="cstat-no" title="statement not covered" > certInfo.fingerprint = fingerprint.f</span>ingerprint
<span class="cstat-no" title="statement not covered" > keystoreDoc.ca.push certInfo</span>
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke keystoreDoc, 'save'</span>
<span class="cstat-no" title="statement not covered" > if invalidCert</span>
utils.logAndSetResponse this, 400, "Failed to add one more cert, are they valid? #{err}", 'error'
else
this.status = 201
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not add trusted cert via the API: #{err}", 'error'
exports.removeCACert = <span class="fstat-no" title="function not covered" >(</span>certId) ->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeCACert by id denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > keystoreDoc = y</span>ield Keystore.findOne().exec()
<span class="cstat-no" title="statement not covered" > keystoreDoc.ca.id(certId).remove()</span>
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke keystoreDoc, 'save'</span>
this.status = 200
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not remove ca cert by id via the API: #{err}", 'error'
exports.verifyServerKeys = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to verifyServerKeys.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
try
<span class="cstat-no" title="statement not covered" > result = yield Q.nfcall getCertKeyStatus</span>
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, "Could not verify certificate and key, are they valid? #{err}", 'error'</span>
this.body =
valid: result
this.status = 200
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not determine validity via the API: #{err}", 'error'
exports.getCertKeyStatus = getCertKeyStatus = <span class="fstat-no" title="function not covered" >(</span>callback) ->
Keystore.findOne <span class="fstat-no" title="function not covered" >(</span>err, keystoreDoc) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err, null if err
# if the key is encrypted but no passphrase is supplied, return false instantly
if /Proc-Type:.*ENCRYPTED/.test(keystoreDoc.key) and (not keystoreDoc.passphrase? or keystoreDoc.passphrase.length == 0)
<span class="cstat-no" title="statement not covered" > return callback null, false</span>
pem.getModulusFromProtected keystoreDoc.key, keystoreDoc.passphrase, <span class="fstat-no" title="function not covered" >(</span>err, keyModulus) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err, null if err
pem.getModulus keystoreDoc.cert.data, <span class="fstat-no" title="function not covered" >(</span>err, certModulus) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err, null if err
# if cert/key match and are valid
if keyModulus.modulus is certModulus.modulus
<span class="cstat-no" title="statement not covered" > return callback null, true</span>
else
<span class="cstat-no" title="statement not covered" > return callback null, false</span>
</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Oct 10 2016 13:39:22 GMT+0200 (SAST)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>