
    d                         d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
 d dlmc mZ d dlmc mc mZ dZ G d de      Zy)    N)ustr
bytebuffer)
CryptErrorz6{0} cms -decrypt -inform DER -inkey {1} -in /dev/stdinc                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)	CryptUtilc                     || _         y )N)openssl_cmd)selfr	   s     H/usr/lib/python3/dist-packages/azurelinuxagent/common/utils/cryptutil.py__init__zCryptUtil.__init__%   s
    &    c                    | j                   ddddddddd	d
|d|g}	 t        j                  |       y# t        j                  $ rG}dj	                  |||j
                  |j                        }t        j                  |       Y d}~yd}~ww xY w)zV
        Create ssl certificate for https communication with endpoint server.
        reqz-x509-nodesz-subjz/CN=LinuxTransportz-days730z-newkeyzrsa:2048z-keyout-outzFFailed to create {0} and {1} certificates.
[stdout]
{2}

[stderr]
{3}
N)	r	   	shellutilrun_commandCommandErrorformatstdoutstderrloggererror)r
   prv_filecrt_filecmdcmd_errmsgs         r   gen_transport_certzCryptUtil.gen_transport_cert(   s     7DXUIz9hPXZ	!!#&%% 	`(GNNGNNK LL	s   2 B=BBc                     t         j                  j                  |      st        t        j
                  d|      | j                  dd|dg}t        j                  |d      }|S )NFile not foundrsa-inz-puboutT	log_error	ospathexistsIOErrorerrnoENOENTr	   r   r   r
   	file_namer   pubs       r   get_pubkey_from_prvzCryptUtil.get_pubkey_from_prv5   sS    ww~~i(%,,(8)DD##UE9iHC''t<CJr   c                     t         j                  j                  |      st        t        j
                  d|      | j                  dd|ddg}t        j                  |d      }|S )Nr"   x509r$   z-pubkey-nooutTr%   r'   r.   s       r   get_pubkey_from_crtzCryptUtil.get_pubkey_from_crt=   sU    ww~~i(%,,(8)DD##VUIy(SC''t<CJr   c                 H   t         j                  j                  |      st        t        j
                  d|      | j                  dd|ddg}t        j                  |      }|j                         j                  d      d   j                  dd	      j                         }|S )
Nr"   r3   r$   z-fingerprintr4   =   : )r(   r)   r*   r+   r,   r-   r	   r   r   rstripsplitreplaceupper)r
   r/   r   
thumbprints       r   get_thumbprint_from_crtz!CryptUtil.get_thumbprint_from_crtE   s    ww~~i(%,,(8)DD##VUI~xXC"..s3J#**,2237:BB3KQQSJr   c                    t         j                  j                  |      st        t        j
                  d|      t         j                  j                  |      st        t        j
                  d|      	 t        j                  | j                  ddd|d|d|g	| j                  ddd	d
d|gg       y # t        j                  $ rA}t        j                  d||j                  |j                  |j                         Y d }~y d }~ww xY w)Nr"   cmsz-decryptr$   z-inkeyz-recippkcs12r   z	-passwordzpass:r   zBFailed to decrypt {0} (return code: {1})
[stdout]
{2}
[stderr]
{3})r(   r)   r*   r+   r,   r-   r   run_piper	   r   r   r   
returncoder   r   )r
   p7m_filetrans_prv_filetrans_cert_filepem_filecommand_errors         r   decrypt_p7mzCryptUtil.decrypt_p7mN   s    ww~~h'%,,(8(CC/%,,(8.IId""%%uj%8Ucemo~%%x;QWYab$d e )) dem668L8LmNbNbd dds   6;B2 2D7DDc                     t        |d      5 }ddddd|g}	 t        j                  ||d       d d d        y # t        j                  $ r Y w xY w# 1 sw Y   y xY w)	Nabz
ssh-keygenz-iz-mPKCS8z-fT)r   r&   )openr   r   r   )r
   
input_fileoutput_filefile_outr   s        r   
crt_to_sshzCryptUtil.crt_to_ssh\   sk    +t$ 	tWdJGC%%c(dK		 	
 )) 	 	s&   	A8AAAAAc           
         |j                  d      }|D cg c]  }|j                  d      r| }}dj                  |      }	 ddlm} t        j                  |      }|j                  |      d   d   }|j                  | j                  |            d   }|d   }|d   }	t               }
|
j                  t        j                  dt        d                   |
j                  d	       |
j                  t        j                  dt        | j                  |	                         |
j                  | j                  |	             |
j                  t        j                  dt        | j                  |            dz                |
j                  d
       |
j                  | j                  |             t        j                  t!        |
            }t#        d|z   dz   d      S c c}w # t$        $ r}	t'        d      d }	~	ww xY w)N
z----r:   r   )decoderr8   z>Izssh-rsas   ssh-rsa    s   ssh-rsa    
zutf-8)encodingzFailed to load pyasn1.codec.der)r<   
startswithjoinpyasn1.codec.derrV   base64	b64decodedecodebits_to_bytes	bytearrayextendstructpacklennum_to_bytes	b64encoder   r   ImportErrorr   )r
   pubkeylinesxbase64_encodedder_decoderder_encodedkeynekeydatakeydata_base64s               r   asn1_to_sshzCryptUtil.asn1_to_sshe   s   T"!>qf)=>>	@? **>:K%,,[9!<Q?K$$T%7%7%DEaHC!fA!fAkGNN6;;tS^<=NN:&NN6;;tS1B1B11E-FGHNN4,,Q/0NN6;;tS1B1B11E-F-JKLNN5!NN4,,Q/0#--j.ABN~5=!(* *' ?*  	@>??	@s#   G,G,F&G1 1	H
:HH
c                 v    t               }|r|j                  |dz         |dz  }|r|j                          |S )z;
        Pack number into bytes.  Retun as string.
              )ra   appendreverse)r
   numresults      r   rf   zCryptUtil.num_to_bytes   s=     MM#*%AIC  	r   c                     d}t               }d}|D ]*  }|||z  z  }|dz
  }|dk(  s|j                  |       d}d}, t        |      S )zG
        Convert an array contains bits, [0,1] to a byte array
           r   r8   )ra   rx   bytes)r
   bitsindex
byte_arraycurrbits         r   r`   zCryptUtil.bits_to_bytes   sg     [
 	C3%<(DAIE{!!$'	 Z  r   c                    	 t        j                  |      }t        j                  | j                  |      j                  d      }t        j                  ||t        j                  dd      }|j                  d      S # t        j                  $ r1}t        j                  |j                  d|j                        d }~wt        $ r}t!        d|      d }~ww xY w)N F)inputr   encode_inputencode_outputzutf-16zopenssl cms -decrypt)outputzError decoding secret)r]   r^   DECRYPT_SECRET_CMDr   r	   r<   r   r   
subprocessSTDOUTr_   r   CalledProcessErrorrE   r   	Exceptionr   )r
   encrypted_passwordprivate_keydecodedargsr   rJ   rq   s           r   decrypt_secretzCryptUtil.decrypt_secret   s    	9&&'9:G%,,T-=-={KQQRUVD**4wzGXGXgl  }B  CF==**%% 	//0H0HJ`ivi}i}~~ 	94a88	9s$   A<A? ?C,B>>C
CCN)__name__
__module____qualname__r   r    r1   r5   r@   rK   rS   rt   rf   r`   r    r   r   r   r   $   s;    'd@4	! 	9r   r   )r]   r,   rc   os.pathr(   r   azurelinuxagent.common.futurer   r    azurelinuxagent.common.exceptionr   azurelinuxagent.common.loggercommonr   &azurelinuxagent.common.utils.shellutilutilsr   r   objectr   r   r   r   <module>r      s?   (      : 7 . . : : N 9 9r   