UNPKG

azure-pipelines-task-lib

Version:
72 lines (71 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Vault = void 0; var fs = require("fs"); var path = require("path"); var crypto = require("crypto"); var uuidV4 = require('uuid/v4'); var algorithm = "aes-256-ctr"; var encryptEncoding = 'hex'; var unencryptedEncoding = 'utf8'; // // Store sensitive data in proc. // Main goal: Protects tasks which would dump envvars from leaking secrets inadvertently // the task lib clears after storing. // Also protects against a dump of a process getting the secrets // The secret is generated and stored externally for the lifetime of the task. // var Vault = /** @class */ (function () { function Vault(keyPath) { this._keyFile = path.join(keyPath, '.taskkey'); this._store = {}; this.genKey(); } Vault.prototype.initialize = function () { }; Vault.prototype.storeSecret = function (name, data) { if (!name || name.length == 0) { return false; } name = name.toLowerCase(); if (!data || data.length == 0) { if (this._store.hasOwnProperty(name)) { delete this._store[name]; } return false; } var key = this.getKey(); var iv = crypto.randomBytes(16); var cipher = crypto.createCipheriv(algorithm, key, iv); var crypted = cipher.update(data, unencryptedEncoding, encryptEncoding); var cryptedFinal = cipher.final(encryptEncoding); this._store[name] = iv.toString(encryptEncoding) + crypted + cryptedFinal; return true; }; Vault.prototype.retrieveSecret = function (name) { var secret; name = (name || '').toLowerCase(); if (this._store.hasOwnProperty(name)) { var key = this.getKey(); var data = this._store[name]; var ivDataBuffer = Buffer.from(data, encryptEncoding); var iv = ivDataBuffer.slice(0, 16); var encryptedText = ivDataBuffer.slice(16); var decipher = crypto.createDecipheriv(algorithm, key, iv); var dec = decipher.update(encryptedText); var decFinal = decipher.final(unencryptedEncoding); secret = dec + decFinal; } return secret; }; Vault.prototype.getKey = function () { var key = fs.readFileSync(this._keyFile).toString('utf8'); // Key needs to be hashed to correct length to match algorithm (aes-256-ctr) return crypto.createHash('sha256').update(key).digest(); }; Vault.prototype.genKey = function () { fs.writeFileSync(this._keyFile, uuidV4(), { encoding: 'utf8' }); }; return Vault; }()); exports.Vault = Vault;