blob: c10b1c6ad38a6eaed2eb8a6bcbac2849fefc1769 [file] [log] [blame]
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
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 {
private readonly encoding: EllipticCurves.EcdsaSignatureEncodingType;
/**
* @param opt_encoding The
* optional encoding of the signature. If absent, default is IEEE P1363.
*/
constructor(
private readonly key: CryptoKey, private readonly hash: string,
opt_encoding?: EllipticCurves.EcdsaSignatureEncodingType|null) {
super();
if (!opt_encoding) {
opt_encoding = EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363;
}
this.encoding = opt_encoding;
}
/**
*/
async sign(message: Uint8Array): Promise<Uint8Array> {
Validators.requireUint8Array(message);
const signature = await 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 async function fromJsonWebKey(
jwk: JsonWebKey, hash: string,
opt_encoding?: EllipticCurves.EcdsaSignatureEncodingType|
null): Promise<PublicKeySign> {
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 = await EllipticCurves.importPrivateKey('ECDSA', jwk);
return new EcdsaSign(cryptoKey, hash, opt_encoding);
}