1<?php
2
3/**
4 * Fingerprint Trait for Public Keys
5 *
6 * PHP version 5
7 *
8 * @category  Crypt
9 * @package   Common
10 * @author    Jim Wigginton <terrafrost@php.net>
11 * @copyright 2015 Jim Wigginton
12 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
13 * @link      http://phpseclib.sourceforge.net
14 */
15
16namespace phpseclib3\Crypt\Common\Traits;
17
18use phpseclib3\Crypt\Hash;
19
20/**
21 * Fingerprint Trait for Private Keys
22 *
23 * @package Common
24 * @author  Jim Wigginton <terrafrost@php.net>
25 * @access  public
26 */
27trait Fingerprint
28{
29    /**
30     * Returns the public key's fingerprint
31     *
32     * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is
33     * no public key currently loaded, false is returned.
34     * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716)
35     *
36     * @access public
37     * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned
38     * for invalid values.
39     * @return mixed
40     */
41    public function getFingerprint($algorithm = 'md5')
42    {
43        $type = self::validatePlugin('Keys', 'OpenSSH', 'savePublicKey');
44        if ($type === false) {
45            return false;
46        }
47        $key = $this->toString('OpenSSH', ['binary' => true]);
48        if ($key === false) {
49            return false;
50        }
51        switch ($algorithm) {
52            case 'sha256':
53                $hash = new Hash('sha256');
54                $base = base64_encode($hash->hash($key));
55                return substr($base, 0, strlen($base) - 1);
56            case 'md5':
57                return substr(chunk_split(md5($key), 2, ':'), 0, -1);
58            default:
59                return false;
60        }
61    }
62}
63