| 
<?phpdeclare(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);
 
 |