136d97821Schristos /*
236d97821Schristos  * Hotspot 2.0 - OSU client
336d97821Schristos  * Copyright (c) 2013-2014, Qualcomm Atheros, Inc.
436d97821Schristos  *
536d97821Schristos  * This software may be distributed under the terms of the BSD license.
636d97821Schristos  * See README for more details.
736d97821Schristos  */
836d97821Schristos 
936d97821Schristos #ifndef OSU_CLIENT_H
1036d97821Schristos #define OSU_CLIENT_H
1136d97821Schristos 
1236d97821Schristos #define SPP_NS_URI "http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp"
1336d97821Schristos 
1436d97821Schristos #define URN_OMA_DM_DEVINFO "urn:oma:mo:oma-dm-devinfo:1.0"
1536d97821Schristos #define URN_OMA_DM_DEVDETAIL "urn:oma:mo:oma-dm-devdetail:1.0"
1636d97821Schristos #define URN_HS20_DEVDETAIL_EXT "urn:wfa:mo-ext:hotspot2dot0-devdetail-ext:1.0"
1736d97821Schristos #define URN_HS20_PPS "urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0"
1836d97821Schristos 
1936d97821Schristos 
2036d97821Schristos #define MAX_OSU_VALS 10
2136d97821Schristos 
2236d97821Schristos struct osu_lang_text {
2336d97821Schristos 	char lang[4];
2436d97821Schristos 	char text[253];
2536d97821Schristos };
2636d97821Schristos 
2736d97821Schristos struct hs20_osu_client {
2836d97821Schristos 	struct xml_node_ctx *xml;
2936d97821Schristos 	struct http_ctx *http;
3036d97821Schristos 	int no_reconnect;
3136d97821Schristos 	char pps_fname[300];
3236d97821Schristos 	char *devid;
3336d97821Schristos 	const char *result_file;
3436d97821Schristos 	const char *summary_file;
3536d97821Schristos 	const char *ifname;
3636d97821Schristos 	const char *ca_fname;
3736d97821Schristos 	int no_osu_cert_validation; /* for EST operations */
3836d97821Schristos 	char *fqdn;
3936d97821Schristos 	char *server_url;
4036d97821Schristos 	struct osu_lang_text friendly_name[MAX_OSU_VALS];
4136d97821Schristos 	size_t friendly_name_count;
4236d97821Schristos 	size_t icon_count;
4336d97821Schristos 	char icon_filename[MAX_OSU_VALS][256];
4436d97821Schristos 	u8 icon_hash[MAX_OSU_VALS][32];
4536d97821Schristos 	int pps_cred_set;
4636d97821Schristos 	int pps_updated;
4736d97821Schristos 	int client_cert_present;
4836d97821Schristos 	char **server_dnsname;
4936d97821Schristos 	size_t server_dnsname_count;
50*ebb5671cSchristos 	const char *osu_ssid; /* Enforced OSU_SSID for testing purposes */
5136d97821Schristos #define WORKAROUND_OCSP_OPTIONAL 0x00000001
5236d97821Schristos 	unsigned long int workarounds;
5336d97821Schristos };
5436d97821Schristos 
5536d97821Schristos 
5636d97821Schristos /* osu_client.c */
5736d97821Schristos 
5836d97821Schristos void write_result(struct hs20_osu_client *ctx, const char *fmt, ...)
5936d97821Schristos 	__attribute__ ((format (printf, 2, 3)));
6036d97821Schristos void write_summary(struct hs20_osu_client *ctx, const char *fmt, ...)
6136d97821Schristos 	__attribute__ ((format (printf, 2, 3)));
6236d97821Schristos 
6336d97821Schristos void debug_dump_node(struct hs20_osu_client *ctx, const char *title,
6436d97821Schristos 		     xml_node_t *node);
6536d97821Schristos int osu_get_certificate(struct hs20_osu_client *ctx, xml_node_t *getcert);
6636d97821Schristos int hs20_add_pps_mo(struct hs20_osu_client *ctx, const char *uri,
6736d97821Schristos 		    xml_node_t *add_mo, char *fname, size_t fname_len);
6836d97821Schristos void get_user_pw(struct hs20_osu_client *ctx, xml_node_t *pps,
6936d97821Schristos 		 const char *alt_loc, char **user, char **pw);
7036d97821Schristos int update_pps_file(struct hs20_osu_client *ctx, const char *pps_fname,
7136d97821Schristos 		    xml_node_t *pps);
7236d97821Schristos void cmd_set_pps(struct hs20_osu_client *ctx, const char *pps_fname);
7336d97821Schristos 
7436d97821Schristos 
7536d97821Schristos /* spp_client.c */
7636d97821Schristos 
7736d97821Schristos void spp_sub_rem(struct hs20_osu_client *ctx, const char *address,
7836d97821Schristos 		 const char *pps_fname,
7936d97821Schristos 		 const char *client_cert, const char *client_key,
8036d97821Schristos 		 const char *cred_username, const char *cred_password,
8136d97821Schristos 		 xml_node_t *pps);
8236d97821Schristos void spp_pol_upd(struct hs20_osu_client *ctx, const char *address,
8336d97821Schristos 		 const char *pps_fname,
8436d97821Schristos 		 const char *client_cert, const char *client_key,
8536d97821Schristos 		 const char *cred_username, const char *cred_password,
8636d97821Schristos 		 xml_node_t *pps);
8736d97821Schristos int cmd_prov(struct hs20_osu_client *ctx, const char *url);
8836d97821Schristos int cmd_sim_prov(struct hs20_osu_client *ctx, const char *url);
8936d97821Schristos 
9036d97821Schristos 
9136d97821Schristos /* oma_dm_client.c */
9236d97821Schristos 
9336d97821Schristos int cmd_oma_dm_prov(struct hs20_osu_client *ctx, const char *url);
9436d97821Schristos int cmd_oma_dm_sim_prov(struct hs20_osu_client *ctx, const char *url);
9536d97821Schristos void oma_dm_sub_rem(struct hs20_osu_client *ctx, const char *address,
9636d97821Schristos 		    const char *pps_fname,
9736d97821Schristos 		    const char *client_cert, const char *client_key,
9836d97821Schristos 		    const char *cred_username, const char *cred_password,
9936d97821Schristos 		    xml_node_t *pps);
10036d97821Schristos void oma_dm_pol_upd(struct hs20_osu_client *ctx, const char *address,
10136d97821Schristos 		    const char *pps_fname,
10236d97821Schristos 		    const char *client_cert, const char *client_key,
10336d97821Schristos 		    const char *cred_username, const char *cred_password,
10436d97821Schristos 		    xml_node_t *pps);
10536d97821Schristos void cmd_oma_dm_sub_rem(struct hs20_osu_client *ctx, const char *address,
10636d97821Schristos 			const char *pps_fname);
10736d97821Schristos void cmd_oma_dm_add(struct hs20_osu_client *ctx, const char *pps_fname,
10836d97821Schristos 		    const char *add_fname);
10936d97821Schristos void cmd_oma_dm_replace(struct hs20_osu_client *ctx, const char *pps_fname,
11036d97821Schristos 			const char *replace_fname);
11136d97821Schristos 
11236d97821Schristos /* est.c */
11336d97821Schristos 
11436d97821Schristos int est_load_cacerts(struct hs20_osu_client *ctx, const char *url);
11536d97821Schristos int est_build_csr(struct hs20_osu_client *ctx, const char *url);
11636d97821Schristos int est_simple_enroll(struct hs20_osu_client *ctx, const char *url,
11736d97821Schristos 		      const char *user, const char *pw);
11836d97821Schristos 
11936d97821Schristos #endif /* OSU_CLIENT_H */
120