o
    B]                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlmZmZmZ d dl m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z' ej(ej) Z*G dd dej+ej,Z-G dd deZ.dS )    N)AbstractSecurityModel)hmacmd5hmacshanoauth)desnopriv)aes)hmacsha2)des3aes192aes256)NoSuchInstanceError)apirfc1155errinderror)debug)univ	namedtype
constraint)encoderdecodereoo)PyAsn1Error)nullc                   @   s   e Zd Zeede ede j	e
dddede j	e
dddede j	e
ddded	e ed
e ZdS )UsmSecurityParametersmsgAuthoritativeEngineIdmsgAuthoritativeEngineBootsr   )ZsubtypeSpecmsgAuthoritativeEngineTimemsgUserName    ZmsgAuthenticationParametersZmsgPrivacyParametersN)__name__
__module____qualname__r   Z
NamedTypesZ	NamedTyper   OctetStringZIntegerZsubtyper   ZValueRangeConstraintZValueSizeConstraintZcomponentType r&   r&   E/usr/lib/python3/dist-packages/pysnmp/proto/secmod/rfc3414/service.pyr      s    r   c                   @   sF  e Zd ZdZejje ejje e	j
je	
e	j
je	j
je	
e	j
je	j
je	
e	j
je	j
je	
e	j
jejje iZejje ejje ejje ejje ejje ejje ejje ejje iZ e!j"ddZ#dd Z$dddZ%e&d	d
 Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dS )SnmpUSMSecurityModel   Z
0000000000ZhexValuec                 C   s.   t |  t | _i | _i | _d| _d| _d S )Nr   )r   __init__r   -_SnmpUSMSecurityModel__securityParametersSpec_SnmpUSMSecurityModel__timeline'_SnmpUSMSecurityModel__timelineExpQueue&_SnmpUSMSecurityModel__expirationTimer%_SnmpUSMSecurityModel__paramsBranchId)selfr&   r&   r'   r,   C   s   

zSnmpUSMSecurityModel.__init__Nc                 C   s  |j jj}|dd\}| j|jkr||ddd\}}i | _|}	 z||j}W n t	yG   |j| _t
jt
j@ oDt
d| j| jf  Y n5w |jt|jd  }	||j|	 j}
||j|	 j}||j|	 j}|
|f}|| jvr{|| j|< q!|d u r|dd\}|j}z	| j||f }W n ty   t
jt
j@ ot
d	||f  t	  t	 w t
jt
j@ ot
d
|||f  |S  |S )NSNMP-USER-BASED-SM-MIBusmUserEngineIDusmUserNameusmUserSecurityNameTzK_sec2usr: built snmpEngineId + securityName to userName map, version %s: %r__SNMP-FRAMEWORK-MIBsnmpEngineIDz>_sec2usr: no entry exists for snmpEngineId %r, securityName %rz@_sec2usr: using userName %r for snmpEngineId %r, securityName %r)msgAndPduDspmibInstrumController
mibBuilderimportSymbolsr1   ZbranchVersionIdZ(_SnmpUSMSecurityModel__securityToUserMapZgetNextNodenamer   r   loggerflagSMlengetNodesyntaxKeyError)r2   
snmpEnginesecurityNamesecurityEngineIDr;   r4   r5   r6   ZnextMibNodeZinstIdZ_SnmpUSMSecurityModel__engineIDZ_SnmpUSMSecurityModel__userNameZ#_SnmpUSMSecurityModel__securityNamekr8   userNamer&   r&   r'   Z	__sec2usrK   sh   



zSnmpUSMSecurityModel.__sec2usrc                 C   s   | j dd\}|||}||jd | j}||jd | j}||jd | j}||jd | j}| j dd\}	|	|	jd	 | j}
|	|	jd | j}||||
||fS )
Nr3   usmUserEntry   r)         PYSNMP-USM-MIBpysnmpUsmKeyEntry   )r;   r<   getInstIdFromIndicesrA   r=   rB   )r:   rF   rH   rI   ZtblIdxr5   r6   usmUserAuthProtocolusmUserPrivProtocolrR   pysnmpUsmKeyAuthLocalizedpysnmpUsmKeyPrivLocalizedr&   r&   r'   Z__getUserInfo   s"   z"SnmpUSMSecurityModel.__getUserInfoc                 C   sb  |j dd\}|j dd\}||j|}||jd | }||jd | }||jd | }	||jd | }
||jd	 | }|j d
d\}||jd | }||jd | }|||}||jd | dff |j||jd | _|j||jd | _|	j|||jd | _|
j||jd | _|j||jd	 | _|j d
d\}||jd | }|
j| jv r| j|
j j	}||j|}nt
jtjd|d ur|j||_||jd | }|j| jv r| j|j j	}||
j|j|}nt
jtjd|d ur#|j||_|j|j|
j|j|j|jfS )Nr7   r8   r3   rI   rJ   rL   )   rM   rO   rQ   rR   )   rZ   rS   errorIndication)r;   r<   rU   rB   rA   r=   Z	writeVarscloneauthServiceslocalizeKeyr   StatusInformationr   ZunsupportedAuthProtocolprivServicesZunsupportedPrivProtocol)r2   r:   rF   rH   r8   rI   ZtblIdx1r5   r6   ZusmUserCloneFromrV   rW   rR   ZpysnmpUsmKeyAuthZpysnmpUsmKeyPrivZtblIdx2rX   r`   ZlocalAuthKeyrY   ZlocalPrivKeyr&   r&   r'   Z__cloneUserInfo   sx   
z$SnmpUSMSecurityModel.__cloneUserInfoc           '      C   s>
  |j jj}|ddd j}|}|
d ur}| j|
}|d }d|v r'|d }n|}d|v r2|d }ntjj	}d|v r?|d }nd }d|v rJ|d }nt
jj	}d	|v rW|d	 }nd }|}tjtj@ oztd
||||ol| ||or| | ||
f	  n|rzXz| |j j|| |||\}}}}}}W n ty   | |j j| j| ||| j\}}}}}}Y nw tjtj@ otd||||o| ||o| | |f  W n( tyN   |dd\}|j }|sBz7| |j j|| ||\}}}}}}tjtj@ o#td||||o| ||o| | |f  W n tyA   tjtj@ o<td||f  d}Y nw |rLtjtjdY n ty   tjtj@ o}tdt d f  |dd\}| jd7  _tjtjd |dd\}| jd7  _tjtjdw t }}d}|	jdtdddd |d}|jdt j!dddddd |	d" }|# }t$j%&| |	dj'|j(|dddd t }}tjj	}t
jj	}d  }}tjtj@ o td|||||||o| |f  |dkr|tjj	ks|t
jj	krtjtj)d|dks%|dkr3|tjj	kr3tjtj)d| j*}|dd}|jd|	dddd |
d u r|dv r|| j+v rn| j+| \}}}}tjtj@ oltd nGd }}tjtj@ otd|f  n3|
d ur|dd d!\}}|j}|j# }tjtj@ otd" nd }}tjtj@ otd# tjtj@ otd$|||f  |dkrb|| j,v r| j,| } ntjtj-dtjtj@ otd%|	   zt./|	}!W n) ty   tjtj@ otd&t d   tjtj0d tjtj0dw tjtj@ o/td't1|!  | 2|||d f|!\}"}#|jd(|#dddd |jd|"dddd tjtj@ o`td)t1|"  n|dksl|dkrr|d(d* tjtj@ otd|   |jd|dddd |jd|dddd |jd|dddd |jd|dddd |dks|dkr`|| j3v r| j3| }$ntjtj4d|d+d,|$j5  tjtj@ otd| f  z|jdt./|dd- W n) ty   tjtj@ otd.t d   tjtj0d tjtj0dw tjtj@ o'td/|   zt./|}%W n) tyX   tjtj@ oPtd0t d   tjtj0d tjtj0dw |$6||%}&n|jd+d*dddd tjtj@ oztd| f  z|jdt./|dddd W n) ty   tjtj@ otd1t d   tjtj0d tjtj0dw ztjtj@ otd2|   t./|}&W n) ty   tjtj@ otd0t d   tjtj0d tjtj0dw tjtj@ otd3|dkrd4pd5t1|&f  |d|&fS  |d|&fS )6Nr7   r8   r   r    r6   rV   usmUserAuthKeyLocalizedrW   usmUserPrivKeyLocalizeda(  __generateRequestOrResponseMsg: using cached USM user entry usmUserName "%s" usmUserSecurityName "%s" usmUserAuthProtocol "%s" usmUserAuthKeyLocalized "%s" usmUserPrivProtocol "%s" usmUserPrivKeyLocalized "%s" for securityEngineID "%s" and  securityName "%s" found by securityStateReference "%s" z__generateRequestOrResponseMsg: found USM user entry usmUserName "%s" usmUserSecurityName "%s" usmUserAuthProtocol "%s" usmUserAuthKeyLocalized "%s" usmUserPrivProtocol "%s" usmUserPrivKeyLocalized "%s" by securityEngineID "%s" and  securityName "%s"__PYSNMP-USM-MIBpysnmpUsmDiscoveryz__generateRequestOrResponseMsg: cloned USM user entry usmUserName "%s" usmUserSecurityName "%s" usmUserAuthProtocol "%s" usmUserAuthKeyLocalized "%s" usmUserPrivProtocol "%s" usmUserPrivKeyLocalized "%s" for securityEngineID "%s" and  securityName "%s"zd__generateRequestOrResponseMsg: failed to clone USM user for securityEngineID "%s" securityName "%s"Tr\   z"__generateRequestOrResponseMsg: %srT   __SNMPv2-MIBsnmpInGenErrsF)verifyConstraintsZ	matchTagsZmatchConstraintsrK   Z04r*   a  __generateRequestOrResponseMsg: using blank USM info for peer SNMP engine ID discovery usmUserName "%s" usmUserSecurityName "%s" usmUserAuthProtocol "%s" usmUserAuthKeyLocalized "%s" usmUserPrivProtocol "%s" usmUserPrivKeyLocalized "%s" for securityEngineID "%s" and  securityName "%s"r)   )rK   r)   zR__generateRequestOrResponseMsg: read snmpEngineBoots, snmpEngineTime from timelinezC__generateRequestOrResponseMsg: no timeline for securityEngineID %rsnmpEngineBootssnmpEngineTimezM__generateRequestOrResponseMsg: read snmpEngineBoots, snmpEngineTime from LCDzM__generateRequestOrResponseMsg: assuming zero snmpEngineBoots, snmpEngineTimez`__generateRequestOrResponseMsg: use snmpEngineBoots %s snmpEngineTime %s for securityEngineID %rz,__generateRequestOrResponseMsg: scopedPDU %szA__generateRequestOrResponseMsg: scopedPDU serialization error: %sz9__generateRequestOrResponseMsg: scopedPDU encoded into %srN   z:__generateRequestOrResponseMsg: scopedPDU ciphered into %s rZ    )ri   zJ__generateRequestOrResponseMsg: securityParameters serialization error: %sz5__generateRequestOrResponseMsg: auth outgoing msg: %sz;__generateRequestOrResponseMsg: msg serialization error: %szJ__generateRequestOrResponseMsg: secutiryParameters serialization error: %sz6__generateRequestOrResponseMsg: plain outgoing msg: %sz3__generateRequestOrResponseMsg: %s outgoing msg: %sZauthenticatedZplain)7r9   r:   r;   r<   rB   _cachepopr   NoAuth	serviceIDr   NoPrivr   r>   r?   prettyPrint"_SnmpUSMSecurityModel__getUserInfo_SnmpUSMSecurityModel__sec2usrr   wildcardSecurityEngineId$_SnmpUSMSecurityModel__cloneUserInfor   ra   r   unknownSecurityNamer   sysexc_info
invalidMsgr   setComponentByPositiongetComponentByPositionr   r%   getComponentr^   pModZapiPDUZsetDefaultsZsetComponentByTypeZtagSetunsupportedSecurityLevelr-   r.   rb   ZencryptionErrorr   encodeZserializationErrorhexdumpZencryptDatar_   authenticationFailureZdigestLengthZauthenticateOutgoingMsg)'r2   rD   messageProcessingModel
globalDatamaxMessageSizesecurityModelrF   rE   securityLevel	scopedPDUsecurityStateReferencer;   r8   msgZcachedSecurityDatar5   r6   rV   rc   rW   rd   rf   ZreportUnknownNamerh   Z
headerDataZemptyPdusecurityParametersZscopedPDUDatarj   rk   latestReceivedEngineTimelatestUpdateTimestampprivHandlerZdataToEncryptZencryptedDataZprivParametersauthHandlerwholeMsgZauthenticatedWholeMsgr&   r&   r'   Z__generateRequestOrResponseMsg   s  





	







	

















z3SnmpUSMSecurityModel.__generateRequestOrResponseMsgc
           
      C   s   |  |||||||||	d 
S N3_SnmpUSMSecurityModel__generateRequestOrResponseMsg)
r2   rD   r   r   r   r   rF   rE   r   r   r&   r&   r'   generateRequestMsgp  s   z'SnmpUSMSecurityModel.generateRequestMsgc                 C   s   |  |||||||||	|

S r   r   )r2   rD   r   r   r   r   rF   rE   r   r   r   r&   r&   r'   generateResponseMsg  s
   z(SnmpUSMSecurityModel.generateResponseMsgc	           3      C   sP  |j jj}	t|t| d }
tjtj@ otdt|  t	j
|| jd\}}tjtj@ o8td| f  tj|rFtjtjd|d}| jj|dd}tjtj@ oftd	||df  |d}|	d
dd j}t}|	d
dd j}||krD|| jvrD|rdt|  k rdk rn ntjtj@ otd|f  ntjtj@ otd |	dd\}| jd7  _tjtj@ otd |	dd\}|jr)tjtj@ otd | dkr
tjtj@ otd|   tjtjd tjtjd| }|d}|d}tjtj|j|j||||||
d	tjtj@ o<td tjtjd tjtjd|d}tjtj@ oXtd||f  |r?z| |j j||\}}}}}}tjtj@ owtd W n t y   z| |j j| j!|\}}}}}}tjtj@ otd W nW t y   tjtj@ otd||f  |	dd\}| jd7  _tjtj"|j|j||||||
d 	 |	dd\}| jd7  _tjtj"|j|j||||||
d 	w Y nV t#y>   tjtj@ o(tdt$% d f  |	d!d"\}| jd7  _tjtj&d |	d!d"\}| jd7  _tjtj&dw t }}t'j(j)}t*j+j)}d  }}tjtj@ oatd#|||||f  | j,| | jj|d|||||d$}|d}|d%}|j-.|d&t/|||||||||d'	 |j-0|d& ||kr3d } |dkr|t'j(j)krd(} |t*j+j)krd)} n5|d%kr|t'j(j)krd*} |t*j+j)kr|s|rd+} n|dkr|t'j(j)krd,} |t*j+j)krd-} | r3|	dd.\}!|! jd7  _tjtj@ o!td/|| f  tjtj1|!j|!j||||||
d 	 tjtj1|!j|!j||||||
d 	|dks=|d%kr|| j2v rI| j2| }"ntjtj3dz|"4||d| W n( tjy   |	dd0\}#|# jd7  _tjtj3|#j|#j||||||
d 	w tjtj@ otd1 |d|d%|d%tt55 f| j|< |j6d u rd2p|j67 }$t| j8d3|$  }%|%| j9vrg | j9|%< | j9|% :| tjtj@ otd4|f  |dks|d%kr||kr|	d
d5d6\}&}'|&j}&|'j; }'d}(tjtj@ otd7|&|'f  n/|| jv r=| j| \}&}'})}*tt55 |* }(tjtj@ o;td8|&|'||(f  nt<d9||kr|&d:ks`|&|ks`t=|(t|' t| d;kr|	dd<\}+|+ jd7  _tjtj>|+j|+j|d%||||
d 	n}||&ks||&kr||)kr|||tt55 f| j|< |j6d u rd2p|j67 }$t| j8d3|$  }%|%| j9vrg | j9|%< | j9|% :| tjtj@ otd=|||f  |&d:ks||&k s||&krt=|(t|' t| d;krtjtj>|d>|dkr|| j?v r| j?| },ntjtj@|d>|d}-|-d u r(tjtj@|d>z&|,A||d|d%|d?f|-}.tjtj@ oLtd@t|.  W n( tjyv   |	ddA\}/|/ jd7  _tjtj@|/j|/j||||||
d 	w |Bdd}0zt	j
|.|0d\}1}W n+ t#y   tjtj@ otdBt$% d   tjtj@|d> tjtj@|d>w tj|1rtjtj@|d>n|d}1|1d u rtjtj@|d>tjtj@ otdC|1   |}2tjtj@ otdD||f  |s!|s!|	dd\}| jd7  _tjtj"|j|j|||||||
|1dE||2|1|
|fS )FN0   z)processIncomingMsg: securityParameters %s)Zasn1SpeczprocessIncomingMsg: %sr\   r   r)   )r    zKprocessIncomingMsg: cache write securityStateReference %s by msgUserName %sr7   r8   rZ   !   z8processIncomingMsg: non-synchronized securityEngineID %rz9processIncomingMsg: peer requested snmpEngineID discoveryz__SNMP-USER-BASED-SM-MIBusmStatsUnknownEngineIDsrT   z>processIncomingMsg: null or malformed msgAuthoritativeEngineIdre   pysnmpUsmDiscoverablez=processIncomingMsg: starting snmpEngineID discovery procedureZ	plaintextz2processIncomingMsg: scopedPduData not plaintext %s)	r]   oidvalr   r   contextEngineIdcontextNamer   maxSizeResponseScopedPDUz.processIncomingMsg: will not discover EngineIDzWprocessIncomingMsg: read from securityParams msgAuthoritativeEngineId %r msgUserName %rz+processIncomingMsg: read user info from LCDz4processIncomingMsg: read wildcard user info from LCDz>processIncomingMsg: unknown securityEngineID %r msgUserName %rusmStatsUnknownUserNames)	r]   r   r   r   r   r   r   r    r   rg   rh   zprocessIncomingMsg: now have usmUserName %r usmUserSecurityName %r usmUserAuthProtocol %r usmUserPrivProtocol %r for msgUserName %r)r    r6   rV   rc   rW   rd   rK   zrfc3414.processIncomingMsg)	ZsecurityEngineIdrj   rk   rH   rE   ZauthProtocolZauthKeyZprivProtocolZprivKeyz'authPriv wanted while auth not expectedz'authPriv wanted while priv not expectedz)authNoPriv wanted while auth not expectedz%authNoPriv wanted while priv expectedz'noAuthNoPriv wanted while auth expectedz'noAuthNoPriv wanted while priv expectedusmStatsUnsupportedSecLevelszJprocessIncomingMsg: reporting inappropriate security level for user %s: %susmStatsWrongDigestsz.processIncomingMsg: incoming msg authenticatedg      ?i,  z:processIncomingMsg: store timeline for securityEngineID %rrj   rk   zKprocessIncomingMsg: read snmpEngineBoots (%s), snmpEngineTime (%s) from LCDzyprocessIncomingMsg: read timeline snmpEngineBoots %s snmpEngineTime %s for msgAuthoritativeEngineId %r, idle time %s secszPeer SNMP engine info missingr      usmStatsNotInTimeWindowszprocessIncomingMsg: stored timeline msgAuthoritativeEngineBoots %s msgAuthoritativeEngineTime %s for msgAuthoritativeEngineId %r)r]   r    rN   z*processIncomingMsg: PDU deciphered into %susmStatsDecryptionErrorsz/processIncomingMsg: scopedPDU decoder failed %sz(processIncomingMsg: scopedPDU decoded %szKprocessIncomingMsg: cached msgUserName %s info by securityStateReference %s)r]   r   r   r   rF   r   r   r   r    r   ZPDU)Cr9   r:   r;   intr@   r   r>   r?   r   r   decoder-   rs   r   ZendOfOctetsZisSameTypeWithr   ra   r   Z
parseErrorr}   rn   pushr<   rB   r   r.   ZgetNameZunknownEngineIDr~   r=   rt   r   rv   rx   r   ry   rz   r{   r   rp   rq   r   rr   ro   ZobserverZstoreExecutionContextdictZclearExecutionContextr   r_   r   ZauthenticateIncomingMsgtimeZtransportDispatcherZgetTimerResolutionr0   r/   appendr^   ZProtocolErrorabsZnotInTimeWindowrb   ZdecryptionErrorZdecryptDatar|   )3r2   rD   r   r   r   r   r   r   r   r;   r   restr   r   ZscopedPduDatar   r   r8   r   r   Z	scopedPdur    r5   r6   rV   rc   rW   rd   r   rh   r   r   ZbadSecIndicationr   r   r   ZtimerResolutionZexpireAtrj   rk   ZidleTimer   r   r   r   ZencryptedPDUZdecryptedDatar   ZscopedPduSpecr   rE   r&   r&   r'   processIncomingMsg  s  










&

	























z'SnmpUSMSecurityModel.processIncomingMsgc                 C   sh   | j | jv r+| j| j  D ]}|| jv r%| j|= tjtj@ o$td|f  q| j| j = |  j d7  _ d S )Nz!__expireTimelineInfo: expiring %rrT   )r0   r/   r.   r   r>   r?   )r2   ZengineIdKeyr&   r&   r'   Z__expireTimelineInfoc  s   

z)SnmpUSMSecurityModel.__expireTimelineInfoc                 C   s   |    d S r   ))_SnmpUSMSecurityModel__expireTimelineInfo)r2   rD   ZtimeNowr&   r&   r'   receiveTimerTickl  s   z%SnmpUSMSecurityModel.receiveTimerTickr   )/r"   r#   r$   ZsecurityModelIDr   ZHmacMd5rq   r   ZHmacShar	   ZHmacSha2Zsha224ServiceIDZsha256ServiceIDZsha384ServiceIDZsha512ServiceIDr   rp   r_   r   ZDesr
   ZDes3r   ZAesr   ZAesBlumenthal192r   ZAesBlumenthal256ZAes192ZAes256r   rr   rb   r   r%   rv   r,   ru   staticmethodrt   rw   r   r   r   r   r   r   r&   r&   r&   r'   r(   +   sJ    
4
N      \	r(   )/r   ry   Zpysnmp.proto.secmod.baser   Z pysnmp.proto.secmod.rfc3414.authr   r   r   Z pysnmp.proto.secmod.rfc3414.privr   r   Z pysnmp.proto.secmod.rfc3826.privr   Z pysnmp.proto.secmod.rfc7860.authr	   Zpysnmp.proto.secmod.eso.privr
   r   r   Zpysnmp.smi.errorr   Zpysnmp.protor   r   r   r   Zpysnmpr   Zpyasn1.typer   r   r   Zpyasn1.codec.berr   r   r   Zpyasn1.errorr   Zpyasn1.compat.octetsr   ZprotoModulesZprotoVersion2cr   ZTypeCoercionHackMixInSequencer   r(   r&   r&   r&   r'   <module>   s$   