|
17 | 17 | //******************************************************************************* |
18 | 18 | "use strict"; |
19 | 19 |
|
20 | | -var msrCryptoVersion = "1.6.3"; |
| 20 | +var msrCryptoVersion = "1.6.4"; |
21 | 21 |
|
22 | 22 | (function(root, factory) { |
23 | 23 |
|
@@ -7236,106 +7236,76 @@ var msrCryptoVersion = "1.6.3"; |
7236 | 7236 | operations.register("generateKey", "RSA-PSS", msrcryptoRsa.generateKeyPair); |
7237 | 7237 | } |
7238 | 7238 |
|
7239 | | - var msrcryptoKdf = function(hashFunction) { |
| 7239 | + var msrcryptoConcatKdf = (function() { |
7240 | 7240 |
|
7241 | | - var utils = msrcryptoUtilities; |
| 7241 | + function deriveBits(p) { |
| 7242 | + |
| 7243 | + var hashName = p.algorithm.hash.name, |
| 7244 | + hashFunction = msrcryptoHashFunctions[hashName.toUpperCase()](), |
| 7245 | + alg = p.algorithm; |
| 7246 | + |
| 7247 | + var otherInfo = |
| 7248 | + utils.toArray(alg.algorithmId).concat( |
| 7249 | + utils.toArray(alg.partyUInfo), |
| 7250 | + utils.toArray(alg.partyVInfo), |
| 7251 | + utils.toArray(alg.publicInfo) || [], |
| 7252 | + utils.toArray(alg.privateInfo) || []); |
7242 | 7253 |
|
7243 | | - function deriveKey(secretBytes, otherInfo, keyOutputLength) { |
7244 | | - var reps = Math.ceil(keyOutputLength / (hashFunction.hashLen / 8)), |
| 7254 | + var reps = Math.ceil(p.length / hashFunction.hashLen), |
7245 | 7255 | counter = 1, |
7246 | | - digest = secretBytes.concat(otherInfo), |
| 7256 | + digest = p.keyData.concat(otherInfo), |
7247 | 7257 | output = []; |
7248 | 7258 |
|
7249 | 7259 | for (var i = 0; i < reps; i++) { |
7250 | | - |
7251 | 7260 | var data = utils.int32ToBytes(counter++).concat(digest); |
7252 | | - |
7253 | 7261 | var h = hashFunction.computeHash(data); |
7254 | | - |
7255 | 7262 | output = output.concat(h); |
7256 | 7263 | } |
7257 | 7264 |
|
7258 | | - return output.slice(0, keyOutputLength); |
| 7265 | + return output.slice(0, p.length / 8); |
| 7266 | + |
7259 | 7267 | } |
7260 | 7268 |
|
7261 | 7269 | return { |
7262 | | - |
7263 | | - deriveKey: deriveKey |
7264 | | - |
| 7270 | + deriveBits: deriveBits |
7265 | 7271 | }; |
7266 | 7272 |
|
7267 | | - }; |
| 7273 | + }()); |
7268 | 7274 |
|
7269 | | - var msrcryptoKdfInstance = null; |
| 7275 | + var msrcryptoConcatKdfInstance = null; |
7270 | 7276 |
|
7271 | 7277 | if (typeof operations !== "undefined") { |
7272 | 7278 |
|
7273 | | - msrcryptoKdf.deriveKey = function(p) { |
7274 | | - |
7275 | | - var utils = msrcryptoUtilities; |
7276 | | - |
7277 | | - var hashName = p.algorithm.hash.name; |
7278 | | - |
7279 | | - var hashFunction = msrcryptoHashFunctions[hashName.toUpperCase()](); |
7280 | | - |
7281 | | - msrcryptoKdfInstance = msrcryptoKdf(hashFunction); |
7282 | | - |
7283 | | - var alg = p.algorithm; |
7284 | | - |
7285 | | - var otherInfo = |
7286 | | - utils.toArray(alg.algorithmId).concat( |
7287 | | - utils.toArray(alg.partyUInfo), |
7288 | | - utils.toArray(alg.partyVInfo), |
7289 | | - utils.toArray(alg.publicInfo), |
7290 | | - utils.toArray(alg.privateInfo)); |
| 7279 | + msrcryptoConcatKdf.importKey = function(p) { |
| 7280 | + var keyData; |
7291 | 7281 |
|
7292 | | - var result = |
7293 | | - msrcryptoKdfInstance.deriveKey(p.keyData, otherInfo, p.derivedKeyType.length); |
| 7282 | + if (p.format === "raw") { |
| 7283 | + keyData = msrcryptoUtilities.toArray(p.keyData); |
| 7284 | + } else { |
| 7285 | + throw new Error("unsupported import format"); |
| 7286 | + } |
7294 | 7287 |
|
7295 | | - msrcryptoKdfInstance = null; |
| 7288 | + if (p.extractable !== false) { |
| 7289 | + throw new Error("only extractable=false is supported."); |
| 7290 | + } |
7296 | 7291 |
|
7297 | 7292 | return { |
7298 | | - type: "keyDerive", |
7299 | | - keyData: result, |
| 7293 | + type: "keyImport", |
| 7294 | + keyData: keyData, |
7300 | 7295 | keyHandle: { |
7301 | | - algorithm: p.derivedKeyType, |
7302 | | - extractable: p.extractable, |
7303 | | - usages: null || p.usages, |
| 7296 | + algorithm: { |
| 7297 | + name: "CONCAT" |
| 7298 | + }, |
| 7299 | + extractable: false, |
| 7300 | + usages: p.usages, |
7304 | 7301 | type: "secret" |
7305 | 7302 | } |
7306 | 7303 | }; |
7307 | 7304 |
|
7308 | 7305 | }; |
7309 | 7306 |
|
7310 | | - msrcryptoKdf.deriveBits = function(p) { |
7311 | | - |
7312 | | - var hashName = p.algorithm.hash.name; |
7313 | | - |
7314 | | - var hashFunction = msrcryptoHashFunctions[hashName.toUpperCase()](); |
7315 | | - |
7316 | | - msrcryptoKdfInstance = msrcryptoKdf(hashFunction); |
7317 | | - |
7318 | | - var alg = p.algorithm; |
7319 | | - |
7320 | | - var otherInfo = |
7321 | | - alg.algorithmId.concat( |
7322 | | - alg.partyUInfo, |
7323 | | - alg.partyVInfo, |
7324 | | - alg.publicInfo || [], |
7325 | | - alg.privateInfo || []); |
7326 | | - |
7327 | | - var result = |
7328 | | - msrcryptoKdfInstance.deriveKey(p.keyData, otherInfo, p.length); |
7329 | | - |
7330 | | - msrcryptoKdfInstance = null; |
7331 | | - |
7332 | | - return result; |
7333 | | - |
7334 | | - }; |
7335 | | - |
7336 | | - operations.register("deriveKey", "concat", msrcryptoKdf.deriveKey); |
7337 | | - operations.register("deriveBits", "concat", msrcryptoKdf.deriveBits); |
7338 | | - |
| 7307 | + operations.register("deriveBits", "CONCAT", msrcryptoConcatKdf.deriveBits); |
| 7308 | + operations.register("importKey", "CONCAT", msrcryptoConcatKdf.importKey); |
7339 | 7309 | } |
7340 | 7310 |
|
7341 | 7311 | var msrcryptoPbkdf2 = (function() { |
@@ -7574,6 +7544,113 @@ var msrCryptoVersion = "1.6.3"; |
7574 | 7544 | operations.register("importKey", "HKDF", msrcryptoHkdf.importKey); |
7575 | 7545 | } |
7576 | 7546 |
|
| 7547 | + var msrcryptoHkdfCtr = (function() { |
| 7548 | + |
| 7549 | + function deriveBits(p) { |
| 7550 | + |
| 7551 | + var algorithm = p.algorithm, |
| 7552 | + keyBytes = p.keyData, |
| 7553 | + bits = p.length, |
| 7554 | + labelBytes = algorithm.label, |
| 7555 | + contextBytes = algorithm.context, |
| 7556 | + byteLen = Math.ceil(bits / 8), |
| 7557 | + hLen, |
| 7558 | + output = [], |
| 7559 | + i, |
| 7560 | + hmacContext; |
| 7561 | + |
| 7562 | + switch (algorithm.hash.name.toUpperCase()) { |
| 7563 | + case "SHA-1": |
| 7564 | + hLen = 20; |
| 7565 | + break; |
| 7566 | + case "SHA-256": |
| 7567 | + hLen = 32; |
| 7568 | + break; |
| 7569 | + case "SHA-384": |
| 7570 | + hLen = 48; |
| 7571 | + break; |
| 7572 | + case "SHA-512": |
| 7573 | + hLen = 64; |
| 7574 | + break; |
| 7575 | + default: |
| 7576 | + throw new Error("Unsupported hash algorithm."); |
| 7577 | + } |
| 7578 | + |
| 7579 | + if (algorithm.label == null) { |
| 7580 | + throw new Error("HkdfCtrParams: label: Missing required property."); |
| 7581 | + } |
| 7582 | + |
| 7583 | + if (algorithm.context == null) { |
| 7584 | + throw new Error("HkdfCtrParams: context: Missing required property."); |
| 7585 | + } |
| 7586 | + |
| 7587 | + if (bits % 8 !== 0) { |
| 7588 | + throw new Error("The length provided for HKDF-CTR is not a multiple of 8 bits."); |
| 7589 | + } |
| 7590 | + |
| 7591 | + if (byteLen > 255 * hLen) { |
| 7592 | + throw new Error("The length provided for HKDF-CTR is too large."); |
| 7593 | + } |
| 7594 | + |
| 7595 | + hmacContext = { |
| 7596 | + workerid: 0, |
| 7597 | + keyHandle: { |
| 7598 | + algorithm: algorithm |
| 7599 | + }, |
| 7600 | + keyData: keyBytes, |
| 7601 | + buffer: keyBytes |
| 7602 | + }; |
| 7603 | + |
| 7604 | + var fixed = labelBytes.concat([0], contextBytes, utils.int32ToBytes(bits)); |
| 7605 | + |
| 7606 | + for (i = 1; i <= Math.ceil(byteLen / hLen); i++) { |
| 7607 | + hmacContext.buffer = utils.int32ToBytes(i).concat(fixed); |
| 7608 | + output = output.concat(msrcryptoHmac.signHmac(hmacContext)); |
| 7609 | + } |
| 7610 | + |
| 7611 | + return output.slice(0, byteLen); |
| 7612 | + } |
| 7613 | + |
| 7614 | + return { |
| 7615 | + deriveBits: deriveBits |
| 7616 | + }; |
| 7617 | + |
| 7618 | + }()); |
| 7619 | + |
| 7620 | + if (typeof operations !== "undefined") { |
| 7621 | + |
| 7622 | + msrcryptoHkdfCtr.importKey = function(p) { |
| 7623 | + var keyData; |
| 7624 | + |
| 7625 | + if (p.format === "raw") { |
| 7626 | + keyData = msrcryptoUtilities.toArray(p.keyData); |
| 7627 | + } else { |
| 7628 | + throw new Error("unsupported import format"); |
| 7629 | + } |
| 7630 | + |
| 7631 | + if (p.extractable !== false) { |
| 7632 | + throw new Error("only extractable=false is supported."); |
| 7633 | + } |
| 7634 | + |
| 7635 | + return { |
| 7636 | + type: "keyImport", |
| 7637 | + keyData: keyData, |
| 7638 | + keyHandle: { |
| 7639 | + algorithm: { |
| 7640 | + name: "HKDF-CTR" |
| 7641 | + }, |
| 7642 | + extractable: false, |
| 7643 | + usages: p.usages, |
| 7644 | + type: "secret" |
| 7645 | + } |
| 7646 | + }; |
| 7647 | + |
| 7648 | + }; |
| 7649 | + |
| 7650 | + operations.register("deriveBits", "HKDF-CTR", msrcryptoHkdfCtr.deriveBits); |
| 7651 | + operations.register("importKey", "HKDF-CTR", msrcryptoHkdfCtr.importKey); |
| 7652 | + } |
| 7653 | + |
7577 | 7654 | var msrcryptoEcdh = function(curve) { |
7578 | 7655 |
|
7579 | 7656 | var btd = cryptoMath.bytesToDigits, |
|
0 commit comments