����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 97.74.90.209  /  Your IP : 216.73.216.74
Web Server : Apache
System : Linux live.indianstaffingfederation.org 4.18.0-553.54.1.el8_10.x86_64 #1 SMP Tue May 27 22:49:52 EDT 2025 x86_64
User : indianstaffing ( 1003)
PHP Version : 8.3.22
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/opt/nydus/ops/cryptography/hazmat/backends/openssl/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/opt/nydus/ops/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-39.pyc
a

Nh#hHy�@s�ddlZddlZddlZddlZddlZddlmZddlmZmZddl	m
Z
mZddlm
Z
ddlmZddlmZddlmZmZmZmZdd	lmZmZmZdd
lmZmZddlmZm Z ddl!m"Z"m#Z#m$Z$dd
l%m&Z&ddl'm(Z(ddl)m*Z*m+Z+ddl,m-Z-m.Z.ddl/m0Z0m1Z1ddl2m3Z3m4Z4ddl5mZ6ddl7m8Z8ddl9m:Z:m;Z;ddl<m=Z=ddl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFddlGmHZHmIZImJZJmKZKddlLmMZMmNZNmOZOddlPmQZQmRZRddlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]ddl^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgddlhmiZiddljmkZkmlZlddlmmnZnmoZompZpmqZqe�rd d!d"g�ZsGd#d$�d$�ZtGd%d&�d&�ZuGd'd(�d(�ZveueTd)�d*d+�Zweu�ZxdS),�N)�contextmanager)�utils�x509)�UnsupportedAlgorithm�_Reasons)�aead)�_CipherContext��_CMACContext)�
_DHParameters�
_DHPrivateKey�_DHPublicKey�_dh_params_dup)�_DSAParameters�_DSAPrivateKey�
_DSAPublicKey)�_EllipticCurvePrivateKey�_EllipticCurvePublicKey)�_Ed25519PrivateKey�_Ed25519PublicKey)�_ED448_KEY_SIZE�_Ed448PrivateKey�_Ed448PublicKey��_HashContext��_HMACContext)�_POLY1305_KEY_SIZE�_Poly1305Context)�_RSAPrivateKey�
_RSAPublicKey)�_X25519PrivateKey�_X25519PublicKey)�_X448PrivateKey�_X448PublicKey)r)�binding)�hashes�
serialization)�AsymmetricPadding)�dh�dsa�ec�ed25519�ed448�rsa�x25519�x448)�MGF1�OAEP�PKCS1v15�PSS)�#CERTIFICATE_ISSUER_PUBLIC_KEY_TYPES�PRIVATE_KEY_TYPES�PUBLIC_KEY_TYPES)�BlockCipherAlgorithm�CipherAlgorithm)
�AES�ARC4�Camellia�ChaCha20�SM4�	TripleDES�_BlowfishInternal�_CAST5Internal�
_IDEAInternal�
_SEEDInternal)	�CBC�CFB�CFB8�CTR�ECB�GCM�Mode�OFB�XTS)�scrypt)�pkcs7�ssh)�PKCS12Certificate�PKCS12KeyAndCertificates�_ALLOWED_PKCS12_TYPES�_PKCS12_CAS_TYPES�
_MemoryBIO�bioZchar_ptrc@seZdZdS)�_RC2N)�__name__�
__module__�__qualname__�rZrZ�_/opt/nydus/tmp/pip-target-wgfnss67/lib64/python/cryptography/hazmat/backends/openssl/backend.pyrV�srVc@sT
eZdZdZdZhd�ZefZej	ej
ejejej
ejejejejejejejfZejejejejfZdZdZdd>ZdZde>Z dd�Z!e"d	�d
d�Z#�d?e$e%j&e%j'e(j)dd
�dd�Z*e$d	�dd�Z+dd	�dd�Z,dd	�dd�Z-e.j/dd��Z0dd	�dd�Z1e"d	�dd�Z2e"d	�dd�Z3e4d	�dd�Z5e6ej7e8d �d!d"�Z9ej7d#�d$d%�Z:ej7d#�d&d'�Z;ej7e$d(�d)d*�Z<ej7e$d(�d+d,�Z=e$d	�d-d.�Z>ej7e$d(�d/d0�Z?ej7ej@d(�d1d2�ZAeBeCe$d3�d4d5�ZDd6d7�ZEdd	�d8d9�ZFeBeCeGd3�d:d;�ZHeBeCeGd3�d<d=�ZIej7e$d(�d>d?�ZJej7e4e6e4e6e6d@�dAdB�ZKe%j'e(j)d	�dCdD�ZLe%j'e(jMd	�dEdF�ZNe4d	�dGdH�ZO�d@e4dI�dJdK�ZPe4e4eQjRdL�dMdN�ZSe4e4e$dL�dOdP�ZTeQjUeQjRdQ�dRdS�ZVeQjWeQjXdQ�dTdU�ZYdVdW�ZZdXdY�Z[e6dZ�d[d\�Z\d]d^�Z]e6d	�d_d`�Z^e_d	�dadb�Z`ead	�dcdd�Zbej7e$d(�dedf�Zcede$dg�dhdi�Zee4efjgdj�dkdl�Zhefjgefjidm�dndo�Zje4efjidj�dpdq�Zkdrds�ZlefjmefjidQ�dtdu�ZnefjoefjpdQ�dvdw�ZqefjrefjgdQ�dxdy�Zsdzd{�Zte$d	�d|d}�Zuej7e$d(�d~d�Zve$d	�d�d��Zwexeyd(�d�d��Zze6e%j&e6e_d��d�d��Z{e6ead��d�d��Z|e6e}j~d��d�d��Ze6e%j&e6e_d��d�d��Z�d�d��Z�e6ead��d�d��Z�e6e}j~d��d�d��Z�e�j�e%j�d��d�d��Z�e%j�e�j�d��d�d��Z�e�j�e%j�d��d�d��Z�e%j�e�j�d��d�d��Z�e�j�e%j�d��d�d��Z�e%j�e�j�d��d�d��Z�e�j�e�e$d��d�d��Z�e�j�e$d��d�d��Z�d�d��Z�d�d��Z�e%j�d	�d�d��Z�ej�e$d��d�d��Z�ej�ej�e$d��d�d��Z�ej�ej�d��d�d��Z�ej�ej�dQ�d�d��Z�ej�ej�dQ�d�d��Z�ej�e6ej�d��d�d��Z�e4ej�ej�d��d�d„Z�ej�dÜd�dńZ�e4dƜd�dȄZ�ej�ej�e$dɜd�d˄Z�d�d̈́Z�ej�e4d��d�dτZ�e/d�dф�Z�d�dӄZ�e4e4dԜd�dքZ�e�j�e�j�e�j�e6dלd�dلZ�d�dۄZ�d�d݄Z�e�j�e�j�e6dޜd�d�Z�e$d	�d�d�Z�e4e4e}j~d�d�d�Z�d�d�Z�e}j~e}j�dm�d�d�Z�e4e4e}j�d�d�d�Z�e}j�e}j�dQ�d�d�Z�e}j�e}j�dQ�d�d�Z�e}j�e}j~dQ�d�d�Z��dAe4e4e%j&e4e$d�d�d�Z�e$d	�d�d��Z�e6e�j�d��d�d��Z�e6e�j�d��d�d��Z�d�d��Z�e�j�d	�d�d��Z�e$d	�d��d�Z�e6e�j�d���d�d�Z�e6e�j�d���d�d�Z�e�j�d	��d�d�Z�e$d	��d�d�Z�e$d	��d	�d
�Z�e6e�j�d���d�d�Z�e6e�j�d���d
�d�Z�e�j�d	��d�d�Z�e$d	��d�d�Z�e6e�j�d���d�d�Z�e6e�j�d���d�d�Z�e�j�d	��d�d�Z�e6e6e4e4e4e4e6�d��d�d�Z�e$d	��d�d�Z�e.j/e4e%j�e��d��d�d ��Z�e4d�d��d!�d"�Z�e.j/�d#�d$��Z�e6e%j&e6e%j�e%j&e_e%j&e�j�e%j'e�j�fd���d%�d&�Z�e6e%j&e6e�d���d'�d(�Z�e%j&e6e%j&e�e%j&e�j�e%j&e%j'e�e�j�e6�d)��d*�d+�Z�e$d	��d,�d-�Z�e6e�d.��d/�d0�Z�e$d	��d1�d2�Z�e6e%j'e�j�d���d3�d4�Z�e6e%j'e�j�d���d5�d6�Z�d7�d8�Z�e%j'e�j�e�j��d9��d:�d;�Z�e�j�e�j�e%j'e�j�e6�d<��d=�d>�Z�dS(B�Backendz)
    OpenSSL API binding interfaces.
    Zopenssl>saes-128-gcmsaes-256-gcmsaes-192-ccmsaes-192-gcmsaes-128-ccmsaes-256-ccm�i�cCs�t��|_|jj|_|jj|_d|_|��|_	i|_
|��|j	rX|jjrXt
�dt�n|��|jjg|_|jjr�|j�|jj�dS)NFz<OpenSSL FIPS mode is enabled. Can't enable DRBG fork safety.)r%ZBinding�_binding�ffi�_ffi�lib�_lib�_rsa_skip_check_key�_is_fips_enabled�
_fips_enabled�_cipher_registry�_register_default_ciphers�"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINE�warnings�warn�UserWarning�activate_osrandom_engineZEVP_PKEY_DH�	_dh_types�Cryptography_HAS_EVP_PKEY_DHX�appendZEVP_PKEY_DHX��selfrZrZr[�__init__�s 



�zBackend.__init__)�returncCsd�|��|j�S)Nz'<OpenSSLBackend(version: {}, FIPS: {})>)�format�openssl_version_textrfrqrZrZr[�__repr__�s
�zBackend.__repr__N)�ok�errorsrtcCstj|j||d�S)N)ry)r%Z_openssl_assertrc)rrrxryrZrZr[�openssl_assert�szBackend.openssl_assertcCsH|jjr|j�|jj�}nt|jddd���}|dkr@|j��t|�S)NZ	FIPS_modecSsdS�NrrZrZrZrZr[�<lambda>��z*Backend._is_fips_enabled.<locals>.<lambda>r)rcZCryptography_HAS_300_FIPSZ&EVP_default_properties_is_fips_enabledra�NULL�getattrZERR_clear_error�bool)rr�moderZrZr[re�s�
zBackend._is_fips_enabledcCs$|j��|��sJ�|��|_dS�N)r_�_enable_fipsrerfrqrZrZr[r��s
zBackend._enable_fipscCsf|jjrb|j��}||jjkrb|j�|�|j�|jj�}|�|dk�|j�|�}|�|dk�dS�Nr^)	rcriZENGINE_get_default_RANDrar~ZENGINE_unregister_RAND�RAND_set_rand_methodrz�
ENGINE_finish�rr�e�resrZrZr[�activate_builtin_random�s
zBackend.activate_builtin_randomc
cs�|j�|jj�}|�||jjk�|j�|�}|�|dk�z>|VW|j�|�}|�|dk�|j�|�}|�|dk�n6|j�|�}|�|dk�|j�|�}|�|dk�0dSr�)	rcZENGINE_by_idZCryptography_osrandom_engine_idrzrar~ZENGINE_initZENGINE_freer�r�rZrZr[�_get_osurandom_engine�s�zBackend._get_osurandom_enginecCst|jjrp|��|���*}|j�|�}|�|dk�Wd�n1sH0Y|j�|jj�}|�|dk�dSr�)	rcrir�r�ZENGINE_set_default_RANDrzr�rar~r�rZrZr[rms
,z Backend.activate_osrandom_enginec	Cst|j�dd�}|���<}|j�|dt|�||jjd�}|�|dk�Wd�n1sX0Y|j�|��	d�S)N�char[]�@sget_implementationr�ascii)
ra�newr�rcZENGINE_ctrl_cmd�lenr~rz�string�decode)rr�bufr�r�rZrZr[�osrandom_engine_implementations
�,z&Backend.osrandom_engine_implementationcCs|j�|j�|jj���d�S)z�
        Friendly string name of the loaded OpenSSL library. This is not
        necessarily the same version as it was compiled against.

        Example: OpenSSL 1.1.1d  10 Sep 2019
        r�)rar�rcZOpenSSL_version�OPENSSL_VERSIONr�rqrZrZr[rv s
��zBackend.openssl_version_textcCs
|j��Sr�)rcZOpenSSL_version_numrqrZrZr[�openssl_version_number+szBackend.openssl_version_number)�key�	algorithmrtcCst|||�Sr�r)rrr�r�rZrZr[�create_hmac_ctx.szBackend.create_hmac_ctx)r�cCsL|jdks|jdkr0d�|j|jd��d�}n|j�d�}|j�|�}|S)N�blake2b�blake2sz{}{}�r�)�nameru�digest_size�encodercZEVP_get_digestbyname)rrr��alg�evp_mdrZrZr[�_evp_md_from_algorithm3s��zBackend._evp_md_from_algorithmcCs |�|�}|�||jjk�|Sr�)r�rzrar~�rrr�r�rZrZr[�_evp_md_non_null_from_algorithm>s
z'Backend._evp_md_non_null_from_algorithm)r�rtcCs,|jrt||j�sdS|�|�}||jjkS�NF)rf�
isinstance�_fips_hashesr�rar~r�rZrZr[�hash_supportedCs
zBackend.hash_supportedcCs |jrt|tj�rdS|�|�Sr��rfr�r&�SHA1r��rrr�rZrZr[�signature_hash_supportedJsz Backend.signature_hash_supportedcCs|jr
dS|jjdkSdS�NFr^)rfrcZCryptography_HAS_SCRYPTrqrZrZr[�scrypt_supportedSszBackend.scrypt_supportedcCs |jrt|tj�rdS|�|�S)NTr�r�rZrZr[�hmac_supportedYszBackend.hmac_supportedcCs
t||�Sr�rr�rZrZr[�create_hash_ctx`szBackend.create_hash_ctx)�cipherr�rtcCs^|jrt||j�sdSz|jt|�t|�f}WntyDYdS0||||�}|jj|kSr�)rfr��
_fips_ciphersrg�type�KeyErrorrar~)rrr�r��adapter�
evp_cipherrZrZr[�cipher_supportedeszBackend.cipher_supportedcCs0||f|jvrtd�||���||j||f<dS)Nz"Duplicate registration for: {} {}.)rg�
ValueErrorru)rr�
cipher_cls�mode_clsr�rZrZr[�register_cipher_adapterss��zBackend.register_cipher_adaptercCs~tttttttfD]}|�t|t	d��qtttttfD]}|�t
|t	d��q8ttttfD]}|�t|t	d��q\|�ttt	d��ttttfD]}|�t|t	d��q�ttttfD]}|�t
|t	d��q�t�ttgttttg�D]\}}|�||t	d��q�|�ttd�t	d��|�ttd�t	d��|�ttd�t	d	��|�ttt�tttttfD]}|�t|t	d
���q`dS)Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}Zrc4Zrc2Zchacha20zsm4-{mode.name})rDrGrHrKrErFrIr�r:�GetCipherByNamer<r?r@rC�	itertools�productrArBr;r�rVr=rL�_get_xts_cipherr>)rrr�r�rZrZr[rh|s\��
�
�
�
�
���
�z!Backend._register_default_cipherscCst|||tj�Sr�)rZ_ENCRYPT�rrr�r�rZrZr[�create_symmetric_encryption_ctx�sz'Backend.create_symmetric_encryption_ctxcCst|||tj�Sr�)rZ_DECRYPTr�rZrZr[�create_symmetric_decryption_ctx�sz'Backend.create_symmetric_decryption_ctxcCs
|�|�Sr�)r�r�rZrZr[�pbkdf2_hmac_supported�szBackend.pbkdf2_hmac_supported)r��length�salt�
iterations�key_materialrtc

Csh|j�d|�}|�|�}|j�|�}|j�|t|�|t|�||||�}	|�|	dk�|j�|�dd�S)N�unsigned char[]r^)	rar�r��from_bufferrcZPKCS5_PBKDF2_HMACr�rz�buffer)
rrr�r�r�r�r�r�r��key_material_ptrr�rZrZr[�derive_pbkdf2_hmac�s
�
zBackend.derive_pbkdf2_hmaccCst�|j�Sr�)r%�_consume_errorsrcrqrZrZr[r��szBackend._consume_errorscCst�|j�Sr�)r%�_consume_errors_with_textrcrqrZrZr[r��sz!Backend._consume_errors_with_textcCsz||jjksJ�|�|j�|��|j�|�}|j�d|�}|j�||�}|�|dk�t�	|j�
|�d|�d�}|S)Nr�r�big)rar~rzrcZBN_is_negativeZBN_num_bytesr�Z	BN_bn2bin�int�
from_bytesr�)rr�bnZbn_num_bytesZbin_ptrZbin_len�valrZrZr[�
_bn_to_int�szBackend._bn_to_int)�numcCsn|dus||jjksJ�|dur(|jj}|�t|��dd�d�}|j�|t|�|�}|�||jjk�|S)a

        Converts a python integer to a BIGNUM. The returned BIGNUM will not
        be garbage collected (to support adding them to structs that take
        ownership of the object). Be sure to register it for GC if it will
        be discarded after use.
        Ng @r^r�)	rar~�to_bytesr��
bit_lengthrcZ	BN_bin2bnr�rz)rrr�r��binaryZbn_ptrrZrZr[�
_int_to_bn�szBackend._int_to_bn)�public_exponent�key_sizertcCs�t�||�|j��}|�||jjk�|j�||jj�}|�	|�}|j�||jj
�}|j�||||jj�}|�|dk�|�|�}t
||||j�Sr�)r.Z_verify_rsa_parametersrc�RSA_newrzrar~�gc�RSA_freer��BN_freeZRSA_generate_key_ex�_rsa_cdata_to_evp_pkeyrrd)rrr�r��	rsa_cdatar�r��evp_pkeyrZrZr[�generate_rsa_private_key�s

�

�z Backend.generate_rsa_private_keycCs|dko|d@dko|dkS)N�r^rirZ)rrr�r�rZrZr[�!generate_rsa_parameters_supported
s

��z)Backend.generate_rsa_parameters_supported)�numbersrtc

Cs6t�|j|j|j|j|j|j|jj	|jj
�|j��}|�
||jjk�|j�||jj�}|�|j�}|�|j�}|�|j�}|�|j�}|�|j�}|�|j�}|�|jj	�}	|�|jj
�}
|j�|||�}|�
|dk�|j�||
|	|�}|�
|dk�|j�||||�}|�
|dk�|�|�}t||||j�Sr�)r.Z_check_private_key_components�p�q�d�dmp1�dmq1�iqmp�public_numbersr��nrcr�rzrar~r�r�r�ZRSA_set0_factors�RSA_set0_keyZRSA_set0_crt_paramsr�rrd)
rrr�r�r�r�r�r�r�r�r�r�r�r�rZrZr[�load_rsa_private_numberss>�



�z Backend.load_rsa_private_numberscCs�t�|j|j�|j��}|�||jjk�|j�	||jj
�}|�|j�}|�|j�}|j�||||jj�}|�|dk�|�
|�}t|||�Sr�)r.Z_check_public_key_componentsr�r�rcr�rzrar~r�r�r�r�r�r )rrr�r�r�r�r�r�rZrZr[�load_rsa_public_numbers:s

zBackend.load_rsa_public_numberscCs2|j��}|�||jjk�|j�||jj�}|Sr�)rcZEVP_PKEY_newrzrar~r��
EVP_PKEY_free�rrr�rZrZr[�_create_evp_pkey_gcIs
zBackend._create_evp_pkey_gccCs(|��}|j�||�}|�|dk�|Sr�)r�rcZEVP_PKEY_set1_RSArz)rrr�r�r�rZrZr[r�OszBackend._rsa_cdata_to_evp_pkey)�datacCsH|j�|�}|j�|t|��}|�||jjk�t|j�||jj	�|�S)z�
        Return a _MemoryBIO namedtuple of (BIO, char*).

        The char* is the storage for the BIO and it must stay alive until the
        BIO is finished with.
        )
rar�rcZBIO_new_mem_bufr�rzr~rTr��BIO_free)rrr��data_ptrrUrZrZr[�
_bytes_to_bioUszBackend._bytes_to_biocCsP|j��}|�||jjk�|j�|�}|�||jjk�|j�||jj�}|S)z.
        Creates an empty memory BIO.
        )rcZ	BIO_s_memrzrar~ZBIO_newr�r�)rrZ
bio_methodrUrZrZr[�_create_mem_bio_gcbs
zBackend._create_mem_bio_gccCs\|j�d�}|j�||�}|�|dk�|�|d|jjk�|j�|d|�dd�}|S)zE
        Reads a memory BIO. This only works on memory BIOs.
        zchar **rN)rar�rcZBIO_get_mem_datarzr~r�)rrrUr�Zbuf_len�bio_datarZrZr[�
_read_mem_biomszBackend._read_mem_bioc	CsD|j�|�}||jjkrX|j�|�}|�||jjk�|j�||jj�}t	||||j
�S||jjkr�|jjs�|jj
s�|jjs�|j�|�}|�||jjk�|j�||jj�}|��}|j�||�}|�|dk�|j|�|�dd�S||jjk�r.|j�|�}|�||jjk�|j�||jj�}t|||�S||jjk�rx|j�|�}|�||jjk�|j�||jj�}t|||�S||jv�r�|j�|�}|�||jjk�|j�||jj�}t|||�S|t|jdd�k�r�t ||�S|t|jdd�k�r�t!||�S|t|jdd�k�rt"||�S|t|jdd�k�r8t#||�St$d��dS)	zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        r^N)�password�EVP_PKEY_ED25519�
EVP_PKEY_X448�EVP_PKEY_X25519�EVP_PKEY_ED448�Unsupported key type.)%rc�EVP_PKEY_id�EVP_PKEY_RSA�EVP_PKEY_get1_RSArzrar~r�r�rrdZEVP_PKEY_RSA_PSS�CRYPTOGRAPHY_IS_LIBRESSL�CRYPTOGRAPHY_IS_BORINGSSLZ#CRYPTOGRAPHY_OPENSSL_LESS_THAN_111Er��i2d_RSAPrivateKey_bio�load_der_private_keyr��EVP_PKEY_DSA�EVP_PKEY_get1_DSA�DSA_freer�EVP_PKEY_EC�EVP_PKEY_get1_EC_KEY�EC_KEY_freerrn�EVP_PKEY_get1_DH�DH_freerrrr#r!rr)	rrr��key_typer�rUr��	dsa_cdata�ec_cdata�dh_cdatarZrZr[�_evp_pkey_to_private_keyxsb
�
����

�



z Backend._evp_pkey_to_private_keycCs�|j�|�}||jjkrT|j�|�}|�||jjk�|j�||jj�}t	|||�S||jj
kr�|j�|�}|�||jjk�|j�||jj�}t
|||�S||jjkr�|j�|�}||jjkr�|��}td|��|j�||jj�}t|||�S||jv�r8|j�|�}|�||jjk�|j�||jj�}t|||�S|t|jdd�k�rVt||�S|t|jdd�k�rtt||�S|t|jdd�k�r�t||�S|t|jdd�k�r�t||�Std��dS)zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        zUnable to load EC keyr�Nr�r�rr)rcrrrrzrar~r�r�r r	r
rrrr
r�r�rrrnrrr
rrr$r"rr)rrr�rr�rrryrrZrZr[�_evp_pkey_to_public_key�s@




zBackend._evp_pkey_to_public_keycCst|tjtjtjtjtjf�Sr�)r�r&r��SHA224�SHA256�SHA384�SHA512r�rZrZr[�_oaep_hash_supported�s��zBackend._oaep_hash_supported)�paddingrtcCs�t|t�rdSt|t�rNt|jt�rN|jr>t|jjtj�r>dS|�	|jj�Sn4t|t
�r~t|jt�r~|�|jj�o||�|j�SdSdS)NTF)r�r3r4Z_mgfr1rf�
_algorithmr&r�r�r2r)rrrrZrZr[�rsa_padding_supported�s

��
�zBackend.rsa_padding_supported)r�rtc	Cs~|dvrtd��|j��}|�||jjk�|j�||jj�}|j�|||jjd|jj|jj|jj�}|�|dk�t	||�S)N)ir]iiz0Key size must be 1024, 2048, 3072, or 4096 bits.rr^)
r�rc�DSA_newrzrar~r�rZDSA_generate_parameters_exr)rrr��ctxr�rZrZr[�generate_dsa_parameterss$�
�
zBackend.generate_dsa_parameters)�
parametersrtcCsT|j�|j�}|�||jjk�|j�||jj�}|j�|�|�	|�}t
|||�Sr�)rcZ
DSAparams_dupZ
_dsa_cdatarzrar~r�rZDSA_generate_key�_dsa_cdata_to_evp_pkeyr)rrr"r r�rZrZr[�generate_dsa_private_keys�
z Backend.generate_dsa_private_keycCs|�|�}|�|�Sr�)r!r$)rrr�r"rZrZr[�'generate_dsa_private_key_and_parameters)s
z/Backend.generate_dsa_private_key_and_parameterscCsB|j�||||�}|�|dk�|j�|||�}|�|dk�dSr�)rc�DSA_set0_pqgrzZDSA_set0_key)rrrr�r��g�pub_key�priv_keyr�rZrZr[�_dsa_cdata_set_values/szBackend._dsa_cdata_set_valuesc
Cs�t�|�|jj}|j��}|�||jjk�|j�	||jj
�}|�|j�}|�|j
�}|�|j�}|�|jj�}|�|j�}|�||||||�|�|�}	t|||	�Sr�)r*Z_check_dsa_private_numbersr��parameter_numbersrcrrzrar~r�rr�r�r�r'�y�xr*r#r)
rrr�r+rr�r�r'r(r)r�rZrZr[�load_dsa_private_numbers5s


z Backend.load_dsa_private_numbersc	Cs�t�|j�|j��}|�||jjk�|j�||jj	�}|�
|jj�}|�
|jj�}|�
|jj
�}|�
|j�}|jj}|�||||||�|�|�}t|||�Sr�)r*�_check_dsa_parametersr+rcrrzrar~r�rr�r�r�r'r,r*r#r)	rrr�rr�r�r'r(r)r�rZrZr[�load_dsa_public_numbersJs

zBackend.load_dsa_public_numberscCs�t�|�|j��}|�||jjk�|j�||jj�}|�	|j
�}|�	|j�}|�	|j�}|j�
||||�}|�|dk�t||�Sr�)r*r/rcrrzrar~r�rr�r�r�r'r&r)rrr�rr�r�r'r�rZrZr[�load_dsa_parameter_numbers]s

z"Backend.load_dsa_parameter_numberscCs(|��}|j�||�}|�|dk�|Sr�)r�rcZEVP_PKEY_set1_DSArz)rrrr�r�rZrZr[r#mszBackend._dsa_cdata_to_evp_pkeycCs|jSr�)rfrqrZrZr[�
dsa_supportedsszBackend.dsa_supportedcCs|��sdS|�|�Sr�)r2r�r�rZrZr[�dsa_hash_supportedvszBackend.dsa_hash_supportedcCs|�|td|j��S)N�)r�rD�
block_sizer�rZrZr[�cmac_algorithm_supported{s�z Backend.cmac_algorithm_supportedcCs
t||�Sr�r	r�rZrZr[�create_cmac_ctx�szBackend.create_cmac_ctx)r�r�rtcCs|�|jj|j||�Sr�)�	_load_keyrcZPEM_read_bio_PrivateKeyr)rrr�r�rZrZr[�load_pem_private_key�s�zBackend.load_pem_private_key)r�rtcCs�|�|�}|j�d�}|j�|j|jj|j�|jjd�|�}||jjkrd|j�	||jj
�}|�|�S|��|j�
|j�}|�|dk�|j�|j|jj|j�|jjd�|�}||jjkr�|j�	||jj�}|�|�}t|||�S|��dS)N�CRYPTOGRAPHY_PASSWORD_DATA *�Cryptography_pem_password_cbr^)r�rar�rcZPEM_read_bio_PUBKEYrUr~�	addressof�
_original_libr�r�rr��	BIO_resetrzZPEM_read_bio_RSAPublicKeyr�r�r �_handle_key_loading_error)rrr��mem_bio�userdatar�r�r�rZrZr[�load_pem_public_key�s:
��
��
zBackend.load_pem_public_keycCs^|�|�}|j�|j|jj|jj|jj�}||jjkrR|j�||jj�}t||�S|�	�dSr�)
r�rcZPEM_read_bio_DHparamsrUrar~r�rrr?)rrr�r@rrZrZr[�load_pem_parameters�s
�
zBackend.load_pem_parameterscCs>|�|�}|�||�}|r$|�|�S|�|jj|j||�SdSr�)r��"_evp_pkey_from_der_traditional_keyrr8rcZd2i_PKCS8PrivateKey_bio)rrr�r�r�r�rZrZr[r�s

�zBackend.load_der_private_keycCs^|j�|j|jj�}||jjkrN|��|j�||jj�}|durJtd��|S|��dSdS)N�4Password was given but private key is not encrypted.)	rc�d2i_PrivateKey_biorUrar~r�r�r��	TypeError)rrr�r�r�rZrZr[rD�s�z*Backend._evp_pkey_from_der_traditional_keycCs�|�|�}|j�|j|jj�}||jjkrF|j�||jj�}|�|�S|�	�|j�
|j�}|�|dk�|j�|j|jj�}||jjkr�|j�||jj
�}|�|�}t|||�S|��dSr�)r�rcZd2i_PUBKEY_biorUrar~r�r�rr�r>rzZd2i_RSAPublicKey_bior�r�r r?)rrr�r@r�r�r�rZrZr[�load_der_public_key�s 


�
zBackend.load_der_public_keycCs�|�|�}|j�|j|jj�}||jjkrF|j�||jj�}t||�S|jj	r�|�
�|j�|j�}|�|dk�|j�
|j|jj�}||jjkr�|j�||jj�}t||�S|��dSr�)r�rcZd2i_DHparams_biorUrar~r�rrror�r>rzZCryptography_d2i_DHxparams_bior?)rrr�r@rr�rZrZr[�load_der_parameterss 


�
zBackend.load_der_parameters)�certrtcCsT|�tjj�}|�|�}|j�|j|jj	�}|�
||jj	k�|j�||jj�}|Sr�)
�public_bytesr'�Encoding�DERr�rcZd2i_X509_biorUrar~rzr��	X509_free)rrrJr�r@rrZrZr[�
_cert2ossls
zBackend._cert2ossl)rrtcCs4|��}|j�||�}|�|dk�t�|�|��Sr�)r�rcZi2d_X509_biorz�	rust_x509Zload_der_x509_certificater�)rrrrUr�rZrZr[�
_ossl2certszBackend._ossl2cert)�csrrtcCsT|�tjj�}|�|�}|j�|j|jj	�}|�
||jj	k�|j�||jj�}|Sr�)
rKr'rLrMr�rcZd2i_X509_REQ_biorUrar~rzr�Z
X509_REQ_free)rrrRr�r@�x509_reqrZrZr[�	_csr2ossl$s
zBackend._csr2ossl)rSrtcCs4|��}|j�||�}|�|dk�t�|�|��Sr�)r�rcZi2d_X509_REQ_biorzrPZload_der_x509_csrr�)rrrSrUr�rZrZr[�	_ossl2csr,szBackend._ossl2csr)�crlrtcCsT|�tjj�}|�|�}|j�|j|jj	�}|�
||jj	k�|j�||jj�}|Sr�)
rKr'rLrMr�rcZd2i_X509_CRL_biorUrar~rzr�Z
X509_CRL_free)rrrVr�r@�x509_crlrZrZr[�	_crl2ossl4s
zBackend._crl2ossl)rWrtcCs4|��}|j�||�}|�|dk�t�|�|��Sr�)r�rcZi2d_X509_CRL_biorzrPZload_der_x509_crlr�)rrrWrUr�rZrZr[�	_ossl2crl<szBackend._ossl2crl)rV�
public_keyrtcCsJt|tttf�std��|�|�}|j�||j�}|dkrF|�	�dSdS)NzGExpecting one of DSAPublicKey, RSAPublicKey, or EllipticCurvePublicKey.r^FT)
r�rr rrGrXrcZX509_CRL_verify�	_evp_pkeyr�)rrrVrZrWr�rZrZr[�_crl_is_signature_validDs ���
zBackend._crl_is_signature_validcCs`|�|�}|j�|�}|�||jjk�|j�||jj�}|j�||�}|dkr\|�	�dSdS)Nr^FT)
rTrcZX509_REQ_get_pubkeyrzrar~r�r�ZX509_REQ_verifyr�)rrrRrSZpkeyr�rZrZr[�_csr_is_signature_valid^s
zBackend._csr_is_signature_validcCs"|j�|j|j�dkrtd��dS)Nr^zKeys do not correspond)rcZEVP_PKEY_cmpr[r�)rr�key1�key2rZrZr[�_check_keys_correspondmszBackend._check_keys_correspondc	Cs&|�|�}|j�d�}|durFt�d|�|j�|�}||_t|�|_||j	|jj
|j�|jj
d�|�}||jj
kr�|jdkr�|��|jdkr�td��q�|jdks�J�td�|jd	���n|��|��|j�||jj�}|dur�|jdkr�td
��|du�r|jd	k�s|du�sJ�||�S)Nr:r�r;r���z3Password was not given but private key is encrypted���zAPasswords longer than {} bytes are not supported by this backend.r^rE)r�rar�r�_check_bytesliker�r�r�r�rUr~r<rcr=�errorr�rGr�ru�maxsizer?r�r��called)	rrZopenssl_read_funcZconvert_funcr�r�r@rAZpassword_ptrr�rZrZr[r8qsT

��	

�������zBackend._load_keycs����}|std��n�|d��jj�jj�sf|d��jj�jj�sf�jjrp|d��jj	�jj
�rptd��n4t�fdd�|D��r�td��nt�
|�}td|��dS)Nz|Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.rz Bad decrypt. Incorrect password?c3s"|]}|��jj�jj�VqdSr�)�_lib_reason_matchrc�ERR_LIB_EVPZ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM)�.0rdrqrZr[�	<genexpr>�s
��z4Backend._handle_key_loading_error.<locals>.<genexpr>z!Unsupported public key algorithm.z�Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).)r�r�rgrcrhZEVP_R_BAD_DECRYPTZERR_LIB_PKCS12Z!PKCS12_R_PKCS12_CIPHERFINAL_ERRORZCryptography_HAS_PROVIDERSZERR_LIB_PROVZPROV_R_BAD_DECRYPT�anyr%Z_errors_with_text)rrryZerrors_with_textrZrqr[r?�s>�����	�
��
�

�z!Backend._handle_key_loading_error)�curvertcCstz|�|�}Wnty(|jj}Yn0|j�|�}||jjkrN|��dS|�||jjk�|j�	|�dSdS)NFT)
�_elliptic_curve_to_nidrrc�	NID_undefZEC_GROUP_new_by_curve_namerar~r�rzZ
EC_GROUP_free)rrrl�	curve_nid�grouprZrZr[�elliptic_curve_supported�sz Backend.elliptic_curve_supported)�signature_algorithmrlrtcCst|tj�sdS|�|�Sr�)r�r+ZECDSArq)rrrrrlrZrZr[�,elliptic_curve_signature_algorithm_supported�sz4Backend.elliptic_curve_signature_algorithm_supportedcCs\|�|�rD|�|�}|j�|�}|�|dk�|�|�}t|||�Std�|j	�t
j��dS)z@
        Generate a new private key on the named curve.
        r^z#Backend object does not support {}.N)rq�_ec_key_new_by_curvercZEC_KEY_generate_keyrz�_ec_cdata_to_evp_pkeyrrrur�r�UNSUPPORTED_ELLIPTIC_CURVE)rrrlrr�r�rZrZr[�#generate_elliptic_curve_private_key�s



�z+Backend.generate_elliptic_curve_private_keycCsz|j}|�|j�}|j�|�|j�|jj�}|j�	||�}|dkrR|�
�td��|�||j
|j�|�|�}t|||�S)Nr^�Invalid EC key.)r�rtrlrar�r��
private_valuerc�
BN_clear_free�EC_KEY_set_private_keyr�r��)_ec_key_set_public_key_affine_coordinatesr-r,rur)rrr��publicrryr�r�rZrZr[�#load_elliptic_curve_private_numberss�
�
z+Backend.load_elliptic_curve_private_numberscCs4|�|j�}|�||j|j�|�|�}t|||�Sr�)rtrlr|r-r,rur)rrr�rr�rZrZr[�"load_elliptic_curve_public_numberss
�
z*Backend.load_elliptic_curve_public_numbers)rl�point_bytesrtc	Cs�|�|�}|j�|�}|�||jjk�|j�|�}|�||jjk�|j�||jj�}|�	��@}|j�
|||t|�|�}|dkr�|��t
d��Wd�n1s�0Y|j�||�}|�|dk�|�|�}t|||�S)Nr^z(Invalid public bytes for the given curve)rtrc�EC_KEY_get0_grouprzrar~�EC_POINT_newr��
EC_POINT_free�_tmp_bn_ctxZEC_POINT_oct2pointr�r�r��EC_KEY_set_public_keyrur)	rrrlr�rrp�point�bn_ctxr�r�rZrZr[� load_elliptic_curve_public_bytes(s"

�&
z(Backend.load_elliptic_curve_public_bytes)ryrlrtc	Csb|�|�}|�|�\}}|j�|�}|�||jjk�|j�||jj�}|�	|�}|j�||jj
�}|���|}|j�||||jj|jj|�}	|�|	dk�|j�
|�}
|j�
|�}||||
||�}	|	dkr�|��td��Wd�n1s�0Y|j�||�}	|�|	dk�|�	|�}|j�||jj
�}|j�||�}	|�|	dk�|�|�}
t|||
�S)Nr^z'Unable to derive key from private_value)rt� _ec_key_determine_group_get_funcrcr�rzrar~r�r�r�rzr�ZEC_POINT_mulZ
BN_CTX_getr�r�r�r{rur)rrryrlr�get_funcrpr��valuer�r�Zbn_xZbn_y�privater�rZrZr[�!derive_elliptic_curve_private_key>s4


�&

z)Backend.derive_elliptic_curve_private_key)rlcCs|�|�}|�|�Sr�)rm�_ec_key_new_by_curve_nid)rrrlrorZrZr[rtes
zBackend._ec_key_new_by_curve)rocCs0|j�|�}|�||jjk�|j�||jj�Sr�)rcZEC_KEY_new_by_curve_namerzrar~r�r)rrrorrZrZr[r�isz Backend._ec_key_new_by_curve_nid)r�rlrtcCs,|jrt||j�sdS|�|�o*t|tj�Sr�)rfr��_fips_ecdh_curvesrqr+�ECDH)rrr�rlrZrZr[�+elliptic_curve_exchange_algorithm_supportedns��z3Backend.elliptic_curve_exchange_algorithm_supportedcCs(|��}|j�||�}|�|dk�|Sr�)r�rcZEVP_PKEY_set1_EC_KEYrz)rrrr�r�rZrZr[ruzszBackend._ec_cdata_to_evp_pkeycCsNddd�}|�|j|j�}|j�|���}||jjkrJtd�|j�tj	��|S)z/
        Get the NID for a curve name.
        Z
prime192v1Z
prime256v1)Z	secp192r1Z	secp256r1z${} is not a supported elliptic curve)
�getr�rc�
OBJ_sn2nidr�rnrrurrv)rrrlZ
curve_aliasesZ
curve_namerorZrZr[rm�s

�zBackend._elliptic_curve_to_nidc	csd|j��}|�||jjk�|j�||jj�}|j�|�z|VW|j�|�n|j�|�0dSr�)	rcZ
BN_CTX_newrzrar~r�ZBN_CTX_freeZBN_CTX_startZ
BN_CTX_end)rrr�rZrZr[r��s
zBackend._tmp_bn_ctxcCs�|�||jjk�|j�d�}|�||jjk�|j�|�}|�||jjk�|j�|�}|�||jjk�|j�|�}|�||jjk�||kr�|jj	r�|jj
}n|jj}|s�J�||fS)zu
        Given an EC_KEY determine the group and what function is required to
        get point coordinates.
        scharacteristic-two-field)rzrar~rcr�rnr�ZEC_GROUP_method_ofZEC_METHOD_get_field_typeZCryptography_HAS_EC2MZ$EC_POINT_get_affine_coordinates_GF2mZ#EC_POINT_get_affine_coordinates_GFp)rrr Z
nid_two_fieldrp�method�nidr�rZrZr[r��s
z(Backend._ec_key_determine_group_get_func)r-r,cCst|dks|dkrtd��|j�|�|�|jj�}|j�|�|�|jj�}|j�|||�}|dkrp|��td��dS)zg
        Sets the public key point in the EC_KEY context to the affine x and y
        values.
        rz2Invalid EC key. Both x and y must be non-negative.r^rxN)r�rar�r�rcr�Z(EC_KEY_set_public_key_affine_coordinatesr�)rrr r-r,r�rZrZr[r|�s�z1Backend._ec_key_set_public_key_affine_coordinates)�encodingru�encryption_algorithmrtc
Cs(t|tj�std��t|tj�s(td��t|tj�s<td��t|tj�rNd}n0t|tj�rv|j}t	|�dkr~t
d��nt
d��|tjjur�|tjjur�|j
j}n|tjjur�|j
j}nt
d��|�|||�S|tjju�r�|jr�t|tj�s�t
d	��|j
�|�}	|tjju�rl|	|j
jk�r&|j
j}n8|	|j
jk�r>|j
j}n |	|j
jk�rV|j
j}nt
d
��|�|||�S|tjju�r�|�r�t
d��|	|j
jk�r�|j
j}n8|	|j
jk�r�|j
j}n |	|j
jk�r�|j
j}nt
d
��|�||�St
d��|tjju�r|tjju�rt �!||�St
d
��t
d��dS)N�/encoding must be an item from the Encoding enumz2format must be an item from the PrivateFormat enumzBEncryption algorithm must be a KeySerializationEncryption instancer}i�zBPasswords longer than 1023 bytes are not supported by this backendzUnsupported encryption typezUnsupported encoding for PKCS8zCEncrypted traditional OpenSSL format is not supported in FIPS mode.z+Unsupported key type for TraditionalOpenSSLzDEncryption is not supported for DER encoded traditional OpenSSL keysz+Unsupported encoding for TraditionalOpenSSLz=OpenSSH private key format can only be used with PEM encoding�format is invalid with this key)"r�r'rLrG�
PrivateFormat�KeySerializationEncryption�NoEncryption�BestAvailableEncryptionr�r�r�ZPKCS8�PEMrcZPEM_write_bio_PKCS8PrivateKeyrMZi2d_PKCS8PrivateKey_bio�_private_key_bytes_via_bioZTraditionalOpenSSLrfrrZPEM_write_bio_RSAPrivateKeyr	ZPEM_write_bio_DSAPrivateKeyrZPEM_write_bio_ECPrivateKeyrZi2d_ECPrivateKey_bioZi2d_DSAPrivateKey_bio�_bio_func_output�OpenSSHrOZserialize_ssh_private_key)
rrr�rur�r�r��cdatar��	write_biorrZrZr[�_private_key_bytes�s�
�����

���


���


��zBackend._private_key_bytesc	Cs<|s|jj}n|j�d�}|�||||t|�|jj|jj�S)Nsaes-256-cbc)rar~rc�EVP_get_cipherbynamer�r�)rrr�r�r�r�rZrZr[r�9s
�z"Backend._private_key_bytes_via_biocGs0|��}||g|�R�}|�|dk�|�|�Sr�)r�rzr�)rrr��argsrUr�rZrZr[r�JszBackend._bio_func_output)r�rurtcCst|tj�std��t|tj�s(td��|tjjurt|tjjurJ|jj}n|tjj	ur`|jj
}ntd��|�||�S|tjj
ur�|j�|�}||jjkr�td��|tjjur�|jj}n|tjj	ur�|jj}ntd��|�||�S|tjju�r|tjju�rt�|�Std��td��dS)Nr�z1format must be an item from the PublicFormat enumz8SubjectPublicKeyInfo works only with PEM or DER encodingz+PKCS1 format is supported only for RSA keysz)PKCS1 works only with PEM or DER encodingz1OpenSSH format must be used with OpenSSH encodingr�)r�r'rLrG�PublicFormatZSubjectPublicKeyInfor�rcZPEM_write_bio_PUBKEYrMZi2d_PUBKEY_bior�r�ZPKCS1rrZPEM_write_bio_RSAPublicKeyZi2d_RSAPublicKey_bior�rOZserialize_ssh_public_key)rrr�rur�r�r�r�rrZrZr[�_public_key_bytesPs@�

�


�zBackend._public_key_bytescCs
|jjSr��rcrrqrZrZr[�dh_supported�szBackend.dh_supported)�	generatorr�rtcCs�|tjkrtd�tj���|dvr*td��|j��}|�||jjk�|j�	||jj
�}|j�||||jj�}|�|dk�t||�S)Nz$DH key_size must be at least {} bits)��zDH generator must be 2 or 5r^)
r)Z_MIN_MODULUS_SIZEr�rurc�DH_newrzrar~r�rZDH_generate_parameters_exr)rrr�r�Zdh_param_cdatar�rZrZr[�generate_dh_parameters�s 
��
�zBackend.generate_dh_parameterscCs(|��}|j�||�}|�|dk�|Sr�)r�rcZEVP_PKEY_set1_DHrz)rrrr�r�rZrZr[�_dh_cdata_to_evp_pkey�szBackend._dh_cdata_to_evp_pkeycCs<t|j|�}|j�|�}|�|dk�|�|�}t|||�Sr�)rZ	_dh_cdatarcZDH_generate_keyrzr�r)rrr"Zdh_key_cdatar�r�rZrZr[�generate_dh_private_key�s�
zBackend.generate_dh_private_keycCs|�|�||��Sr�)r�r�)rrr�r�rZrZr[�&generate_dh_private_key_and_parameters�s
�z.Backend.generate_dh_private_key_and_parameterscCs>|jj}|j��}|�||jjk�|j�||jj�}|�	|j
�}|�	|j�}|jdurf|�	|j�}n|jj}|�	|jj
�}|�	|j�}|j�||||�}	|�|	dk�|j�|||�}	|�|	dk�|j�dd�}
|j�||
�}	|�|	dk�|
ddk�r(|jdk�r |
d|jjAdk�s(td��|�|�}t|||�S)Nr^�int[]rr�z.DH private numbers did not pass safety checks.)r�r+rcr�rzrar~r�rr�r�r'r�r,r-�DH_set0_pqg�DH_set0_keyr��Cryptography_DH_checkZDH_NOT_SUITABLE_GENERATORr�r�r)rrr�r+rr�r'r�r(r)r��codesr�rZrZr[�load_dh_private_numbers�s4


��
zBackend.load_dh_private_numbersc
Cs�|j��}|�||jjk�|j�||jj�}|j}|�|j	�}|�|j
�}|jdurd|�|j�}n|jj}|�|j�}|j�
||||�}|�|dk�|j�|||jj�}|�|dk�|�|�}	t|||	�Sr�)rcr�rzrar~r�rr+r�r�r'r�r,r�r�r�r
)
rrr�rr+r�r'r�r(r�r�rZrZr[�load_dh_public_numbers�s 


zBackend.load_dh_public_numberscCs�|j��}|�||jjk�|j�||jj�}|�|j�}|�|j	�}|j
dur^|�|j
�}n|jj}|j�||||�}|�|dk�t||�Sr�)
rcr�rzrar~r�rr�r�r'r�r�r)rrr�rr�r'r�r�rZrZr[�load_dh_parameter_numbers
s

z!Backend.load_dh_parameter_numbers)r�r'r�rtcCs�|j��}|�||jjk�|j�||jj�}|�|�}|�|�}|durV|�|�}n|jj}|j�||||�}|�|dk�|j�	dd�}|j�
||�}|�|dk�|ddkS)Nr^r�r)rcr�rzrar~r�rr�r�r�r�)rrr�r'r�rr�r�rZrZr[�dh_parameters_supporteds


zBackend.dh_parameters_supportedcCs|jjdkSr�)rcrorqrZrZr[�dh_x942_serialization_supported6sz'Backend.dh_x942_serialization_supportedcCsht|�dkrtd��|��}|j�||jj�}|�|dk�|j�||t|��}|�|dk�t||�S)N� z%An X25519 public key is 32 bytes longr^)	r�r�r�rcZEVP_PKEY_set_type�
NID_X25519rzZEVP_PKEY_set1_tls_encodedpointr")rrr�r�r�rZrZr[�x25519_load_public_bytes9s
�z Backend.x25519_load_public_bytescCs�t|�dkrtd��d}|�d��F}||dd�<||dd�<|�|�}|j�|j|jj�}Wd�n1sn0Y|�	||jjk�|j�
||jj�}|�	|j�|�|jj
k�t||�S)Nr�z&An X25519 private key is 32 bytes longs0.0+en" �0r�)r�r��_zeroed_bytearrayr�rcrFrUrar~rzr�r�rr�r!)rrr�Zpkcs8_prefix�barUr�rZrZr[�x25519_load_private_bytesHs
2�z!Backend.x25519_load_private_bytescCs�|j�||jj�}|�||jjk�|j�||jj�}|j�|�}|�|dk�|j�d�}|j�	||�}|�|dk�|�|d|jjk�|j�|d|jj
�}|S)Nr^�EVP_PKEY **r)rcZEVP_PKEY_CTX_new_idrar~rzr�ZEVP_PKEY_CTX_freeZEVP_PKEY_keygen_initr�ZEVP_PKEY_keygenr�)rrr�Zevp_pkey_ctxr�Z	evp_ppkeyr�rZrZr[�_evp_pkey_keygen_gclszBackend._evp_pkey_keygen_gccCs|�|jj�}t||�Sr�)r�rcr�r!r�rZrZr[�x25519_generate_keyyszBackend.x25519_generate_keycCs|jr
dS|jjSr�)rfrcrrqrZrZr[�x25519_supported}szBackend.x25519_supportedcCs`t|�dkrtd��|j�|jj|jj|t|��}|�||jjk�|j�||jj	�}t
||�S)N�8z#An X448 public key is 56 bytes long)r�r�rc�EVP_PKEY_new_raw_public_key�NID_X448rar~rzr�r�r$�rrr�r�rZrZr[�x448_load_public_bytes�s�zBackend.x448_load_public_bytescCslt|�dkrtd��|j�|�}|j�|jj|jj|t|��}|�||jjk�|j�	||jj
�}t||�S)Nr�z$An X448 private key is 56 bytes long)r�r�rar�rc�EVP_PKEY_new_raw_private_keyr�r~rzr�r�r#�rrr�r�r�rZrZr[�x448_load_private_bytes�s�zBackend.x448_load_private_bytescCs|�|jj�}t||�Sr�)r�rcr�r#r�rZrZr[�x448_generate_key�szBackend.x448_generate_keycCs|jr
dS|jjo|jjSr�)rfrcZ"CRYPTOGRAPHY_OPENSSL_LESS_THAN_111rrqrZrZr[�x448_supported�s

�zBackend.x448_supportedcCs|jr
dS|jjSr�)rfrc�#CRYPTOGRAPHY_OPENSSL_LESS_THAN_111BrqrZrZr[�ed25519_supported�szBackend.ed25519_supportedcCsnt�d|�t|�tjkr"td��|j�|jj|j	j
|t|��}|�||j	j
k�|j	�||jj
�}t||�S)Nr�z&An Ed25519 public key is 32 bytes long)r�_check_bytesr�r,�_ED25519_KEY_SIZEr�rcr��NID_ED25519rar~rzr�r�rr�rZrZr[�ed25519_load_public_bytes�s�z!Backend.ed25519_load_public_bytescCszt|�tjkrtd��t�d|�|j�|�}|j�	|jj
|jj|t|��}|�||jjk�|j�
||jj�}t||�S)Nz'An Ed25519 private key is 32 bytes longr�)r�r,r�r�rrcrar�rcr�r�r~rzr�r�rr�rZrZr[�ed25519_load_private_bytes�s�z"Backend.ed25519_load_private_bytescCs|�|jj�}t||�Sr�)r�rcr�rr�rZrZr[�ed25519_generate_key�szBackend.ed25519_generate_keycCs|jr
dS|jjo|jjSr�)rfrcr�rrqrZrZr[�ed448_supported�s

�zBackend.ed448_supportedcCslt�d|�t|�tkr td��|j�|jj|jj	|t|��}|�
||jj	k�|j�||jj�}t
||�S)Nr�z$An Ed448 public key is 57 bytes long)rr�r�rr�rcr��	NID_ED448rar~rzr�r�rr�rZrZr[�ed448_load_public_bytes�s�zBackend.ed448_load_public_bytescCsxt�d|�t|�tkr td��|j�|�}|j�|jj	|jj
|t|��}|�||jj
k�|j�||jj
�}t||�S)Nr�z%An Ed448 private key is 57 bytes long)rrcr�rr�rar�rcr�r�r~rzr�r�rr�rZrZr[�ed448_load_private_bytes�s�z Backend.ed448_load_private_bytescCs|�|jj�}t||�Sr�)r�rcr�rr�rZrZr[�ed448_generate_key�szBackend.ed448_generate_key)r�r�r�r��rr�rtcCs�|j�d|�}|j�|�}|j�|t|�|t|�|||tj||�
}	|	dkrr|��}
d||d}t	d�
|�|
��|j�|�dd�S)Nr�r^�izJNot enough memory to derive key. These parameters require {} MB of memory.)rar�r�rcZEVP_PBE_scryptr�rMZ
_MEM_LIMITr��MemoryErrorrur�)rrr�r�r�r�r�r�r�r�r�ryZ
min_memoryrZrZr[�
derive_scrypt�s0	���zBackend.derive_scryptcCsLt�|�}|jr||jvrdS|�d�r4|jjdkS|j�|�|jj	kSdS)NFs-sivr^)
rZ_aead_cipher_namerf�
_fips_aead�endswithrc�#CRYPTOGRAPHY_OPENSSL_300_OR_GREATERr�rar~)rrr��cipher_namerZrZr[�aead_cipher_supporteds

�zBackend.aead_cipher_supported)r�rtc
cs2t|�}z|VW|�||�n|�||�0dS)z�
        This method creates a bytearray, which we copy data into (hopefully
        also from a mutable buffer that can be dynamically erased!), and then
        zero when we're done.
        N)�	bytearray�
_zero_data)rrr�r�rZrZr[r�&szBackend._zeroed_bytearraycCst|�D]}d||<qdSr{)�range)rrr�r��irZrZr[r�3szBackend._zero_dataccs||dur|jjVndt|�}|j�d|d�}|j�|||�z |VW|�|j�d|�|�n|�|j�d|�|�0dS)a�
        This method takes bytes, which can be a bytestring or a mutable
        buffer like a bytearray, and yields a null-terminated version of that
        data. This is required because PKCS12_parse doesn't take a length with
        its password char * and ffi.from_buffer doesn't provide null
        termination. So, to support zeroing the data via bytearray we
        need to build this ridiculous construct that copies the memory, but
        zeroes it after use.
        Nr�r^z	uint8_t *)rar~r�r��memmover��cast)rrr�Zdata_lenr�rZrZr[�_zeroed_null_terminated_buf:sz#Backend._zeroed_null_terminated_bufcCs2|�||�}|j|jr|jjnddd�|jD�fS)NcSsg|]
}|j�qSrZ)�certificate�rirJrZrZr[�
<listcomp>\r}zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>)�load_pkcs12r�rJr�Zadditional_certs)rrr�r�Zpkcs12rZrZr[�%load_key_and_certificates_from_pkcs12Qs
�z-Backend.load_key_and_certificates_from_pkcs12cCs�|durt�d|�|�|�}|j�|j|jj�}||jjkrN|��t	d��|j�
||jj�}|j�d�}|j�d�}|j�d�}|�
|��$}|j�|||||�}	Wd�n1s�0Y|jjr�|��|	dkr�|��t	d��d}
d}g}|d|jjk�r(|j�
|d|jj�}
|�|
�}|d|jjk�r�|j�
|d|jj�}|�|�}d}|j�||jj�}||jjk�r�|j�|�}t||�}
|d|jjk�r~|j�
|d|jj�}|j�|d�}|jj�s�|jj�r�t|�}ntt|��}|D]�}|j�||�}|�||jjk�|j�
||jj�}|�|�}d}|j�||jj�}||jjk�rj|j�|�}|�t||���q�t ||
|�S)Nr�z!Could not deserialize PKCS12 datar�zX509 **zCryptography_STACK_OF_X509 **rzInvalid password or PKCS12 data)!rrcr�rcZd2i_PKCS12_biorUrar~r�r�r��PKCS12_freer�r�ZPKCS12_parseZ#CRYPTOGRAPHY_LIBRESSL_LESS_THAN_340r�rrNrQZX509_alias_get0r�rP�sk_X509_free�sk_X509_numr�rr��reversed�
sk_X509_valuerzrprQ)rrr�r�rU�p12Zevp_pkey_ptrZx509_ptrZsk_x509_ptr�password_bufr�rJr�Zadditional_certificatesr�rZcert_objr�Z
maybe_name�sk_x509r��indicesr�Z	addl_certZ	addl_namerZrZr[r�_sp

�"


��

�zBackend.load_pkcs12)r�r�rJ�casr�rtcCsFd}|durt�d|�t|tj�r6d}d}d}	d}
n4t|tj�rb|jj}|jj}d}	d}
|j}nt	d��|dus~t
|�dkr�|jj}n�|j�
�}|j�||jj�}g}|D]�}
t|
t��r|
j}|�|
j�}|�|��.}|j�||d�}|�|dk�Wd�n1�s0Yn
|�|
�}|�|�|j�||�}t�|dk�q�|�|���}|�|��`}|�rt|�|�n|jj}|du�r�|j}n|jj}|j�||||||||	|
d�
}Wd�n1�s�0YWd�n1�s�0Y|�||jjk�|j�||jj�}|��}|j�||�}|�|dk�|�|�S)Nr�rari Nr^zUnsupported key encryption type) rr�r�r'r�r�rcZ&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr�r�r�rar~�sk_X509_new_nullr�r�rPZ
friendly_namerOr�r�ZX509_alias_set1rzrp�sk_X509_push�backendr[Z
PKCS12_creater�r�Zi2d_PKCS12_bior�)rrr�r�rJr�r�r�Znid_certZnid_keyZpkcs12_iterZmac_iterr�Zossl_cas�caZca_aliasZossl_caZca_name_bufr�r�Zname_buf�	ossl_certr�r�rUrZrZr[�(serialize_key_and_certificates_to_pkcs12�s|�

��0


�D
z0Backend.serialize_key_and_certificates_to_pkcs12cCs|jr
dS|jjdkSr�)rfrcZCryptography_HAS_POLY1305rqrZrZr[�poly1305_supported	szBackend.poly1305_supported)r�rtcCs*t�d|�t|�tkr td��t||�S)Nr�zA poly1305 key is 32 bytes long)rrcr�rr�r)rrr�rZrZr[�create_poly1305_ctx		szBackend.create_poly1305_ctxcCs
|jjSr�r�rqrZrZr[�pkcs7_supported	szBackend.pkcs7_supportedcCsnt�d|�|�|�}|j�|j|jj|jj|jj�}||jjkrR|��t	d��|j�
||jj�}|�|�S�Nr�zUnable to parse PKCS7 data)
rr�r�rcZPEM_read_bio_PKCS7rUrar~r�r�r��
PKCS7_free�_load_pkcs7_certificates�rrr�rU�p7rZrZr[�load_pem_pkcs7_certificates	s
�z#Backend.load_pem_pkcs7_certificatescCsbt�d|�|�|�}|j�|j|jj�}||jjkrF|��t	d��|j�
||jj�}|�|�Sr)
rr�r�rcZ
d2i_PKCS7_biorUrar~r�r�r�r	r
rrZrZr[�load_der_pkcs7_certificates"	s
z#Backend.load_der_pkcs7_certificatesc
Cs�|j�|j�}|�||jjk�||jjkr>td�|�tj	��|j
jj}|j�
|�}g}t|�D]d}|j�||�}|�||jjk�|j�|�}|�|dk�|j�||jj�}|�|�}	|�|	�q`|S)NzNOnly basic signed structures are currently supported. NID for this data was {}r^)rcZOBJ_obj2nidr�rzrnZNID_pkcs7_signedrrurZUNSUPPORTED_SERIALIZATIONr��signrJr�r�r�rar~ZX509_up_refr�rNrQrp)
rrrr�r�r��certsr�rr�rJrZrZr[r
/	s*��

z Backend._load_pkcs7_certificates)rr�c
Cs"t|�}|rtdd�|D��s&td��|tjjtjjfvrBtd��|j��}|j	�
||jj�}g}|D]4}|�|�}|�
|�|j�||�}|�|dk�qf|j�|j	j|j	j||j	j|jj�}|��}	|tjjur�|j�|	||j	jd�}n|tjjus�J�|j�|	|�}|�|dk�|�|	�S)Ncss|]}t|tj�VqdSr�)r�r�Certificater�rZrZr[rjO	sz7Backend.pkcs7_serialize_certificates.<locals>.<genexpr>z.certs must be a list of certs with length >= 1z/encoding must DER or PEM from the Encoding enumr^r)�list�allrGr'rLr�rMrcr�rar�r�rOrprrz�
PKCS7_signr~�
PKCS7_PARTIALr��PEM_write_bio_PKCS7_stream�
i2d_PKCS7_bior�)
rrrr�Zcerts_sk�
ossl_certsrJrr�r�bio_outrZrZr[�pkcs7_serialize_certificatesI	sD��


��z$Backend.pkcs7_serialize_certificates)�builderr��optionsrtcCs�|jdusJ�|�|j�}|jj}d}t|j�dkr>|jj}n\|j��}|j�	||jj
�}g}|jD]4}	|�|	�}
|�|
�|j�
||
�}|�|dk�qdtjj|vr�||jjO}||jjO}|j�|jj|jj||jj|�}|�||jjk�|j�	||jj�}d}
tjj|v�r"|
|jjO}
ntjj|v�r<|
|jjO}
tjj|v�rV|
|jjO}
|jD]H\}}}|�|�}
|�|�}|j�||
|j||
�}|�||jjk��q\|D]<}|tjju�r�||jj O}n|tjj!u�r�||jj"O}�q�|�#�}|t$j%j&u�r|j�'|||j(|�}n�|t$j%j)u�rX|j�*||j(|�}|�|dk�|j�+|||j(|�}nR|t$j%j,u�sjJ�|j�*||j(|�}|�|dk�|jj-�r�|�.�|j�/||�}|�|dk�|�0|�S)Nrr^)1�_datar�rcrr�Z_additional_certsrar~r�r�r�rOrprrzrN�PKCS7OptionsZDetachedSignatureZPKCS7_DETACHEDrr	ZNoCapabilitiesZPKCS7_NOSMIMECAPZNoAttributesZPKCS7_NOATTRZNoCertsZ
PKCS7_NOCERTSZ_signersr�ZPKCS7_sign_add_signerr[�TextZ
PKCS7_TEXT�BinaryZPKCS7_BINARYr�r'rLZSMIMEZSMIME_write_PKCS7rUr�ZPKCS7_finalrrMr�r�rr�)rrrr�rrUZ
init_flagsZfinal_flagsrrrJrr�rZsigner_flagsr�Zprivate_keyZhash_algorithmZmdZp7signerinfo�optionrrZrZr[�
pkcs7_signx	s�




�

�
�
�
zBackend.pkcs7_sign)N)N)N)�rWrXrY�__doc__r�r�r:r�r&rrrrZ
SHA512_224Z
SHA512_256ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512ZSHAKE128ZSHAKE256r�r+Z	SECP224R1Z	SECP256R1Z	SECP384R1Z	SECP521R1r�Z_fips_rsa_min_key_sizeZ_fips_rsa_min_public_exponentZ_fips_dsa_min_modulusZ_fips_dh_min_key_sizeZ_fips_dh_min_modulusrs�strrwr��typing�Optional�Listr%Z
_OpenSSLErrorrzrer�r��
contextlibrr�rmr�rvr�r��bytesZ
HashAlgorithmrr�r�r�r�r�r�r�ZHashContextr�r9rJr�r�rhrr�r�r�r�r�Z_OpenSSLErrorWithTextr�r�r�r.Z
RSAPrivateKeyr�r�ZRSAPrivateNumbersr�ZRSAPublicNumbersZRSAPublicKeyr�r�r�r�r�r�r6rr7rrr(rr*Z
DSAParametersr!Z
DSAPrivateKeyr$r%r*ZDSAPrivateNumbersr.ZDSAPublicNumbersZDSAPublicKeyr0ZDSAParameterNumbersr1r#r2r3r6r8r
r7r9rBr)ZDHParametersrCrrDrHrIrr�AnyrOrQZCertificateSigningRequestrTrUZCertificateRevocationListrXrYr5r\r]r`r8�NoReturnr?Z
EllipticCurverqZEllipticCurveSignatureAlgorithmrsZEllipticCurvePrivateKeyrwZEllipticCurvePrivateNumbersr~ZEllipticCurvePublicNumbersZEllipticCurvePublicKeyrr�r�rtr�r�r�rurmr�r�r|r'rLr�r�r�r�r�r�r�r�r�r�ZDHPrivateKeyr�r�ZDHPrivateNumbersr�ZDHPublicNumbersZDHPublicKeyr�ZDHParameterNumbersr�r�r�r/ZX25519PublicKeyr�ZX25519PrivateKeyr�r�r�r�r0Z
X448PublicKeyr�ZX448PrivateKeyr�r�r�r�r,ZEd25519PublicKeyr�ZEd25519PrivateKeyr�r�r�r-ZEd448PublicKeyr�ZEd448PrivateKeyr�r�r�r��Iteratorr�r�r�r��Tupler�rQr�rRrSrrrrrr
rr
rrNZPKCS7SignatureBuilderrr"rZrZrZr[r\�sN
����


	��	�	2���
���
�%�
@-�����
�
*
�	�	�
��5/������'�

�o�7����1�����$
��
�#


���
�O
�X
�
�

�1
�r\c@s,eZdZed�dd�Zeeed�dd�ZdS)r�)�fmtcCs
||_dSr�)�_fmt)rrr.rZrZr[rs�	szGetCipherByName.__init__)rr�r�cCs&|jj||d���}|j�|�d��S)N)r�r�r�)r/ru�lowerrcr�r�)rrrr�r�r�rZrZr[�__call__�	szGetCipherByName.__call__N)	rWrXrYr$rsr\r9rJr1rZrZrZr[r��	sr�)rr�cCs"d�|jd�}|j�|�d��S)Nz
aes-{}-xtsr�r�)rur�rcr�r�)rr�r�r�rZrZr[r��	sr�)y�collectionsr(r�r%rjrZcryptographyrrZcryptography.exceptionsrrZ$cryptography.hazmat.backends.opensslrZ,cryptography.hazmat.backends.openssl.ciphersrZ)cryptography.hazmat.backends.openssl.cmacr
Z'cryptography.hazmat.backends.openssl.dhrrr
rZ(cryptography.hazmat.backends.openssl.dsarrrZ'cryptography.hazmat.backends.openssl.ecrrZ,cryptography.hazmat.backends.openssl.ed25519rrZ*cryptography.hazmat.backends.openssl.ed448rrrZ+cryptography.hazmat.backends.openssl.hashesrZ)cryptography.hazmat.backends.openssl.hmacrZ-cryptography.hazmat.backends.openssl.poly1305rrZ(cryptography.hazmat.backends.openssl.rsarr Z+cryptography.hazmat.backends.openssl.x25519r!r"Z)cryptography.hazmat.backends.openssl.x448r#r$Z"cryptography.hazmat.bindings._rustrPZ$cryptography.hazmat.bindings.opensslr%Zcryptography.hazmat.primitivesr&r'Z*cryptography.hazmat.primitives._asymmetricr(Z)cryptography.hazmat.primitives.asymmetricr)r*r+r,r-r.r/r0Z1cryptography.hazmat.primitives.asymmetric.paddingr1r2r3r4Z/cryptography.hazmat.primitives.asymmetric.typesr5r6r7Z&cryptography.hazmat.primitives.ciphersr8r9Z1cryptography.hazmat.primitives.ciphers.algorithmsr:r;r<r=r>r?r@rArBrCZ,cryptography.hazmat.primitives.ciphers.modesrDrErFrGrHrIrJrKrLZ"cryptography.hazmat.primitives.kdfrMZ,cryptography.hazmat.primitives.serializationrNrOZ3cryptography.hazmat.primitives.serialization.pkcs12rPrQrRrS�
namedtuplerTrVr\r�r�rrZrZrZr[�<module>st(
0,i	

Youez - 2016 - github.com/yon3zu
LinuXploit