diff options
Diffstat (limited to 'plugins/enigma/lib/Crypt/GPG/SubKey.php')
| -rw-r--r-- | plugins/enigma/lib/Crypt/GPG/SubKey.php | 649 | 
1 files changed, 649 insertions, 0 deletions
| diff --git a/plugins/enigma/lib/Crypt/GPG/SubKey.php b/plugins/enigma/lib/Crypt/GPG/SubKey.php new file mode 100644 index 000000000..b6316e99f --- /dev/null +++ b/plugins/enigma/lib/Crypt/GPG/SubKey.php @@ -0,0 +1,649 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Contains a class representing GPG sub-keys and constants for GPG algorithms + * + * PHP version 5 + * + * LICENSE: + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @category  Encryption + * @package   Crypt_GPG + * @author    Michael Gauthier <mike@silverorange.com> + * @author    Nathan Fredrickson <nathan@silverorange.com> + * @copyright 2005-2010 silverorange + * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version   CVS: $Id: SubKey.php 302768 2010-08-25 13:45:52Z gauthierm $ + * @link      http://pear.php.net/package/Crypt_GPG + */ + +// {{{ class Crypt_GPG_SubKey + +/** + * A class for GPG sub-key information + * + * This class is used to store the results of the {@link Crypt_GPG::getKeys()} + * method. Sub-key objects are members of a {@link Crypt_GPG_Key} object. + * + * @category  Encryption + * @package   Crypt_GPG + * @author    Michael Gauthier <mike@silverorange.com> + * @author    Nathan Fredrickson <nathan@silverorange.com> + * @copyright 2005-2010 silverorange + * @license   http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link      http://pear.php.net/package/Crypt_GPG + * @see       Crypt_GPG::getKeys() + * @see       Crypt_GPG_Key::getSubKeys() + */ +class Crypt_GPG_SubKey +{ +    // {{{ class constants + +    /** +     * RSA encryption algorithm. +     */ +    const ALGORITHM_RSA = 1; + +    /** +     * Elgamal encryption algorithm (encryption only). +     */ +    const ALGORITHM_ELGAMAL_ENC = 16; + +    /** +     * DSA encryption algorithm (sometimes called DH, sign only). +     */ +    const ALGORITHM_DSA = 17; + +    /** +     * Elgamal encryption algorithm (signage and encryption - should not be +     * used). +     */ +    const ALGORITHM_ELGAMAL_ENC_SGN = 20; + +    // }}} +    // {{{ class properties + +    /** +     * The id of this sub-key +     * +     * @var string +     */ +    private $_id = ''; + +    /** +     * The algorithm used to create this sub-key +     * +     * The value is one of the Crypt_GPG_SubKey::ALGORITHM_* constants. +     * +     * @var integer +     */ +    private $_algorithm = 0; + +    /** +     * The fingerprint of this sub-key +     * +     * @var string +     */ +    private $_fingerprint = ''; + +    /** +     * Length of this sub-key in bits +     * +     * @var integer +     */ +    private $_length = 0; + +    /** +     * Date this sub-key was created +     * +     * This is a Unix timestamp. +     * +     * @var integer +     */ +    private $_creationDate = 0; + +    /** +     * Date this sub-key expires +     * +     * This is a Unix timestamp. If this sub-key does not expire, this will be +     * zero. +     * +     * @var integer +     */ +    private $_expirationDate = 0; + +    /** +     * Whether or not this sub-key can sign data +     * +     * @var boolean +     */ +    private $_canSign = false; + +    /** +     * Whether or not this sub-key can encrypt data +     * +     * @var boolean +     */ +    private $_canEncrypt = false; + +    /** +     * Whether or not the private key for this sub-key exists in the keyring +     * +     * @var boolean +     */ +    private $_hasPrivate = false; + +    /** +     * Whether or not this sub-key is revoked +     * +     * @var boolean +     */ +    private $_isRevoked = false; + +    // }}} +    // {{{ __construct() + +    /** +     * Creates a new sub-key object +     * +     * Sub-keys can be initialized from an array of named values. Available +     * names are: +     * +     * - <kbd>string  id</kbd>          - the key id of the sub-key. +     * - <kbd>integer algorithm</kbd>   - the encryption algorithm of the +     *                                    sub-key. +     * - <kbd>string  fingerprint</kbd> - the fingerprint of the sub-key. The +     *                                    fingerprint should not contain +     *                                    formatting characters. +     * - <kbd>integer length</kbd>      - the length of the sub-key in bits. +     * - <kbd>integer creation</kbd>    - the date the sub-key was created. +     *                                    This is a UNIX timestamp. +     * - <kbd>integer expiration</kbd>  - the date the sub-key expires. This +     *                                    is a UNIX timestamp. If the sub-key +     *                                    does not expire, use 0. +     * - <kbd>boolean canSign</kbd>     - whether or not the sub-key can be +     *                                    used to sign data. +     * - <kbd>boolean canEncrypt</kbd>  - whether or not the sub-key can be +     *                                    used to encrypt data. +     * - <kbd>boolean hasPrivate</kbd>  - whether or not the private key for +     *                                    the sub-key exists in the keyring. +     * - <kbd>boolean isRevoked</kbd>   - whether or not this sub-key is +     *                                    revoked. +     * +     * @param Crypt_GPG_SubKey|string|array $key optional. Either an existing +     *        sub-key object, which is copied; a sub-key string, which is +     *        parsed; or an array of initial values. +     */ +    public function __construct($key = null) +    { +        // parse from string +        if (is_string($key)) { +            $key = self::parse($key); +        } + +        // copy from object +        if ($key instanceof Crypt_GPG_SubKey) { +            $this->_id             = $key->_id; +            $this->_algorithm      = $key->_algorithm; +            $this->_fingerprint    = $key->_fingerprint; +            $this->_length         = $key->_length; +            $this->_creationDate   = $key->_creationDate; +            $this->_expirationDate = $key->_expirationDate; +            $this->_canSign        = $key->_canSign; +            $this->_canEncrypt     = $key->_canEncrypt; +            $this->_hasPrivate     = $key->_hasPrivate; +            $this->_isRevoked      = $key->_isRevoked; +        } + +        // initialize from array +        if (is_array($key)) { +            if (array_key_exists('id', $key)) { +                $this->setId($key['id']); +            } + +            if (array_key_exists('algorithm', $key)) { +                $this->setAlgorithm($key['algorithm']); +            } + +            if (array_key_exists('fingerprint', $key)) { +                $this->setFingerprint($key['fingerprint']); +            } + +            if (array_key_exists('length', $key)) { +                $this->setLength($key['length']); +            } + +            if (array_key_exists('creation', $key)) { +                $this->setCreationDate($key['creation']); +            } + +            if (array_key_exists('expiration', $key)) { +                $this->setExpirationDate($key['expiration']); +            } + +            if (array_key_exists('canSign', $key)) { +                $this->setCanSign($key['canSign']); +            } + +            if (array_key_exists('canEncrypt', $key)) { +                $this->setCanEncrypt($key['canEncrypt']); +            } + +            if (array_key_exists('hasPrivate', $key)) { +                $this->setHasPrivate($key['hasPrivate']); +            } + +            if (array_key_exists('isRevoked', $key)) { +                $this->setRevoked($key['isRevoked']); +            } +        } +    } + +    // }}} +    // {{{ getId() + +    /** +     * Gets the id of this sub-key +     * +     * @return string the id of this sub-key. +     */ +    public function getId() +    { +        return $this->_id; +    } + +    // }}} +    // {{{ getAlgorithm() + +    /** +     * Gets the algorithm used by this sub-key +     * +     * The algorithm should be one of the Crypt_GPG_SubKey::ALGORITHM_* +     * constants. +     * +     * @return integer the algorithm used by this sub-key. +     */ +    public function getAlgorithm() +    { +        return $this->_algorithm; +    } + +    // }}} +    // {{{ getCreationDate() + +    /** +     * Gets the creation date of this sub-key +     * +     * This is a Unix timestamp. +     * +     * @return integer the creation date of this sub-key. +     */ +    public function getCreationDate() +    { +        return $this->_creationDate; +    } + +    // }}} +    // {{{ getExpirationDate() + +    /** +     * Gets the date this sub-key expires +     * +     * This is a Unix timestamp. If this sub-key does not expire, this will be +     * zero. +     * +     * @return integer the date this sub-key expires. +     */ +    public function getExpirationDate() +    { +        return $this->_expirationDate; +    } + +    // }}} +    // {{{ getFingerprint() + +    /** +     * Gets the fingerprint of this sub-key +     * +     * @return string the fingerprint of this sub-key. +     */ +    public function getFingerprint() +    { +        return $this->_fingerprint; +    } + +    // }}} +    // {{{ getLength() + +    /** +     * Gets the length of this sub-key in bits +     * +     * @return integer the length of this sub-key in bits. +     */ +    public function getLength() +    { +        return $this->_length; +    } + +    // }}} +    // {{{ canSign() + +    /** +     * Gets whether or not this sub-key can sign data +     * +     * @return boolean true if this sub-key can sign data and false if this +     *                 sub-key can not sign data. +     */ +    public function canSign() +    { +        return $this->_canSign; +    } + +    // }}} +    // {{{ canEncrypt() + +    /** +     * Gets whether or not this sub-key can encrypt data +     * +     * @return boolean true if this sub-key can encrypt data and false if this +     *                 sub-key can not encrypt data. +     */ +    public function canEncrypt() +    { +        return $this->_canEncrypt; +    } + +    // }}} +    // {{{ hasPrivate() + +    /** +     * Gets whether or not the private key for this sub-key exists in the +     * keyring +     * +     * @return boolean true the private key for this sub-key exists in the +     *                 keyring and false if it does not. +     */ +    public function hasPrivate() +    { +        return $this->_hasPrivate; +    } + +    // }}} +    // {{{ isRevoked() + +    /** +     * Gets whether or not this sub-key is revoked +     * +     * @return boolean true if this sub-key is revoked and false if it is not. +     */ +    public function isRevoked() +    { +        return $this->_isRevoked; +    } + +    // }}} +    // {{{ setCreationDate() + +    /** +     * Sets the creation date of this sub-key +     * +     * The creation date is a Unix timestamp. +     * +     * @param integer $creationDate the creation date of this sub-key. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setCreationDate($creationDate) +    { +        $this->_creationDate = intval($creationDate); +        return $this; +    } + +    // }}} +    // {{{ setExpirationDate() + +    /** +     * Sets the expiration date of this sub-key +     * +     * The expiration date is a Unix timestamp. Specify zero if this sub-key +     * does not expire. +     * +     * @param integer $expirationDate the expiration date of this sub-key. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setExpirationDate($expirationDate) +    { +        $this->_expirationDate = intval($expirationDate); +        return $this; +    } + +    // }}} +    // {{{ setId() + +    /** +     * Sets the id of this sub-key +     * +     * @param string $id the id of this sub-key. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setId($id) +    { +        $this->_id = strval($id); +        return $this; +    } + +    // }}} +    // {{{ setAlgorithm() + +    /** +     * Sets the algorithm used by this sub-key +     * +     * @param integer $algorithm the algorithm used by this sub-key. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setAlgorithm($algorithm) +    { +        $this->_algorithm = intval($algorithm); +        return $this; +    } + +    // }}} +    // {{{ setFingerprint() + +    /** +     * Sets the fingerprint of this sub-key +     * +     * @param string $fingerprint the fingerprint of this sub-key. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setFingerprint($fingerprint) +    { +        $this->_fingerprint = strval($fingerprint); +        return $this; +    } + +    // }}} +    // {{{ setLength() + +    /** +     * Sets the length of this sub-key in bits +     * +     * @param integer $length the length of this sub-key in bits. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setLength($length) +    { +        $this->_length = intval($length); +        return $this; +    } + +    // }}} +    // {{{ setCanSign() + +    /** +     * Sets whether of not this sub-key can sign data +     * +     * @param boolean $canSign true if this sub-key can sign data and false if +     *                         it can not. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setCanSign($canSign) +    { +        $this->_canSign = ($canSign) ? true : false; +        return $this; +    } + +    // }}} +    // {{{ setCanEncrypt() + +    /** +     * Sets whether of not this sub-key can encrypt data +     * +     * @param boolean $canEncrypt true if this sub-key can encrypt data and +     *                            false if it can not. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setCanEncrypt($canEncrypt) +    { +        $this->_canEncrypt = ($canEncrypt) ? true : false; +        return $this; +    } + +    // }}} +    // {{{ setHasPrivate() + +    /** +     * Sets whether of not the private key for this sub-key exists in the +     * keyring +     * +     * @param boolean $hasPrivate true if the private key for this sub-key +     *                            exists in the keyring and false if it does +     *                            not. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setHasPrivate($hasPrivate) +    { +        $this->_hasPrivate = ($hasPrivate) ? true : false; +        return $this; +    } + +    // }}} +    // {{{ setRevoked() + +    /** +     * Sets whether or not this sub-key is revoked +     * +     * @param boolean $isRevoked whether or not this sub-key is revoked. +     * +     * @return Crypt_GPG_SubKey the current object, for fluent interface. +     */ +    public function setRevoked($isRevoked) +    { +        $this->_isRevoked = ($isRevoked) ? true : false; +        return $this; +    } + +    // }}} +    // {{{ parse() + +    /** +     * Parses a sub-key object from a sub-key string +     * +     * See <b>doc/DETAILS</b> in the +     * {@link http://www.gnupg.org/download/ GPG distribution} for information +     * on how the sub-key string is parsed. +     * +     * @param string $string the string containing the sub-key. +     * +     * @return Crypt_GPG_SubKey the sub-key object parsed from the string. +     */ +    public static function parse($string) +    { +        $tokens = explode(':', $string); + +        $subKey = new Crypt_GPG_SubKey(); + +        $subKey->setId($tokens[4]); +        $subKey->setLength($tokens[2]); +        $subKey->setAlgorithm($tokens[3]); +        $subKey->setCreationDate(self::_parseDate($tokens[5])); +        $subKey->setExpirationDate(self::_parseDate($tokens[6])); + +        if ($tokens[1] == 'r') { +            $subKey->setRevoked(true); +        } + +        if (strpos($tokens[11], 's') !== false) { +            $subKey->setCanSign(true); +        } + +        if (strpos($tokens[11], 'e') !== false) { +            $subKey->setCanEncrypt(true); +        } + +        return $subKey; +    } + +    // }}} +    // {{{ _parseDate() + +    /** +     * Parses a date string as provided by GPG into a UNIX timestamp +     * +     * @param string $string the date string. +     * +     * @return integer the UNIX timestamp corresponding to the provided date +     *                 string. +     */ +    private static function _parseDate($string) +    { +        if ($string == '') { +            $timestamp = 0; +        } else { +            // all times are in UTC according to GPG documentation +            $timeZone = new DateTimeZone('UTC'); + +            if (strpos($string, 'T') === false) { +                // interpret as UNIX timestamp +                $string = '@' . $string; +            } + +            $date = new DateTime($string, $timeZone); + +            // convert to UNIX timestamp +            $timestamp = intval($date->format('U')); +        } + +        return $timestamp; +    } + +    // }}} +} + +// }}} + +?> | 
