%PDF- %PDF-
Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/ |
Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/KeyPairsController.php |
<?php /* * Copyright (C) 2019 Pascal Mathis <mail@pascalmathis.com> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ namespace OPNsense\IPsec\Api; use OPNsense\Base\ApiMutableModelControllerBase; /** * Class KeyPairsController * @package OPNsense\IPsec\Api */ class KeyPairsController extends ApiMutableModelControllerBase { protected static $internalModelName = 'ipsec'; protected static $internalModelClass = 'OPNsense\IPsec\IPsec'; /** * Search key pairs * @return array * @throws \ReflectionException */ public function searchItemAction() { return $this->searchBase( 'keyPairs.keyPair', ['name', 'keyType', 'keySize', 'keyFingerprint'] ); } /** * Update key pair with given properties * @param $uuid * @return array * @throws \OPNsense\Base\UserException * @throws \ReflectionException */ public function setItemAction($uuid = null) { $response = $this->setBase('keyPair', 'keyPairs.keyPair', $uuid); if (!empty($response['result']) && $response['result'] === 'saved') { touch('/tmp/ipsec.dirty'); // mark_subsystem_dirty('ipsec') } return $response; } /** * Add new key pair with given properties * @return array * @throws \OPNsense\Base\UserException * @throws \ReflectionException */ public function addItemAction() { $response = $this->addBase('keyPair', 'keyPairs.keyPair'); if (!empty($response['result']) && $response['result'] === 'saved') { touch('/tmp/ipsec.dirty'); // mark_subsystem_dirty('ipsec') } return $response; } /** * Retrieve key pair or return defaults for new one * @param $uuid * @return array * @throws \ReflectionException */ public function getItemAction($uuid = null) { return $this->getBase('keyPair', 'keyPairs.keyPair', $uuid); } /** * Delete key pair by UUID * @param $uuid * @return array * @throws \OPNsense\Base\UserException * @throws \ReflectionException */ public function delItemAction($uuid) { $response = $this->delBase('keyPairs.keyPair', $uuid); if (!empty($response['result']) && $response['result'] === 'deleted') { touch('/tmp/ipsec.dirty'); // mark_subsystem_dirty('ipsec') } return $response; } /** * Generate keypair * @param string $type (rsa, ecdsa) * @param string $size The key size in bytes * @return array */ public function genKeyPairAction($type, $size = null) { $certtype = null; $keylength = null; $attrs = []; if ($type == 'rsa') { if (!empty($size) && !in_array($size, ['1024', '2048', '3072', '4096', '8192'])) { return ['status' => 'failed', 'message' => sprintf('invalid key size %s', $size)]; } $attrs['private_key_type'] = OPENSSL_KEYTYPE_RSA; $attrs['private_key_bits'] = !empty($size) ? intval($size) : 2048; } elseif ($type == 'ecdsa') { if (!empty($size) && !in_array($size, ['256', '384', '521'])) { return ['status' => 'failed', 'message' => sprintf('invalid key size %s', $size)]; } $attrs['private_key_type'] = OPENSSL_KEYTYPE_EC; switch ($size ?? '384') { case '256'; $attrs['curve_name'] = "prime256v1"; break; case '384'; $attrs['curve_name'] = "secp384r1"; break; case '521'; $attrs['curve_name'] = "secp521r1"; break; } } else { return ['status' => 'failed', 'message' => sprintf('invalid type %s', $type)]; } $pkey = openssl_pkey_new($attrs); if ($pkey === false) { return ['status' => 'failed', 'message' => 'unable to generate key']; } $keyDetails = openssl_pkey_get_details($pkey); openssl_pkey_export($pkey, $pkeyout); return [ 'pubkey' => $keyDetails['key'], 'privkey' => $pkeyout, 'status' => 'ok' ]; } }