tink-crypto
Version:
A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.
69 lines • 7.56 kB
JavaScript
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { SecurityException } from '../exception/security_exception';
import { PublicKeySign } from '../signature/internal/public_key_sign';
import * as EllipticCurves from './elliptic_curves';
import * as Validators from './validators';
/**
* Implementation of ECDSA signing.
*
* @final
*/
export class EcdsaSign extends PublicKeySign {
/**
* @param opt_encoding The
* optional encoding of the signature. If absent, default is IEEE P1363.
*/
constructor(key, hash, opt_encoding) {
super();
this.key = key;
this.hash = hash;
if (!opt_encoding) {
opt_encoding = EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363;
}
this.encoding = opt_encoding;
}
/**
*/
sign(message) {
return __awaiter(this, void 0, void 0, function* () {
Validators.requireUint8Array(message);
const signature = yield window.crypto.subtle.sign({ name: 'ECDSA', hash: { name: this.hash } }, this.key, message);
if (this.encoding === EllipticCurves.EcdsaSignatureEncodingType.DER) {
return EllipticCurves.ecdsaIeee2Der(new Uint8Array(signature));
}
return new Uint8Array(signature);
});
}
}
/**
* @param opt_encoding The
* optional encoding of the signature. If absent, default is IEEE P1363.
*/
export function fromJsonWebKey(jwk, hash, opt_encoding) {
return __awaiter(this, void 0, void 0, function* () {
if (!jwk) {
throw new SecurityException('private key has to be non-null');
}
const { crv } = jwk;
if (!crv) {
throw new SecurityException('curve has to be defined');
}
Validators.validateEcdsaParams(crv, hash);
const cryptoKey = yield EllipticCurves.importPrivateKey('ECDSA', jwk);
return new EcdsaSign(cryptoKey, hash, opt_encoding);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2Ffc2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3N1YnRsZS9lY2RzYV9zaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFcEUsT0FBTyxLQUFLLGNBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFNBQVUsU0FBUSxhQUFhO0lBRzFDOzs7T0FHRztJQUNILFlBQ3FCLEdBQWMsRUFBbUIsSUFBWSxFQUM5RCxZQUE2RDtRQUMvRCxLQUFLLEVBQUUsQ0FBQztRQUZXLFFBQUcsR0FBSCxHQUFHLENBQVc7UUFBbUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUdoRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLFlBQVksR0FBRyxjQUFjLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7SUFDL0IsQ0FBQztJQUVEO09BQ0c7SUFDRyxJQUFJLENBQUMsT0FBbUI7O1lBQzVCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDN0MsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsMEJBQTBCLENBQUMsR0FBRyxFQUFFO2dCQUNuRSxPQUFPLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNoRTtZQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsQ0FBQztLQUFBO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLGNBQWMsQ0FDaEMsR0FBZSxFQUFFLElBQVksRUFDN0IsWUFDSTs7UUFDTixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksaUJBQWlCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUN4RDtRQUNELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7U2VjdXJpdHlFeGNlcHRpb259IGZyb20gJy4uL2V4Y2VwdGlvbi9zZWN1cml0eV9leGNlcHRpb24nO1xuaW1wb3J0IHtQdWJsaWNLZXlTaWdufSBmcm9tICcuLi9zaWduYXR1cmUvaW50ZXJuYWwvcHVibGljX2tleV9zaWduJztcblxuaW1wb3J0ICogYXMgRWxsaXB0aWNDdXJ2ZXMgZnJvbSAnLi9lbGxpcHRpY19jdXJ2ZXMnO1xuaW1wb3J0ICogYXMgVmFsaWRhdG9ycyBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIEVDRFNBIHNpZ25pbmcuXG4gKlxuICogQGZpbmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFY2RzYVNpZ24gZXh0ZW5kcyBQdWJsaWNLZXlTaWduIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmNvZGluZzogRWxsaXB0aWNDdXJ2ZXMuRWNkc2FTaWduYXR1cmVFbmNvZGluZ1R5cGU7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRfZW5jb2RpbmcgVGhlXG4gICAqICAgICBvcHRpb25hbCBlbmNvZGluZyBvZiB0aGUgc2lnbmF0dXJlLiBJZiBhYnNlbnQsIGRlZmF1bHQgaXMgSUVFRSBQMTM2My5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBrZXk6IENyeXB0b0tleSwgcHJpdmF0ZSByZWFkb25seSBoYXNoOiBzdHJpbmcsXG4gICAgICBvcHRfZW5jb2Rpbmc/OiBFbGxpcHRpY0N1cnZlcy5FY2RzYVNpZ25hdHVyZUVuY29kaW5nVHlwZXxudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoIW9wdF9lbmNvZGluZykge1xuICAgICAgb3B0X2VuY29kaW5nID0gRWxsaXB0aWNDdXJ2ZXMuRWNkc2FTaWduYXR1cmVFbmNvZGluZ1R5cGUuSUVFRV9QMTM2MztcbiAgICB9XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdF9lbmNvZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgYXN5bmMgc2lnbihtZXNzYWdlOiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlVWludDhBcnJheShtZXNzYWdlKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5zaWduKFxuICAgICAgICB7bmFtZTogJ0VDRFNBJywgaGFzaDoge25hbWU6IHRoaXMuaGFzaH19LCB0aGlzLmtleSwgbWVzc2FnZSk7XG4gICAgaWYgKHRoaXMuZW5jb2RpbmcgPT09IEVsbGlwdGljQ3VydmVzLkVjZHNhU2lnbmF0dXJlRW5jb2RpbmdUeXBlLkRFUikge1xuICAgICAgcmV0dXJuIEVsbGlwdGljQ3VydmVzLmVjZHNhSWVlZTJEZXIobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShzaWduYXR1cmUpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIG9wdF9lbmNvZGluZyBUaGVcbiAqICAgICBvcHRpb25hbCBlbmNvZGluZyBvZiB0aGUgc2lnbmF0dXJlLiBJZiBhYnNlbnQsIGRlZmF1bHQgaXMgSUVFRSBQMTM2My5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZyb21Kc29uV2ViS2V5KFxuICAgIGp3azogSnNvbldlYktleSwgaGFzaDogc3RyaW5nLFxuICAgIG9wdF9lbmNvZGluZz86IEVsbGlwdGljQ3VydmVzLkVjZHNhU2lnbmF0dXJlRW5jb2RpbmdUeXBlfFxuICAgIG51bGwpOiBQcm9taXNlPFB1YmxpY0tleVNpZ24+IHtcbiAgaWYgKCFqd2spIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ3ByaXZhdGUga2V5IGhhcyB0byBiZSBub24tbnVsbCcpO1xuICB9XG4gIGNvbnN0IHtjcnZ9ID0gandrO1xuICBpZiAoIWNydikge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignY3VydmUgaGFzIHRvIGJlIGRlZmluZWQnKTtcbiAgfVxuICBWYWxpZGF0b3JzLnZhbGlkYXRlRWNkc2FQYXJhbXMoY3J2LCBoYXNoKTtcbiAgY29uc3QgY3J5cHRvS2V5ID0gYXdhaXQgRWxsaXB0aWNDdXJ2ZXMuaW1wb3J0UHJpdmF0ZUtleSgnRUNEU0EnLCBqd2spO1xuICByZXR1cm4gbmV3IEVjZHNhU2lnbihjcnlwdG9LZXksIGhhc2gsIG9wdF9lbmNvZGluZyk7XG59XG4iXX0=