# Copyright 2018 Espressif Systems (Shanghai) PTE LTD
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# APIs for interpreting and creating protobuf packets for
# protocomm endpoint with security type protocomm_security0

from __future__ import print_function
from future.utils import tobytes

import proto
from .security import Security


class Security0(Security):
    def __init__(self, verbose):
        # Initialize state of the security1 FSM
        self.session_state = 0
        self.verbose = verbose
        Security.__init__(self, self.security0_session)

    def security0_session(self, response_data):
        # protocomm security0 FSM which interprets/forms
        # protobuf packets according to present state of session
        if (self.session_state == 0):
            self.session_state = 1
            return self.setup0_request()
        if (self.session_state == 1):
            self.setup0_response(response_data)
            return None

    def setup0_request(self):
        # Form protocomm security0 request packet
        setup_req = proto.session_pb2.SessionData()
        setup_req.sec_ver = 0
        session_cmd = proto.sec0_pb2.S0SessionCmd()
        setup_req.sec0.sc.MergeFrom(session_cmd)
        return setup_req.SerializeToString().decode('latin-1')

    def setup0_response(self, response_data):
        # Interpret protocomm security0 response packet
        setup_resp = proto.session_pb2.SessionData()
        setup_resp.ParseFromString(tobytes(response_data))
        # Check if security scheme matches
        if setup_resp.sec_ver != proto.session_pb2.SecScheme0:
            print("Incorrect sec scheme")

    def encrypt_data(self, data):
        # Passive. No encryption when security0 used
        return data

    def decrypt_data(self, data):
        # Passive. No encryption when security0 used
        return data
