1*7ab6e6acSAndroid Build Coastguard Worker /*
2*7ab6e6acSAndroid Build Coastguard Worker * iperf, Copyright (c) 2020, The Regents of the University of
3*7ab6e6acSAndroid Build Coastguard Worker * California, through Lawrence Berkeley National Laboratory (subject
4*7ab6e6acSAndroid Build Coastguard Worker * to receipt of any required approvals from the U.S. Dept. of
5*7ab6e6acSAndroid Build Coastguard Worker * Energy). All rights reserved.
6*7ab6e6acSAndroid Build Coastguard Worker *
7*7ab6e6acSAndroid Build Coastguard Worker * If you have questions about your rights to use or distribute this
8*7ab6e6acSAndroid Build Coastguard Worker * software, please contact Berkeley Lab's Technology Transfer
9*7ab6e6acSAndroid Build Coastguard Worker * Department at [email protected].
10*7ab6e6acSAndroid Build Coastguard Worker *
11*7ab6e6acSAndroid Build Coastguard Worker * NOTICE. This software is owned by the U.S. Department of Energy.
12*7ab6e6acSAndroid Build Coastguard Worker * As such, the U.S. Government has been granted for itself and others
13*7ab6e6acSAndroid Build Coastguard Worker * acting on its behalf a paid-up, nonexclusive, irrevocable,
14*7ab6e6acSAndroid Build Coastguard Worker * worldwide license in the Software to reproduce, prepare derivative
15*7ab6e6acSAndroid Build Coastguard Worker * works, and perform publicly and display publicly. Beginning five
16*7ab6e6acSAndroid Build Coastguard Worker * (5) years after the date permission to assert copyright is obtained
17*7ab6e6acSAndroid Build Coastguard Worker * from the U.S. Department of Energy, and subject to any subsequent
18*7ab6e6acSAndroid Build Coastguard Worker * five (5) year renewals, the U.S. Government is granted for itself
19*7ab6e6acSAndroid Build Coastguard Worker * and others acting on its behalf a paid-up, nonexclusive,
20*7ab6e6acSAndroid Build Coastguard Worker * irrevocable, worldwide license in the Software to reproduce,
21*7ab6e6acSAndroid Build Coastguard Worker * prepare derivative works, distribute copies to the public, perform
22*7ab6e6acSAndroid Build Coastguard Worker * publicly and display publicly, and to permit others to do so.
23*7ab6e6acSAndroid Build Coastguard Worker *
24*7ab6e6acSAndroid Build Coastguard Worker * This code is distributed under a BSD style license, see the LICENSE
25*7ab6e6acSAndroid Build Coastguard Worker * file for complete information.
26*7ab6e6acSAndroid Build Coastguard Worker */
27*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_config.h"
28*7ab6e6acSAndroid Build Coastguard Worker
29*7ab6e6acSAndroid Build Coastguard Worker #include <assert.h>
30*7ab6e6acSAndroid Build Coastguard Worker #ifdef HAVE_STDINT_H
31*7ab6e6acSAndroid Build Coastguard Worker #include <stdint.h>
32*7ab6e6acSAndroid Build Coastguard Worker #endif
33*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
34*7ab6e6acSAndroid Build Coastguard Worker #include <string.h>
35*7ab6e6acSAndroid Build Coastguard Worker
36*7ab6e6acSAndroid Build Coastguard Worker #include "iperf.h"
37*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_api.h"
38*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL)
39*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_auth.h"
40*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SSL */
41*7ab6e6acSAndroid Build Coastguard Worker
42*7ab6e6acSAndroid Build Coastguard Worker #include "version.h"
43*7ab6e6acSAndroid Build Coastguard Worker
44*7ab6e6acSAndroid Build Coastguard Worker #include "units.h"
45*7ab6e6acSAndroid Build Coastguard Worker
46*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL)
47*7ab6e6acSAndroid Build Coastguard Worker int test_authtoken(const char *authUser, const char *authPassword, EVP_PKEY *pubkey, EVP_PKEY *privkey);
48*7ab6e6acSAndroid Build Coastguard Worker
49*7ab6e6acSAndroid Build Coastguard Worker int
main(int argc,char ** argv)50*7ab6e6acSAndroid Build Coastguard Worker main(int argc, char **argv)
51*7ab6e6acSAndroid Build Coastguard Worker {
52*7ab6e6acSAndroid Build Coastguard Worker /* sha256 */
53*7ab6e6acSAndroid Build Coastguard Worker void sha256(const char *string, char outputBuffer[65]);
54*7ab6e6acSAndroid Build Coastguard Worker const char sha256String[] = "This is a SHA256 test.";
55*7ab6e6acSAndroid Build Coastguard Worker const char sha256Digest[] = "4816482f8b4149f687a1a33d61a0de6b611364ec0fb7adffa59ff2af672f7232"; /* echo -n "This is a SHA256 test." | shasum -a256 */
56*7ab6e6acSAndroid Build Coastguard Worker char sha256Output[65];
57*7ab6e6acSAndroid Build Coastguard Worker
58*7ab6e6acSAndroid Build Coastguard Worker sha256(sha256String, sha256Output);
59*7ab6e6acSAndroid Build Coastguard Worker assert(strcmp(sha256Output, sha256Digest) == 0);
60*7ab6e6acSAndroid Build Coastguard Worker
61*7ab6e6acSAndroid Build Coastguard Worker /* Base64{Encode,Decode} */
62*7ab6e6acSAndroid Build Coastguard Worker int Base64Encode(const unsigned char* buffer, const size_t length, char** b64text);
63*7ab6e6acSAndroid Build Coastguard Worker int Base64Decode(const char* b64message, unsigned char** buffer, size_t* length);
64*7ab6e6acSAndroid Build Coastguard Worker const char base64String[] = "This is a Base64 test.";
65*7ab6e6acSAndroid Build Coastguard Worker char *base64Text;
66*7ab6e6acSAndroid Build Coastguard Worker char *base64Decode;
67*7ab6e6acSAndroid Build Coastguard Worker size_t base64DecodeLength;
68*7ab6e6acSAndroid Build Coastguard Worker const char base64EncodeCheck[] = "VGhpcyBpcyBhIEJhc2U2NCB0ZXN0Lg=="; /* echo -n "This is a Base64 test." | b64encode -r - */
69*7ab6e6acSAndroid Build Coastguard Worker
70*7ab6e6acSAndroid Build Coastguard Worker assert(Base64Encode((unsigned char *) base64String, strlen(base64String), &base64Text) == 0);
71*7ab6e6acSAndroid Build Coastguard Worker assert(strcmp(base64Text, base64EncodeCheck) == 0);
72*7ab6e6acSAndroid Build Coastguard Worker assert(Base64Decode(base64Text, (unsigned char **) &base64Decode, &base64DecodeLength) == 0);
73*7ab6e6acSAndroid Build Coastguard Worker assert(strcmp(base64String, base64Decode) == 0);
74*7ab6e6acSAndroid Build Coastguard Worker
75*7ab6e6acSAndroid Build Coastguard Worker /* public/private key tests */
76*7ab6e6acSAndroid Build Coastguard Worker const char *pubkeyfile = "public.pem";
77*7ab6e6acSAndroid Build Coastguard Worker const char *privkeyfile = "private.pem";
78*7ab6e6acSAndroid Build Coastguard Worker
79*7ab6e6acSAndroid Build Coastguard Worker /* built-in tests */
80*7ab6e6acSAndroid Build Coastguard Worker assert(test_load_pubkey_from_file(pubkeyfile) == 0);
81*7ab6e6acSAndroid Build Coastguard Worker assert(test_load_private_key_from_file(privkeyfile) == 0);
82*7ab6e6acSAndroid Build Coastguard Worker
83*7ab6e6acSAndroid Build Coastguard Worker /* load public key pair for use in further tests */
84*7ab6e6acSAndroid Build Coastguard Worker EVP_PKEY *pubkey, *privkey;
85*7ab6e6acSAndroid Build Coastguard Worker pubkey = load_pubkey_from_file(pubkeyfile);
86*7ab6e6acSAndroid Build Coastguard Worker assert(pubkey);
87*7ab6e6acSAndroid Build Coastguard Worker privkey = load_privkey_from_file(privkeyfile);
88*7ab6e6acSAndroid Build Coastguard Worker assert(privkey);
89*7ab6e6acSAndroid Build Coastguard Worker
90*7ab6e6acSAndroid Build Coastguard Worker /* authentication token tests */
91*7ab6e6acSAndroid Build Coastguard Worker assert(test_authtoken("kilroy", "fubar", pubkey, privkey) == 0);
92*7ab6e6acSAndroid Build Coastguard Worker
93*7ab6e6acSAndroid Build Coastguard Worker /* This should fail because the data is way too long for the RSA key */
94*7ab6e6acSAndroid Build Coastguard Worker /* assert(test_authtoken("kilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroykilroy", "fubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubarfubar", pubkey, privkey) < 0); */
95*7ab6e6acSAndroid Build Coastguard Worker
96*7ab6e6acSAndroid Build Coastguard Worker return 0;
97*7ab6e6acSAndroid Build Coastguard Worker }
98*7ab6e6acSAndroid Build Coastguard Worker
99*7ab6e6acSAndroid Build Coastguard Worker int
test_authtoken(const char * authUser,const char * authPassword,EVP_PKEY * pubkey,EVP_PKEY * privkey)100*7ab6e6acSAndroid Build Coastguard Worker test_authtoken(const char *authUser, const char *authPassword, EVP_PKEY *pubkey, EVP_PKEY *privkey) {
101*7ab6e6acSAndroid Build Coastguard Worker char *authToken;
102*7ab6e6acSAndroid Build Coastguard Worker char *decodeUser;
103*7ab6e6acSAndroid Build Coastguard Worker char *decodePassword;
104*7ab6e6acSAndroid Build Coastguard Worker time_t decodeTime;
105*7ab6e6acSAndroid Build Coastguard Worker
106*7ab6e6acSAndroid Build Coastguard Worker assert(encode_auth_setting(authUser, authPassword, pubkey, &authToken) == 0);
107*7ab6e6acSAndroid Build Coastguard Worker assert(decode_auth_setting(0, authToken, privkey, &decodeUser, &decodePassword, &decodeTime) == 0);
108*7ab6e6acSAndroid Build Coastguard Worker
109*7ab6e6acSAndroid Build Coastguard Worker assert(strcmp(decodeUser, authUser) == 0);
110*7ab6e6acSAndroid Build Coastguard Worker assert(strcmp(decodePassword, authPassword) == 0);
111*7ab6e6acSAndroid Build Coastguard Worker
112*7ab6e6acSAndroid Build Coastguard Worker time_t now = time(NULL);
113*7ab6e6acSAndroid Build Coastguard Worker
114*7ab6e6acSAndroid Build Coastguard Worker assert(now - decodeTime >= 0); /* time has to go forwards */
115*7ab6e6acSAndroid Build Coastguard Worker assert(now - decodeTime <= 1); /* shouldn't take more than a second to run */
116*7ab6e6acSAndroid Build Coastguard Worker
117*7ab6e6acSAndroid Build Coastguard Worker return 0;
118*7ab6e6acSAndroid Build Coastguard Worker }
119*7ab6e6acSAndroid Build Coastguard Worker #else
120*7ab6e6acSAndroid Build Coastguard Worker int
main(int argc,char ** argv)121*7ab6e6acSAndroid Build Coastguard Worker main(int argc, char **argv)
122*7ab6e6acSAndroid Build Coastguard Worker {
123*7ab6e6acSAndroid Build Coastguard Worker return 0;
124*7ab6e6acSAndroid Build Coastguard Worker }
125*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SSL */
126