Path: blob/main/crypto/krb5/src/lib/krad/t_packet.c
39536 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* lib/krad/t_packet.c - RADIUS packet test program */2/*3* Copyright 2013 Red Hat, Inc. All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions are met:7*8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10*11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in13* the documentation and/or other materials provided with the14* distribution.15*16* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS17* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED18* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A19* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER20* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,21* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,22* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR23* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF24* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING25* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS26* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.27*/2829#include "t_daemon.h"3031#define ACCEPT_PACKET 032#define REJECT_PACKET 13334static krad_packet *packets[3];3536static const krad_packet *37iterator(void *data, krb5_boolean cancel)38{39krad_packet *tmp;40int *i = data;4142if (cancel || packets[*i] == NULL)43return NULL;4445tmp = packets[*i];46*i += 1;47return tmp;48}4950static krb5_error_code51make_packet(krb5_context ctx, const krb5_data *username,52const krb5_data *password, krad_packet **pkt)53{54krad_attrset *set = NULL;55krad_packet *tmp = NULL;56krb5_error_code retval;57const krb5_data *data;58int i = 0;59krb5_data nas_id;6061nas_id = string2data("12345678901234567890123456789012345678901234567890"62"12345678901234567890123456789012345678901234567890"63"12345678901234567890123456789012345678901234567890"64"12345678901234567890123456789012345678901234567890"65"12345678901234567890123456789012345678901234567890"66"123");6768retval = krad_attrset_new(ctx, &set);69if (retval != 0)70goto out;7172retval = krad_attrset_add(set, KRAD_ATTR_USER_NAME, username);73if (retval != 0)74goto out;7576retval = krad_attrset_add(set, KRAD_ATTR_USER_PASSWORD,77password);78if (retval != 0)79goto out;8081retval = krad_attrset_add(set, KRAD_ATTR_NAS_IDENTIFIER, &nas_id);82if (retval != 0)83goto out;8485retval = krad_packet_new_request(ctx, "foo", KRAD_CODE_ACCESS_REQUEST,86set, iterator, &i, &tmp);87if (retval != 0)88goto out;8990data = krad_packet_get_attr(tmp, KRAD_ATTR_USER_NAME, 0);91if (data == NULL) {92retval = ENOENT;93goto out;94}9596if (data->length != username->length ||97memcmp(data->data, username->data, data->length) != 0) {98retval = EINVAL;99goto out;100}101102*pkt = tmp;103tmp = NULL;104105out:106krad_attrset_free(set);107krad_packet_free(tmp);108return retval;109}110111static krb5_error_code112do_auth(krb5_context ctx, struct addrinfo *ai, const char *secret,113const krad_packet *rqst, krb5_boolean *auth)114{115const krad_packet *req = NULL;116char tmp[KRAD_PACKET_SIZE_MAX];117const krb5_data *request;118krad_packet *rsp = NULL;119krb5_error_code retval;120krb5_data response;121int sock = -1, i;122123response = make_data(tmp, sizeof(tmp));124125sock = socket(ai->ai_family, ai->ai_socktype, 0);126if (sock < 0) {127retval = errno;128goto out;129}130131request = krad_packet_encode(rqst);132if (sendto(sock, request->data, request->length, 0, ai->ai_addr,133ai->ai_addrlen) < 0) {134retval = errno;135goto out;136}137138i = recv(sock, response.data, sizeof(tmp), 0);139if (i < 0) {140retval = errno;141goto out;142}143response.length = i;144145i = 0;146retval = krad_packet_decode_response(ctx, secret, &response, iterator, &i,147&req, &rsp);148if (retval != 0)149goto out;150151if (req != rqst) {152retval = EBADMSG;153goto out;154}155156*auth = krad_packet_get_code(rsp) == KRAD_CODE_ACCESS_ACCEPT;157158out:159krad_packet_free(rsp);160if (sock >= 0)161close(sock);162return retval;163}164165int166main(int argc, const char **argv)167{168struct addrinfo *ai = NULL, hints;169krb5_data username, password;170krb5_boolean auth = FALSE;171krb5_context ctx;172const krad_packet *dupreq;173const krb5_data *encpkt;174krad_packet *decreq;175176username = string2data("testUser");177178if (!daemon_start(argc, argv)) {179fprintf(stderr, "Unable to start pyrad daemon, skipping test...\n");180return 0;181}182183noerror(krb5_init_context(&ctx));184185password = string2data("accept");186noerror(make_packet(ctx, &username, &password, &packets[ACCEPT_PACKET]));187encpkt = krad_packet_encode(packets[ACCEPT_PACKET]);188noerror(krad_packet_decode_request(ctx, "foo", encpkt, NULL, NULL,189&dupreq, &decreq));190krad_packet_free(decreq);191192password = string2data("reject");193noerror(make_packet(ctx, &username, &password, &packets[REJECT_PACKET]));194encpkt = krad_packet_encode(packets[REJECT_PACKET]);195noerror(krad_packet_decode_request(ctx, "foo", encpkt, NULL, NULL,196&dupreq, &decreq));197krad_packet_free(decreq);198199memset(&hints, 0, sizeof(hints));200hints.ai_family = AF_INET;201hints.ai_socktype = SOCK_DGRAM;202noerror(gai_error_code(getaddrinfo("127.0.0.1", "radius", &hints, &ai)));203204noerror(do_auth(ctx, ai, "foo", packets[ACCEPT_PACKET], &auth));205insist(auth == TRUE);206207noerror(do_auth(ctx, ai, "foo", packets[REJECT_PACKET], &auth));208insist(auth == FALSE);209210krad_packet_free(packets[ACCEPT_PACKET]);211krad_packet_free(packets[REJECT_PACKET]);212krb5_free_context(ctx);213freeaddrinfo(ai);214return 0;215}216217218