Test Failed
Push — master ( 1352e7...0da4e2 )
by Esteban De La Fuente
03:30
created

AsymmetricKey   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 65
ccs 0
cts 22
cp 0
rs 10
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A generatePublicKeyFromModulusExponent() 0 13 1
A normalizePrivateKey() 0 12 2
A normalizePublicKey() 0 12 2
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
    public static function normalizePublicKey(
45
        string $publicKey,
46
        int $wordwrap = Str::WORDWRAP
47
    ): string {
48
        if (!str_contains($publicKey, '-----BEGIN CERTIFICATE-----')) {
49
            $body = trim($publicKey);
50
            $publicKey = '-----BEGIN CERTIFICATE-----' . "\n";
51
            $publicKey .= Str::wordWrap($body, $wordwrap) . "\n";
52
            $publicKey .= '-----END CERTIFICATE-----' . "\n";
53
        }
54
55
        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
    public static function normalizePrivateKey(
66
        string $privateKey,
67
        int $wordwrap = Str::WORDWRAP
68
    ): string {
69
        if (!str_contains($privateKey, '-----BEGIN PRIVATE KEY-----')) {
70
            $body = trim($privateKey);
71
            $privateKey = '-----BEGIN PRIVATE KEY-----' . "\n";
72
            $privateKey .= Str::wordWrap($body, $wordwrap) . "\n";
73
            $privateKey .= '-----END PRIVATE KEY-----' . "\n";
74
        }
75
76
        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
    public static function generatePublicKeyFromModulusExponent(
87
        string $modulus,
88
        string $exponent
89
    ): string {
90
        $modulus = new BigInteger(base64_decode($modulus), 256);
91
        $exponent = new BigInteger(base64_decode($exponent), 256);
92
93
        $rsa = PublicKeyLoader::load([
94
            'n' => $modulus,
95
            'e' => $exponent,
96
        ]);
97
98
        return (string) $rsa->toString('PKCS1');
99
    }
100
}
101