Passed
Push — master ( 737114...d97858 )
by Esteban De La Fuente
04:54
created

generatePublicKeyFromModulusExponent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 13
ccs 8
cts 8
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Helper;
26
27
use phpseclib3\Crypt\PublicKeyLoader;
28
use phpseclib3\Math\BigInteger;
29
30
/**
31
 * Clase que proporciona utilidades comunes para certificados RSA que utilizan
32
 * cifrado asimétrico. Estos son usados, por ejemplo, en firma electrónica.
33
 */
34
class AsymmetricKey
35
{
36
    /**
37
     * Normaliza una clave pública (certificado) añadiendo encabezados y pies
38
     * si es necesario.
39
     *
40
     * @param string $publicKey Clave pública que se desea normalizar.
41
     * @param int $wordwrap Largo al que se debe dejar cada línea del archivo.
42
     * @return string Clave pública normalizada.
43
     */
44 25
    public static function normalizePublicKey(
45
        string $publicKey,
46
        int $wordwrap = Str::WORDWRAP
47
    ): string {
48 25
        if (!str_contains($publicKey, '-----BEGIN CERTIFICATE-----')) {
49 6
            $body = trim($publicKey);
50 6
            $publicKey = '-----BEGIN CERTIFICATE-----' . "\n";
51 6
            $publicKey .= Str::wordWrap($body, $wordwrap) . "\n";
52 6
            $publicKey .= '-----END CERTIFICATE-----' . "\n";
53
        }
54
55 25
        return $publicKey;
56
    }
57
58
    /**
59
     * Normaliza una clave privada añadiendo encabezados y pies si es necesario.
60
     *
61
     * @param string $privateKey Clave privada que se desea normalizar.
62
     * @param int $wordwrap Largo al que se debe dejar cada línea del archivo.
63
     * @return string Clave privada normalizada.
64
     */
65 25
    public static function normalizePrivateKey(
66
        string $privateKey,
67
        int $wordwrap = Str::WORDWRAP
68
    ): string {
69 25
        if (!str_contains($privateKey, '-----BEGIN PRIVATE KEY-----')) {
70 2
            $body = trim($privateKey);
71 2
            $privateKey = '-----BEGIN PRIVATE KEY-----' . "\n";
72 2
            $privateKey .= Str::wordWrap($body, $wordwrap) . "\n";
73 2
            $privateKey .= '-----END PRIVATE KEY-----' . "\n";
74
        }
75
76 25
        return $privateKey;
77
    }
78
79
    /**
80
     * Genera una clave pública a partir de un módulo y un exponente.
81
     *
82
     * @param string $modulus Módulo de la clave.
83
     * @param string $exponent Exponente de la clave.
84
     * @return string Clave pública generada.
85
     */
86 1
    public static function generatePublicKeyFromModulusExponent(
87
        string $modulus,
88
        string $exponent
89
    ): string {
90 1
        $modulus = new BigInteger(base64_decode($modulus), 256);
91 1
        $exponent = new BigInteger(base64_decode($exponent), 256);
92
93 1
        $rsa = PublicKeyLoader::load([
94 1
            'n' => $modulus,
95 1
            'e' => $exponent,
96 1
        ]);
97
98 1
        return (string) $rsa->toString('PKCS1');
99
    }
100
}
101