1281681Srpaulo/*
2281681Srpaulo * Hotspot 2.0 - OSU client
3281681Srpaulo * Copyright (c) 2013-2014, Qualcomm Atheros, Inc.
4281681Srpaulo *
5281681Srpaulo * This software may be distributed under the terms of the BSD license.
6281681Srpaulo * See README for more details.
7281681Srpaulo */
8281681Srpaulo
9281681Srpaulo#ifndef OSU_CLIENT_H
10281681Srpaulo#define OSU_CLIENT_H
11281681Srpaulo
12281681Srpaulo#define SPP_NS_URI "http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp"
13281681Srpaulo
14281681Srpaulo#define URN_OMA_DM_DEVINFO "urn:oma:mo:oma-dm-devinfo:1.0"
15281681Srpaulo#define URN_OMA_DM_DEVDETAIL "urn:oma:mo:oma-dm-devdetail:1.0"
16281681Srpaulo#define URN_HS20_DEVDETAIL_EXT "urn:wfa:mo-ext:hotspot2dot0-devdetail-ext:1.0"
17281681Srpaulo#define URN_HS20_PPS "urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0"
18281681Srpaulo
19281681Srpaulo
20281681Srpaulo#define MAX_OSU_VALS 10
21281681Srpaulo
22281681Srpaulostruct osu_lang_text {
23281681Srpaulo	char lang[4];
24281681Srpaulo	char text[253];
25281681Srpaulo};
26281681Srpaulo
27281681Srpaulostruct hs20_osu_client {
28281681Srpaulo	struct xml_node_ctx *xml;
29281681Srpaulo	struct http_ctx *http;
30281681Srpaulo	int no_reconnect;
31281681Srpaulo	char pps_fname[300];
32281681Srpaulo	char *devid;
33281681Srpaulo	const char *result_file;
34281681Srpaulo	const char *summary_file;
35281681Srpaulo	const char *ifname;
36281681Srpaulo	const char *ca_fname;
37281681Srpaulo	int no_osu_cert_validation; /* for EST operations */
38281681Srpaulo	char *fqdn;
39281681Srpaulo	char *server_url;
40281681Srpaulo	struct osu_lang_text friendly_name[MAX_OSU_VALS];
41281681Srpaulo	size_t friendly_name_count;
42281681Srpaulo	size_t icon_count;
43281681Srpaulo	char icon_filename[MAX_OSU_VALS][256];
44281681Srpaulo	u8 icon_hash[MAX_OSU_VALS][32];
45281681Srpaulo	int pps_cred_set;
46281681Srpaulo	int pps_updated;
47281681Srpaulo	int client_cert_present;
48281681Srpaulo	char **server_dnsname;
49281681Srpaulo	size_t server_dnsname_count;
50346981Scy	const char *osu_ssid; /* Enforced OSU_SSID for testing purposes */
51281681Srpaulo#define WORKAROUND_OCSP_OPTIONAL 0x00000001
52281681Srpaulo	unsigned long int workarounds;
53281681Srpaulo};
54281681Srpaulo
55281681Srpaulo
56281681Srpaulo/* osu_client.c */
57281681Srpaulo
58281681Srpaulovoid write_result(struct hs20_osu_client *ctx, const char *fmt, ...)
59281681Srpaulo	__attribute__ ((format (printf, 2, 3)));
60281681Srpaulovoid write_summary(struct hs20_osu_client *ctx, const char *fmt, ...)
61281681Srpaulo	__attribute__ ((format (printf, 2, 3)));
62281681Srpaulo
63281681Srpaulovoid debug_dump_node(struct hs20_osu_client *ctx, const char *title,
64281681Srpaulo		     xml_node_t *node);
65281681Srpauloint osu_get_certificate(struct hs20_osu_client *ctx, xml_node_t *getcert);
66281681Srpauloint hs20_add_pps_mo(struct hs20_osu_client *ctx, const char *uri,
67281681Srpaulo		    xml_node_t *add_mo, char *fname, size_t fname_len);
68281681Srpaulovoid get_user_pw(struct hs20_osu_client *ctx, xml_node_t *pps,
69281681Srpaulo		 const char *alt_loc, char **user, char **pw);
70281681Srpauloint update_pps_file(struct hs20_osu_client *ctx, const char *pps_fname,
71281681Srpaulo		    xml_node_t *pps);
72281681Srpaulovoid cmd_set_pps(struct hs20_osu_client *ctx, const char *pps_fname);
73281681Srpaulo
74281681Srpaulo
75281681Srpaulo/* spp_client.c */
76281681Srpaulo
77281681Srpaulovoid spp_sub_rem(struct hs20_osu_client *ctx, const char *address,
78281681Srpaulo		 const char *pps_fname,
79281681Srpaulo		 const char *client_cert, const char *client_key,
80281681Srpaulo		 const char *cred_username, const char *cred_password,
81281681Srpaulo		 xml_node_t *pps);
82281681Srpaulovoid spp_pol_upd(struct hs20_osu_client *ctx, const char *address,
83281681Srpaulo		 const char *pps_fname,
84281681Srpaulo		 const char *client_cert, const char *client_key,
85281681Srpaulo		 const char *cred_username, const char *cred_password,
86281681Srpaulo		 xml_node_t *pps);
87281681Srpauloint cmd_prov(struct hs20_osu_client *ctx, const char *url);
88281681Srpauloint cmd_sim_prov(struct hs20_osu_client *ctx, const char *url);
89281681Srpaulo
90281681Srpaulo
91281681Srpaulo/* oma_dm_client.c */
92281681Srpaulo
93281681Srpauloint cmd_oma_dm_prov(struct hs20_osu_client *ctx, const char *url);
94281681Srpauloint cmd_oma_dm_sim_prov(struct hs20_osu_client *ctx, const char *url);
95281681Srpaulovoid oma_dm_sub_rem(struct hs20_osu_client *ctx, const char *address,
96281681Srpaulo		    const char *pps_fname,
97281681Srpaulo		    const char *client_cert, const char *client_key,
98281681Srpaulo		    const char *cred_username, const char *cred_password,
99281681Srpaulo		    xml_node_t *pps);
100281681Srpaulovoid oma_dm_pol_upd(struct hs20_osu_client *ctx, const char *address,
101281681Srpaulo		    const char *pps_fname,
102281681Srpaulo		    const char *client_cert, const char *client_key,
103281681Srpaulo		    const char *cred_username, const char *cred_password,
104281681Srpaulo		    xml_node_t *pps);
105281681Srpaulovoid cmd_oma_dm_sub_rem(struct hs20_osu_client *ctx, const char *address,
106281681Srpaulo			const char *pps_fname);
107281681Srpaulovoid cmd_oma_dm_add(struct hs20_osu_client *ctx, const char *pps_fname,
108281681Srpaulo		    const char *add_fname);
109281681Srpaulovoid cmd_oma_dm_replace(struct hs20_osu_client *ctx, const char *pps_fname,
110281681Srpaulo			const char *replace_fname);
111281681Srpaulo
112281681Srpaulo/* est.c */
113281681Srpaulo
114281681Srpauloint est_load_cacerts(struct hs20_osu_client *ctx, const char *url);
115281681Srpauloint est_build_csr(struct hs20_osu_client *ctx, const char *url);
116281681Srpauloint est_simple_enroll(struct hs20_osu_client *ctx, const char *url,
117281681Srpaulo		      const char *user, const char *pw);
118281681Srpaulo
119281681Srpaulo#endif /* OSU_CLIENT_H */
120