Implement OpenPGP_SecretKeyPacket
This commit is contained in:
parent
6e8dc4799f
commit
6ac274b8ec
@ -803,7 +803,53 @@ class OpenPGP_PublicSubkeyPacket extends OpenPGP_PublicKeyPacket {
|
|||||||
* @see http://tools.ietf.org/html/rfc4880#section-12
|
* @see http://tools.ietf.org/html/rfc4880#section-12
|
||||||
*/
|
*/
|
||||||
class OpenPGP_SecretKeyPacket extends OpenPGP_PublicKeyPacket {
|
class OpenPGP_SecretKeyPacket extends OpenPGP_PublicKeyPacket {
|
||||||
// TODO
|
public $s2k_useage, $s2k_type, $s2k_hash_algorithm, $s2k_salt, $s2k_count, $symmetric_type, $private_hash, $encrypted_data;
|
||||||
|
function read() {
|
||||||
|
parent::read(); // All the fields from PublicKey
|
||||||
|
$this->s2k_useage = ord($this->read_byte());
|
||||||
|
if($this->s2k_useage == 255 || $this->s2k_useage == 254) {
|
||||||
|
$this->symmetric_type = ord($this->read_byte());
|
||||||
|
$this->s2k_type = ord($this->read_byte());
|
||||||
|
$this->s2k_hash_algorithm = ord($this->read_byte());
|
||||||
|
if($this->s2k_type == 1 || $this->s2k_type == 3) $this->s2k_salt = $this->read_bytes(8);
|
||||||
|
if($this->s2k_type == 3) {
|
||||||
|
$c = ord($this->read_byte());
|
||||||
|
$this->s2k_count = ((int)16 + ($c & 15)) << (($c >> 4) + 6);
|
||||||
|
}
|
||||||
|
} else if($this->s2k_useage > 0) {
|
||||||
|
$this->symmetric_type = $this->s2k_useage;
|
||||||
|
}
|
||||||
|
if($this->s2k_useage > 0) {
|
||||||
|
// TODO: IV of the same length as cipher's block size
|
||||||
|
$this->encrypted_data = $this->input; // Rest of input is MPIs and checksum (encrypted)
|
||||||
|
} else {
|
||||||
|
$this->data = $this->input; // Rest of input is MPIs and checksum
|
||||||
|
$this->key_from_data();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function key_from_data() {
|
||||||
|
if(!$this->data) return NULL; // Not decrypted yet
|
||||||
|
$this->input = $this->data;
|
||||||
|
|
||||||
|
static $key_fields = array(
|
||||||
|
1 => array('d', 'p', 'q', 'u'), // RSA
|
||||||
|
16 => array('x'), // ELG-E
|
||||||
|
17 => array('x'), // DSA
|
||||||
|
);
|
||||||
|
foreach($key_fields[$this->algorithm] as $field) {
|
||||||
|
$this->key[$field] = $this->read_mpi();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Validate checksum?
|
||||||
|
if($this->s2k_useage == 254) { // 20 octet sha1 hash
|
||||||
|
$this->private_hash = $this->read_bytes(20);
|
||||||
|
} else { // two-octet checksum
|
||||||
|
$this->private_hash = $this->read_bytes(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($this->input);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user