1<?php
2
3/**
4 * ASN1 Signature Handler
5 *
6 * PHP version 5
7 *
8 * Handles signatures in the format described in
9 * https://tools.ietf.org/html/rfc3279#section-2.2.2
10 *
11 * @category  Crypt
12 * @package   Common
13 * @author    Jim Wigginton <terrafrost@php.net>
14 * @copyright 2016 Jim Wigginton
15 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
16 * @link      http://phpseclib.sourceforge.net
17 */
18
19namespace phpseclib3\Crypt\DSA\Formats\Signature;
20
21use phpseclib3\File\ASN1 as Encoder;
22use phpseclib3\File\ASN1\Maps;
23use phpseclib3\Math\BigInteger;
24
25/**
26 * ASN1 Signature Handler
27 *
28 * @package Common
29 * @author  Jim Wigginton <terrafrost@php.net>
30 * @access  public
31 */
32abstract class ASN1
33{
34    /**
35     * Loads a signature
36     *
37     * @access public
38     * @param string $sig
39     * @return array|bool
40     */
41    public static function load($sig)
42    {
43        if (!is_string($sig)) {
44            return false;
45        }
46
47        $decoded = Encoder::decodeBER($sig);
48        if (empty($decoded)) {
49            return false;
50        }
51        $components = Encoder::asn1map($decoded[0], Maps\DssSigValue::MAP);
52
53        return $components;
54    }
55
56    /**
57     * Returns a signature in the appropriate format
58     *
59     * @access public
60     * @param \phpseclib3\Math\BigInteger $r
61     * @param \phpseclib3\Math\BigInteger $s
62     * @return string
63     */
64    public static function save(BigInteger $r, BigInteger $s)
65    {
66        return Encoder::encodeDER(compact('r', 's'), Maps\DssSigValue::MAP);
67    }
68}
69