
    <f              	          d dl Z d dlmZ d dl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  G d d	e j                  Z G d
 de j                  Z G d de j                  Z G d de j                  Z G d de j                  Z G d de j                  Z G d de j                  Z edddd d d d          pg ZeD ]-Zej        ej        ej        fdZ eedej        z  e           . G d d e j                  Z edd!d"d# d$ d% d          pg ZeD ]-Zej        ej        ej        fd&Z eedej        z  e           . G d' d(e j                  Z  edd)d*d+ d, d- d          pg ZeD ]-Zej        ej        ej        fd.Z ee dej        z  e           . G d/ d0e j                  Z! edd1d2d3 d4 d5 d          pg ZeD ]-Zej        ej        ej        fd6Z ee!dej        z  e           . G d7 d8e j                  Z" edd9d:d; d< d= d          pg ZeD ]-Zej        ej        ej        fd>Z ee"dej        z  e           . G d? d@e j                  Z# G dA dBe j                  Z$ G dC dDe j                  Z% G dE dFe j                  Z& G dG dHe j                  Z' G dI dJe j                  Z( G dK dLe j                  Z) G dM dNe j                  Z* G dO dPe j                  Z+ G dQ dRe j                  Z,i fdSZ-e.dTk    rdU Z/ e j0        dVW           dS dS )X    N)	unhexlify)list_test_cases)load_test_vectors)ECC)EccPoint_curvesEccKey)Integerc                       e Zd Zd Zd ZdS )TestEccPointc                    t          j        d          j        }t          j        d          j        }	 ||z    J # t          $ r}dt	          |          v sJ Y d }~nd }~ww xY w	 ||z  }J # t          $ r}dt	          |          v sJ Y d }~nd }~ww xY w G d d          }|                     | |            k               |                     | |            k               d S )NP-256curveP-384Fznot on the same curvec                       e Zd ZdS )+TestEccPoint.test_mix.<locals>.OtherKeyTypeN)__name__
__module____qualname__     v/home/panchajanya/Development/work/volatility3/lib/python3.11/site-packages/Crypto/SelfTest/PublicKey/test_ECC_NIST.pyOtherKeyTyper   >   s        Dr   r   )r   generatepointQ
ValueErrorstrassertFalse
assertTrue)selfp1p2er   s        r   test_mixzTestEccPoint.test_mix-   sH   \(((/\(((/	5GGM 	5 	5 	5*c!ff444444444	5	5"HBM 	5 	5 	5*c!ff444444444	5	 	 	 	 	 	 	 	 	||~~-...llnn,-----s-   = 
A$AA$(A/ /
B9BBc                 |    t          j        dddd          }|                     t          |          d           d S )Nr   l   }	&_n i9]}!5$7P%^-& l   -
k%j&*/n;[jH**7 
i/v{-l   ]W][@iMmlQ;i?XU,p )r   dpoint_xpoint_ya  EccKey(curve='NIST P-256', point_x=20573031766139722500939782666697015100983491952082159880539639074939225934381, point_y=108863130203210779921520632367477406025152638284581252625277850513266505911389, d=75467964919405407085864614198393977741148485328036093939970922195112333446269))r   	constructassertEqualrepr)r!   r"   s     r   	test_reprzTestEccPoint.test_reprD   s]    ]j#p#qs s s 	b  $@  	A  	A  	A  	A  	Ar   N)r   r   r   r%   r-   r   r   r   r   r   +   s7        . . ..A A A A Ar   r   c                       e Zd ZdZ eddd          Z eddd          Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd ZdS )TestEccPoint_NIST_P192ztTests defined in section 4.1 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdfl   ,/}H 5iH\D>GEl   ;_!3o3nk3>
6@I%p192r   l   S.7lpPa7ng>=}Tb"l   y5R]2vNA>RmKwYfe% !dc                     t          dd          }|                    | j                   |                     || j                   d S Nr   r   setpointSr+   r!   pointWs     r   test_setzTestEccPoint_NIST_P192.test_setY   A    !Q

4;-----r   c                    | j                                         }|                     || j                    |                    | j                   |                     || j                   |                     | j         | j                   d S Nr5   copyr+   r4   pointTassertNotEqualr6   s     r   	test_copyz TestEccPoint_NIST_P192.test_copy^   y    !!##---

4;---DK55555r   c                     | j          }| j         |z   }|                     || j                                                    d S r;   r5   r+   point_at_infinityr!   negSsums      r   test_negatez"TestEccPoint_NIST_P192.test_negatee   A    |kD dk;;==>>>>>r   c                    d}d}| j         | j        z   }|                     |j        |           |                     |j        |           |                                }| j         |z   }|                     || j                    || j         z   }|                     || j                    ||z   }|                     ||           d S Nl   <Sb!tX?w|xh\7% l   K*m/_JSl(U[yq;}r5   r>   r+   xyrD   r!   pointRxpointRypointRpais        r   test_additionz$TestEccPoint_NIST_P192.test_additionj   s    DDt{*7+++7+++&&(( s"--- t{"--- s%%%%%r   c                 *   d}d}| j                                         }|| j        z  }|                     |j        |           |                     |j        |           |                                }| j                                         }||z  }|                     || j                    |                                }|| j         z  }|                     || j                    |                                }||z  }|                     ||           d S rK   r5   r=   r>   r+   rM   rN   rD   rO   s        r   test_inplace_additionz,TestEccPoint_NIST_P192.test_inplace_addition   s	   DD!!##$+7+++7+++&&(( !!###--- $+--- #%%%%%r   c                 *   d}d}| j                                         }|                                 |                     |j        |           |                     |j        |           | j                                         }|                                }|                                 |                     ||           | j                                         }||z  }|                     |j        |           |                     |j        |           d S )Nl   bi~hIR wYTSD{1.-l   	%Y^-<6!N	qp r5   r=   doubler+   rM   rN   rD   rO   s        r   test_doublingz$TestEccPoint_NIST_P192.test_doubling   s    DD!!##7+++7+++ k++--%%% !!##&7+++7+++++r   c                 \    d}d}d} j         |z  }                     |j        |                                |j        |            j                                         } j         dz  }                     ||                                t           fd           | j         z  }                     |j        |                                |j        |           t          |           j         z  }                     |j        |                                |j        |           d S )N   tlkdcH(Lj]u5Qx
l   1m~KT4IwxIG-i!wl   {5syq-BKBior   c                       j         dz  S Nr5   r!   s   r   <lambda>z=TestEccPoint_NIST_P192.test_scalar_multiply.<locals>.<lambda>       dkB.> r   r5   r+   rM   rN   rD   assertRaisesr   r
   r!   r'   rP   rQ   rR   rS   s   `     r   test_scalar_multiplyz+TestEccPoint_NIST_P192.test_scalar_multiply   s*   >DDq7+++7+++ k++--q%%% 	*&>&>&>&>??? T[7+++7+++dk)7+++7+++++r   c                     d}d}d}d}| j         |z  | j        |z  z   }|                     |j        |           |                     |j        |           d S )Nr]   l   rr6O^ho3&gaOqKl   [oge?/ or6uc;'{ l   D6vMc'~vLz6bHer5   r>   r+   rM   rN   r!   r'   r$   rP   rQ   rR   s         r   test_joint_scalar_multiplyz1TestEccPoint_NIST_P192.test_joint_scalar_multiply   sb    >>DDq4;?27+++7+++++r   c                     |                      | j                                        d           |                      | j                                        d           d S )N      r+   r5   size_in_bitssize_in_bytesrb   s    r   
test_sizesz!TestEccPoint_NIST_P192.test_sizes   P    1133S9992244b99999r   N)r   r   r   __doc__r   r5   r>   r8   r@   rH   rT   rW   r[   rh   rl   rs   r   r   r   r/   r/   L   s        ~~XBB  F
 XBB  F
. . .
6 6 6? ? ?
& & &,& & &4, , ,*, , ,4, , ,: : : : :r   r/   c                       e Zd ZdZ eddd          Z eddd          Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd ZdS )TestEccPoint_NIST_P224ztTests defined in section 4.2 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdfl   [;!4E7<_1*vK6N9!TY:)Pl   "?Iq.pGA26', X-p/i;p224r   l   m=Mp@2i#M#Y B/#nX\jd-l   4i"nQ)N}:{	hk-xBISIQ
1c                     t          dd          }|                    | j                   |                     || j                   d S r2   r3   r6   s     r   r8   zTestEccPoint_NIST_P224.test_set   r9   r   c                    | j                                         }|                     || j                    |                    | j                   |                     || j                   |                     | j         | j                   d S r;   r<   r6   s     r   r@   z TestEccPoint_NIST_P224.test_copy   rA   r   c                     | j          }| j         |z   }|                     || j                                                    d S r;   rC   rE   s      r   rH   z"TestEccPoint_NIST_P224.test_negate   rI   r   c                    d}d}| j         | j        z   }|                     |j        |           |                     |j        |           |                                }| j         |z   }|                     || j                    || j         z   }|                     || j                    ||z   }|                     ||           d S Nl   }Q+|y%w<{ Vu{adl   pZv8)_z-hK	G^6gyO9rL   rO   s        r   rT   z$TestEccPoint_NIST_P224.test_addition   s    LLt{*7+++7+++&&(( s"--- t{"--- s%%%%%r   c                 *   d}d}| j                                         }|| j        z  }|                     |j        |           |                     |j        |           |                                }| j                                         }||z  }|                     || j                    |                                }|| j         z  }|                     || j                    |                                }||z  }|                     ||           d S r}   rV   rO   s        r   rW   z,TestEccPoint_NIST_P224.test_inplace_addition  s	   LL!!##$+7+++7+++&&(( !!###--- $+--- #%%%%%r   c                 *   d}d}| j                                         }|                                 |                     |j        |           |                     |j        |           | j                                         }|                                }|                                 |                     ||           | j                                         }||z  }|                     |j        |           |                     |j        |           d S )Nl   _xxRh>7ZPJIw}-r*l   }]o`}MH^>A0Z]Sv>L1|+rY   rO   s        r   r[   z$TestEccPoint_NIST_P224.test_doubling&  s    LL!!##7+++7+++ k++--%%% !!##&7+++7+++++r   c                 \    d}d}d} j         |z  }                     |j        |                                |j        |            j                                         } j         dz  }                     ||                                t           fd           | j         z  }                     |j        |                                |j        |           t          |           j         z  }                     |j        |                                |j        |           d S )N   ;WU'uoZw]o]em82~P)l   <N0VmoLBm_J+'"/F*iKl%l   mG[nWh8z{hbIU_OxQB)Jr   c                       j         dz  S r_   ra   rb   s   r   rc   z=TestEccPoint_NIST_P224.test_scalar_multiply.<locals>.<lambda>J  rd   r   re   rg   s   `     r   rh   z+TestEccPoint_NIST_P224.test_scalar_multiply;  s*   FLLq7+++7+++ k++--q%%% 	*&>&>&>&>??? T[7+++7+++dk)7+++7+++++r   c                     d}d}d}d}| j         |z  | j        |z  z   }|                     |j        |           |                     |j        |           d S )Nr   l   6W]UDwyptq>3dd|?)5l   >HEK5\
5F2~?jTm{+E6l   1(^VKUC?++'*X:pCrj   rk   s         r   test_joing_scalar_multiplyz1TestEccPoint_NIST_P224.test_joing_scalar_multiplyU  sb    FFLLq4;?27+++7+++++r   c                     |                      | j                                        d           |                      | j                                        d           d S )N      rp   rb   s    r   rs   z!TestEccPoint_NIST_P224.test_sizes_  rt   r   Nr   r   r   ru   r   r5   r>   r8   r@   rH   rT   rW   r[   rh   r   rs   r   r   r   rw   rw      s        ~~XJJ  F
 XJJ  F
. . .
6 6 6? ? ?
& & &,& & &4, , ,*, , ,4, , ,: : : : :r   rw   c                   x    e Zd ZdZ edd          Z edd          Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd ZdS )TestEccPoint_NIST_P256ztTests defined in section 4.3 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdfl   ,;zQCl:a*N<xn.h&#/_"$^ l   V"`,1kWypYLG+-pJ|?W@ l   kkdg\[W9r*9.B,LI5/f:hcXUl   Cdc'2gs1E+.-'a!Tc                     t          dd          }|                    | j                   |                     || j                   d S r2   r3   r6   s     r   r8   zTestEccPoint_NIST_P256.test_seto  r9   r   c                    | j                                         }|                     || j                    |                    | j                   |                     || j                   |                     | j         | j                   d S r;   r<   r6   s     r   r@   z TestEccPoint_NIST_P256.test_copyt  rA   r   c                     | j          }| j         |z   }|                     || j                                                    d S r;   rC   rE   s      r   rH   z"TestEccPoint_NIST_P256.test_negate{  rI   r   c                    d}d}| j         | j        z   }|                     |j        |           |                     |j        |           |                                }| j         |z   }|                     || j                    || j         z   }|                     || j                    ||z   }|                     ||           d S Nl   ~(iM)E=kdHpit3&EpmRrl   dBhE@	hFTVL.E$udK].X rL   rO   s        r   rT   z$TestEccPoint_NIST_P256.test_addition  s    TTt{*7+++7+++&&(( s"--- t{"--- s%%%%%r   c                 *   d}d}| j                                         }|| j        z  }|                     |j        |           |                     |j        |           |                                }| j                                         }||z  }|                     || j                    |                                }|| j         z  }|                     || j                    |                                }||z  }|                     ||           d S r   rV   rO   s        r   rW   z,TestEccPoint_NIST_P256.test_inplace_addition  	   TT!!##$+7+++7+++&&(( !!###--- $+--- #%%%%%r   c                 *   d}d}| j                                         }|                                 |                     |j        |           |                     |j        |           | j                                         }|                                }|                                 |                     ||           | j                                         }||z  }|                     |j        |           |                     |j        |           d S )Nl   '6?0T.<63GwG:]Hsivl   P6e#` {yO8^g^ w{9lJ@z rY   rO   s        r   r[   z$TestEccPoint_NIST_P256.test_doubling  s    TT!!##7+++7+++ k++--%%% !!##&7+++7+++++r   c                 \    d}d}d} j         |z  }                     |j        |                                |j        |            j                                         } j         dz  }                     ||                                t           fd           | j         z  }                     |j        |                                |j        |           t          |           j         z  }                     |j        |                                |j        |           d S )N   _,)N$chKf-5lk<Xk#E l   ? nDf>1x066OPKFQl   ATU*-sX)>~|N\}T9%Dbu4ur   c                       j         dz  S r_   ra   rb   s   r   rc   z=TestEccPoint_NIST_P256.test_scalar_multiply.<locals>.<lambda>  rd   r   re   rg   s   `     r   rh   z+TestEccPoint_NIST_P256.test_scalar_multiply  s*   NTTq7+++7+++ k++--q%%% 	*&>&>&>&>??? T[7+++7+++dk)7+++7+++++r   c                     d}d}d}d}| j         |z  | j        |z  z   }|                     |j        |           |                     |j        |           d S )Nr   l   T:XuMKt^5~{"/T3G1S l   vbaB>Y5OgEI# d3ZgX l   uR`/.5ES6p* Pr rj   rk   s         r   r   z1TestEccPoint_NIST_P256.test_joing_scalar_multiply  sb    NNTTq4;?27+++7+++++r   c                     |                      | j                                        d           |                      | j                                        d           d S )N       rp   rb   s    r   rs   z!TestEccPoint_NIST_P256.test_sizes  rt   r   Nr   r   r   r   r   r   d  s        ~~XRRT TF XRRT TF. . .
6 6 6? ? ?
& & &,& & &4, , ,*, , ,4, , ,: : : : :r   r   c                   |    e Zd ZdZ eddd          Z eddd          Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd ZdS )TestEccPoint_NIST_P384ztTests defined in section 4.4 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdfl   K<L3YUH[Am]8$_-'DM./8;V~Ho\"l   E^PjWvM0M7bKL84\mn&J

"[!66p#y|@z~W~ p384l   Q'"f4OcE-XJ9ija>:}@sMLUl   P}&zIy$GY9Q%?pa(Fv|EO{ c                     t          ddd          }|                    | j                   |                     || j                   d S )Nr   r   r3   r6   s     r   r8   zTestEccPoint_NIST_P384.test_set  sE    !Q''

4;-----r   c                    | j                                         }|                     || j                    |                    | j                   |                     || j                   |                     | j         | j                   d S r;   r<   r6   s     r   r@   z TestEccPoint_NIST_P384.test_copy   rA   r   c                     | j          }| j         |z   }|                     || j                                                    d S r;   rC   rE   s      r   rH   z"TestEccPoint_NIST_P384.test_negate  rI   r   c                    d}d}| j         | j        z   }|                     |j        |           |                     |j        |           |                                }| j         |z   }|                     || j                    || j         z   }|                     || j                    ||z   }|                     ||           d S )Nl   ^\mLH\%sz.	_QHp)wB'2h\|Sz9Y07s\\% l   $	rQ4 1ml w{g~OM wr6bLLU;8*$0xrs, rL   rO   s        r   rT   z$TestEccPoint_NIST_P384.test_addition  s    ttt{*7+++7+++&&(( s"--- t{"--- s%%%%%r   c                 *   d}d}| j                                         }|| j        z  }|                     |j        |           |                     |j        |           |                                }| j                                         }||z  }|                     || j                    |                                }|| j         z  }|                     || j                    |                                }||z  }|                     ||           d S r   rV   rO   s        r   _test_inplace_additionz-TestEccPoint_NIST_P384._test_inplace_addition"  r   r   c                 *   d}d}| j                                         }|                                 |                     |j        |           |                     |j        |           | j                                         }|                                }|                                 |                     ||           | j                                         }||z  }|                     |j        |           |                     |j        |           d S )Nl   LPeroBr0_nCYw~s7xI|Z:Ze*X!T l   ]e^A|\"Rn0WWCs(h}	c5JBNnN=.rY   rO   s        r   r[   z$TestEccPoint_NIST_P384.test_doubling<  s    tt!!##7+++7+++ k++--%%% !!##&7+++7+++++r   c                 B    d}d}d} j         |z  }                     |j        |                                |j        |            j                                         } j         dz  }                     ||                                t           fd           d S )N   4.v0Z:z;ODK#Gv)Z5mXCDs:frkIl   R@dV]9"O/'5r}]~AYwHoY4-?~wl   f9;Y?5.BieXcXtqMDb7K6X}1 }Xr   c                       j         dz  S r_   ra   rb   s   r   rc   z=TestEccPoint_NIST_P384.test_scalar_multiply.<locals>.<lambda>`  rd   r   r5   r+   rM   rN   rD   rf   r   rg   s   `     r   rh   z+TestEccPoint_NIST_P384.test_scalar_multiplyQ  s    nttq7+++7+++ k++--q%%% 	*&>&>&>&>?????r   c                     d}d}d}d}| j         |z  | j        |z  z   }|                     |j        |           |                     |j        |           d S )Nr   l   ]8|$W!&%TxFgqeYTKeM80,YO_l   tdvO*;q/$L]0	}pn<x&"FFe5hYE~"l   q!jB%~^Y7yK\+5{SWxFJR1DwJA6g)4 rj   rk   s         r   r   z1TestEccPoint_NIST_P384.test_joing_scalar_multiplyb  sb    nnttq4;?27+++7+++++r   c                     |                      | j                                        d           |                      | j                                        d           d S )Ni  0   rp   rb   s    r   rs   z!TestEccPoint_NIST_P384.test_sizesl  rt   r   N)r   r   r   ru   r   r5   r>   r8   r@   rH   rT   r   r[   rh   r   rs   r   r   r   r   r     s        ~~Xrr F
 Xrr F
. . .
6 6 6? ? ?
& & &,& & &4, , ,*@ @ @", , ,: : : : :r   r   c                   |    e Zd ZdZ eddd          Z eddd          Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd ZdS )TestEccPoint_NIST_P521ztTests defined in section 4.5 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdfl#   A5;LK5N}W,*n<UP%hA=Cb?iOtiL1!@vlv'Wl#   #5kS7?I]*[nnkYi[7.	 d9MT3X=TP5_Icc	np521l#   GJo7 $=?>D^`bXkNo	tG`xw-dg!;I7>S{) wh\.,#l#   cae.tDffI*"a%A&4h#Ww5%D2>n<!}6@fNvF$>8vpc                     t          dd          }|                    | j                   |                     || j                   d S r2   r3   r6   s     r   r8   zTestEccPoint_NIST_P521.test_set~  r9   r   c                    | j                                         }|                     || j                    |                    | j                   |                     || j                   |                     | j         | j                   d S r;   r<   r6   s     r   r@   z TestEccPoint_NIST_P521.test_copy  rA   r   c                     | j          }| j         |z   }|                     || j                                                    d S r;   rC   rE   s      r   rH   z"TestEccPoint_NIST_P521.test_negate  rI   r   c                    d}d}| j         | j        z   }|                     |j        |           |                     |j        |           |                                }| j         |z   }|                     || j                    || j         z   }|                     || j                    ||z   }|                     ||           d S Nl#   Y[V=xCmuOFl*sg	Np)giD>u{9gh0!cK-Op-^Nl#   U,R&9/@a}#>;cd{cl@E'98kh~a7?!-(O+SrL   rO   s        r   rT   z$TestEccPoint_NIST_P521.test_addition  s     ] ]t{*7+++7+++&&(( s"--- t{"--- s%%%%%r   c                 *   d}d}| j                                         }|| j        z  }|                     |j        |           |                     |j        |           |                                }| j                                         }||z  }|                     || j                    |                                }|| j         z  }|                     || j                    |                                }||z  }|                     ||           d S r   rV   rO   s        r   rW   z,TestEccPoint_NIST_P521.test_inplace_addition  s    ] ]!!##$+7+++7+++&&(( !!###--- $+--- #%%%%%r   c                 *   d}d}| j                                         }|                                 |                     |j        |           |                     |j        |           | j                                         }|                                }|                                 |                     ||           | j                                         }||z  }|                     |j        |           |                     |j        |           d S )Nl#   k'<J cmtW9T@%T$SD!kdlPgciSW_%3byF`($/rl#   C5APS?( w8OoXx
e\**L3tX@7N&xrZ7}r.8QIarY   rO   s        r   r[   z$TestEccPoint_NIST_P521.test_doubling  s     ] ]!!##7+++7+++ k++--%%% !!##&7+++7+++++r   c                 B    d}d}d} j         |z  }                     |j        |                                |j        |            j                                         } j         dz  }                     ||                                t           fd           d S )N#   \??7gf@YKjrR)P6_r	[<lSfPL3ZM
TUU3TM|K\xl#   QUx2?z=[nWq0 6&7mnktztX;Ia^Rm<9-Te	bFl#   [}5]v3nLIYjzQ`:Gk`O<Y[w `5Q**e7U5qr   c                       j         dz  S r_   ra   rb   s   r   rc   z=TestEccPoint_NIST_P521.test_scalar_multiply.<locals>.<lambda>  rd   r   r   rg   s   `     r   rh   z+TestEccPoint_NIST_P521.test_scalar_multiply  s     W ] ]q7+++7+++ k++--q%%% 	*&>&>&>&>?????r   c                     d}d}d}d}| j         |z  }|| j        |z  z  }|                     |j        |           |                     |j        |           d S )Nr   l#   |TB)I%_
#wUV6C9c  1z7bnl<#qI"fu#0	Xajpx8=nMl#   =etEK9JBadZYx
./jVa@3hMhA]_`s}J+dptl#   XM`Wi&GgwH"!e+oeG$,oQ Tk9P>@5{U':c0'=NDH? rj   rk   s         r   r   z1TestEccPoint_NIST_P521.test_joing_scalar_multiply  ss     W W ] ]q$+/!7+++7+++++r   c                     |                      | j                                        d           |                      | j                                        d           d S )Ni	  B   rp   rb   s    r   rs   z!TestEccPoint_NIST_P521.test_sizes  rt   r   Nr   r   r   r   r   r   q  s        ~~X [ [ F
 X [ [ F
. . .
6 6 6? ? ?
& & &,& & &4, , ,*@ @ @"	, 	, 	,: : : : :r   r   c                   P    e Zd ZdZed         Z eej        ej        d          Z	dS )TestEccPoint_PAI_P1929Test vectors from http://point-at-infinity.org/ecc/nisttvr0   N
r   r   r   ru   r   r   r   GxGypointGr   r   r   r   r     4        CCFOEXeh&11FFFr   r   )	PublicKeyr   zpoint-at-infinity.org-P192.txtz&P-192 tests from point-at-infinity.orgc                      t          |           S r;   intks    r   rc   rc         CFF r   c                 "    t          | d          S N   r   rM   s    r   rc   rc          C2JJ r   c                 "    t          | d          S r   r   rN   s    r   rc   rc     r   r   )r   rM   rN   c                     | j         |z  }|                     |j        |           |                     |j        |           d S r;   r   r+   rM   rN   r!   scalarrM   rN   results        r   new_testr     D    v%1%%%1%%%%%r   ztest_%dc                   P    e Zd ZdZed         Z eej        ej        d          Z	dS )TestEccPoint_PAI_P224r   rx   Nr   r   r   r   r   r   
  r   r   r   zpoint-at-infinity.org-P224.txtz&P-224 tests from point-at-infinity.orgc                      t          |           S r;   r   r   s    r   rc   rc     r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc     r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc     r   r   c                     | j         |z  }|                     |j        |           |                     |j        |           d S r;   r   r   s        r   r   r     r   r   c                   P    e Zd ZdZed         Z eej        ej        d          Z	dS )TestEccPoint_PAI_P256r   p256Nr   r   r   r   r   r     r   r   r   zpoint-at-infinity.org-P256.txtz&P-256 tests from point-at-infinity.orgc                      t          |           S r;   r   r   s    r   rc   rc   )  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   *  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   +  r   r   c                     | j         |z  }|                     |j        |           |                     |j        |           d S r;   r   r   s        r   r   r   -  r   r   c                   P    e Zd ZdZed         Z eej        ej        d          Z	dS )TestEccPoint_PAI_P384r   r   Nr   r   r   r   r   r   4  r   r   r   zpoint-at-infinity.org-P384.txtz&P-384 tests from point-at-infinity.orgc                      t          |           S r;   r   r   s    r   rc   rc   >  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   ?  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   @  r   r   c                     | j         |z  }|                     |j        |           |                     |j        |           d S r;   r   r   s        r   r   r   B  r   r   c                   P    e Zd ZdZed         Z eej        ej        d          Z	dS )TestEccPoint_PAI_P521r   r   Nr   r   r   r   r   r   I  r   r   r   zpoint-at-infinity.org-P521.txtz&P-521 tests from point-at-infinity.orgc                      t          |           S r;   r   r   s    r   rc   rc   S  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   T  r   r   c                 "    t          | d          S r   r   r   s    r   rc   rc   U  r   r   c                     | j         |z  }|                     |j        |           |                     |j        |           d S r;   r   r   s        r   r   r   W  r   r   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestEccKey_P192c                    t          dd          }|                     |j        d           |                     |                                           |                     |j        j        t          d         j                   |                     |j        j	        t          d         j
                   t          t          d         j        t          d         j
        d          }t          dd|          }|                     |j        d           |                     |                                           |                     |j        |           t          dd          }t          dd          }d S )	NP-192   r   r'   r0   r   r   r'   point	secp192r1
prime192v1r	   r+   r'   r    has_privater   rM   r   r   rN   r   r   r!   keyr   s      r   test_private_keyz TestEccKey_P192.test_private_key`  6   7a((("""))***wv'9:::wv'9:::+WV_-?wOOO7au555"""))***U+++ ;!,,,<1---r   c                    t          t          d         j        t          d         j        d          }t	          d|          }|                     |                                           |                     |j        |           d S )Nr0   r   r   r   r   	r   r   r   r   r	   r   r   r+   r   r!   r   r   s      r   test_public_keyzTestEccKey_P192.test_public_keyr  r    +WV_-?wOOO7%000**+++U+++++r   c                     t          dd          }|                                }|                     |                                           |                     |j        |j                   d S )Nr      r   r	   
public_keyr   r   r+   r   r!   priv_keypub_keys      r   test_public_key_derivedz'TestEccKey_P192.test_public_key_derivedy  e    1---%%'',,..///'.99999r   c                 >    |                      t          d            d S )Nc                  $    t          dd          S )NzP-193r   r   r	   r   r   r   rc   z4TestEccKey_P192.test_invalid_curve.<locals>.<lambda>      f7a.H.H.H r   rf   r   rb   s    r   test_invalid_curvez"TestEccKey_P192.test_invalid_curve  "    *&H&HIIIIIr   c                 v    |                      t          d            |                      t          d            d S )Nc                  $    t          dd          S )Nr   r   r   r  r   r   r   rc   z0TestEccKey_P192.test_invalid_d.<locals>.<lambda>  r  r   c                  D    t          dt          d         j                  S )Nr   r0   r   r	   r   orderr   r   r   rc   z0TestEccKey_P192.test_invalid_d.<locals>.<lambda>  $    f77>v7L/N /N /N r   r  rb   s    r   test_invalid_dzTestEccKey_P192.test_invalid_d  Q    *&H&HIII* 'N 'N 	O 	O 	O 	O 	Or   c                    t          j        dd          }t          j        dd          }t          j        dd          }|                                }|                                }|                                }|                     ||           |                     ||           |                     ||           |                     ||           |                     ||           d S )Nr  r   r'   r      r   r*   r
  r+   r?   r!   private_keyprivate_key2private_key3r
  public_key2public_key3s          r   test_equalityzTestEccKey_P192.test_equality      maw777}q888}q888 ++--
"--//"--//l333K666[111J444J44444r   c                    t          j        d          }|                     dt          |                     |                     |j        d           |                     |                                j        d           d S )Nr0   r   zcurve='NIST P-192'z
NIST P-192r   r   assertInr,   r+   r   r
  r!   r   s     r   test_name_consistencyz%TestEccKey_P192.test_name_consistency  p    l(((*DII666L111))/>>>>>r   N
r   r   r   r   r  r  r  r  r)  r/  r   r   r   r   r   ^          . . .$, , ,: : :J J JO O O
5 5 5$? ? ? ? ?r   r   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestEccKey_P224c                    t          dd          }|                     |j        d           |                     |                                           |                     |j        j        t          d         j                   |                     |j        j	        t          d         j
                   t          t          d         j        t          d         j
        d          }t          dd|          }|                     |j        d           |                     |                                           |                     |j        |           t          dd          }t          dd          }d S )	NP-224r   r   rx   r   r   	secp224r1
prime224v1r   r   s      r   r   z TestEccKey_P224.test_private_key  r   r   c                    t          t          d         j        t          d         j        d          }t	          d|          }|                     |                                           |                     |j        |           d S )Nrx   r6  r   r  r  r  s      r   r  zTestEccKey_P224.test_public_key  r  r   c                     t          dd          }|                                }|                     |                                           |                     |j        |j                   d S )Nr6  r  r   r	  r  s      r   r  z'TestEccKey_P224.test_public_key_derived  r  r   c                 >    |                      t          d            d S )Nc                  $    t          dd          S )NzP-225r   r   r  r   r   r   rc   z4TestEccKey_P224.test_invalid_curve.<locals>.<lambda>  r  r   r  rb   s    r   r  z"TestEccKey_P224.test_invalid_curve  r  r   c                 v    |                      t          d            |                      t          d            d S )Nc                  $    t          dd          S )Nr6  r   r   r  r   r   r   rc   z0TestEccKey_P224.test_invalid_d.<locals>.<lambda>  r  r   c                  D    t          dt          d         j                  S )Nr6  rx   r   r  r   r   r   rc   z0TestEccKey_P224.test_invalid_d.<locals>.<lambda>  r  r   r  rb   s    r   r  zTestEccKey_P224.test_invalid_d  r  r   c                    t          j        dd          }t          j        dd          }t          j        dd          }|                                }|                                }|                                }|                     ||           |                     ||           |                     ||           |                     ||           |                     ||           d S )Nr  r6  r   r!  r"  r#  s          r   r)  zTestEccKey_P224.test_equality  r*  r   c                    t          j        d          }|                     dt          |                     |                     |j        d           |                     |                                j        d           d S )Nrx   r   zcurve='NIST P-224'z
NIST P-224r,  r.  s     r   r/  z%TestEccKey_P224.test_name_consistency  r0  r   Nr1  r   r   r   r4  r4    r2  r   r4  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestEccKey_P256c                 4   t          dd          }|                     |j        d           |                     |                                           |                     |j        j        t          d         j                   |                     |j        j	        t          d         j
                   t          t          d         j        t          d         j
                  }t          dd|          }|                     |j        d           |                     |                                           |                     |j        |           t          dd          }t          dd          }|                     t          t           dd	           d S )
Nr   r   r   r   r   	secp256r1
prime256v1s    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH)r   seed)r	   r+   r'   r    r   r   rM   r   r   rN   r   r   rf   r   r   s      r   r   z TestEccKey_P256.test_private_key  sR   7a((("""))***wv'9:::wv'9:::+WV_-?@@7au555"""))***U+++ ;!,,,<1--- 	*fFIIIIIr   c                    t          t          d         j        t          d         j                  }t	          d|          }|                     |                                           |                     |j        |           d S )Nr   r   r  r  r  s      r   r  zTestEccKey_P256.test_public_key  sm    +WV_-?@@7%000**+++U+++++r   c                     t          dd          }|                                }|                     |                                           |                     |j        |j                   d S )Nr   r  r   r	  r  s      r   r  z'TestEccKey_P256.test_public_key_derived  r  r   c                 >    |                      t          d            d S )Nc                  $    t          dd          S )NzP-257r   r   r  r   r   r   rc   z4TestEccKey_P256.test_invalid_curve.<locals>.<lambda>
  r  r   r  rb   s    r   r  z"TestEccKey_P256.test_invalid_curve	  r  r   c                 v    |                      t          d            |                      t          d            d S )Nc                  $    t          dd          S )Nr   r   r   r  r   r   r   rc   z0TestEccKey_P256.test_invalid_d.<locals>.<lambda>  r  r   c                  D    t          dt          d         j                  S )Nr   r   r   r  r   r   r   rc   z0TestEccKey_P256.test_invalid_d.<locals>.<lambda>  s    f7gfoF[.\.\.\ r   r  rb   s    r   r  zTestEccKey_P256.test_invalid_d  s<    *&H&HIII*&\&\]]]]]r   c                    t          j        dd          }t          j        dd          }t          j        dd          }|                                }|                                }|                                }|                     ||           |                     ||           |                     ||           |                     ||           |                     ||           d S )Nr  r   r   r!  r"  r#  s          r   r)  zTestEccKey_P256.test_equality  r*  r   c                    t          j        d          }|                     dt          |                     |                     |j        d           |                     |                                j        d           d S )Nr   r   zcurve='NIST P-256'z
NIST P-256r,  r.  s     r   r/  z%TestEccKey_P256.test_name_consistency"  r0  r   Nr1  r   r   r   rC  rC    s        J J J*, , ,: : :J J J^ ^ ^5 5 5$? ? ? ? ?r   rC  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestEccKey_P384c                    t           d         }t          dd          }|                     |j        d           |                     |                                           |                     |j        j        |j                   |                     |j        j	        |j
                   t          |j        |j
        d          }t          dd|          }|                     |j        d           |                     |                                           |                     |j        |           t          dd          }t          dd          }t          dd          }d S )Nr   r   r   r   r   	secp384r1
prime384v1r   r	   r+   r'   r    r   r   rM   r   rN   r   r   )r!   r   r   r   s       r   r   z TestEccKey_P384.test_private_key+  :   v7a((("""))***tw///tw///$'6227au555"""))***U+++ 6Q''';!,,,<1---r   c                     t           d         }t          |j        |j        d          }t	          d|          }|                     |                                           |                     |j        |           d S )Nr   r   r  	r   r   r   r   r	   r   r   r+   r   )r!   r   r   r   s       r   r  zTestEccKey_P384.test_public_key@  n    v$'6227%000**+++U+++++r   c                     t          dd          }|                                }|                     |                                           |                     |j        |j                   d S )Nr   r  r   r	  r  s      r   r  z'TestEccKey_P384.test_public_key_derivedH  r  r   c                 >    |                      t          d            d S )Nc                  $    t          dd          S )NzP-385r   r   r  r   r   r   rc   z4TestEccKey_P384.test_invalid_curve.<locals>.<lambda>P  r  r   r  rb   s    r   r  z"TestEccKey_P384.test_invalid_curveO  r  r   c                 v    |                      t          d            |                      t          d            d S )Nc                  $    t          dd          S )Nr   r   r   r  r   r   r   rc   z0TestEccKey_P384.test_invalid_d.<locals>.<lambda>S  r  r   c                  D    t          dt          d         j                  S )Nr   r   r   r  r   r   r   rc   z0TestEccKey_P384.test_invalid_d.<locals>.<lambda>T  r  r   r  rb   s    r   r  zTestEccKey_P384.test_invalid_dR  r  r   c                    t          j        dd          }t          j        dd          }t          j        dd          }|                                }|                                }|                                }|                     ||           |                     ||           |                     ||           |                     ||           |                     ||           d S )Nr  r   r   r!  r"  r#  s          r   r)  zTestEccKey_P384.test_equalityW  r*  r   c                    t          j        d          }|                     dt          |                     |                     |j        d           |                     |                                j        d           d S )Nr   r   zcurve='NIST P-384'z
NIST P-384r,  r.  s     r   r/  z%TestEccKey_P384.test_name_consistencyi  r0  r   Nr1  r   r   r   rR  rR  )          . . .*, , ,: : :J J JO O O
5 5 5$? ? ? ? ?r   rR  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestEccKey_P521c                    t           d         }t          dd          }|                     |j        d           |                     |                                           |                     |j        j        |j                   |                     |j        j	        |j
                   t          |j        |j
        d          }t          dd|          }|                     |j        d           |                     |                                           |                     |j        |           t          dd          }t          dd          }t          dd          }d S )Nr   P-521r   r   r   	secp521r1
prime521v1rV  )r!   r   r   r   s       r   r   z TestEccKey_P521.test_private_keyr  rW  r   c                     t           d         }t          |j        |j        d          }t	          d|          }|                     |                                           |                     |j        |           d S )Nr   r   r  rY  )r!   r   r   r   s       r   r  zTestEccKey_P521.test_public_key  rZ  r   c                     t          dd          }|                                }|                     |                                           |                     |j        |j                   d S )Nrg  r  r   r	  r  s      r   r  z'TestEccKey_P521.test_public_key_derived  r  r   c                 >    |                      t          d            d S )Nc                  $    t          dd          S )NzP-522r   r   r  r   r   r   rc   z4TestEccKey_P521.test_invalid_curve.<locals>.<lambda>  r  r   r  rb   s    r   r  z"TestEccKey_P521.test_invalid_curve  r  r   c                 v    |                      t          d            |                      t          d            d S )Nc                  $    t          dd          S )Nrg  r   r   r  r   r   r   rc   z0TestEccKey_P521.test_invalid_d.<locals>.<lambda>  r  r   c                  D    t          dt          d         j                  S )Nrg  r   r   r  r   r   r   rc   z0TestEccKey_P521.test_invalid_d.<locals>.<lambda>  r  r   r  rb   s    r   r  zTestEccKey_P521.test_invalid_d  r  r   c                    t          j        dd          }t          j        dd          }t          j        dd          }|                                }|                                }|                                }|                     ||           |                     ||           |                     ||           |                     ||           |                     ||           d S )Nr  rg  r   r!  r"  r#  s          r   r)  zTestEccKey_P521.test_equality  r*  r   c                    t          j        d          }|                     dt          |                     |                     |j        d           |                     |                                j        d           d S )Nr   r   zcurve='NIST P-521'z
NIST P-521r,  r.  s     r   r/  z%TestEccKey_P521.test_name_consistency  r0  r   Nr1  r   r   r   re  re  p  rc  r   re  c                        e Zd Zd Zd Zd ZdS )TestEccModule_P192c                 x   t          j        d          }|                     |                                           |                     |j        t          t          d         j        t          d         j	        d          |j
        z  d           t          j        d           t          j        d           d S )Nr   r   r0   r   r   r   r   r    r   r+   r   r   r   r   r   r'   r.  s     r   test_generatez TestEccModule_P192.test_generate      l)))))***Xgfo.@.5fo.@.5&7 &79<&? /5	6 	6 	6 	;''''<((((((r   c                 l   t          j        dd          }|                     |                                           |                     |j        t          d         j                   t          j        dt          d         j        t          d         j	                  }| 
                    |                                           |                     |j        t          d         j                   t          j        dd           t          j        dd           t          j        dd           d S )Nr   r   r   r0   r   r(   r)   r   r   r   r*   r    r   r+   r   r   Gr   r   r   r.  s     r   test_constructz!TestEccModule_P192.test_construct      m'Q///))***WV_%6777m'76?3E$+FO$68 8 8**+++WV_%6777 	Fa((((K1----LA......r   c                    t          dd          }t          t          d         j        t          d         j                  } | j        t
          t          j        fddi|  | j        t
          t          j        fddd| d S )	N
   r!  r(   r)   r0   r   r      r   dictr   r   r   rf   r   r   r*   r!   coordcoordGs      r   test_negative_constructz*TestEccModule_P192.test_negative_construct      R+++gfo0'&/:LMMM*cmLL7LeLLL*cmR7aRR6RRRRRr   Nr   r   r   rw  r}  r  r   r   r   rt  rt    F        ) ) )/ / / S S S S Sr   rt  c                        e Zd Zd Zd Zd ZdS )TestEccModule_P224c                 x   t          j        d          }|                     |                                           |                     |j        t          t          d         j        t          d         j	        d          |j
        z  d           t          j        d           t          j        d           d S )Nr6  r   rx   r7  r8  rv  r.  s     r   rw  z TestEccModule_P224.test_generate  rx  r   c                 l   t          j        dd          }|                     |                                           |                     |j        t          d         j                   t          j        dt          d         j        t          d         j	                  }| 
                    |                                           |                     |j        t          d         j                   t          j        dd           t          j        dd           t          j        dd           d S )Nr6  r   r   rx   rz  r7  r8  r{  r.  s     r   r}  z!TestEccModule_P224.test_construct  r~  r   c                    t          dd          }t          t          d         j        t          d         j                  } | j        t
          t          j        fddi|  | j        t
          t          j        fddd| d S )	Nr  r!  r  rx   r   r6  r  r   r  r  s      r   r  z*TestEccModule_P224.test_negative_construct  r  r   Nr  r   r   r   r  r    r  r   r  c                        e Zd Zd Zd Zd ZdS )TestEccModule_P256c                 v   t          j        d          }|                     |                                           |                     |j        t          t          d         j        t          d         j	                  |j
        z  d           t          j        d           t          j        d           d S )Nr   r   r   rE  rF  rv  r.  s     r   rw  z TestEccModule_P256.test_generate  s    l)))))***Xgfo.@.5fo.@&B &BDGE&J.4	6 	6 	6
 	;''''<((((((r   c                 l   t          j        dd          }|                     |                                           |                     |j        t          d         j                   t          j        dt          d         j        t          d         j	                  }| 
                    |                                           |                     |j        t          d         j                   t          j        dd           t          j        dd           t          j        dd           d S )Nr   r   r   r   rz  rE  rF  r{  r.  s     r   r}  z!TestEccModule_P256.test_construct  r~  r   c                    t          dd          }t          t          d         j        t          d         j                  } | j        t
          t          j        fddi|  | j        t
          t          j        fddd| d S )	Nr  r!  r  r   r   r   r  r   r  r  s      r   r  z*TestEccModule_P256.test_negative_construct#  r  r   Nr  r   r   r   r  r    sF        
) 
) 
)/ / / S S S S Sr   r  c                        e Zd Zd Zd Zd ZdS )TestEccModule_P384c                 d   t           d         }t          j        d          }|                     |                                           |                     |j        t          |j        |j	        d          |j
        z             t          j        d           t          j        d           d S )Nr   r   r   rT  rU  r   r   r   r    r   r+   r   r   r   r   r'   r!   r   r   s      r   rw  z TestEccModule_P384.test_generate-      l)))))***Xeh&%I%ICE%QRRR 	;''''<((((((r   c                 D   t           d         }t          j        dd          }|                     |                                           |                     |j        t           d         j                   t          j        d|j        |j	                  }| 
                    |                                           |                     |j        |j                   t          j        dd           t          j        dd           t          j        dd           d S )Nr   r   r   r   rz  rT  rU  r   r   r*   r    r   r+   r   r|  r   r   r   r  s      r   r}  z!TestEccModule_P384.test_construct8      m'Q///))***WV_%6777m'58UXNNN**+++UW--- 	Fa((((K1----LA......r   c                    t          dd          }t          t          d         j        t          d         j                  } | j        t
          t          j        fddi|  | j        t
          t          j        fddd| d S )	Nr  r!  r  r   r   r   r  r   r  r  s      r   r  z*TestEccModule_P384.test_negative_constructH  r  r   Nr  r   r   r   r  r  +  F        	) 	) 	)/ / / S S S S Sr   r  c                        e Zd Zd Zd Zd ZdS )TestEccModule_P521c                 d   t           d         }t          j        d          }|                     |                                           |                     |j        t          |j        |j	        d          |j
        z             t          j        d           t          j        d           d S )Nr   rg  r   rh  ri  r  r  s      r   rw  z TestEccModule_P521.test_generateR  r  r   c                 D   t           d         }t          j        dd          }|                     |                                           |                     |j        t           d         j                   t          j        d|j        |j	                  }| 
                    |                                           |                     |j        |j                   t          j        dd           t          j        dd           t          j        dd           d S )Nr   rg  r   r   rz  rh  ri  r  r  s      r   r}  z!TestEccModule_P521.test_construct]  r  r   c                    t          dd          }t          t          d         j        t          d         j                  } | j        t
          t          j        fddi|  | j        t
          t          j        fddd| d S )	Nr  r!  r  r   r   rg  r  r   r  r  s      r   r  z*TestEccModule_P521.test_negative_constructm  r  r   Nr  r   r   r   r  r  P  r  r   r  c                    g }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t
                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                    z  }|t          t                     z  }|t          t"                    z  }|t          t$                    z  }|t          t&                    z  }|t          t(                    z  }|t          t*                    z  }|S r;   )r   r   r/   rw   r   r   r   r   r   r   r   r   r   r4  rC  rR  re  rt  r  r  r  r  )configtestss     r   	get_testsr  u  s   E	_\***E	_3444E	_3444E	_3444E	_3444E	_3444E	_2333E	_2333E	_2333E	_2333E	_2333E	__---E	__---E	__---E	__---E	__---E	_/000E	_/000E	_/000E	_/000E	_/000ELr   __main__c                  B    t          j        t                                S r;   )unittest	TestSuiter  r   r   r   rc   rc     s    H&y{{33 r   suite)defaultTest)1r  binasciir   Crypto.SelfTest.st_commonr   Crypto.SelfTest.loaderr   Crypto.PublicKeyr   Crypto.PublicKey.ECCr   r   r	   Crypto.Math.Numbersr
   TestCaser   r/   rw   r   r   r   r   tv_paitvr   rM   rN   r   setattrcountr   r   r   r   r   r4  rC  rR  re  rt  r  r  r  r  r  r   r  mainr   r   r   <module>r     s!  >        5 5 5 5 5 5 4 4 4 4 4 4             : : : : : : : : : : ' ' ' ' ' 'A A A A A8$ A A ABI: I: I: I: I:X. I: I: I:XI: I: I: I: I:X. I: I: I:XG: G: G: G: G:X. G: G: G:T@: @: @: @: @:X. @: @: @:FA: A: A: A: A:X. A: A: A:H2 2 2 2 2H- 2 2 2 
	/4<**....0 0
1 
1 
7
 57   C CB dbdbd & & & & G!9rx#7BBBB2 2 2 2 2H- 2 2 2 
	/4<**....0 0
1 
1 
7
 57   C CB dbdbd & & & & G!9rx#7BBBB2 2 2 2 2H- 2 2 2 
	/4<**....0 0
1 
1 
7
 57   C CB dbdbd & & & & G!9rx#7BBBB2 2 2 2 2H- 2 2 2 
	/4<**....0 0
1 
1 
7
 57   C CB dbdbd & & & & G!9rx#7BBBB2 2 2 2 2H- 2 2 2 
	/4<**....0 0
1 
1 
7
 57   C CB dbdbd & & & & G!9rx#7BBBB@? @? @? @? @?h' @? @? @?F@? @? @? @? @?h' @? @? @?FB? B? B? B? B?h' B? B? B?JD? D? D? D? D?h' D? D? D?ND? D? D? D? D?h' D? D? D?N$S $S $S $S $S* $S $S $SN$S $S $S $S $S* $S $S $SN#S #S #S #S #S* #S #S #SL"S "S "S "S "S* "S "S "SJ"S "S "S "S "S* "S "S "SJ     4 z33EHMg&&&&&& r   