
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;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 rd	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|	||< qW 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 |st
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:   

		


+