| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you 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. | |
| */ | |
| #include <fcntl.h> | |
| #include <sys/stat.h> | |
| #include <sys/types.h> | |
| #include <unistd.h> | |
| #include "common/crypto/key_generator.h" | |
| #include "common/crypto/signature_verifier.h" | |
| using namespace resdb; | |
| void WriteKey(const std::string& key, const std::string& file_name) { | |
| printf("save key to path %s\n", file_name.c_str()); | |
| int fd = open(file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); | |
| if (fd < 0) { | |
| printf("open file %s fail %s\n", file_name.c_str(), strerror(errno)); | |
| return; | |
| } | |
| assert(fd >= 0); | |
| write(fd, key.c_str(), key.size()); | |
| close(fd); | |
| } | |
| KeyInfo ReadKey(const std::string& file_name) { | |
| int fd = open(file_name.c_str(), O_RDONLY, 0666); | |
| if (fd < 0) { | |
| printf("open file %s fail %s\n", file_name.c_str(), strerror(errno)); | |
| } | |
| assert(fd >= 0); | |
| std::string res; | |
| int read_len = 0; | |
| char tmp[1024]; | |
| while (true) { | |
| read_len = read(fd, tmp, sizeof(tmp)); | |
| if (read_len <= 0) { | |
| break; | |
| } | |
| res.append(tmp, read_len); | |
| } | |
| close(fd); | |
| KeyInfo key; | |
| assert(key.ParseFromString(res)); | |
| return key; | |
| } | |
| CertificateInfo GenerateCertificateInfo(const KeyInfo& admin_pub_key, | |
| const KeyInfo& pri_key, | |
| const KeyInfo& pub_key, | |
| int64_t node_id) { | |
| CertificateInfo info; | |
| info.set_node_id(node_id); | |
| *info.mutable_admin_public_key() = admin_pub_key; | |
| return info; | |
| } | |
| int main(int argc, char** argv) { | |
| std::string path = "./"; | |
| std::string admin_pri_key_path, admin_pub_key_path; | |
| std::string node_pub_key_path; | |
| std::string ip; | |
| std::string type; | |
| int port = 0; | |
| int64_t node_id = 0; | |
| if (argc < 9) { | |
| printf( | |
| "<save path> <administor private key path> <adminisotr public key " | |
| "path> <node public key path> <node id> <ip> <port> " | |
| "<type>(client/server)\n"); | |
| exit(0); | |
| } else { | |
| path = argv[1]; | |
| admin_pri_key_path = argv[2]; | |
| admin_pub_key_path = argv[3]; | |
| node_pub_key_path = argv[4]; | |
| node_id = strtoull(argv[5], NULL, 10); | |
| ip = argv[6]; | |
| port = strtoull(argv[7], NULL, 10); | |
| type = argv[8]; | |
| } | |
| // Read the keys of current node. | |
| KeyInfo pub_key = ReadKey(node_pub_key_path); | |
| // Read the keys of administor. | |
| KeyInfo admin_pri_key = ReadKey(admin_pri_key_path); | |
| KeyInfo admin_pub_key = ReadKey(admin_pub_key_path); | |
| CertificateInfo info; | |
| info.mutable_admin_public_key()->set_key(admin_pub_key.key()); | |
| info.mutable_admin_public_key()->set_hash_type(admin_pub_key.hash_type()); | |
| *info.mutable_public_key()->mutable_public_key_info()->mutable_key() = | |
| pub_key; | |
| info.mutable_public_key()->mutable_public_key_info()->set_node_id(node_id); | |
| if ("client" == type) { | |
| info.mutable_public_key()->mutable_public_key_info()->set_type( | |
| CertificateKeyInfo::CLIENT); | |
| } else { | |
| info.mutable_public_key()->mutable_public_key_info()->set_type( | |
| CertificateKeyInfo::REPLICA); | |
| } | |
| info.mutable_public_key()->mutable_public_key_info()->set_ip(ip); | |
| info.mutable_public_key()->mutable_public_key_info()->set_port(port); | |
| info.set_node_id(node_id); | |
| // Get certificate using the key from administor. | |
| SignatureVerifier verifier( | |
| admin_pri_key, | |
| GenerateCertificateInfo(admin_pub_key, admin_pri_key, admin_pub_key, 0)); | |
| auto resp_info = | |
| verifier.SignCertificateKeyInfo(info.public_key().public_key_info()); | |
| assert(resp_info.ok()); | |
| *info.mutable_public_key()->mutable_certificate() = *resp_info; | |
| std::cout << "info:" << info.DebugString(); | |
| // Write the keys with certificate to the file. | |
| std::string str; | |
| assert(info.SerializeToString(&str)); | |
| WriteKey(str, path + "/cert_" + std::to_string(node_id) + ".cert"); | |
| } |