Skip to content

Commit

Permalink
feat: gcp kms signer
Browse files Browse the repository at this point in the history
  • Loading branch information
fforbeck committed Oct 25, 2021
1 parent 0ea082b commit e290230
Show file tree
Hide file tree
Showing 18 changed files with 32,156 additions and 1 deletion.
18 changes: 18 additions & 0 deletions .babelrc
@@ -0,0 +1,18 @@
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": 6
}
}
],
"@babel/preset-typescript"
],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-optional-chaining",
"@babel/plugin-proposal-nullish-coalescing-operator"
]
}
3 changes: 3 additions & 0 deletions .eslintignore
@@ -0,0 +1,3 @@
coverage
dist
node_modules
53 changes: 53 additions & 0 deletions .eslintrc
@@ -0,0 +1,53 @@
{
"parser": "babel-eslint",
"extends": [
"airbnb-base",
"plugin:prettier/recommended"
],
"env": {
"jest": true
},
"settings": {
"import/resolver": {
"node": {
"extensions": [
".js",
".jsx",
".ts",
".tsx"
]
}
}
},
"overrides": [
{
"files": [
"**/*.ts",
"**/*.tsx"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
"no-undef": "off",
"no-unused-vars": "off",
"no-restricted-globals": "off"
}
}
],
"rules": {
"import/extensions": "off",
"import/prefer-default-export": "off",
"import/no-default-export": "error",
"no-underscore-dangle": [
2,
{
"allowAfterThis": true
}
]
}
}
27 changes: 27 additions & 0 deletions .github/workflow/release.yml
@@ -0,0 +1,27 @@
name: Release
on:
push:
branches:
- main
jobs:
release:
name: Release
runs-on: ubuntu-latest
environment:
name: 'NPM Deploy'
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 12
- name: Install dependencies
run: npm ci
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npx semantic-release
38 changes: 38 additions & 0 deletions .github/workflow/test.yml
@@ -0,0 +1,38 @@
name: CI

on: [push]

jobs:
test:
name: Lint & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Cache Node Modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Packages
# there's a problem with ganache-core using a very old version of ethereumjs-abi which fails on git checkout with ssh reasons
run: |
git config --global url."https://".insteadOf git://
git config --global url."https://".insteadOf git+https://
git config --global url."https://".insteadOf ssh://git
npm ci
- name: Check Lint
run: npm run lint
- name: Test
run: npm run test
- name: Build
run: npm run build
3 changes: 3 additions & 0 deletions .prettierrc
@@ -0,0 +1,3 @@
{
"printWidth": 120
}
2 changes: 2 additions & 0 deletions .releaserc.yaml
@@ -0,0 +1,2 @@
branch: main
extends: "semantic-release-npm-github-publish"
7 changes: 7 additions & 0 deletions .yo-rc.json
@@ -0,0 +1,7 @@
{
"generator-semantic-module": {
"packager": "npm",
"commitizen-adapter": "@commitlint/prompt",
"commitlint-config": "@commitlint/config-conventional"
}
}
82 changes: 81 additions & 1 deletion README.md
@@ -1 +1,81 @@
# ethers-gcp-kms-signer
# ethers-gcp-kms-signer

This is a wallet or signer that can be used together with [Ethers.js](https://github.com/ethers-io/ethers.js/) applications.

## Getting Started

```sh
npm i ethers-gcp-kms-signer
```

1. Create your asymmetric key as follows: https://cloud.google.com/kms/docs/creating-asymmetric-keys

2. Add the new service account to GCP with the correct KMS roles: Crypto KMS `Signer`, `Verifier`, `Viewer`

3. Provide the GCP service account credentials using an environment variable called `GOOGLE_APPLICATION_CREDENTIALS` [here](https://cloud.google.com/kms/docs/accessing-the-api#non_google_production_environment)

4. Use the `GcpKmsSigner` constructor as shown below, and that will resolve the correct key to sign the transaction.

```js
import { GcpKmsSigner } from "ethers-gcp-kms-signer";

const kmsCredentials = {
projectId: "gcp-project-id", // your project id in gcp
locationId: "global", // the location where your key ring was created
keyRingId: "kr-1", // the id of the key ring
keyId: "key-name", // the name/id of your key in the key ring
keyVersion: "1", // the version of the key
};

const provider = ethers.providers.getDefaultProvider("ropsten");
let signer = new GcpKmsSigner(kmsCredentials);
signer = signer.connect(provider);

const tx = await signer.sendTransaction({
to: "0xE94E130546485b928C9C9b9A5e69EB787172952e",
value: ethers.utils.parseEther("0.01"),
});
console.log(tx);
```

# Developers

## Install

`git clone` this repo

```sh
$ git clone https://github.com/openlawteam/ethers-gcp-kms-signer my-module
$ cd my-module
$ rm -rf .git
$ npm install # or yarn
```

Just make sure to edit `package.json`, `README.md` and `LICENSE` files accordingly with your module's info.

## Commands

```sh
$ npm test # run tests with Jest
$ npm run coverage # run tests with coverage
$ npm run lint # lint code
$ npm run build # generate docs and transpile code
```

## Commit message format

This boiler plate uses the **semantic-release** package to manage versioning. Once it has been set up, version numbers and Github release changelogs will be automatically managed. **semantic-release** uses the commit messages to determine the type of changes in the codebase. Following formalized conventions for commit messages, **semantic-release** automatically determines the next [semantic version](https://semver.org) number, generates a changelog and publishes the release.

Use `npm run commit` instead of `git commit` in order to invoke Commitizen commit helper that helps with writing properly formatted commit messages.

## License

MIT

# Credits

All the credits to

- [RJ Chow](https://github.com/rjchow) for integrating AWS KMS signer with Ethers.js and share that with everyone at https://github.com/rjchow/ethers-aws-kms-signer

- Lucas Henning for doing the legwork on parsing the AWS KMS signature and public key asn formats: https://luhenning.medium.com/the-dark-side-of-the-elliptic-curve-signing-ethereum-transactions-with-aws-kms-in-javascript-83610d9a6f81
8 changes: 8 additions & 0 deletions commitlint.config.js
@@ -0,0 +1,8 @@
/* eslint-env node */

module.exports = {
extends: ["@commitlint/config-conventional"],

// Add your own rules. See http://marionebl.github.io/commitlint
rules: {},
};
4 changes: 4 additions & 0 deletions jest.config.js
@@ -0,0 +1,4 @@
const config = {
verbose: false,
};
module.exports = config;

0 comments on commit e290230

Please sign in to comment.