OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Handles web page requests for gnubby enrollment. | 6 * @fileoverview Handles web page requests for gnubby enrollment. |
7 */ | 7 */ |
8 | 8 |
9 'use strict'; | 9 'use strict'; |
10 | 10 |
11 /** | 11 /** |
12 * Handles a web enroll request. | 12 * Handles a web enroll request. |
13 * @param {MessageSender} sender The sender of the message. | 13 * @param {MessageSender} sender The sender of the message. |
14 * @param {Object} request The web page's enroll request. | 14 * @param {Object} request The web page's enroll request. |
15 * @param {Function} sendResponse Called back with the result of the enroll. | 15 * @param {Function} sendResponse Called back with the result of the enroll. |
16 * @return {Closeable} A handler object to be closed when the browser channel | 16 * @return {Closeable} A handler object to be closed when the browser channel |
17 * closes. | 17 * closes. |
18 */ | 18 */ |
19 function handleWebEnrollRequest(sender, request, sendResponse) { | 19 function handleWebEnrollRequest(sender, request, sendResponse) { |
20 var sentResponse = false; | 20 var sentResponse = false; |
21 var closeable; | 21 var closeable = null; |
22 | 22 |
23 function sendErrorResponse(u2fCode) { | 23 function sendErrorResponse(error) { |
24 var response = makeWebErrorResponse(request, | 24 var response = makeWebErrorResponse(request, |
25 mapErrorCodeToGnubbyCodeType(u2fCode, false /* forSign */)); | 25 mapErrorCodeToGnubbyCodeType(error.errorCode, false /* forSign */)); |
26 sendResponseOnce(sentResponse, closeable, response, sendResponse); | 26 sendResponseOnce(sentResponse, closeable, response, sendResponse); |
27 } | 27 } |
28 | 28 |
29 function sendSuccessResponse(u2fVersion, info, browserData) { | 29 function sendSuccessResponse(u2fVersion, info, browserData) { |
30 var enrollChallenges = request['enrollChallenges']; | 30 var enrollChallenges = request['enrollChallenges']; |
31 var enrollChallenge = | 31 var enrollChallenge = |
32 findEnrollChallengeOfVersion(enrollChallenges, u2fVersion); | 32 findEnrollChallengeOfVersion(enrollChallenges, u2fVersion); |
33 if (!enrollChallenge) { | 33 if (!enrollChallenge) { |
34 sendErrorResponse(ErrorCodes.OTHER_ERROR); | 34 sendErrorResponse(ErrorCodes.OTHER_ERROR); |
35 return; | 35 return; |
36 } | 36 } |
37 var responseData = | 37 var responseData = |
38 makeEnrollResponseData(enrollChallenge, u2fVersion, | 38 makeEnrollResponseData(enrollChallenge, u2fVersion, |
39 'enrollData', info, 'browserData', browserData); | 39 'enrollData', info, 'browserData', browserData); |
40 var response = makeWebSuccessResponse(request, responseData); | 40 var response = makeWebSuccessResponse(request, responseData); |
41 sendResponseOnce(sentResponse, closeable, response, sendResponse); | 41 sendResponseOnce(sentResponse, closeable, response, sendResponse); |
42 } | 42 } |
43 | 43 |
44 closeable = | 44 var enroller = |
45 validateAndBeginEnrollRequest( | 45 validateEnrollRequest( |
46 sender, request, 'enrollChallenges', 'signData', | 46 sender, request, 'enrollChallenges', 'signData', |
47 sendErrorResponse, sendSuccessResponse); | 47 sendErrorResponse, sendSuccessResponse); |
| 48 if (enroller) { |
| 49 var registerRequests = request['enrollChallenges']; |
| 50 var signRequests = getSignRequestsFromEnrollRequest(request, 'signData'); |
| 51 closeable = /** @type {Closeable} */ (enroller); |
| 52 enroller.doEnroll(registerRequests, signRequests, request['appId']); |
| 53 } |
48 return closeable; | 54 return closeable; |
49 } | 55 } |
50 | 56 |
51 /** | 57 /** |
52 * Handles a U2F enroll request. | 58 * Handles a U2F enroll request. |
53 * @param {MessageSender} sender The sender of the message. | 59 * @param {MessageSender} sender The sender of the message. |
54 * @param {Object} request The web page's enroll request. | 60 * @param {Object} request The web page's enroll request. |
55 * @param {Function} sendResponse Called back with the result of the enroll. | 61 * @param {Function} sendResponse Called back with the result of the enroll. |
56 * @return {Closeable} A handler object to be closed when the browser channel | 62 * @return {Closeable} A handler object to be closed when the browser channel |
57 * closes. | 63 * closes. |
58 */ | 64 */ |
59 function handleU2fEnrollRequest(sender, request, sendResponse) { | 65 function handleU2fEnrollRequest(sender, request, sendResponse) { |
60 var sentResponse = false; | 66 var sentResponse = false; |
61 var closeable; | 67 var closeable = null; |
62 | 68 |
63 function sendErrorResponse(u2fCode) { | 69 function sendErrorResponse(error) { |
64 var response = makeU2fErrorResponse(request, u2fCode); | 70 var response = makeU2fErrorResponse(request, error.errorCode, |
| 71 error.errorMessage); |
65 sendResponseOnce(sentResponse, closeable, response, sendResponse); | 72 sendResponseOnce(sentResponse, closeable, response, sendResponse); |
66 } | 73 } |
67 | 74 |
68 function sendSuccessResponse(u2fVersion, info, browserData) { | 75 function sendSuccessResponse(u2fVersion, info, browserData) { |
69 var enrollChallenges = request['registerRequests']; | 76 var enrollChallenges = request['registerRequests']; |
70 var enrollChallenge = | 77 var enrollChallenge = |
71 findEnrollChallengeOfVersion(enrollChallenges, u2fVersion); | 78 findEnrollChallengeOfVersion(enrollChallenges, u2fVersion); |
72 if (!enrollChallenge) { | 79 if (!enrollChallenge) { |
73 sendErrorResponse(ErrorCodes.OTHER_ERROR); | 80 sendErrorResponse(ErrorCodes.OTHER_ERROR); |
74 return; | 81 return; |
75 } | 82 } |
76 var responseData = | 83 var responseData = |
77 makeEnrollResponseData(enrollChallenge, u2fVersion, | 84 makeEnrollResponseData(enrollChallenge, u2fVersion, |
78 'registrationData', info, 'clientData', browserData); | 85 'registrationData', info, 'clientData', browserData); |
79 var response = makeU2fSuccessResponse(request, responseData); | 86 var response = makeU2fSuccessResponse(request, responseData); |
80 sendResponseOnce(sentResponse, closeable, response, sendResponse); | 87 sendResponseOnce(sentResponse, closeable, response, sendResponse); |
81 } | 88 } |
82 | 89 |
83 closeable = | 90 var enroller = |
84 validateAndBeginEnrollRequest( | 91 validateEnrollRequest( |
85 sender, request, 'registerRequests', 'signRequests', | 92 sender, request, 'registerRequests', 'signRequests', |
86 sendErrorResponse, sendSuccessResponse, 'registeredKeys'); | 93 sendErrorResponse, sendSuccessResponse, 'registeredKeys'); |
| 94 if (enroller) { |
| 95 var registerRequests = request['registerRequests']; |
| 96 var signRequests = getSignRequestsFromEnrollRequest(request, |
| 97 'signRequests', 'registeredKeys'); |
| 98 closeable = /** @type {Closeable} */ (enroller); |
| 99 enroller.doEnroll(registerRequests, signRequests, request['appId']); |
| 100 } |
87 return closeable; | 101 return closeable; |
88 } | 102 } |
89 | 103 |
90 /** | 104 /** |
91 * Validates an enroll request using the given parameters, and, if valid, begins | 105 * Validates an enroll request using the given parameters. |
92 * handling the enroll request. (The enroll request may be modified as a result | |
93 * of handling it.) | |
94 * @param {MessageSender} sender The sender of the message. | 106 * @param {MessageSender} sender The sender of the message. |
95 * @param {Object} request The web page's enroll request. | 107 * @param {Object} request The web page's enroll request. |
96 * @param {string} enrollChallengesName The name of the enroll challenges value | 108 * @param {string} enrollChallengesName The name of the enroll challenges value |
97 * in the request. | 109 * in the request. |
98 * @param {string} signChallengesName The name of the sign challenges value in | 110 * @param {string} signChallengesName The name of the sign challenges value in |
99 * the request. | 111 * the request. |
100 * @param {function(ErrorCodes)} errorCb Error callback. | 112 * @param {function(U2fError)} errorCb Error callback. |
101 * @param {function(string, string, (string|undefined))} successCb Success | 113 * @param {function(string, string, (string|undefined))} successCb Success |
102 * callback. | 114 * callback. |
103 * @param {string=} opt_registeredKeysName The name of the registered keys | 115 * @param {string=} opt_registeredKeysName The name of the registered keys |
104 * value in the request. | 116 * value in the request. |
105 * @return {Closeable} Request handler that should be closed when the browser | 117 * @return {Enroller} Enroller object representing the request, if the request |
106 * message channel is closed. | 118 * is valid, or null if the request is invalid. |
107 */ | 119 */ |
108 function validateAndBeginEnrollRequest(sender, request, | 120 function validateEnrollRequest(sender, request, |
109 enrollChallengesName, signChallengesName, errorCb, successCb, | 121 enrollChallengesName, signChallengesName, errorCb, successCb, |
110 opt_registeredKeysName) { | 122 opt_registeredKeysName) { |
111 var origin = getOriginFromUrl(/** @type {string} */ (sender.url)); | 123 var origin = getOriginFromUrl(/** @type {string} */ (sender.url)); |
112 if (!origin) { | 124 if (!origin) { |
113 errorCb(ErrorCodes.BAD_REQUEST); | 125 errorCb({errorCode: ErrorCodes.BAD_REQUEST}); |
114 return null; | 126 return null; |
115 } | 127 } |
116 | 128 |
117 if (!isValidEnrollRequest(request, enrollChallengesName, | 129 if (!isValidEnrollRequest(request, enrollChallengesName, |
118 signChallengesName, opt_registeredKeysName)) { | 130 signChallengesName, opt_registeredKeysName)) { |
119 errorCb(ErrorCodes.BAD_REQUEST); | 131 errorCb({errorCode: ErrorCodes.BAD_REQUEST}); |
120 return null; | 132 return null; |
121 } | 133 } |
122 | 134 |
123 var enrollChallenges = request[enrollChallengesName]; | |
124 var signChallenges; | |
125 if (opt_registeredKeysName && | |
126 request.hasOwnProperty(opt_registeredKeysName)) { | |
127 // Convert registered keys to sign challenges by adding a challenge value. | |
128 signChallenges = request[opt_registeredKeysName]; | |
129 for (var i = 0; i < signChallenges.length; i++) { | |
130 // The actual value doesn't matter, as long as it's a string. | |
131 signChallenges[i]['challenge'] = ''; | |
132 } | |
133 } else { | |
134 signChallenges = request[signChallengesName]; | |
135 } | |
136 var logMsgUrl = request['logMsgUrl']; | |
137 | |
138 var timer = createTimerForRequest( | 135 var timer = createTimerForRequest( |
139 FACTORY_REGISTRY.getCountdownFactory(), request); | 136 FACTORY_REGISTRY.getCountdownFactory(), request); |
| 137 var logMsgUrl = request['logMsgUrl']; |
140 var enroller = new Enroller(timer, origin, errorCb, successCb, | 138 var enroller = new Enroller(timer, origin, errorCb, successCb, |
141 sender.tlsChannelId, logMsgUrl); | 139 sender.tlsChannelId, logMsgUrl); |
142 enroller.doEnroll(enrollChallenges, signChallenges, request['appId']); | 140 return enroller; |
143 return /** @type {Closeable} */ (enroller); | |
144 } | 141 } |
145 | 142 |
146 /** | 143 /** |
147 * Returns whether the request appears to be a valid enroll request. | 144 * Returns whether the request appears to be a valid enroll request. |
148 * @param {Object} request The request. | 145 * @param {Object} request The request. |
149 * @param {string} enrollChallengesName The name of the enroll challenges value | 146 * @param {string} enrollChallengesName The name of the enroll challenges value |
150 * in the request. | 147 * in the request. |
151 * @param {string} signChallengesName The name of the sign challenges value in | 148 * @param {string} signChallengesName The name of the sign challenges value in |
152 * the request. | 149 * the request. |
153 * @param {string=} opt_registeredKeysName The name of the registered keys | 150 * @param {string=} opt_registeredKeysName The name of the registered keys |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 } | 262 } |
266 if (u2fVersion == 'U2F_V2') { | 263 if (u2fVersion == 'U2F_V2') { |
267 // For U2F_V2, the challenge sent to the gnubby is modified to be the | 264 // For U2F_V2, the challenge sent to the gnubby is modified to be the |
268 // hash of the browser data. Include the browser data. | 265 // hash of the browser data. Include the browser data. |
269 responseData[browserDataName] = browserData; | 266 responseData[browserDataName] = browserData; |
270 } | 267 } |
271 return responseData; | 268 return responseData; |
272 } | 269 } |
273 | 270 |
274 /** | 271 /** |
| 272 * Gets the expanded sign challenges from an enroll request, potentially by |
| 273 * modifying the request to contain a challenge value where one was omitted. |
| 274 * (For enrolling, the server isn't interested in the value of a signature, |
| 275 * only whether the presented key handle is already enrolled.) |
| 276 * @param {Object} request The request. |
| 277 * @param {string} signChallengesName The name of the sign challenges value in |
| 278 * the request. |
| 279 * @param {string=} opt_registeredKeysName The name of the registered keys |
| 280 * value in the request. |
| 281 * @return {Array.<SignChallenge>} |
| 282 */ |
| 283 function getSignRequestsFromEnrollRequest(request, signChallengesName, |
| 284 opt_registeredKeysName) { |
| 285 var signChallenges; |
| 286 if (opt_registeredKeysName && |
| 287 request.hasOwnProperty(opt_registeredKeysName)) { |
| 288 // Convert registered keys to sign challenges by adding a challenge value. |
| 289 signChallenges = request[opt_registeredKeysName]; |
| 290 for (var i = 0; i < signChallenges.length; i++) { |
| 291 // The actual value doesn't matter, as long as it's a string. |
| 292 signChallenges[i]['challenge'] = ''; |
| 293 } |
| 294 } else { |
| 295 signChallenges = request[signChallengesName]; |
| 296 } |
| 297 return signChallenges; |
| 298 } |
| 299 |
| 300 /** |
275 * Creates a new object to track enrolling with a gnubby. | 301 * Creates a new object to track enrolling with a gnubby. |
276 * @param {!Countdown} timer Timer for enroll request. | 302 * @param {!Countdown} timer Timer for enroll request. |
277 * @param {string} origin The origin making the request. | 303 * @param {string} origin The origin making the request. |
278 * @param {function(ErrorCodes)} errorCb Called upon enroll failure with an | 304 * @param {function(U2fError)} errorCb Called upon enroll failure. |
279 * error code. | |
280 * @param {function(string, string, (string|undefined))} successCb Called upon | 305 * @param {function(string, string, (string|undefined))} successCb Called upon |
281 * enroll success with the version of the succeeding gnubby, the enroll | 306 * enroll success with the version of the succeeding gnubby, the enroll |
282 * data, and optionally the browser data associated with the enrollment. | 307 * data, and optionally the browser data associated with the enrollment. |
283 * @param {string=} opt_tlsChannelId the TLS channel ID, if any, of the origin | 308 * @param {string=} opt_tlsChannelId the TLS channel ID, if any, of the origin |
284 * making the request. | 309 * making the request. |
285 * @param {string=} opt_logMsgUrl The url to post log messages to. | 310 * @param {string=} opt_logMsgUrl The url to post log messages to. |
286 * @constructor | 311 * @constructor |
287 */ | 312 */ |
288 function Enroller(timer, origin, errorCb, successCb, opt_tlsChannelId, | 313 function Enroller(timer, origin, errorCb, successCb, opt_tlsChannelId, |
289 opt_logMsgUrl) { | 314 opt_logMsgUrl) { |
290 /** @private {Countdown} */ | 315 /** @private {Countdown} */ |
291 this.timer_ = timer; | 316 this.timer_ = timer; |
292 /** @private {string} */ | 317 /** @private {string} */ |
293 this.origin_ = origin; | 318 this.origin_ = origin; |
294 /** @private {function(ErrorCodes)} */ | 319 /** @private {function(U2fError)} */ |
295 this.errorCb_ = errorCb; | 320 this.errorCb_ = errorCb; |
296 /** @private {function(string, string, (string|undefined))} */ | 321 /** @private {function(string, string, (string|undefined))} */ |
297 this.successCb_ = successCb; | 322 this.successCb_ = successCb; |
298 /** @private {string|undefined} */ | 323 /** @private {string|undefined} */ |
299 this.tlsChannelId_ = opt_tlsChannelId; | 324 this.tlsChannelId_ = opt_tlsChannelId; |
300 /** @private {string|undefined} */ | 325 /** @private {string|undefined} */ |
301 this.logMsgUrl_ = opt_logMsgUrl; | 326 this.logMsgUrl_ = opt_logMsgUrl; |
302 | 327 |
303 /** @private {boolean} */ | 328 /** @private {boolean} */ |
304 this.done_ = false; | 329 this.done_ = false; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 enrollAppIds.push(opt_appId); | 376 enrollAppIds.push(opt_appId); |
352 } | 377 } |
353 for (var i = 0; i < enrollChallenges.length; i++) { | 378 for (var i = 0; i < enrollChallenges.length; i++) { |
354 if (enrollChallenges[i].hasOwnProperty('appId')) { | 379 if (enrollChallenges[i].hasOwnProperty('appId')) { |
355 enrollAppIds.push(enrollChallenges[i]['appId']); | 380 enrollAppIds.push(enrollChallenges[i]['appId']); |
356 } | 381 } |
357 } | 382 } |
358 // Sanity check | 383 // Sanity check |
359 if (!enrollAppIds.length) { | 384 if (!enrollAppIds.length) { |
360 console.warn(UTIL_fmt('empty enroll app ids?')); | 385 console.warn(UTIL_fmt('empty enroll app ids?')); |
361 this.notifyError_(ErrorCodes.BAD_REQUEST); | 386 this.notifyError_({errorCode: ErrorCodes.BAD_REQUEST}); |
362 return; | 387 return; |
363 } | 388 } |
364 var self = this; | 389 var self = this; |
365 this.checkAppIds_(enrollAppIds, signChallenges, function(result) { | 390 this.checkAppIds_(enrollAppIds, signChallenges, function(result) { |
366 if (result) { | 391 if (result) { |
367 self.handler_ = FACTORY_REGISTRY.getRequestHelper().getHandler(request); | 392 self.handler_ = FACTORY_REGISTRY.getRequestHelper().getHandler(request); |
368 if (self.handler_) { | 393 if (self.handler_) { |
369 var helperComplete = | 394 var helperComplete = |
370 /** @type {function(HelperReply)} */ | 395 /** @type {function(HelperReply)} */ |
371 (self.helperComplete_.bind(self)); | 396 (self.helperComplete_.bind(self)); |
372 self.handler_.run(helperComplete); | 397 self.handler_.run(helperComplete); |
373 } else { | 398 } else { |
374 self.notifyError_(ErrorCodes.OTHER_ERROR); | 399 self.notifyError_({errorCode: ErrorCodes.OTHER_ERROR}); |
375 } | 400 } |
376 } else { | 401 } else { |
377 self.notifyError_(ErrorCodes.BAD_REQUEST); | 402 self.notifyError_({errorCode: ErrorCodes.BAD_REQUEST}); |
378 } | 403 } |
379 }); | 404 }); |
380 }; | 405 }; |
381 | 406 |
382 /** | 407 /** |
383 * Encodes the enroll challenge as an enroll helper challenge. | 408 * Encodes the enroll challenge as an enroll helper challenge. |
384 * @param {EnrollChallenge} enrollChallenge The enroll challenge to encode. | 409 * @param {EnrollChallenge} enrollChallenge The enroll challenge to encode. |
385 * @param {string=} opt_appId The app id for the entire request. | 410 * @param {string=} opt_appId The app id for the entire request. |
386 * @return {EnrollHelperChallenge} The encoded challenge. | 411 * @return {EnrollHelperChallenge} The encoded challenge. |
387 * @private | 412 * @private |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 * Called with the result of checking the origin. When the origin is allowed | 501 * Called with the result of checking the origin. When the origin is allowed |
477 * to claim the app ids, begins checking whether the app ids also list the | 502 * to claim the app ids, begins checking whether the app ids also list the |
478 * origin. | 503 * origin. |
479 * @param {!Array.<string>} appIds The app ids. | 504 * @param {!Array.<string>} appIds The app ids. |
480 * @param {function(boolean)} cb Called with the result of the check. | 505 * @param {function(boolean)} cb Called with the result of the check. |
481 * @param {boolean} result Whether the origin could claim the app ids. | 506 * @param {boolean} result Whether the origin could claim the app ids. |
482 * @private | 507 * @private |
483 */ | 508 */ |
484 Enroller.prototype.originChecked_ = function(appIds, cb, result) { | 509 Enroller.prototype.originChecked_ = function(appIds, cb, result) { |
485 if (!result) { | 510 if (!result) { |
486 this.notifyError_(ErrorCodes.BAD_REQUEST); | 511 this.notifyError_({errorCode: ErrorCodes.BAD_REQUEST}); |
487 return; | 512 return; |
488 } | 513 } |
489 /** @private {!AppIdChecker} */ | 514 /** @private {!AppIdChecker} */ |
490 this.appIdChecker_ = new AppIdChecker(FACTORY_REGISTRY.getTextFetcher(), | 515 this.appIdChecker_ = new AppIdChecker(FACTORY_REGISTRY.getTextFetcher(), |
491 this.timer_.clone(), this.origin_, appIds, this.allowHttp_, | 516 this.timer_.clone(), this.origin_, appIds, this.allowHttp_, |
492 this.logMsgUrl_); | 517 this.logMsgUrl_); |
493 this.appIdChecker_.doCheck().then(cb); | 518 this.appIdChecker_.doCheck().then(cb); |
494 }; | 519 }; |
495 | 520 |
496 /** Closes this enroller. */ | 521 /** Closes this enroller. */ |
497 Enroller.prototype.close = function() { | 522 Enroller.prototype.close = function() { |
498 if (this.appIdChecker_) { | 523 if (this.appIdChecker_) { |
499 this.appIdChecker_.close(); | 524 this.appIdChecker_.close(); |
500 } | 525 } |
501 if (this.handler_) { | 526 if (this.handler_) { |
502 this.handler_.close(); | 527 this.handler_.close(); |
503 this.handler_ = null; | 528 this.handler_ = null; |
504 } | 529 } |
505 }; | 530 }; |
506 | 531 |
507 /** | 532 /** |
508 * Notifies the caller with the error code. | 533 * Notifies the caller with the error. |
509 * @param {ErrorCodes} code Error code | 534 * @param {U2fError} error Error. |
510 * @private | 535 * @private |
511 */ | 536 */ |
512 Enroller.prototype.notifyError_ = function(code) { | 537 Enroller.prototype.notifyError_ = function(error) { |
513 if (this.done_) | 538 if (this.done_) |
514 return; | 539 return; |
515 this.close(); | 540 this.close(); |
516 this.done_ = true; | 541 this.done_ = true; |
517 this.errorCb_(code); | 542 this.errorCb_(error); |
518 }; | 543 }; |
519 | 544 |
520 /** | 545 /** |
521 * Notifies the caller of success with the provided response data. | 546 * Notifies the caller of success with the provided response data. |
522 * @param {string} u2fVersion Protocol version | 547 * @param {string} u2fVersion Protocol version |
523 * @param {string} info Response data | 548 * @param {string} info Response data |
524 * @param {string|undefined} opt_browserData Browser data used | 549 * @param {string|undefined} opt_browserData Browser data used |
525 * @private | 550 * @private |
526 */ | 551 */ |
527 Enroller.prototype.notifySuccess_ = | 552 Enroller.prototype.notifySuccess_ = |
528 function(u2fVersion, info, opt_browserData) { | 553 function(u2fVersion, info, opt_browserData) { |
529 if (this.done_) | 554 if (this.done_) |
530 return; | 555 return; |
531 this.close(); | 556 this.close(); |
532 this.done_ = true; | 557 this.done_ = true; |
533 this.successCb_(u2fVersion, info, opt_browserData); | 558 this.successCb_(u2fVersion, info, opt_browserData); |
534 }; | 559 }; |
535 | 560 |
536 /** | 561 /** |
537 * Called by the helper upon completion. | 562 * Called by the helper upon completion. |
538 * @param {EnrollHelperReply} reply The result of the enroll request. | 563 * @param {EnrollHelperReply} reply The result of the enroll request. |
539 * @private | 564 * @private |
540 */ | 565 */ |
541 Enroller.prototype.helperComplete_ = function(reply) { | 566 Enroller.prototype.helperComplete_ = function(reply) { |
542 if (reply.code) { | 567 if (reply.code) { |
543 var reportedError = mapDeviceStatusCodeToErrorCode(reply.code); | 568 var reportedError = mapDeviceStatusCodeToU2fError(reply.code); |
544 console.log(UTIL_fmt('helper reported ' + reply.code.toString(16) + | 569 console.log(UTIL_fmt('helper reported ' + reply.code.toString(16) + |
545 ', returning ' + reportedError)); | 570 ', returning ' + reportedError.errorCode)); |
546 this.notifyError_(reportedError); | 571 this.notifyError_(reportedError); |
547 } else { | 572 } else { |
548 console.log(UTIL_fmt('Gnubby enrollment succeeded!!!!!')); | 573 console.log(UTIL_fmt('Gnubby enrollment succeeded!!!!!')); |
549 var browserData; | 574 var browserData; |
550 | 575 |
551 if (reply.version == 'U2F_V2') { | 576 if (reply.version == 'U2F_V2') { |
552 // For U2F_V2, the challenge sent to the gnubby is modified to be the hash | 577 // For U2F_V2, the challenge sent to the gnubby is modified to be the hash |
553 // of the browser data. Include the browser data. | 578 // of the browser data. Include the browser data. |
554 browserData = this.browserData_[reply.version]; | 579 browserData = this.browserData_[reply.version]; |
555 } | 580 } |
556 | 581 |
557 this.notifySuccess_(/** @type {string} */ (reply.version), | 582 this.notifySuccess_(/** @type {string} */ (reply.version), |
558 /** @type {string} */ (reply.enrollData), | 583 /** @type {string} */ (reply.enrollData), |
559 browserData); | 584 browserData); |
560 } | 585 } |
561 }; | 586 }; |
OLD | NEW |