mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-22 03:24:18 +01:00
Seed encrypt: init mint with encrypted keys after migration (#472)
* seed encrypt: init mint with encrypted keys after migration * adjust build pipeline
This commit is contained in:
12
.github/workflows/docker.yaml
vendored
12
.github/workflows/docker.yaml
vendored
@@ -21,6 +21,15 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v4
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Determine Tag
|
- name: Determine Tag
|
||||||
id: get_tag
|
id: get_tag
|
||||||
run: |
|
run: |
|
||||||
@@ -36,3 +45,6 @@ jobs:
|
|||||||
context: .
|
context: .
|
||||||
push: ${{ github.event_name == 'release' }}
|
push: ${{ github.event_name == 'release' }}
|
||||||
tags: ${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}:${{ steps.get_tag.outputs.tag }}
|
tags: ${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}:${{ steps.get_tag.outputs.tag }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ def derive_keys(mnemonic: str, derivation_path: str):
|
|||||||
bip32 = BIP32.from_seed(mnemonic.encode())
|
bip32 = BIP32.from_seed(mnemonic.encode())
|
||||||
orders_str = [f"/{i}'" for i in range(settings.max_order)]
|
orders_str = [f"/{i}'" for i in range(settings.max_order)]
|
||||||
return {
|
return {
|
||||||
2
|
2**i: PrivateKey(
|
||||||
** i: PrivateKey(
|
|
||||||
bip32.get_privkey_from_path(derivation_path + orders_str[i]),
|
bip32.get_privkey_from_path(derivation_path + orders_str[i]),
|
||||||
raw=True,
|
raw=True,
|
||||||
)
|
)
|
||||||
@@ -25,26 +24,25 @@ def derive_keys(mnemonic: str, derivation_path: str):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def derive_keys_sha256(master_key: str, derivation_path: str = ""):
|
def derive_keys_sha256(seed: str, derivation_path: str = ""):
|
||||||
"""
|
"""
|
||||||
Deterministic derivation of keys for 2^n values.
|
Deterministic derivation of keys for 2^n values.
|
||||||
TODO: Implement BIP32.
|
TODO: Implement BIP32.
|
||||||
"""
|
"""
|
||||||
return {
|
return {
|
||||||
2
|
2**i: PrivateKey(
|
||||||
** i: PrivateKey(
|
hashlib.sha256((seed + derivation_path + str(i)).encode("utf-8")).digest()[
|
||||||
hashlib.sha256(
|
:32
|
||||||
(master_key + derivation_path + str(i)).encode("utf-8")
|
],
|
||||||
).digest()[:32],
|
|
||||||
raw=True,
|
raw=True,
|
||||||
)
|
)
|
||||||
for i in range(settings.max_order)
|
for i in range(settings.max_order)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def derive_pubkey(master_key: str):
|
def derive_pubkey(seed: str):
|
||||||
return PrivateKey(
|
return PrivateKey(
|
||||||
hashlib.sha256((master_key).encode("utf-8")).digest()[:32],
|
hashlib.sha256((seed).encode("utf-8")).digest()[:32],
|
||||||
raw=True,
|
raw=True,
|
||||||
).pubkey
|
).pubkey
|
||||||
|
|
||||||
|
|||||||
@@ -6,15 +6,14 @@ from ..core.settings import settings
|
|||||||
|
|
||||||
|
|
||||||
def derive_keys_backwards_compatible_insecure_pre_0_12(
|
def derive_keys_backwards_compatible_insecure_pre_0_12(
|
||||||
master_key: str, derivation_path: str = ""
|
seed: str, derivation_path: str = ""
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
WARNING: Broken key derivation for backwards compatibility with 0.11.
|
WARNING: Broken key derivation for backwards compatibility with 0.11.
|
||||||
"""
|
"""
|
||||||
return {
|
return {
|
||||||
2
|
2**i: PrivateKey(
|
||||||
** i: PrivateKey(
|
hashlib.sha256((seed + derivation_path + str(i)).encode("utf-8"))
|
||||||
hashlib.sha256((master_key + derivation_path + str(i)).encode("utf-8"))
|
|
||||||
.hexdigest()
|
.hexdigest()
|
||||||
.encode("utf-8")[:32],
|
.encode("utf-8")[:32],
|
||||||
raw=True,
|
raw=True,
|
||||||
|
|||||||
@@ -146,6 +146,17 @@ async def migrate(no_dry_run):
|
|||||||
keyset_dict["id"],
|
keyset_dict["id"],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
click.echo("Initializing mint with encrypted seeds.")
|
||||||
|
encrypted_mint_private_key = aes.encrypt(settings.mint_private_key.encode())
|
||||||
|
ledger = Ledger(
|
||||||
|
db=Database("mint", settings.mint_database),
|
||||||
|
seed=encrypted_mint_private_key,
|
||||||
|
seed_decryption_key=settings.mint_seed_decryption_key,
|
||||||
|
derivation_path=settings.mint_derivation_path,
|
||||||
|
backends={},
|
||||||
|
crud=LedgerCrudSqlite(),
|
||||||
|
)
|
||||||
click.echo("✅ Migration complete.")
|
click.echo("✅ Migration complete.")
|
||||||
|
|
||||||
|
|
||||||
@@ -76,17 +76,22 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
|
|||||||
assert seed, "seed not set"
|
assert seed, "seed not set"
|
||||||
|
|
||||||
# decrypt seed if seed_decryption_key is set
|
# decrypt seed if seed_decryption_key is set
|
||||||
self.master_key = (
|
try:
|
||||||
AESCipher(seed_decryption_key).decrypt(seed)
|
self.seed = (
|
||||||
if seed_decryption_key
|
AESCipher(seed_decryption_key).decrypt(seed)
|
||||||
else seed
|
if seed_decryption_key
|
||||||
)
|
else seed
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(
|
||||||
|
f"Could not decrypt seed. Make sure that the seed is correct and the decryption key is set. {e}"
|
||||||
|
)
|
||||||
self.derivation_path = derivation_path
|
self.derivation_path = derivation_path
|
||||||
|
|
||||||
self.db = db
|
self.db = db
|
||||||
self.crud = crud
|
self.crud = crud
|
||||||
self.backends = backends
|
self.backends = backends
|
||||||
self.pubkey = derive_pubkey(self.master_key)
|
self.pubkey = derive_pubkey(self.seed)
|
||||||
self.spent_proofs: Dict[str, Proof] = {}
|
self.spent_proofs: Dict[str, Proof] = {}
|
||||||
|
|
||||||
# ------- KEYS -------
|
# ------- KEYS -------
|
||||||
@@ -109,7 +114,7 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
|
|||||||
MintKeyset: Keyset
|
MintKeyset: Keyset
|
||||||
"""
|
"""
|
||||||
assert derivation_path, "derivation path not set"
|
assert derivation_path, "derivation path not set"
|
||||||
seed = seed or self.master_key
|
seed = seed or self.seed
|
||||||
tmp_keyset_local = MintKeyset(
|
tmp_keyset_local = MintKeyset(
|
||||||
seed=seed,
|
seed=seed,
|
||||||
derivation_path=derivation_path,
|
derivation_path=derivation_path,
|
||||||
@@ -132,7 +137,7 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
|
|||||||
# no keyset for this derivation path yet
|
# no keyset for this derivation path yet
|
||||||
# we create a new keyset (keys will be generated at instantiation)
|
# we create a new keyset (keys will be generated at instantiation)
|
||||||
keyset = MintKeyset(
|
keyset = MintKeyset(
|
||||||
seed=seed or self.master_key,
|
seed=seed or self.seed,
|
||||||
derivation_path=derivation_path,
|
derivation_path=derivation_path,
|
||||||
version=version or settings.version,
|
version=version or settings.version,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user