
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ôn»j\  ã               @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZdgZdd1iZd	Z	e
d
ƒZe
dƒZe
dƒZG dd„ deƒZd2dd„Zdd„ Zd3dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zejd"d#„ ƒZejd$d%„ ƒZd&d'„ Zd(d)„ Zd4d+d,„Zd5d-d.„Zd6d/d0„Z dS )7é    NZrsa4096ÚgpgÚtypeÚkindÚroleÚserialÚkeyz/dev/shmó    Ú c               @   s   e Zd ZdS )ÚErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú)/usr/libexec/kcare/python/kcsig_verify.pyr
      s   r
   Úlatin1c             C   sN   t | ƒ}|tkr| S |tkr&| j|ƒS |tkr:tt| ƒƒS tdt|ƒ ƒ‚d S )NzUnsupported pae type )r   ÚbtypeÚutypeÚencodeÚintÚto_bytesÚstrÚ
ValueError)ÚdataÚencodingÚdtyper   r   r   r      s    
r   c             C   s@   t | ƒ}|tkr| S |tkr&| jdƒS |tkr8| jdƒS t‚d S )Nzutf-8)r   Úntyper   Údecoder   r   ÚNotImplementedError)r   r   r   r   r   Únstr(   s    

r   Úwc          
   C   s8   | d }t ||ƒ�}|j|ƒ W d Q R X tj|| ƒ d S )Nz.tmp)ÚopenÚwriteÚosÚrename)ÚfnameÚcontentÚmodeÚ	tmp_fnameÚfr   r   r   Úatomic_write3   s    r)   c          	   C   s   t | ƒ�
}|jƒ S Q R X d S )N)r    Úread)r$   r(   r   r   r   Ú	read_file;   s    
r+   c             C   s   t jt| ƒƒS )N)ÚjsonÚloadsr+   )r$   r   r   r   Ú	read_json@   s    r.   c              G   s:   dt | ƒ }x(| D ] }t|ƒ}|dt |ƒ|f 7 }qW |S )Ns   %ds   %d%s)Úlenr   )ÚpartsÚresultÚpZbpr   r   r   ÚpaeD   s
    
r3   c                s   t ‡ fdd„|D ƒŽ S )Nc                s   g | ]}ˆ | ‘qS r   r   )Ú.0r(   )r   r   r   ú
<listcomp>O   s    zpae_fields.<locals>.<listcomp>)r3   )r   Úfieldsr   )r   r   Ú
pae_fieldsM   s    r7   c             C   s   t | t| d  ƒS )Nr   )r7   Ú
PAE_FIELDS)r   r   r   r   Úpae_typeR   s    r9   c             C   s$   | d t kr tdt| d ƒ ƒ‚d S )Nr   zinvalid key type: )r8   r   r   )r   r   r   r   Ú	check_keyV   s    r:   c          
   c   sH   |r| V  n8t jtdd��$}|jt| ƒƒ |jƒ  |jV  W d Q R X d S )Nzkcsig-data-)ÚdirÚprefix)ÚtempfileÚNamedTemporaryFileÚTMPDIRr!   r   ÚflushÚname)r   Údata_is_filer(   r   r   r   Útemp_datafile[   s    rC   c             c   s*   t j| |d�}z
|V  W d tj|ƒ X d S )N)r<   r;   )r=   ÚmkdtempÚshutilÚrmtree)r<   r;   Ztemp_dirr   r   r   Útemp_directoryf   s    
rG   c             C   s|   t tdd��f}dd|d| dd|g}tj|tjtjtjd�}|j|ƒ\}}|jd	krntd
t|ƒ d t|ƒ ƒ‚W d Q R X d S )Nzkcsig-gpgtmp-)r;   r<   r   z	--homedirz	--keyringz--verifyú-)ÚstdinÚstdoutÚstderrr   zVerify error: Ú
)	rG   r?   Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncodeÚ	Exceptionr   )ÚkeyfileÚdatafileÚsigdataZtmp_dirÚcmdr2   rJ   rK   r   r   r   Úrun_gpg_verifyo   s    
rW   c             C   sx   t |ƒ tjtdd��X}|jtjt|d ƒƒƒ |jƒ  t	||ƒ�"}tjt| ƒƒ}t
|j||ƒ W d Q R X W d Q R X d S )Nz
kcsig-key-)r;   r<   r   )r:   r=   r>   r?   r!   Úbase64Ú	b64decoder   r@   rC   rW   rA   )Ú	signaturer   r   rB   Úkey_filerT   rU   r   r   r   Ú
verify_keyy   s    r\   Fc       	      C   s†   d}i }xt| j ƒ D ]h\}}||kr,d||< qyt||| ||ƒ W n. tk
rp } zt|ƒ||< W Y d d }~X qX |d7 }qW ||fS )Nr   zno corresponding root keyé   )Úitemsr\   rR   r   )	Ú
signaturesÚkeysr   rB   ÚcountÚerrorsÚkeyidÚsigÚer   r   r   Úverify_count„   s    rf   c             C   s®  |j ddƒ}|j ddƒ}i }|p"t}i }x¢| d jƒ D ]’\}}	yXt|	ƒ |	d |krjdj|	d |ƒ||< n*|	d |k rŒd	j|	d |ƒ||< n|	||< W q6 tk
rÆ }
 zt|
ƒ||< w6W Y d d }
~
X q6X q6W i }xN|jƒ D ]B\}}	t|	d
 |d t|	ƒd�\}}||k �r|||< qÚ|	||< qÚW d}xl|jƒ D ]`\}}	yt	| d
 | |	|dd� W n0 tk
�r‚ }
 zt|
ƒ||< W Y d d }
~
X n
X |d7 }�q.W |�sªt
dtj|ƒ ƒ‚d S )NÚ	thresholdi'  Ú
min_serialiÿàõr`   r   z&invalid kind {0}, accepted list is {1}r   z"invalid serial {0}, current is {1}r_   )r   r   T)r   rB   r]   z!Error validating file signature: )ÚgetÚAVAILABLE_KINDSr^   r:   ÚformatrR   r   rf   r9   r\   r
   r,   Údumps)rU   rT   Ú	root_keysÚkindsrg   rh   rb   Zapplicable_keysrc   r   re   Zverified_keysra   Zroot_errorsr   r   r   Ú_verify—   s>    

ro   c             C   s$   t | ƒ}t |ƒ}t||||d� d S )N)rn   )r.   ro   )ZsigfilerT   Zrootfilern   rU   rm   r   r   r   ÚverifyÂ   s    rp   )r   r   r   r   r   )r   )r   )F)N)N)!rX   Ú
contextlibr,   r"   rE   rM   r=   rj   r8   r?   r   r   r   r   rR   r
   r   r   r)   r+   r.   r3   r7   r9   r:   ÚcontextmanagerrC   rG   rW   r\   rf   ro   rp   r   r   r   r   Ú<module>   s:   

		


+