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.
61 lines • 6.52 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 { Aead } from '../aead/internal/aead';
import { InsecureIvAesGcm, IV_SIZE_IN_BYTES } from '../aead/internal/insecure_iv_aes_gcm';
import { randBytes } from './random';
import * as validators from './validators';
/**
* Implementation of AES-GCM, wrapped around InsecureIvAesGcm.
*
* @final
*/
export class AesGcm extends Aead {
constructor(key) {
super();
this.key = key;
this.insecureIvAesGcm = new InsecureIvAesGcm({ key, prependIv: true });
}
encrypt(plaintext, associatedData) {
return __awaiter(this, void 0, void 0, function* () {
const iv = randBytes(IV_SIZE_IN_BYTES);
return this.insecureIvAesGcm.encrypt(iv, plaintext, associatedData);
});
}
decrypt(ciphertext, associatedData) {
return __awaiter(this, void 0, void 0, function* () {
const iv = new Uint8Array(IV_SIZE_IN_BYTES);
iv.set(ciphertext.subarray(0, IV_SIZE_IN_BYTES));
return this.insecureIvAesGcm.decrypt(iv, ciphertext, associatedData);
});
}
}
/** Returns an AEAD instantiation genererated from a given raw `key` */
export function fromRawKey(key) {
return __awaiter(this, void 0, void 0, function* () {
validators.validateAesKeySize(key.length);
const webCryptoKey = yield self.crypto.subtle.importKey(
/* format */
'raw', key,
/* keyData */
{ 'name': 'AES-GCM', 'length': key.length },
/* algo */
false,
/* extractable*/
['encrypt', 'decrypt']);
/* usage */
return new AesGcm(webCryptoKey);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVzX2djbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3N1YnRsZS9hZXNfZ2NtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFFeEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLE1BQU8sU0FBUSxJQUFJO0lBRzlCLFlBQXFCLEdBQWM7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFEVyxRQUFHLEdBQUgsR0FBRyxDQUFXO1FBRWpDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFSyxPQUFPLENBQUMsU0FBcUIsRUFBRSxjQUEyQjs7WUFFOUQsTUFBTSxFQUFFLEdBQWUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdEUsQ0FBQztLQUFBO0lBRUssT0FBTyxDQUFDLFVBQXNCLEVBQUUsY0FBMkI7O1lBRS9ELE1BQU0sRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkUsQ0FBQztLQUFBO0NBQ0Y7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFnQixVQUFVLENBQUMsR0FBZTs7UUFDOUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVM7UUFDbkQsWUFBWTtRQUNaLEtBQUssRUFBRSxHQUFHO1FBQ1YsYUFBYTtRQUNiLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBQztRQUN6QyxVQUFVO1FBQ1YsS0FBSztRQUNMLGdCQUFnQjtRQUNoQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTVCLFdBQVc7UUFDWCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHtBZWFkfSBmcm9tICcuLi9hZWFkL2ludGVybmFsL2FlYWQnO1xuaW1wb3J0IHtJbnNlY3VyZUl2QWVzR2NtLCBJVl9TSVpFX0lOX0JZVEVTfSBmcm9tICcuLi9hZWFkL2ludGVybmFsL2luc2VjdXJlX2l2X2Flc19nY20nO1xuXG5pbXBvcnQge3JhbmRCeXRlc30gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIEFFUy1HQ00sIHdyYXBwZWQgYXJvdW5kIEluc2VjdXJlSXZBZXNHY20uXG4gKlxuICogQGZpbmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBZXNHY20gZXh0ZW5kcyBBZWFkIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlY3VyZUl2QWVzR2NtOiBJbnNlY3VyZUl2QWVzR2NtO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGtleTogQ3J5cHRvS2V5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmluc2VjdXJlSXZBZXNHY20gPSBuZXcgSW5zZWN1cmVJdkFlc0djbSh7a2V5LCBwcmVwZW5kSXY6IHRydWV9KTtcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHQocGxhaW50ZXh0OiBVaW50OEFycmF5LCBhc3NvY2lhdGVkRGF0YT86IFVpbnQ4QXJyYXkpOlxuICAgICAgUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgaXY6IFVpbnQ4QXJyYXkgPSByYW5kQnl0ZXMoSVZfU0laRV9JTl9CWVRFUyk7XG4gICAgcmV0dXJuIHRoaXMuaW5zZWN1cmVJdkFlc0djbS5lbmNyeXB0KGl2LCBwbGFpbnRleHQsIGFzc29jaWF0ZWREYXRhKTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHQoY2lwaGVydGV4dDogVWludDhBcnJheSwgYXNzb2NpYXRlZERhdGE/OiBVaW50OEFycmF5KTpcbiAgICAgIFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkoSVZfU0laRV9JTl9CWVRFUyk7XG4gICAgaXYuc2V0KGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgSVZfU0laRV9JTl9CWVRFUykpO1xuICAgIHJldHVybiB0aGlzLmluc2VjdXJlSXZBZXNHY20uZGVjcnlwdChpdiwgY2lwaGVydGV4dCwgYXNzb2NpYXRlZERhdGEpO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIGFuIEFFQUQgaW5zdGFudGlhdGlvbiBnZW5lcmVyYXRlZCBmcm9tIGEgZ2l2ZW4gcmF3IGBrZXlgICAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZyb21SYXdLZXkoa2V5OiBVaW50OEFycmF5KTogUHJvbWlzZTxBZWFkPiB7XG4gIHZhbGlkYXRvcnMudmFsaWRhdGVBZXNLZXlTaXplKGtleS5sZW5ndGgpO1xuICBjb25zdCB3ZWJDcnlwdG9LZXkgPSBhd2FpdCBzZWxmLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgLyogZm9ybWF0ICovXG4gICAgICAncmF3Jywga2V5LFxuICAgICAgLyoga2V5RGF0YSAqL1xuICAgICAgeyduYW1lJzogJ0FFUy1HQ00nLCAnbGVuZ3RoJzoga2V5Lmxlbmd0aH0sXG4gICAgICAvKiBhbGdvICovXG4gICAgICBmYWxzZSxcbiAgICAgIC8qIGV4dHJhY3RhYmxlKi9cbiAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10pO1xuXG4gIC8qIHVzYWdlICovXG4gIHJldHVybiBuZXcgQWVzR2NtKHdlYkNyeXB0b0tleSk7XG59XG4iXX0=