1<?php
2
3/**
4 * SSH2 Signature Handler
5 *
6 * PHP version 5
7 *
8 * Handles signatures in the format used by SSH2
9 *
10 * @category  Crypt
11 * @package   Common
12 * @author    Jim Wigginton <terrafrost@php.net>
13 * @copyright 2016 Jim Wigginton
14 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
15 * @link      http://phpseclib.sourceforge.net
16 */
17
18namespace phpseclib3\Crypt\DSA\Formats\Signature;
19
20use phpseclib3\Common\Functions\Strings;
21use phpseclib3\Math\BigInteger;
22
23/**
24 * SSH2 Signature Handler
25 *
26 * @package Common
27 * @author  Jim Wigginton <terrafrost@php.net>
28 * @access  public
29 */
30abstract class SSH2
31{
32    /**
33     * Loads a signature
34     *
35     * @access public
36     * @param string $sig
37     * @return mixed
38     */
39    public static function load($sig)
40    {
41        if (!is_string($sig)) {
42            return false;
43        }
44
45        $result = Strings::unpackSSH2('ss', $sig);
46        if ($result === false) {
47            return false;
48        }
49        list($type, $blob) = $result;
50        if ($type != 'ssh-dss' || strlen($blob) != 40) {
51            return false;
52        }
53
54        return [
55            'r' => new BigInteger(substr($blob, 0, 20), 256),
56            's' => new BigInteger(substr($blob, 20), 256)
57        ];
58    }
59
60    /**
61     * Returns a signature in the appropriate format
62     *
63     * @access public
64     * @param \phpseclib3\Math\BigInteger $r
65     * @param \phpseclib3\Math\BigInteger $s
66     * @return string
67     */
68    public static function save(BigInteger $r, BigInteger $s)
69    {
70        if ($r->getLength() > 160 || $s->getLength() > 160) {
71            return false;
72        }
73        return Strings::packSSH2(
74            'ss',
75            'ssh-dss',
76            str_pad($r->toBytes(), 20, "\0", STR_PAD_LEFT) .
77            str_pad($s->toBytes(), 20, "\0", STR_PAD_LEFT)
78        );
79    }
80}
81