<?php
declare(strict_types=1);
use ParagonIE\Halite\KeyFactory;
/**
* This sets up the contents of our keyring.
*/
$key_management_closure = function() {
if (!\is_dir(ROOT.'/config/keyring/')) {
\mkdir(ROOT.'/config/keyring/', 0750);
}
$keyRing = \Airship\loadJSON(ROOT . '/config/keyring.json');
if (empty($keyRing)) {
// This is critical to Airship's functioning.
throw new \Error(\trk('errors.crypto.keyring_missing'));
}
$state = \Airship\Engine\State::instance();
$keys = [];
foreach ($keyRing as $index => $keyConfig) {
$path = ROOT . '/config/keyring/' . $keyConfig['file'];
if (\file_exists($path)) {
// Load it from disk
switch ($keyConfig['type']) {
case 'AuthenticationKey':
$keys[$index] = KeyFactory::loadAuthenticationKey($path);
break;
case 'EncryptionKey':
$keys[$index] = KeyFactory::loadEncryptionKey($path);
break;
case 'EncryptionPublicKey':
$keys[$index] = KeyFactory::loadEncryptionPublicKey($path);
break;
case 'EncryptionSecretKey':
$keys[$index] = KeyFactory::loadEncryptionSecretKey($path);
break;
case 'SignaturePublicKey':
$keys[$index] = KeyFactory::loadSignaturePublicKey($path);
break;
case 'SignatureSecretKey':
$keys[$index] = KeyFactory::loadSignatureSecretKey($path);
break;
case 'EncryptionKeyPair':
$keys[$index] = KeyFactory::loadEncryptionKeyPair($path);
break;
case 'SignatureKeyPair':
$keys[$index] = KeyFactory::loadSignatureKeyPair($path);
break;
default:
throw new \Error(
\trk('errors.crypto.unknown_key_type', $keyConfig['type'])
);
}
} else {
// We must generate this key/keypair at once:
switch ($keyConfig['type']) {
case 'EncryptionPublicKey':
case 'SignaturePublicKey':
throw new \Error(
\trk('errors.crypto.cannot_generate_public_key')
);
case 'AuthenticationKey':
$keys[$index] = KeyFactory::generateAuthenticationKey();
KeyFactory::save($keys[$index], $path);
break;
case 'EncryptionKey':
$keys[$index] = KeyFactory::generateEncryptionKey();
KeyFactory::save($keys[$index], $path);
break;
case 'EncryptionSecretKey':
$kp = KeyFactory::generateEncryptionKeyPair();
$keys[$index] = $kp->getSecretKey();
KeyFactory::save($keys[$index], $path);
break;
case 'SignatureSecretKey':
$kp = KeyFactory::generateSignatureKeyPair();
$keys[$index] = $kp->getSecretKey();
KeyFactory::save($keys[$index], $path);
break;
case 'EncryptionKeyPair':
$keys[$index] = KeyFactory::generateEncryptionKeyPair();
KeyFactory::save($keys[$index], $path);
break;
case 'SignatureKeyPair':
$keys[$index] = KeyFactory::generateSignatureKeyPair();
KeyFactory::save($keys[$index], $path);
break;
default:
throw new \Error(
\trk('errors.crypto.unknown_key_type', $keyConfig['type'])
);
}
}
}
// Now that we have a bunch of Keys stored in $keys, let's load them into
// our singleton.
$state->keyring = $keys;
};
$key_management_closure();
unset($key_management_closure);
|