Git Product home page Git Product logo

airgap-it / airgap-vault Goto Github PK

View Code? Open in Web Editor NEW
385.0 13.0 108.0 73.81 MB

The AirGap Vault is installed on a spare smartphone that has no connection to any network, thus it is air gapped. This app handles the private key.

License: MIT License

Dockerfile 0.50% JavaScript 1.34% TypeScript 55.16% HTML 12.81% Java 5.68% Kotlin 9.18% C 0.01% Swift 11.32% Objective-C 0.29% Ruby 0.09% SCSS 3.61% Shell 0.01%
wallet cryptocurrency tezos ethereum bitcoin crypto-wallet offline blockchain crypto polkadot

airgap-vault's Introduction

AirGap Vault

Self custody made simple and secure. Protect your crypto and store your private keys offline.

AirGap is a crypto wallet system that lets you secure cypto assets with one secret on an offline device. The AirGap Vault application is installed on a dedicated device that has no connection to any network, thus it is air gapped. The AirGap Wallet is installed on your everyday smartphone.

Description

AirGap Vault is responsible for secure key generation. Entropy from audio, video, touch and accelerometer are used together with the output of the hardware random number generator. The generated secret is saved in the secure enclave of the device, only accessible by biometric authentication. Accounts for multiple protcols can be created. Transactions are prepared by the AirGap Wallet and then transferred to the offline device via QR code, where it is signed and sent back to the Wallet using another QR code.

AirGap Vault is a hybrid application (using the same codebase for Android and iOS). Created using AirGap's protocol agnostic airgap-coin-lib library to interact with different protocols and our own secure storage implementation.

Download

Features

  • Secure secret generation with added entropy from audio, video, touch and device accelerometer
  • Secure storage using the secure enclave of the device, accessible only by biometric authenticaiton
  • Secure, one-way communication with AirGap Wallet over QR codes or URL-Schemes (app switching)
  • Create accounts for all supported currencies like Aeternity, Bitcoin, Ethereum, Tezos, Cosmos, Kusama, Polkadot, Groestlcoin etc.
  • Sign transactions offline without the secret ever leaving your device

Security

The security concept behind air-gapped systems is to work with two physically separated devices, one of which has no connection to the outside world or any network. In the context of AirGap, the component which has no internet connection is the AirGap Vault. The two components, AirGap Vault and AirGap Wallet, communicate through one-way communication using QR codes.

Key Generation

The entropy seeder uses the native secure random generator provided by the device and concatenates this with the sha3 hash of the additional entropy (audio, video, touch, accelerometer). The rationale behind this is:

  • The sha3 hashing algorithm is cryptographically secure, such that the following holds: entropy(sha3(secureRandom())) >= entropy(secureRandom())
  • Adding bytes to the sha3 function will never lower entropy but only add to it, such that the following holds: entropy(sha3(secureRandom() + additionaEntropy)) >= entropy(sha3(secureRandom()))
  • By reusing the hash of an earlier "round" as a salt, we can incorporate the entire collected entropy of the previous round
  • Native secure random cannot be fully trusted because there is no API to check the entropy pool it's using

The algorithm being used for the entropy seeding:

const ENTROPY_BYTE_SIZE = 256
let entropyHashHexString = null

function toHexString(array) {
  return array
    .map(function (i) {
      return ('0' + i.toString(16)).slice(-2)
    })
    .join('')
}

function seedEntropy(additionalEntropyArray) {
  const secureRandomArray = new Uint8Array(ENTROPY_BYTE_SIZE)
  window.crypto.getRandomValues(secureRandomArray)
  console.log(entropyHashHexString + toHexString(secureRandomArray) + toHexString(additionalEntropyArray))
  entropyHashHexString = sha3_256(entropyHashHexString + toHexString(secureRandomArray) + toHexString(additionalEntropyArray))
  return entropyHashHexString
}

Supply Chain Attacks

In the past years, mutliple cryptocurrency wallets have been targeted by attackers to try and steal users funds. One common attack vector is the supply chain attack. In this attack, the attacker tries to compromise a dependency that is used in the wallet and use it to inject malicious code. At AirGap, we take utmost care of evaluating the dependencies we use. We have also introduced a system that separates the dependencies used during testing and development from the dependencies that are used to build and run the project. This reduces the risk of malicious code injection during the build and test steps.

Verifiable Builds

A very important property of any open source wallet is reprucibility. This means that executable that is downloaded from the Play Store or App Store can be exactly reproduced by compiling the open source code. If this is not the case, it means that there is hidden or removed code in the published version that is not visible in the published source code.

The project WalletScrutiny examines a wide variety of cryptocurrency wallets to determine their reproducibility. We're happy to say that AirGap Vault was one of the first wallets to be marked as "reproducible".

Security Audits

The application as a whole, as well as multiple components, have been audited by different third party companies.

All audits have found no way of extracting the private key from AirGap Vault.

The reports will be released once all the findings have been resolved.

Build

First follow the steps below to install the dependencies:

$ npm install -g @capacitor/cli
$ npm install

Run locally in browser:

$ npm run start

Build and open native project

$ npm run build
$ npx cap sync

You can now open the native iOS or Android projects in XCode or Android Studio respectively.

$ npx cap open ios
$ npx cap open android

Testing

To run the unit tests:

$ npm run install-test-dependencies
$ npm test
$ npm run install-build-dependencies

Translations

We use Transifex for the application translations.

If you want to contribute with translating the application you can do so by going to the AirGap Transifex page.

Updating translations

To import the translations from Transifex to the application, first you will need to install the transifex-cli. You can do so by creating a directory of your choice and intalling in it the package globally by running:

curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash

You can now restart the terminal and check if it is installed by running:

tx --version

Every available language can be found in src/assets/i18n/<lang>.json where each json file corresponds to a different language. You can now import the updated translations from Transifex by running:

tx pull

This will update all the local translations with the updated ones automatically.

If you want to send new variables from the default language file to transifex, you can do so by running:

tx push

Disclosing Security Vulnerabilities

If you discover a security vulnerability within this application, please send an e-mail to [email protected]. All security vulnerabilities will be promptly addressed.

Contributing

Before integrating a new feature, please quickly reach out to us in an issue so we can discuss and coordinate the change.

  • If you find any bugs, submit an issue or open pull-request.
  • If you want to integrate a new blockchain, please read the contributing guidelines in the airgap-coin-lib project.
  • Engage with other users and developers on the AirGap Telegram.

Related Projects

airgap-vault's People

Contributors

acharl avatar andreasgassmann avatar bb4l avatar dcale avatar dschoeni avatar etharner avatar godenzim avatar jsamol avatar lukeisontheroad avatar miguelsalesv avatar mlaeng avatar mohammadrafigh avatar mtwzim avatar pascuin avatar tischlu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

airgap-vault's Issues

Add Cryptocurrency Coins

I will create this issue which people can add what coins they want supported in AirGap. I would also like to have anyone who wants a coin added to AirGap look at my Plugin purposal which can be a way to allow coins to be added to AirGap without having the AirGap devs having to maintain all of these coins.

Plugin Purposal
#40

Please search this issue for the coin you want to see before creating a post to have it added and if you want the coin, thumbs up the post. To add a coin to this issue, add the coin name and the ticker symbol.

Cannot reproduce v3.3.0 from Google Play

I tried to reproduce the latest version from Google Play for WalletScrutiny but got a huge diff. I used the same test script as last time when it worked.

I'm pretty sure the build instructions should have changed as I see "1.0" as my build's version and that should be replaced by 3.3.0 I guess.

Files that differ:

Files /tmp/fromPlay_it.airgap.vault_20379/apktool.yml and /tmp/fromBuild_it.airgap.vault_20379/apktool.yml differ
Only in /tmp/fromPlay_it.airgap.vault_20379/assets/public: 38.cea6fa8b879cffca7fe3.js
Only in /tmp/fromBuild_it.airgap.vault_20379/assets/public: 38.e51e7d17dabdb5844377.js
Files /tmp/fromPlay_it.airgap.vault_20379/assets/public/index.html and /tmp/fromBuild_it.airgap.vault_20379/assets/public/index.html differ
Only in /tmp/fromPlay_it.airgap.vault_20379/assets/public: main.07c5ae921df3d9811219.js
Only in /tmp/fromBuild_it.airgap.vault_20379/assets/public: main.4ad3bdee2aeb1e78081d.js
Only in /tmp/fromPlay_it.airgap.vault_20379/assets/public: runtime.5f0fe13d41aff1159105.js
Only in /tmp/fromBuild_it.airgap.vault_20379/assets/public: runtime.8bf3e3c66d45f3bca379.js
Files /tmp/fromPlay_it.airgap.vault_20379/original/AndroidManifest.xml and /tmp/fromBuild_it.airgap.vault_20379/original/AndroidManifest.xml differ
Files /tmp/fromPlay_it.airgap.vault_20379/original/META-INF/MANIFEST.MF and /tmp/fromBuild_it.airgap.vault_20379/original/META-INF/MANIFEST.MF differ
Only in /tmp/fromPlay_it.airgap.vault_20379/original/META-INF: PAPERS.RSA
Only in /tmp/fromPlay_it.airgap.vault_20379/original/META-INF: PAPERS.SF
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/BuildConfig.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/BuildConfig.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/appinfo/AppInfo.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/appinfo/AppInfo.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$3.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$authenticate$3.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$clearWindowSecureFlag$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$clearWindowSecureFlag$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Companion.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Companion.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$3.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$getItem$$inlined$with$lambda$3.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Key.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Key.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Param.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$Param.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$removeItem$$inlined$with$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$removeItem$$inlined$with$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$removeItem$$inlined$with$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$removeItem$$inlined$with$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$3.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setItem$$inlined$with$lambda$3.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupParanoiaPassword$$inlined$with$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupParanoiaPassword$$inlined$with$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupParanoiaPassword$$inlined$with$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupParanoiaPassword$$inlined$with$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$3.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setupRecoveryPassword$$inlined$with$lambda$3.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setWindowSecureFlag$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils$setWindowSecureFlag$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/SecurityUtils.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Errors.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Errors.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$afterTextChanged$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$afterTextChanged$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$Companion.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$Companion.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$generatePassword$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$generatePassword$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$generatePasswordKey$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$generatePasswordKey$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$readFromSecureStorage$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$readFromSecureStorage$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$readFromSecureStorage$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$readFromSecureStorage$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$error$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoverString$error$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoveryKeyCharacters$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$recoveryKeyCharacters$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2$$special$$inlined$apply$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2$$special$$inlined$apply$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2$$special$$inlined$apply$lambda$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2$$special$$inlined$apply$lambda$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordAlert$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$$special$$inlined$apply$lambda$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$$special$$inlined$apply$lambda$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showPasswordSetupAlert$2.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showRecoveryAlert$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$showRecoveryAlert$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$writeToSecureStorage$1$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$writeToSecureStorage$1$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$writeToSecureStorage$1.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage$writeToSecureStorage$1.smali differ
Files /tmp/fromPlay_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage.smali and /tmp/fromBuild_it.airgap.vault_20379/smali/it/airgap/vault/plugin/securityutils/storage/Storage.smali differ

Import Private Key

Currently, as I understand, the only way to import a wallet is with the bip39 mnemonic. When I need to create a transaction from the rubble of post-blast New York, I don't want to have to mess around with laptops and bip39 to make that vital 'let me out' transaction from my emergency wallet.

I suggest the process be something like:
Retrieve the digits of the private key from wherever they are tattooed onto your body.
Import the raw private key into AirGap.
(Option: Sweep the coins into a new wallet, or use the existing wallet in AirGap wallet.)
Pay the Duke for permission to leave.
...

Don't use self implemented Passcode.

Store Passcode using KeyStore. Properly call KeyStore to generate keystream "A" using input passcode. Then if Bio is not enabled, Provide "A" as decryption key and along with TX message to sign TX or show recovery phrase. If Bio is enabled, then you need chain these key together. When for example fingerprint get changed or disabled, then the chain is broken and recovery phrase is needed to re-enable accessing to private key/master phrase.

Electron: ERR_FILE_NOT_FOUND

Error:
Screenshot_2021-01-18_22-11-21

Changing <base href="/" /> to <base href="./" /> in src/index.html seem to fix some files but the airgap-currency-symbols still show ERR_FILE_NOT_FOUND.

Screenshot_2021-01-18_22-51-49

Commit 32c980c
Electron v11.2.0

Missing storage permission on Android 5.1 (API Level 22)

When launching the app the following error is shown: The connection to the server was unsuccessful. (file ///android_asset/www/index.html). I suspect this is due to the missing permission. Following that the app is shut down, thus not usable.

Add support for SSKR (Sharded Secret Key Reconstruction)

Currently, we use a custom implementation of SSS (Shamir's Secret Sharing) because there was no standard at the time.

We cannot use SLIP-39, because it does not allow to "split up" an existing BIP-39 seed.

The new bc-sskr standard covers our use case.

SSKR has some more advanced features like "groups" and "group thresholds". But for simplicity, we should only support one level for the shard generation.

In any case, we will continue supporting the reconstruction of shares that have been created using our current implementation.

Two security improvement, Vault.

1/ build a built-in keyboard for, restore a wallet. Like Coinomi.
2/ Use Android KeyStore w/ user entered password(not bio fallback screen lock) + bio double auth. With StrongBox support is even better.

GPG key handling

Is it possible to manage GPG keys using vault? I don't mind if I have to hack something together, I can also submit a PR if it's a desired feature

Please enable deterministic builds

A wallet application is something very sensitive and even the air gap setup is not safe against key leak if the app is corrupt and for example uses poor randomness. A careless maintainer catching a backdoor might be enough to have an APK infected. Of course the public scrutiny is the other reason you want your app to be verifiable.

I tried to verify the current build but failed building the vault app. My findings are in this review.

Release page does not list install requirements

Special thanks to Alessandro for his great help via Telegram.

First my question is - shouldn't there be some specific OS/build version ranges listed for each release?

(1) I've been breaking my head for days trying to install any version at all of Vault over OTG to an Android 6.0 build FlymeOS 6.7.8.8, and then build FlymeOS 7.8.8.31.

Every release I tried installed, but then would not run. Object.entries is not a function.

(2) Then I've gone and updated the WebView to a 59 version, and then a 90 version.

Sidenote: As my main device has always been on iOS and I'm just flailing around with Android for the first time on a friend's "old phone," it's wacky to me that a user has to "know" to go and download specific OS components, which should have been included in the build, but weren't.

Again, even with the new WebViews, there's the same error.
I've tried Vault 1.6.0, 3.7.0, 3.6.2, now trying 2.7.1 as I type.

2.7.1 installs, opens, shows the Vault + aeternity logo, and then shows:

Unexpected token =
SyntaxError: Unexpected token =

webpackJsonp is not defined
ReferenceError: webpackJsonp is not defined at file:///android_asset/www/build/main.js.1:1

(3) I realize this Flyme thingy might be an edge case.
Maybe users could submit their failed installs into a wiki.
Or maybe the requirements could be listed for each release, whether iOS, Android, etc.

https://github.com/airgap-it/airgap-vault/releases

Plugin Like System?

Maybe Consider creating a plugin like system which can be made for cryptocurrency devs to easily integrate their coin into the AirGap Vault and Wallet app.

The plugin will expect the cryptocurrency developers to create functions with the following parameters, some parameters are optional. Here is an example

  • send function (to, amount, speed/fee, privatesend, offchain)
  • receive function (to, amount, offchain)
  • gettransactions (address)
  • wordphrase (wordphrase, 25thword)
  • syncing (wordphrase)

And then with the wallet GUI all that is needed by the AirGap devs is to add the wallet and then can integrate the functions to get the coin supported. I am a basic web develop learning web development but I do not know much on mobile app and desktop app programming and an issue I can see if the language used for this since I know there is Java and Koplin or Android, Swift on iOS and other languages for desktop apps which can require the cryptocurrency devs the need to develop the plugin for up to three languages. Using one universal language like Python or JS could work but maybe hard to integrate on Android & iOS and can be more vulnerable to security issues when not using a native language.

This will also mean getting AirGap known by the crypto community as an open source software wallet for crypto developers to support so projects will come and get their coin supported and with the AirGap GUI developed, the cryptocurrency devs may not need to create their own user wallets and only will have to create core wallets and mining software.

I do think however AirGap should continue supporting very popular coins like Bitcoin and Ethereum.

import private key

Would be nice to be able to import private key (with optional bip38 password), so we could use airgap vault to securely spend paper wallet.
Also would be nice to support segwit (3xxx keys) and bech32 (bcxxx keys)

Unable to sign transaction from VVault

I'm running the Vault on a samsung galaxy tablet. My issue is that I am unable to sign the transaction that was created from the mobile wallet. I can successfully scan the transaction but when clicking the "sign transaction" button and verifying my identify, the signing verification window shows. The application just hangs.

anyone experience this ?

BIP39 passphrase ignored

Hi,

it seems when creating a new wallet, setting the optional BIP39 passphrase does not make a difference for the derived Bitcoin address (and presumably the private keys). The same mnemonic/secret gives the same address whether a passphrase is used or not.

How I checked: In Vault, I set up a new wallet with an additional BIP39 passphrase. Then I re-imported that wallet using the mnemonic/secret from the first time, but now without specifying the BIP39 passphrase -- and it gave me the exact same public address, which should not happen.

I also cross checked using https://iancoleman.io/bip39/: The public address corresponds to the mnemonic/secret only, the BIP39 passphrase is ignored.

I'm on Airgap Vault 28519, 3.7.0

Social Recover more options

Please allow for the creation for more secret shares and the number of shared required for recovery. The Trezor wallet allow for up to 16 recover shares.

Impossible to recover from mnemonic seed

I launched and generated mnemonic seed by Vault app, import seed does not work with it, the "IMPORT" button is just not active. I also tried with mnemonic seed generated by Trezor, we are using bip39, right?

The question is, did you test your own recovery procedure or I am doing something wrong? I assume I am right, because it's really hard to enter 24 words many times and make a mistake. Thanks.

Update: Vault must convert all words to lower case, just because every time you enter seed the first word starts from capital letter in this form. It's okay to assume that wallet will do that and its current behaviour causes a lot of inconveniences and confusion.

Sign git tags on new releases

Currently all tags in repo are not signed:
https://github.com/airgap-it/airgap-vault/tags

instead of signed, see for example: (click the 'verified' green button)
https://github.com/bitcoin-wallet/bitcoin-wallet/tags

see for more info on how to sign:
https://help.github.com/en/github/authenticating-to-github/signing-tags

and better read all documentation about git signing at github at: (commit signing as well, etc...)
https://help.github.com/en/github/authenticating-to-github/managing-commit-signature-verification

after signing is used, upload the key to github (it will be shown as verified instead of unverified)
https://help.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account

why it's important:
https://www.qubes-os.org/security/verifying-signatures/#how-to-verify-qubes-repos

Add SegWit, PSBT and BC-UR v2 support

Coinlib

  • To prepare a segwit/PSBT transaction, we need the masterFingerprint in the wallet. This should be added to all "share account" messages.
  • Add signing support for PSBTs
  • Add broadcast support for PSBTs
  • Extract data (eg. input and output, signatures) from PSBT so we can display it. (partially done)

Apps

  • "prepareTransaction" in the Wallet must be called with masterFingerprint

Other

  • RBF (replace by fee) can now be configured, we need to add a UI for it (RBF can be done through watch-only wallets in the near future)

Watch-only wallets

  • BlueWallet
  • Sparrow

Other wallets that support BC-UR should also work, but will be tested in a separate issue: #105

BIP39 Passphrase Active Secrets

Please add a setting when you create or import an active secret were you can add a BIP39 Passphrase. This way you can separate your wallets by the BIP39 passphrase.

Currently you can add a BIP39 passphrase when you Add Account (Creating a new wallet) and this allows you to have multiple bitcoin wallets under one active secret by changing the BIP39 Passphrase for each bitcoin wallet. I am not against this method but would personally also like to see the BIP39 option to be applied to the active secret like this so you can have multiple bitcoin wallets but they are under different active secrets.

Active Secret 1
crumble walnut blush tone cousin never taste silk disease border remind picnic

Active Secret 2
crumble walnut blush tone cousin never taste silk disease border remind picnic mypassphrase1

Active Secret 3
crumble walnut blush tone cousin never taste silk disease border remind picnic mypassphrase2

Active Secret 4
manage woman gym hammer park solar guard prevent toilet arctic pig feed

Active Secret 5
manage woman gym hammer park solar guard prevent toilet arctic pig feed mypassphrase1

Active Secret 6
manage woman gym hammer park solar guard prevent toilet arctic pig feed mypassphrase2

Release v3.7.0's sha256 seems to be incorrect

Hi, hope everything's fine

I recently got to know the app and tried to install it from the latest release page, but issuing sha256sum airgap-vault-28519.apk yielded

57c362a3508f1420007fe5d0867f889a9683f0b51d746ab20067fb9e90abbc2f  airgap-vault-28519.apk

instead of the expected

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  airgap-vault-28519.apk

Then I tried to verify the other two available downloads (the zip and tar ones) to check if the hash was from something else, but that wasn't the issue.

I ran through the same steps with the previous version, and I was able to get the same hash for the APK as the one shown.

Am I missing something?

Thanks!

BIP85 support - Deterministic Entropy From BIP32 Keychains

There is a new BIP that is slowly being adopted by hardware wallets. Coldcard was the first to add support a couple months ago, now others are starting to plan this as well.

A non-technical explanation of BIP85 is that it allows you to deterministically generate new mnemonics out of a mnemonic.

So for example, you can have a mnemonic:

install scatter logic circle pencil average fall shoe quantum disease suspect usage

And then generate another mnemonics out of it, eg:

Index 1: girl mad pet galaxy egg matter matrix prison refuse sense ordinary nose
Index 2: mystery car occur shallow stable order number feature else best trigger curious

Use case

There are many use-cases for BIP85:

  • Instead of worrying about backing up multiple mnemonics in a secure and resilient way, you can focus on storing only one.
  • When you need a mnemonic for a less secure wallet (eg. browser extension), you can derive a new child mnemonic out of the master key. When a child key is compromised, other child keys and the master key are still safe.
  • When you lose a child mnemonic, you can simply derive it again from your master seed. No backups of the child key are necessary.

Libraries

There was no bip85 library available in javascript, so I created one: https://github.com/AndreasGassmann/bip85

References

BIP85 Specs
BIP39 tool from iancoleman PR

[ERROR] Cannot load Cordova config.

Hey Guys,

When I try to run build command

ionic cordova platform run android

I am getting error

ERROR] Cannot load Cordova config.
        
        Could not find necessary file(s): config.xml, package.json.
        
        - ./config.xml
        - ./package.json
        
        You can re-add the Cordova integration with the following command: ionic integrations enable cordova --add

I am new to ionic I am guessing its a configuration file, which is missing in the project.

Also i don't see that's added in the .gitignore file so perhaps its a required file

Unstoppable Domains Support

I know some will prefer FIO or something else, but I would like to suggest adding support on integrating Unstoppable Domains

  • Support .zil and .crypto addresses (Will need to add ZIL coin support for .zil domains)
  • Ability to buy multiple unstoppable domains with crypto in the app
  • Ability to transfer multiple unstoppable domains to another address in the app
  • Ability to add crypto addresses to multiple unstoppable domains in the app
  • Ability to send crypto to an unstoppable domain address in the app

I prefer Unstoppable Domains since they are a one time purchase and you have it for life unlike FIO addresses, they are human readable and can help with adoption by being able to tell others were to send crypto to. Unstoppable domains can be used for other things like hosting IPFS stuff but I dont see a need for Airgap to support all of that, just for the ability to register, transfer domains and be able to easily accept crypto using a unstoppable domain.

Problem in creating account from seed

Hi guys,

I am having issue with generating new account from existing seed phrase.
Error

2020-09-01 10:12:32.201 13640-13640/it.airgap.vault E/Capacitor/Console: File: http://localhost/main.js - Line 3910 - Msg: TypeError: Cannot read property 'initStorage' of undefined

I have android studio 4 (the latest)

Previously i had compiled with android 3* versions and it had worked.

But this time it asked me to install version 4 and after that i started seeing the above issue.

some other capacitor plugins are not loading i think.

any thoughts in this ?

Thank you

Your device is rooted

Device: Fairphone FP3
OS: /E/OS

This is a brand new install of the OS, everything was erased, there should be no trace of a previous root.
The procedure i followed:
_ OEM unlock
_ Flash /e/os as instructed here, ignoring the "Installing a custom recovery" part.
_ Boot the system
_ OEM lock (in developer options)
_ Install AirGap-vault

The OS works fine, dm-verity doesn't complain, i did not even try to root the phone.
When starting AirGap vault, it tells me "Your device is rooted", why is that? how can i fix this?

Thanks

Startup check failed disclaimerAcceptedCheck

I've built master branch and it looks like AirGap Vault must be reopened once after opening at first time to accept disclaimer, for example it doesn't allows me to sign transaction until I reopen it.

image

[ERROR] Depndency issue while trying to build from local coin-lib

Hi guys,

So to test some changes in the coin-lib, I added it in the vault's package.json, file

    "airgap-coin-lib": "file://Users/xyz/Documents/airgap/airgap-coin-lib",

Then did it as npm install

But when I tried to build the vault
npm run build
I am getting issues with two packages mostly

Module not found: Error: Can't resolve 'crypto' in '/Users/xyz/Documents/airgap/airgap-coin-lib/dist/dependencies/src/pbkdf2-3.0.17'

ERROR in ../airgap-coin-lib/dist/dependencies/src/tweetnacl-1.0.1/nacl.js
Module not found: Error: Can't resolve 'crypto' in '/Users/xyz/Documents/airgap/airgap-coin-lib/dist/dependencies/src/tweetnacl-1.0.1'

ERROR in ../airgap-coin-lib/dist/dependencies/src/cipher-base-1.0.4/index.js
Module not found: Error: Can't resolve 'stream' in '/Users/xyz/Documents/airgap/airgap-coin-lib/dist/dependencies/src/cipher-base-1.0.4'

Any suggestion why this could be happening ?

Please not I took a clean pull of the develop branch of both vault and lib

Load app (Activity) after authentication, not at the same time.

On my device I can spam empty space to cancel authentication, then get a prompt again (while(1) loop?) from app, but between these two prompts I have a few millisecond I can operate the app. And go viewing phrases will break the loop.

It's not a serious security concern because when signing and viewing phrases a prompt(*X) will popup again, and is not skip-pable. According to your implementation seems to be cryptographically safe, prompt is a must to decrypt.

The need to fix is because when after you break the loop, stay in app, lock the screen, UNLOCK the screen, Android OS will decide if that second prompt(*X) is still in place, which mostly, not.

Support NIX Atomic Swaps

There are many ways to do private atomic swaps and transactions with non-private cryptos such as REN. I personally think NIX does it better and would like to suggest integrating NIX into the wallet for adding privacy to all crypto wallets and transactions for the users.

  • Adding NIX token support (Will soon be a ERC20 token)
  • Ability to have DEX atomic swaps using NIX protocol
  • Integrate most or all privacy features offered by NIX in AirGap wallet (Ability to use BTC and other coins privately that are supported by NIX)

NIX is currently its own blockchain but is moving over onto Ethereum which I would imagine will make integrating NIX easier into airgap.

Flare Wallet (Wallet that uses NIX atomic swaps)
https://flarewallet.io/

NIX
https://nixplatform.io/

NIX moving onto Ethereum
https://nixplatform.medium.com/bringing-privacy-to-the-ever-expanding-world-of-ethereum-and-defi-28d1c0248d98

Cannot sign transaction: unlok pattern loop

Hi!

I am on Vault 3.6.1 Android.

Signing transactions is not working:

  • I scan the QR
  • I enter the PIN for the Seed.
  • Phone enters a loop asking the unlock pattern.

I tried to replace the unlock pattern by a plain PIN.

Now the vault is now allowing me to sign with: "key permanently invalidated exception".

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.