diff options
| author | Kali Kaneko <kali@leap.se> | 2013-09-12 13:59:21 +0200 | 
|---|---|---|
| committer | Kali Kaneko <kali@leap.se> | 2013-09-12 13:59:21 +0200 | 
| commit | 91da9e7839f58114471b22bb2694732d6775c6e4 (patch) | |
| tree | 0d48c8b3990971354b4c5517cd1abd69f4d29aeb | |
| parent | 08d9cd69e8f3e58d38a176ce4983e88fa00d693a (diff) | |
| parent | 23b96758a217f5a7b6f1ea7c99294c68b53fae65 (diff) | |
Merge tag '0.3.2' into debian-0.3.2
Tag leap.common release 0.3.2
| -rw-r--r-- | CHANGELOG | 4 | ||||
| -rw-r--r-- | LICENSE | 75 | ||||
| -rw-r--r-- | MANIFEST.in | 3 | ||||
| -rw-r--r-- | pkg/requirements.pip | 2 | ||||
| -rw-r--r-- | src/leap/common/config/__init__.py | 39 | ||||
| -rw-r--r-- | src/leap/common/config/baseconfig.py | 5 | ||||
| -rw-r--r-- | src/leap/common/config/prefixers.py | 132 | ||||
| -rw-r--r-- | src/leap/common/config/tests/test_baseconfig.py | 5 | ||||
| -rw-r--r-- | src/leap/common/config/tests/test_get_path_prefix.py | 63 | ||||
| -rw-r--r-- | src/leap/common/events/client.py | 31 | ||||
| -rw-r--r-- | src/leap/common/events/server.py | 11 | ||||
| -rw-r--r-- | src/leap/common/testing/cacert.pem | 49 | ||||
| -rw-r--r-- | src/leap/common/testing/leaptestscert.pem | 143 | ||||
| -rw-r--r-- | src/leap/common/testing/leaptestskey.pem | 55 | 
14 files changed, 273 insertions, 344 deletions
| @@ -1,3 +1,7 @@ +0.3.2 Sep 06: +  o Use dirspec instead of plain xdg. Closes #3574. +  o Correct use of CallbackAlreadyRegistered exception. +  0.3.1 Aug 23:    o Add libssl-dev requirement for pyOpenSSL.    o Make the server ping call be async inside events' @@ -617,78 +617,3 @@ reviewing courts shall apply local law that most closely approximates  an absolute waiver of all civil liability in connection with the  Program, unless a warranty or assumption of liability accompanies a  copy of the Program in return for a fee. - -                     END OF TERMS AND CONDITIONS - -            How to Apply These Terms to Your New Programs - -  If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - -  To do so, attach the following notices to the program.  It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - -    <one line to give the program's name and a brief idea of what it does.> -    Copyright (C) <year>  <name of author> - -    This program is free software: you can redistribute it and/or modify -    it under the terms of the GNU General Public License as published by -    the Free Software Foundation, either version 3 of the License, or -    (at your option) any later version. - -    This program is distributed in the hope that it will be useful, -    but WITHOUT ANY WARRANTY; without even the implied warranty of -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -    GNU General Public License for more details. - -    You should have received a copy of the GNU General Public License -    along with this program.  If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - -  If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - -    <program>  Copyright (C) <year>  <name of author> -    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -    This is free software, and you are welcome to redistribute it -    under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License.  Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - -  You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - -  The GNU General Public License does not permit incorporating your program -into proprietary programs.  If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library.  If this is what you want to do, use the GNU Lesser General -Public License instead of this License.  But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. - --------------------------------------------------------------------------------- - -Leap-client also uses third party icons: - ---- -data/images/Arrow-Up-32.png -data/images/Arrow-Down-32.png - -Author: Liam McKay -License: GNU General Public License - http://en.wikipedia.org/wiki/GNU_General_Public_License -WebSite: http://wefunction.com/ -IconPackage: WooFunction icon pack - http://www.iconspedia.com/pack/woofunction-icons-4136/ ---- -data/images/Globe.png - -Author: Everaldo Coelho -License: LGPL - http://www.gnu.org/licenses/lgpl.html -WebSite: http://www.everaldo.com/ ----
\ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 3ba80ca..c4058d1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,5 @@ +include pkg/*  include src/leap/common/testing/*.pem  include versioneer.py +include LICENSE +include CHANGELOG diff --git a/pkg/requirements.pip b/pkg/requirements.pip index 9617d92..c89fd19 100644 --- a/pkg/requirements.pip +++ b/pkg/requirements.pip @@ -1,5 +1,5 @@  jsonschema  #<=0.8 -- are we done with this conflict? -pyxdg +dirspec  protobuf>=2.4.1  protobuf.socketrpc  pyopenssl diff --git a/src/leap/common/config/__init__.py b/src/leap/common/config/__init__.py index e69de29..68d92dc 100644 --- a/src/leap/common/config/__init__.py +++ b/src/leap/common/config/__init__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# __init__.py +# Copyright (C) 2013 LEAP +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. +""" +Common configs +""" +import os + +from dirspec.basedir import get_xdg_config_home + + +def get_path_prefix(standalone=False): +    """ +    Returns the platform dependent path prefix. + +    :param standalone: if True it will return the prefix for a standalone +                       application. +                       Otherwise, it will return the system default for +                       configuration storage. +    :type standalone: bool +    """ +    config_home = get_xdg_config_home() +    if standalone: +        config_home = os.path.join(os.getcwd(), "config") + +    return config_home diff --git a/src/leap/common/config/baseconfig.py b/src/leap/common/config/baseconfig.py index e310bc0..2d98031 100644 --- a/src/leap/common/config/baseconfig.py +++ b/src/leap/common/config/baseconfig.py @@ -29,7 +29,7 @@ from abc import ABCMeta, abstractmethod  from leap.common.check import leap_assert, leap_check  from leap.common.files import mkdir_p  from leap.common.config.pluggableconfig import PluggableConfig -from leap.common.config.prefixers import get_platform_prefixer +from leap.common.config import get_path_prefix  logger = logging.getLogger(__name__) @@ -108,8 +108,7 @@ class BaseConfig:          """          Returns the platform dependant path prefixer          """ -        return get_platform_prefixer().get_path_prefix( -            standalone=self.standalone) +        return get_path_prefix(standalone=self.standalone)      def loaded(self):          """ diff --git a/src/leap/common/config/prefixers.py b/src/leap/common/config/prefixers.py deleted file mode 100644 index 9a5b043..0000000 --- a/src/leap/common/config/prefixers.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- coding: utf-8 -*- -# prefixers.py -# Copyright (C) 2013 LEAP -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program.  If not, see <http://www.gnu.org/licenses/>. - -""" -Platform dependant configuration path prefixers -""" -import os -import platform - -from abc import ABCMeta, abstractmethod -from xdg import BaseDirectory - -from leap.common.check import leap_assert - - -class Prefixer: -    """ -    Abstract prefixer class -    """ - -    __metaclass__ = ABCMeta - -    @abstractmethod -    def get_path_prefix(self, standalone=False): -        """ -        Returns the platform dependant path prefixer - -        :param standalone: if True it will return the prefix for a -        standalone application. Otherwise, it will return the system -        default for configuration storage. -        :type standalone: bool -        """ -        return "" - - -def get_platform_prefixer(): -    prefixer = globals()[platform.system() + "Prefixer"] -    leap_assert(prefixer, "Unimplemented platform prefixer: %s" % -                (platform.system(),)) -    return prefixer() - - -class LinuxPrefixer(Prefixer): -    """ -    Config prefixer for the Linux platform -    """ - -    def get_path_prefix(self, standalone=False): -        """ -        Returns the platform dependant path prefixer. -        This method expects an env variable named LEAP_CLIENT_PATH if -        standalone is used. - -        :param standalone: if True it will return the prefix for a -        standalone application. Otherwise, it will return the system -        default for configuration storage. -        :type standalone: bool -        """ -        config_dir = BaseDirectory.xdg_config_home -        if not standalone: -            return config_dir -        return os.path.join(os.getcwd(), "config") - - -class DarwinPrefixer(Prefixer): -    """ -    Config prefixer for the Darwin platform -    """ - -    def get_path_prefix(self, standalone=False): -        """ -        Returns the platform dependant path prefixer. -        This method expects an env variable named LEAP_CLIENT_PATH if -        standalone is used. - -        :param standalone: if True it will return the prefix for a -        standalone application. Otherwise, it will return the system -        default for configuration storage. -        :type standalone: bool -        """ -        config_dir = BaseDirectory.xdg_config_home -        if not standalone: -            return config_dir -        return os.path.join(os.getcwd(), "config") - - -class WindowsPrefixer(Prefixer): -    """ -    Config prefixer for the Windows platform -    """ - -    def get_path_prefix(self, standalone=False): -        """ -        Returns the platform dependant path prefixer. -        This method expects an env variable named LEAP_CLIENT_PATH if -        standalone is used. - -        :param standalone: if True it will return the prefix for a -        standalone application. Otherwise, it will return the system -        default for configuration storage. -        :type standalone: bool -        """ -        config_dir = BaseDirectory.xdg_config_home - -        if not standalone: -            return config_dir -        return os.path.join(os.getcwd(), "config") - -if __name__ == "__main__": -    try: -        abs_prefixer = Prefixer() -    except Exception as e: -        assert isinstance(e, TypeError), "Something went wrong" -        print "Abstract Prefixer class is working as expected" - -    linux_prefixer = LinuxPrefixer() -    print linux_prefixer.get_path_prefix(standalone=True) -    print linux_prefixer.get_path_prefix() diff --git a/src/leap/common/config/tests/test_baseconfig.py b/src/leap/common/config/tests/test_baseconfig.py index 8a2915e..8bdf4d0 100644 --- a/src/leap/common/config/tests/test_baseconfig.py +++ b/src/leap/common/config/tests/test_baseconfig.py @@ -113,9 +113,12 @@ class TestConfig(BaseConfig):      def get_version(self):          return self._safe_get_value("version") -    def _get_spec(self): +    def _get_schema(self):          return sample_spec +    def _get_spec(self): +        return self._get_schema() +      def get_default_language(self):          return self._safe_get_value("default_language") diff --git a/src/leap/common/config/tests/test_get_path_prefix.py b/src/leap/common/config/tests/test_get_path_prefix.py new file mode 100644 index 0000000..27824fc --- /dev/null +++ b/src/leap/common/config/tests/test_get_path_prefix.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# test_get_path_prefix.py +# Copyright (C) 2013 LEAP +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. +""" +Tests for get_path_prefix +""" +import os +import mock + +try: +    import unittest2 as unittest +except ImportError: +    import unittest + +from leap.common.config import get_path_prefix +from leap.common.testing.basetest import BaseLeapTest + + +class GetPathPrefixTest(BaseLeapTest): +    """ +    Tests for the get_path_prefix helper. + +    Note: we only are testing that the path is correctly returned and that if +    we are not in a bundle (standalone=False) then the paths are different. + +    dirspec calculates the correct path using different methods and dlls +    (in case of Windows) so we don't implement tests to check if the paths +    are the correct ones. +    """ +    def setUp(self): +        pass + +    def tearDown(self): +        pass + +    def test_standalone_path(self): +        expected_path = os.path.join('expected', 'path', 'config') +        fake_cwd = os.path.join('expected', 'path') +        with mock.patch('os.getcwd', lambda: fake_cwd): +            path = get_path_prefix(standalone=True) +        self.assertEquals(path, expected_path) + +    def test_path_prefix(self): +        standalone_path = get_path_prefix(standalone=True) +        path = get_path_prefix(standalone=False) +        self.assertNotEquals(path, standalone_path) + + +if __name__ == "__main__": +    unittest.main(verbosity=2) diff --git a/src/leap/common/events/client.py b/src/leap/common/events/client.py index 4ae9bff..83f18e0 100644 --- a/src/leap/common/events/client.py +++ b/src/leap/common/events/client.py @@ -14,7 +14,6 @@  #  # You should have received a copy of the GNU General Public License  # along with this program. If not, see <http://www.gnu.org/licenses/>. -  """  The client end point of the events mechanism. @@ -27,18 +26,15 @@ server that it wants to be notified whenever signals of that type are sent by  some other client.  """ -  import logging -import threading  from protobuf.socketrpc import RpcService -from leap.common.events import ( -    events_pb2 as proto, -    server, -    daemon, -    mac_auth, -) + +from leap.common.events import events_pb2 as proto +from leap.common.events import server +from leap.common.events import daemon +from leap.common.events import mac_auth  logger = logging.getLogger(__name__) @@ -118,9 +114,13 @@ def register(signal, callback, uid=None, replace=False, reqcbk=None,      if signal not in registered_callbacks:          registered_callbacks[signal] = []      cbklist = registered_callbacks[signal] + +    # TODO should check that the callback has the right +    # number of arguments. +      if uid and filter(lambda (x, y): x == uid, cbklist):          if not replace: -            raise CallbackAlreadyRegisteredException() +            raise CallbackAlreadyRegistered()          else:              registered_callbacks[signal] = filter(lambda(x, y): x != uid,                                                    cbklist) @@ -133,12 +133,13 @@ def register(signal, callback, uid=None, replace=False, reqcbk=None,      request.mac = ""      service = RpcService(proto.EventsServerService_Stub,                           server.SERVER_PORT, 'localhost') -    logger.info( +    logger.debug(          "Sending registration request to server on port %s: %s",          server.SERVER_PORT,          str(request)[:40])      return service.register(request, callback=reqcbk, timeout=timeout) +  def unregister(signal, uid=None, reqcbk=None, timeout=1000):      """      Unregister a callback. @@ -226,7 +227,7 @@ def signal(signal, content="", mac_method="", mac="", reqcbk=None,      request.mac = mac      service = RpcService(proto.EventsServerService_Stub, server.SERVER_PORT,                           'localhost') -    logger.info("Sending signal to server: %s", str(request)[:40]) +    logger.debug("Sending signal to server: %s", str(request)[:40])      return service.signal(request, callback=reqcbk, timeout=timeout) @@ -251,7 +252,7 @@ def ping(port, reqcbk=None, timeout=1000):          proto.EventsClientService_Stub,          port,          'localhost') -    logger.info("Pinging a client in port %d..." % port) +    logger.debug("Pinging a client in port %d..." % port)      return service.ping(request, callback=reqcbk, timeout=timeout) @@ -277,7 +278,7 @@ class EventsClientService(proto.EventsClientService):          :param done: callback to be called when done          :type done: protobuf.socketrpc.server.Callback          """ -        logger.info('Received signal from server: %s...' % str(request)[:40]) +        logger.debug('Received signal from server: %s...' % str(request)[:40])          # run registered callbacks          # TODO: verify authentication using mac in incoming message @@ -303,7 +304,7 @@ class EventsClientService(proto.EventsClientService):          :param done: callback to be called when done          :type done: protobuf.socketrpc.server.Callback          """ -        logger.info("Received ping request, sending response.") +        logger.debug("Received ping request, sending response.")          response = proto.EventResponse()          response.status = proto.EventResponse.OK          done.run(response) diff --git a/src/leap/common/events/server.py b/src/leap/common/events/server.py index 861cb4f..dc55551 100644 --- a/src/leap/common/events/server.py +++ b/src/leap/common/events/server.py @@ -85,6 +85,7 @@ def ensure_server(port=SERVER_PORT):          logger.info('Launching server on port %d.', port)          return EventsServerDaemon.ensure(port) +  def process_ping(port, request, response):      """      Response callback for the ping event. @@ -100,7 +101,7 @@ def process_ping(port, request, response):          logger.info('A server is already running on port %d.', port)          return      # port is taken, and not by an events server -    logger.info('Port %d is taken by something not an events server.', port) +    logger.warning('Port %d is taken by something not an events server.', port)      raise PortAlreadyTaken(port) @@ -125,7 +126,7 @@ def ping(port=SERVER_PORT, reqcbk=None, timeout=1000):          proto.EventsServerService_Stub,          port,          'localhost') -    logger.info("Pinging server in port %d..." % port) +    logger.debug("Pinging server in port %d..." % port)      return service.ping(request, callback=reqcbk, timeout=timeout) @@ -196,14 +197,14 @@ class EventsServerService(proto.EventsServerService):          :param done: callback to be called when done          :type done: protobuf.socketrpc.server.Callback          """ -        logger.info('Received signal from client: %s...', str(request)[:40]) +        logger.debug('Received signal from client: %s...', str(request)[:40])          # send signal to all registered clients          # TODO: verify signal auth          if request.event in registered_clients:              for port in registered_clients[request.event]:                  def callback(req, resp): -                    logger.info("Signal received by " + str(port)) +                    logger.debug("Signal received by " + str(port))                  service = RpcService(proto.EventsClientService_Stub,                                       port, 'localhost') @@ -224,7 +225,7 @@ class EventsServerService(proto.EventsServerService):          :param done: callback to be called when done          :type done: protobuf.socketrpc.server.Callback          """ -        logger.info("Received ping request, sending response.") +        logger.debug("Received ping request, sending response.")          response = proto.EventResponse()          response.status = proto.EventResponse.OK          done.run(response) diff --git a/src/leap/common/testing/cacert.pem b/src/leap/common/testing/cacert.pem index 6989c48..30c69c6 100644 --- a/src/leap/common/testing/cacert.pem +++ b/src/leap/common/testing/cacert.pem @@ -1,23 +1,30 @@  -----BEGIN CERTIFICATE----- -MIID1TCCAr2gAwIBAgIJAOv0BS09D8byMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD -VQQGEwJVUzETMBEGA1UECAwKY3liZXJzcGFjZTEnMCUGA1UECgweTEVBUCBFbmNy -eXB0aW9uIEFjY2VzcyBQcm9qZWN0MRYwFAYDVQQDDA10ZXN0cy1sZWFwLnNlMRsw -GQYJKoZIhvcNAQkBFgxpbmZvQGxlYXAuc2UwHhcNMTIwODMxMTYyNjMwWhcNMTUw -ODMxMTYyNjMwWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCmN5YmVyc3BhY2Ux -JzAlBgNVBAoMHkxFQVAgRW5jcnlwdGlvbiBBY2Nlc3MgUHJvamVjdDEWMBQGA1UE -AwwNdGVzdHMtbGVhcC5zZTEbMBkGCSqGSIb3DQEJARYMaW5mb0BsZWFwLnNlMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1pU7OU+abrUXFZwp6X0LlF0f -xQvC1Nmr5sFH7N9RTu3bdwY2t57ECP2TPkH6+x7oOvCTgAMxIE1scWEEkfgKViqW -FH/Om1UW1PMaiDYGtFuqEuxM95FvaYxp2K6rzA37WNsedA28sCYzhRD+/5HqbCNT -3rRS2cPaVO8kXI/5bgd8bUk3009pWTg4SvTtOW/9MWJbBH5f5JWmMn7Ayt6hIdT/ -E6npofEK/UCqAlEscARYFXSB/F8nK1whjo9mGFjMUd7d/25UbFHqOk4K7ishD4DH -F7LaS84rS+Sjwn3YtDdDQblGghJfz8X1AfPSGivGnvLVdkmMF9Y2hJlSQ7+C5wID -AQABo1AwTjAdBgNVHQ4EFgQUnpJEv4FnlqKbfm7mprudKdrnOAowHwYDVR0jBBgw -FoAUnpJEv4FnlqKbfm7mprudKdrnOAowDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B -AQUFAAOCAQEAGW66qwdK/ATRVZkTpI2sgi+2dWD5tY4VyZuJIrRwfXsGPeVvmdsa -zDmwW5dMkth1Of5yO6o7ijvUvfnw/UCLNLNICKZhH5G0DHstfBeFc0jnP2MqOZCp -puRGPBlO2nxUCvoGcPRUKGQK9XSYmxcmaSFyzKVDMLnmH+Lakj5vaY9a8ZAcZTz7 -T5qePxKAxg+RIlH8Ftc485QP3fhqPYPrRsL3g6peiqCvIRshoP1MSoh19boI+1uX -wHQ/NyDkL5ErKC5JCSpaeF8VG1ek570kKWQLuQAbnlXZw+Sqfu35CIdizHaYGEcx -xA8oXH4L2JaT2x9GKDSpCmB2xXy/NVamUg== +MIIFGDCCBACgAwIBAgIJAIu/QWMeEGrsMA0GCSqGSIb3DQEBBQUAMIG4MQswCQYD +VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkN5YmVyc3BhY2UxJzAlBgNV +BAoTHkxFQVAgRW5jcnlwdGlvbiBBY2Nlc3MgUHJvamVjdDETMBEGA1UECxMKY3li +ZXJzcGFjZTEWMBQGA1UEAxMNdGVzdHMtbGVhcC5zZTETMBEGA1UEKRMKdGVzdHMt +bGVhcDEcMBoGCSqGSIb3DQEJARYNdGVzdHNAbGVhcC5zZTAeFw0xMzA5MDMxNTA0 +MTFaFw0yMzA5MDExNTA0MTFaMIG4MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0Ex +EzARBgNVBAcTCkN5YmVyc3BhY2UxJzAlBgNVBAoTHkxFQVAgRW5jcnlwdGlvbiBB +Y2Nlc3MgUHJvamVjdDETMBEGA1UECxMKY3liZXJzcGFjZTEWMBQGA1UEAxMNdGVz +dHMtbGVhcC5zZTETMBEGA1UEKRMKdGVzdHMtbGVhcDEcMBoGCSqGSIb3DQEJARYN +dGVzdHNAbGVhcC5zZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ9R +L/azQ7jIzmB6+VEKFSdDw27DMq/aN87grNHqNAQiiU7b3hJLff9CAgMZhP92hB7X +Wwg/TN7IEMLUacP0EChRekI6VtpsNBlfb5g/8yq4kORWhniY99dnjbJaw2sGA3Oh +azySIvrKPxE/V393dmOQq+RFO4S+ytcq+rUILVFQX4lnFUHTyGGtpgMnB3smxJ8K +WPu9bZej0GXjeWgVb28HxoqMEJC+4lScRZT/p7VhWN0QmOW3SP4l65guvDStdTGY +z3uOFbGRuSRN9nHwTxe5COhyOa1TrEp89noHOGt3DRba4ZN4QUF3vX+c5JKaF6Ie +s7LajB3hSWe/8ifT9oMCAwEAAaOCASEwggEdMB0GA1UdDgQWBBQ2GXCWqVz+o4IP +eZUxUitKQb2ByzCB7QYDVR0jBIHlMIHigBQ2GXCWqVz+o4IPeZUxUitKQb2By6GB +vqSBuzCBuDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpDeWJl +cnNwYWNlMScwJQYDVQQKEx5MRUFQIEVuY3J5cHRpb24gQWNjZXNzIFByb2plY3Qx +EzARBgNVBAsTCmN5YmVyc3BhY2UxFjAUBgNVBAMTDXRlc3RzLWxlYXAuc2UxEzAR +BgNVBCkTCnRlc3RzLWxlYXAxHDAaBgkqhkiG9w0BCQEWDXRlc3RzQGxlYXAuc2WC +CQCLv0FjHhBq7DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQBVBey7 +ohxU/ir7g3In+uk3iyfZT+yhmjz1j6IWqbno+sc3CfCOiEgTRTphFTN2aP6pvigD +yKUBYZ0NRA5mAl3xopeT819DPkLgkacm4wugYKqV+60yrekmbEWsu/T5/jLWHN6s +QelIKdLklA9oivM1lCIqR+XV4A2MX3zwXdEmZp8QYiBAqLf49wgCLhSOrgXXUlb0 +EUMsyclHs9PN33YRd9qQiE0hwBwpcxxus/sonnMP2xDiDiCu6dnYC7BmzfYfgiS5 +7tfEGpKyuY+7J+etOzOKfkNA20ooVRvvpQ4rpcHulKwZE3yI0geW7YS2uL+p5ORO +twHvLcMPlAXUkXhS  -----END CERTIFICATE----- diff --git a/src/leap/common/testing/leaptestscert.pem b/src/leap/common/testing/leaptestscert.pem index 65596b1..7cb9265 100644 --- a/src/leap/common/testing/leaptestscert.pem +++ b/src/leap/common/testing/leaptestscert.pem @@ -1,84 +1,99 @@  Certificate:      Data:          Version: 3 (0x2) -        Serial Number: -            eb:f4:05:2d:3d:0f:c6:f3 +        Serial Number: 4 (0x4)      Signature Algorithm: sha1WithRSAEncryption -        Issuer: C=US, ST=cyberspace, O=LEAP Encryption Access Project, CN=tests-leap.se/emailAddress=info@leap.se +        Issuer: C=US, ST=CA, L=Cyberspace, O=LEAP Encryption Access Project, OU=cyberspace, CN=tests-leap.se/name=tests-leap/emailAddress=tests@leap.se          Validity -            Not Before: Aug 31 16:30:17 2012 GMT -            Not After : Aug 31 16:30:17 2013 GMT -        Subject: C=US, ST=cyberspace, L=net, O=LEAP Encryption Access Project, CN=localhost/emailAddress=info@leap.se +            Not Before: Sep  3 17:52:16 2013 GMT +            Not After : Sep  1 17:52:16 2023 GMT +        Subject: C=US, ST=CA, L=Cyberspace, O=LEAP Encryption Access Project, OU=cyberspace, CN=localhost/name=tests-leap/emailAddress=tests@leap.se          Subject Public Key Info:              Public Key Algorithm: rsaEncryption                  Public-Key: (2048 bit)                  Modulus: -                    00:bc:f1:c4:05:ce:4b:d5:9b:9a:fa:c1:a5:0c:89: -                    15:7e:05:69:b6:a4:62:38:3a:d6:14:4a:36:aa:3c: -                    31:70:54:2e:bf:7d:05:19:ad:7b:0c:a9:a6:7d:46: -                    be:83:62:cb:ea:b9:48:6c:7d:78:a0:10:0b:ad:8a: -                    74:7a:b8:ff:32:85:64:36:90:dc:38:dd:90:6e:07: -                    82:70:ae:5f:4e:1f:f4:46:98:f3:98:b4:fa:08:65: -                    bf:d6:ec:a9:ba:7e:a8:f0:40:a2:d0:1a:cb:e6:fc: -                    95:c5:54:63:92:5b:b8:0a:36:cc:26:d3:2b:ad:16: -                    ff:49:53:f4:65:7c:64:27:9a:f5:12:75:11:a5:0c: -                    5a:ea:1e:e4:31:f3:a6:2b:db:0e:4a:5d:aa:47:3a: -                    f0:5e:2a:d5:6f:74:b6:f8:bc:9a:73:d0:fa:8a:be: -                    a8:69:47:9b:07:45:d9:b5:cd:1c:9b:c5:41:9a:65: -                    cc:99:a0:bd:bf:b5:e8:9f:66:5f:69:c9:6d:c8:68: -                    50:68:74:ae:8e:12:7e:9c:24:4f:dc:05:61:b7:8a: -                    6d:2a:95:43:d9:3f:fe:d8:c9:a7:ae:63:cd:30:d5: -                    95:84:18:2d:12:b5:2d:a6:fe:37:dd:74:b8:f8:a5: -                    59:18:8f:ca:f7:ae:63:0d:9d:66:51:7d:9c:40:48: -                    9b:a1 +                    00:c0:4f:ae:dc:f3:2e:0e:45:ae:a8:fe:0a:2b:de: +                    00:28:b8:92:3a:5b:a4:7b:62:53:f3:ce:1e:2e:69: +                    b6:b8:62:1a:a0:00:46:73:71:9e:d2:e7:cf:42:a8: +                    e3:7c:12:8f:06:da:d4:2f:87:e6:52:68:d9:8f:89: +                    d1:43:8c:5c:5f:a5:bd:6c:04:c6:fd:36:ee:f6:d2: +                    cd:15:f1:43:31:cc:20:e1:ee:8c:9e:3d:91:9d:28: +                    ff:85:d3:8f:8c:90:1d:1e:1d:64:8e:6c:1a:f3:b2: +                    3b:23:29:5b:03:ff:97:d4:78:b6:dd:d5:27:4a:d4: +                    2d:9c:2b:3b:28:45:0f:86:54:4c:8c:25:e8:88:48: +                    59:55:d3:97:f1:74:06:52:c9:b3:dc:c0:7f:b7:6a: +                    25:57:fb:b7:0c:f5:e9:3c:6e:e7:c8:7a:aa:c0:7d: +                    95:5d:bc:ef:f6:16:eb:fa:59:f4:76:30:47:b7:d9: +                    73:bf:f6:08:f4:d9:74:86:59:de:ac:3d:73:27:fe: +                    57:e5:2a:f3:4d:28:45:82:51:67:6a:4c:0a:c6:8b: +                    40:aa:43:80:fe:43:bd:eb:b9:42:2d:84:22:6b:fb: +                    b2:d6:2b:ee:d0:28:6f:7c:d1:ad:51:47:b1:99:26: +                    fb:37:b2:48:54:0e:1d:de:b9:ad:ae:20:23:e2:a9: +                    02:e5                  Exponent: 65537 (0x10001)          X509v3 extensions:              X509v3 Basic Constraints:                   CA:FALSE +            Netscape Cert Type:  +                SSL Server              Netscape Comment:  -                OpenSSL Generated Certificate +                Easy-RSA Generated Server Certificate              X509v3 Subject Key Identifier:  -                B2:50:B4:C6:38:8F:BA:C4:3B:69:4C:6B:45:7C:CF:08:48:36:02:E0 +                51:92:B6:A3:D7:D6:EC:8F:FC:16:C5:D4:0F:87:CC:EA:5C:7C:17:81              X509v3 Authority Key Identifier:  -                keyid:9E:92:44:BF:81:67:96:A2:9B:7E:6E:E6:A6:BB:9D:29:DA:E7:38:0A +                keyid:36:19:70:96:A9:5C:FE:A3:82:0F:79:95:31:52:2B:4A:41:BD:81:CB +                DirName:/C=US/ST=CA/L=Cyberspace/O=LEAP Encryption Access Project/OU=cyberspace/CN=tests-leap.se/name=tests-leap/emailAddress=tests@leap.se +                serial:8B:BF:41:63:1E:10:6A:EC +            X509v3 Extended Key Usage:  +                TLS Web Server Authentication +            X509v3 Key Usage:  +                Digital Signature, Key Encipherment      Signature Algorithm: sha1WithRSAEncryption -         aa:ab:d4:27:e3:cb:42:05:55:fd:24:b3:e5:55:7d:fb:ce:6c: -         ff:c7:96:f0:7d:30:a1:53:4a:04:eb:a4:24:5e:96:ee:65:ef: -         e5:aa:08:47:9d:aa:95:2a:bb:6a:28:9f:51:62:63:d9:7d:1a: -         81:a0:72:f7:9f:33:6b:3b:f4:dc:85:cd:2a:ee:83:a9:93:3d: -         75:53:91:fa:0b:1b:10:83:11:2c:03:4e:ac:bf:c3:e6:25:74: -         9f:14:13:4a:43:66:c2:d7:1c:6c:94:3e:a6:f3:a5:bd:01:2c: -         9f:20:29:2e:62:82:12:d8:8b:70:1b:88:2b:18:68:5a:45:80: -         46:2a:6a:d5:df:1f:d3:e8:57:39:0a:be:1a:d8:b0:3e:e5:b6: -         c3:69:b7:5e:c0:7b:b3:a8:a6:78:ee:0a:3d:a0:74:40:fb:42: -         9f:f4:98:7f:47:cc:15:28:eb:b1:95:77:82:a8:65:9b:46:c3: -         4f:f9:f4:72:be:bd:24:28:5c:0d:b3:89:e4:13:71:c8:a7:54: -         1b:26:15:f3:c1:b2:a9:13:77:54:c2:b9:b0:c7:24:39:00:4c: -         1a:a7:9b:e7:ad:4a:3a:32:c2:81:0d:13:2d:27:ea:98:00:a9: -         0e:9e:38:3b:8f:80:34:17:17:3d:49:7e:f4:a5:19:05:28:08: -         7d:de:d3:1f +         88:d9:35:e0:d9:fa:fd:6b:57:e2:4d:f6:ef:91:6f:56:a6:2b: +         1a:1e:ec:8f:b0:18:e3:ec:ca:c9:1e:78:07:1d:0f:cf:fe:09: +         21:84:25:c4:27:ea:22:d7:48:53:73:ed:78:0f:42:5c:c7:f7: +         38:04:84:df:67:99:fd:75:6f:e8:dc:3b:91:ab:fa:c7:32:e5: +         fd:3b:ce:de:7c:6a:df:39:46:1e:46:3a:4d:e1:e1:60:f3:bf: +         aa:b2:0b:5d:ee:f2:0c:ee:82:7f:b5:02:75:04:47:d5:2b:c8: +         e0:6d:6a:10:4a:ca:e0:c3:4f:ee:ff:15:71:37:f5:4d:95:38: +         fe:a3:da:84:46:90:04:c2:61:86:a0:7f:e2:7d:62:46:6d:f6: +         f8:90:51:88:c3:f2:8c:ca:b3:89:40:9f:6b:8b:33:65:e1:fd: +         0f:8b:d7:6a:93:dc:de:be:85:07:c7:d1:1d:b5:db:70:54:9f: +         95:d8:fb:11:f7:a7:e6:90:ba:9b:28:0e:3d:47:7a:63:6d:60: +         44:f6:96:aa:b6:a2:bc:0a:e5:25:c8:a2:74:91:54:95:bb:e2: +         09:01:56:73:6e:56:e8:6f:d6:a5:d8:18:96:c1:82:ef:2c:9e: +         e2:4c:94:bc:00:71:5e:16:49:6b:e4:94:7a:d1:0c:2e:f4:19: +         b2:2a:c2:b8  -----BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAOv0BS09D8bzMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD -VQQGEwJVUzETMBEGA1UECAwKY3liZXJzcGFjZTEnMCUGA1UECgweTEVBUCBFbmNy -eXB0aW9uIEFjY2VzcyBQcm9qZWN0MRYwFAYDVQQDDA10ZXN0cy1sZWFwLnNlMRsw -GQYJKoZIhvcNAQkBFgxpbmZvQGxlYXAuc2UwHhcNMTIwODMxMTYzMDE3WhcNMTMw -ODMxMTYzMDE3WjCBijELMAkGA1UEBhMCVVMxEzARBgNVBAgMCmN5YmVyc3BhY2Ux -DDAKBgNVBAcMA25ldDEnMCUGA1UECgweTEVBUCBFbmNyeXB0aW9uIEFjY2VzcyBQ -cm9qZWN0MRIwEAYDVQQDDAlsb2NhbGhvc3QxGzAZBgkqhkiG9w0BCQEWDGluZm9A -bGVhcC5zZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALzxxAXOS9Wb -mvrBpQyJFX4FabakYjg61hRKNqo8MXBULr99BRmtewyppn1GvoNiy+q5SGx9eKAQ -C62KdHq4/zKFZDaQ3DjdkG4HgnCuX04f9EaY85i0+ghlv9bsqbp+qPBAotAay+b8 -lcVUY5JbuAo2zCbTK60W/0lT9GV8ZCea9RJ1EaUMWuoe5DHzpivbDkpdqkc68F4q -1W90tvi8mnPQ+oq+qGlHmwdF2bXNHJvFQZplzJmgvb+16J9mX2nJbchoUGh0ro4S -fpwkT9wFYbeKbSqVQ9k//tjJp65jzTDVlYQYLRK1Lab+N910uPilWRiPyveuYw2d -ZlF9nEBIm6ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl -blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFLJQtMY4j7rEO2lM -a0V8zwhINgLgMB8GA1UdIwQYMBaAFJ6SRL+BZ5aim35u5qa7nSna5zgKMA0GCSqG -SIb3DQEBBQUAA4IBAQCqq9Qn48tCBVX9JLPlVX37zmz/x5bwfTChU0oE66QkXpbu -Ze/lqghHnaqVKrtqKJ9RYmPZfRqBoHL3nzNrO/Tchc0q7oOpkz11U5H6CxsQgxEs -A06sv8PmJXSfFBNKQ2bC1xxslD6m86W9ASyfICkuYoIS2ItwG4grGGhaRYBGKmrV -3x/T6Fc5Cr4a2LA+5bbDabdewHuzqKZ47go9oHRA+0Kf9Jh/R8wVKOuxlXeCqGWb -RsNP+fRyvr0kKFwNs4nkE3HIp1QbJhXzwbKpE3dUwrmwxyQ5AEwap5vnrUo6MsKB -DRMtJ+qYAKkOnjg7j4A0Fxc9SX70pRkFKAh93tMf +MIIFdDCCBFygAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBuDELMAkGA1UEBhMCVVMx +CzAJBgNVBAgTAkNBMRMwEQYDVQQHEwpDeWJlcnNwYWNlMScwJQYDVQQKEx5MRUFQ +IEVuY3J5cHRpb24gQWNjZXNzIFByb2plY3QxEzARBgNVBAsTCmN5YmVyc3BhY2Ux +FjAUBgNVBAMTDXRlc3RzLWxlYXAuc2UxEzARBgNVBCkTCnRlc3RzLWxlYXAxHDAa +BgkqhkiG9w0BCQEWDXRlc3RzQGxlYXAuc2UwHhcNMTMwOTAzMTc1MjE2WhcNMjMw +OTAxMTc1MjE2WjCBtDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRMwEQYDVQQH +EwpDeWJlcnNwYWNlMScwJQYDVQQKEx5MRUFQIEVuY3J5cHRpb24gQWNjZXNzIFBy +b2plY3QxEzARBgNVBAsTCmN5YmVyc3BhY2UxEjAQBgNVBAMTCWxvY2FsaG9zdDET +MBEGA1UEKRMKdGVzdHMtbGVhcDEcMBoGCSqGSIb3DQEJARYNdGVzdHNAbGVhcC5z +ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBPrtzzLg5Frqj+Cive +ACi4kjpbpHtiU/POHi5ptrhiGqAARnNxntLnz0Ko43wSjwba1C+H5lJo2Y+J0UOM +XF+lvWwExv027vbSzRXxQzHMIOHujJ49kZ0o/4XTj4yQHR4dZI5sGvOyOyMpWwP/ +l9R4tt3VJ0rULZwrOyhFD4ZUTIwl6IhIWVXTl/F0BlLJs9zAf7dqJVf7twz16Txu +58h6qsB9lV287/YW6/pZ9HYwR7fZc7/2CPTZdIZZ3qw9cyf+V+Uq800oRYJRZ2pM +CsaLQKpDgP5Dveu5Qi2EImv7stYr7tAob3zRrVFHsZkm+zeySFQOHd65ra4gI+Kp +AuUCAwEAAaOCAYkwggGFMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDQG +CWCGSAGG+EIBDQQnFiVFYXN5LVJTQSBHZW5lcmF0ZWQgU2VydmVyIENlcnRpZmlj +YXRlMB0GA1UdDgQWBBRRkraj19bsj/wWxdQPh8zqXHwXgTCB7QYDVR0jBIHlMIHi +gBQ2GXCWqVz+o4IPeZUxUitKQb2By6GBvqSBuzCBuDELMAkGA1UEBhMCVVMxCzAJ +BgNVBAgTAkNBMRMwEQYDVQQHEwpDeWJlcnNwYWNlMScwJQYDVQQKEx5MRUFQIEVu +Y3J5cHRpb24gQWNjZXNzIFByb2plY3QxEzARBgNVBAsTCmN5YmVyc3BhY2UxFjAU +BgNVBAMTDXRlc3RzLWxlYXAuc2UxEzARBgNVBCkTCnRlc3RzLWxlYXAxHDAaBgkq +hkiG9w0BCQEWDXRlc3RzQGxlYXAuc2WCCQCLv0FjHhBq7DATBgNVHSUEDDAKBggr +BgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggEBAIjZNeDZ+v1r +V+JN9u+Rb1amKxoe7I+wGOPsyskeeAcdD8/+CSGEJcQn6iLXSFNz7XgPQlzH9zgE +hN9nmf11b+jcO5Gr+scy5f07zt58at85Rh5GOk3h4WDzv6qyC13u8gzugn+1AnUE +R9UryOBtahBKyuDDT+7/FXE39U2VOP6j2oRGkATCYYagf+J9YkZt9viQUYjD8ozK +s4lAn2uLM2Xh/Q+L12qT3N6+hQfH0R2123BUn5XY+xH3p+aQupsoDj1HemNtYET2 +lqq2orwK5SXIonSRVJW74gkBVnNuVuhv1qXYGJbBgu8snuJMlLwAcV4WSWvklHrR +DC70GbIqwrg=  -----END CERTIFICATE----- diff --git a/src/leap/common/testing/leaptestskey.pem b/src/leap/common/testing/leaptestskey.pem index fe6291a..3a3f3fc 100644 --- a/src/leap/common/testing/leaptestskey.pem +++ b/src/leap/common/testing/leaptestskey.pem @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAvPHEBc5L1Zua+sGlDIkVfgVptqRiODrWFEo2qjwxcFQuv30F -Ga17DKmmfUa+g2LL6rlIbH14oBALrYp0erj/MoVkNpDcON2QbgeCcK5fTh/0Rpjz -mLT6CGW/1uypun6o8ECi0BrL5vyVxVRjklu4CjbMJtMrrRb/SVP0ZXxkJ5r1EnUR -pQxa6h7kMfOmK9sOSl2qRzrwXirVb3S2+Lyac9D6ir6oaUebB0XZtc0cm8VBmmXM -maC9v7Xon2ZfacltyGhQaHSujhJ+nCRP3AVht4ptKpVD2T/+2MmnrmPNMNWVhBgt -ErUtpv433XS4+KVZGI/K965jDZ1mUX2cQEiboQIDAQABAoIBAQCh/+yhSbrtoCgm -PegEsnix/3QfPBxWt+Obq/HozglZlWQrnMbFuF+bgM4V9ZUdU5UhYNF+66mEG53X -orGyE3IDYCmHO3cGbroKDPhDIs7mTjGEYlniIbGLh6oPXgU8uKKis9ik84TGPOUx -NuTUtT07zLYHx+FX3DLwLUKLzTaWWSRgA7nxNwCY8aPqDxCkXEyZHvSlm9KYZnhe -nVevycoHR+chxL6X/ebbBt2FKR7tl4328mlDXvMXr0vahPH94CuXEvfTj+f6ZxZF -OctdikyRfd8O3ebrUw0XjafPYyTsDMH0/rQovEBVlecEHqh6Z9dBFlogRq5DSun9 -jem4bBXRAoGBAPGPi4g21pTQPqTFxpqea8TsPqIfo3csfMDPdzT246MxzALHqCfG -yZi4g2JYJrReSWHulZDORO5skSKNEb5VTA/3xFhKLt8CULZOakKBDLkzRXlnDFXg -Jsu9vtjDWjQcJsdsRx1tc5V6s+hmel70aaUu/maUlEYZnyIXaTe+1SB1AoGBAMg9 -EMEO5YN52pOI5qPH8j7uyVKtZWKRiR6jb5KA5TxWqZalSdPV6YwDqV/e+HjWrZNw -kSEFONY0seKpIHwXchx91aym7rDHUgOoBQfCWufRMYvRXLhfOTBu4X+U52++i8wt -FvKgh6eSmc7VayAaDfHp7yfrIfS03IiN0T35mGj9AoGAPCoXg7a83VW8tId5/trE -VsjMlM6yhSU0cUV7GFsBuYzWlj6qODX/0iTqvFzeTwBI4LZu1CE78/Jgd62RJMnT -5wo8Ag1//RVziuSe/K9tvtbxT9qFrQHmR8qbtRt65Q257uOeFstDBZEJLDIR+oJ/ -qZ+5x0zsXUVWaERSdYr3RF0CgYEApKDgN3oB5Ti4Jnh1984aMver+heptYKmU9RX -lQH4dsVhpQO8UTgcTgtso+/0JZWLHB9+ksFyW1rzrcETfjLglOA4XzzYHeuiWHM5 -v4lhqBpsO+Ij80oHAPUI3RYVud/VnEauCUlGftWfM1hwPPJu6KhHAnDleAWDE5pV -oDinwBkCgYEAnn/OceaqA2fNYp1IRegbFzpewjUlHLq3bXiCIVhO7W/HqsdfUxjE -VVdjEno/pAG7ZCO5j8u+rLkG2ZIVY3qsUENUiXz52Q08qEltgM8nfirK7vIQkfd9 -YISRE3QHYJd+ArY4v+7rNeF1O5eIEyzPAbvG5raeZFcZ6POxy66uWKo= ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDAT67c8y4ORa6o +/gor3gAouJI6W6R7YlPzzh4uaba4YhqgAEZzcZ7S589CqON8Eo8G2tQvh+ZSaNmP +idFDjFxfpb1sBMb9Nu720s0V8UMxzCDh7oyePZGdKP+F04+MkB0eHWSObBrzsjsj +KVsD/5fUeLbd1SdK1C2cKzsoRQ+GVEyMJeiISFlV05fxdAZSybPcwH+3aiVX+7cM +9ek8bufIeqrAfZVdvO/2Fuv6WfR2MEe32XO/9gj02XSGWd6sPXMn/lflKvNNKEWC +UWdqTArGi0CqQ4D+Q73ruUIthCJr+7LWK+7QKG980a1RR7GZJvs3skhUDh3eua2u +ICPiqQLlAgMBAAECggEBAKJr6j0UagaF1dFG1eJc2neKA36kXdQTpOIaaKU8haVO +vjv6X4YrJT/tpsAfEhp9Ni1M7r7CIcXiZjVz6bkKOA5UVhqAImxEVClEuw/YN688 +P11yc3NGftBkiwNFPk0yflUr7/zV0yGVm5rD1+oVme9KkO/kkg4CDA+E9664PTdu +S4NVvL6OgHUG2nucqIz0kzUBapo7okIkvggfldeDYF47rn/e0VikNpKkMzoCzWs+ +3ryzldfigwg18rE2nltQYk/Mi+H30iNTNEonLjs9YbiDPn8iy5SZ7xY4lAO1Urev +skdY04hmkOzh9JEETHeTj1LUIw7tfRdS3X6B+19gkCECgYEA+41UOLBb0ZHsGjsA +aZBtI4g8mvGTOFe/Az7Jm0404z6e8AIe4NeSJoJ6oV6WG2BmKvqTViYT2QnmauHA +WB1xJ5fH3PK7/LjICI2QE247E294+g5p1KYysALc2fChfJNpdfETzWJAUSSBFqxb +amCDZ4Gc8S/V44fEkJKPLuAvxL0CgYEAw7YyGsEX+lDGzumFQY4wz20+Cyvilnx0 +xoFGQ85RSprZttU64PID/u1HD9/Nv4lGcBDcTTtrmOEk9x51YzttrsPF9sn+Wj0y +eahuR32Qc1652Y7fAKgN2vIZRFBcGpAsemcoqmYFRMImX60G0areKaclooimTbJA +Si52P4IKnUkCgYAI+07ah1F/9hncBedJ3aJH9oFTdvSuulNTplZEeVJiGsZKA4le +tdO+FEKUqG/rolGDj1bbaJik0zmq70yS2NpFc6HrPa+Aoohh5cwTJYhudTh4lTMq +KJT+u9tu3KynagwF7gmq96scOpVxXc4VykRm2bXk1rRoX1yhXNpH7jFGcQKBgCn/ +v2DebzbYftGIa4BV80OQPfBHyqhgrO6sb1e9vtQzxuTlfW0ogpMCeG1/qbegzeze +sWghiEWWi0g80RQqfK80dBcx4dObrmlNK91LpOQdP+TgNBr/9Xk22xU96YYJyoG6 +AZAPtLG8uF9v0jbMZECsDfeDO60Qw5snvViDn6OBAoGACAbbQCbuh0cduDVwn0uz +8XDyRTKDhOsJ3p6UB1TjwvbLeoPI93Dv1gpEeoqELtCu+ZXr3+/i/IbwrxucrFNn +L/s+4zR2mlEAxBdtCFsH/Qf7+iYpBFSo4YReXz3xR+EVTmswzodJCbtF74oQSr6o +7d56Rd/5k2UkFeXnlGOLyAc= +-----END PRIVATE KEY----- | 
