crypt_ke.c
来自「This a good VPN source」· C语言 代码 · 共 166 行
C
166 行
/* * Cryptographic helper function - calculate KE and nonce * Copyright (C) 2004 Michael C. Richardson <mcr@xelerance.com> * * 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 2 of the License, or (at your * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. * * 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. * * This code was developed with the support of IXIA communications. * * RCSID $Id: crypt_ke.c,v 1.6 2004/10/25 01:42:15 mcr Exp $ */#include <stdlib.h>#include <string.h>#include <ctype.h>#include <errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/queue.h>#include <sys/time.h>#include <sys/resource.h>#include <sys/types.h>#include <signal.h>#include <openswan.h>#include <openswan/ipsec_policy.h>#include "constants.h"#include "defs.h"#include "packet.h"#include "demux.h"#include "crypto.h"#include "rnd.h"#include "state.h"#include "pluto_crypt.h"#include "oswlog.h"#include "log.h"#include "timer.h"void calc_ke(struct pluto_crypto_req *r){ MP_INT mp_g; MP_INT secret; const struct oakley_group_desc *group; chunk_t gi; struct pcr_kenonce *kn = &r->pcr_d.kn; group = lookup_group(kn->oakley_group); pluto_crypto_allocchunk(&kn->thespace , &kn->secret , LOCALSECRETSIZE); get_rnd_bytes(wire_chunk_ptr(kn, &(kn->secret)), LOCALSECRETSIZE); n_to_mpz(&secret, wire_chunk_ptr(kn, &(kn->secret)), LOCALSECRETSIZE); mpz_init(&mp_g); mpz_powm(&mp_g, &groupgenerator, &secret, group->modulus); gi = mpz_to_n(&mp_g, group->bytes); pluto_crypto_allocchunk(&kn->thespace, &kn->gi, gi.len); memcpy(wire_chunk_ptr(kn, &(kn->gi)), gi.ptr, gi.len); DBG(DBG_CRYPT, DBG_dump("Local DH secret:\n" , wire_chunk_ptr(kn, &(kn->secret)) , LOCALSECRETSIZE); DBG_dump_chunk("Public DH value sent:\n", gi)); /* clean up after ourselves */ mpz_clear(&mp_g); freeanychunk(gi);}void calc_nonce(struct pluto_crypto_req *r){ struct pcr_kenonce *kn = &r->pcr_d.kn; pluto_crypto_allocchunk(&kn->thespace, &kn->n, DEFAULT_NONCE_SIZE); get_rnd_bytes(wire_chunk_ptr(kn, &(kn->n)), DEFAULT_NONCE_SIZE); DBG(DBG_CRYPT, DBG_dump("Generated nonce:\n" , wire_chunk_ptr(kn, &(kn->n)) , DEFAULT_NONCE_SIZE));}stf_status build_ke(struct pluto_crypto_req_cont *cn , struct state *st UNUSED , const struct oakley_group_desc *group , enum crypto_importance importance){ struct pluto_crypto_req *r; err_t e; r = alloc_thing(struct pluto_crypto_req, "build ke request"); r->pcr_len = sizeof(struct pluto_crypto_req); r->pcr_type = pcr_build_kenonce; r->pcr_pcim = importance; r->pcr_d.kn.thespace.start = 0; r->pcr_d.kn.thespace.len = sizeof(r->pcr_d.kn.space); r->pcr_d.kn.oakley_group = group->group; e= send_crypto_helper_request(r, cn); if(e != NULL) { loglog(RC_LOG_SERIOUS, "can not start crypto helper: %s", e); return STF_FAIL; } else { delete_event(st); event_schedule(EVENT_CRYPTO_FAILED, EVENT_CRYPTO_FAILED_DELAY, st); return STF_SUSPEND; }}stf_status build_nonce(struct pluto_crypto_req_cont *cn , struct state *st UNUSED , enum crypto_importance importance){ struct pluto_crypto_req *r; err_t e; r = alloc_thing(struct pluto_crypto_req, "build ke request"); r->pcr_len = sizeof(struct pluto_crypto_req); r->pcr_type = pcr_build_nonce; r->pcr_pcim = importance; r->pcr_d.kn.thespace.start = 0; r->pcr_d.kn.thespace.len = sizeof(r->pcr_d.kn.space); e= send_crypto_helper_request(r, cn); if(e != NULL) { loglog(RC_LOG_SERIOUS, "can not start crypto helper: %s", e); return STF_FAIL; } else { delete_event(st); event_schedule(EVENT_CRYPTO_FAILED, EVENT_CRYPTO_FAILED_DELAY, st); return STF_SUSPEND; }}/* * Local Variables: * c-basic-offset:4 * c-style: pluto * End: */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?