CSRManagerServer.cpp 4.32 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
    Copyright (C) 2019-Present SKALE Labs

    This file is part of sgxwallet.

    sgxwallet is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    sgxwallet 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 Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with sgxwallet.  If not, see <https://www.gnu.org/licenses/>.

    @file CSRManager.cpp
    @author Stan Kladko
    @date 2019
*/

24 25 26 27 28
#include <iostream>
#include <fstream>

#include <jsonrpccpp/server/connectors/httpserver.h>

kladko's avatar
kladko committed
29 30 31 32 33
#include "CSRManagerServer.h"
#include "SGXException.h"
#include "sgxwallet_common.h"

#include "Log.h"
34
#include "common.h"
35

kladko's avatar
kladko committed
36 37
shared_ptr<CSRManagerServer> CSRManagerServer::cs = nullptr;
shared_ptr<jsonrpc::HttpServer> CSRManagerServer::hs3 = nullptr;
38 39

CSRManagerServer::CSRManagerServer(AbstractServerConnector &connector,
40
                                   serverVersion_t type) : abstractCSRManagerServer(connector, type) {}
41

42
Json::Value getUnsignedCSRsImpl() {
kladko's avatar
kladko committed
43 44
    spdlog::info(__FUNCTION__);
    INIT_RESULT(result)
45

46 47 48 49 50
    try {
        vector<string> hashes_vect = LevelDB::getCsrDb()->writeKeysToVector1(MAX_CSR_NUM);
        for (int i = 0; i < (int) hashes_vect.size(); i++) {
            result["hashes"][i] = hashes_vect.at(i);
        }
kladko's avatar
kladko committed
51
    } HANDLE_SGX_EXCEPTION(result);
52

53 54
    return result;
}
55

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
Json::Value signByHashImpl(const string &hash, int status) {
    Json::Value result;
    result["errorMessage"] = "";

    try {
        if (!(status == 0 || status == 2)) {
            throw SGXException(-111, "Invalid csr status");
        }

        string csr_db_key = "CSR:HASH:" + hash;
        shared_ptr<string> csr_ptr = LevelDB::getCsrDb()->readString(csr_db_key);
        if (csr_ptr == nullptr) {
            throw SGXException(KEY_SHARE_DOES_NOT_EXIST, "HASH DOES NOT EXIST IN DB");
        }

        if (status == 0) {
            string csr_name = "sgx_data/cert/" + hash + ".csr";
            ofstream outfile(csr_name);
            outfile << *csr_ptr << endl;
            outfile.close();
            if (access(csr_name.c_str(), F_OK) != 0) {
                LevelDB::getCsrDb()->deleteKey(csr_db_key);
                throw SGXException(FILE_NOT_FOUND, "Csr does not exist");
            }

            string signClientCert = "cd sgx_data/cert && ./create_client_cert " + hash;

            if (system(signClientCert.c_str()) == 0) {
                spdlog::info("CLIENT CERTIFICATE IS SUCCESSFULLY GENERATED");
            } else {
                spdlog::info("CLIENT CERTIFICATE GENERATION FAILED");
                LevelDB::getCsrDb()->deleteKey(csr_db_key);
                string status_db_key = "CSR:HASH:" + hash + "STATUS:";
                LevelDB::getCsrStatusDb()->deleteKey(status_db_key);
                LevelDB::getCsrStatusDb()->writeDataUnique(status_db_key, "-1");
                throw SGXException(FAIL_TO_CREATE_CERTIFICATE, "CLIENT CERTIFICATE GENERATION FAILED");
                //exit(-1);
            }
        }
95

96 97 98
        LevelDB::getCsrDb()->deleteKey(csr_db_key);
        string status_db_key = "CSR:HASH:" + hash + "STATUS:";
        LevelDB::getCsrStatusDb()->deleteKey(status_db_key);
99
        LevelDB::getCsrStatusDb()->writeDataUnique(status_db_key, to_string(status));
100

101
        result["status"] = status;
102

kladko's avatar
kladko committed
103
    } HANDLE_SGX_EXCEPTION(result)
104

105
    return result;
106 107
}

108
Json::Value CSRManagerServer::getUnsignedCSRs() {
kladko's avatar
kladko committed
109
    LOCK(m)
110
    return getUnsignedCSRsImpl();
111 112
}

113
Json::Value CSRManagerServer::signByHash(const string &hash, int status) {
kladko's avatar
kladko committed
114
    LOCK(m)
115
    return signByHashImpl(hash, status);
116 117
}

kladko's avatar
kladko committed
118
int CSRManagerServer::initCSRManagerServer() {
kladko's avatar
kladko committed
119
    hs3 = make_shared<jsonrpc::HttpServer>(BASE_PORT + 2);
120
    hs3->BindLocalhost();
kladko's avatar
kladko committed
121
    cs = make_shared<CSRManagerServer>(*hs3, JSONRPC_SERVER_V2); // server (json-rpc 2.0)
122 123 124 125 126 127 128 129

    if (!cs->StartListening()) {
        spdlog::info("CSR manager server could not start listening");
        exit(-1);
    } else {
        spdlog::info("CSR manager server started on port {}", BASE_PORT + 2);
    }
    return 0;
130
};