/* SGP32 Templates in TTCN-3
 *
 * Author: Philipp Maier <pmaier@sysmocom.de> / sysmocom - s.f.m.c. GmbH
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

module SGP32Definitions_Templates {

import from SGP32Definitions all;
import from SGP32Definitions_Types all;

import from RSPDefinitions all;
import from RSPDefinitions_Types all;
import from RSPDefinitions_Templates all;

import from PKIX1Explicit88 all;
import from PKIX1Explicit88_Templates all;
import from PKIX1Explicit88_Types all;

/* GSMA SGP.32, section 6.3.2.1 */
template (present) EsipaMessageFromEimToIpa
tr_initiateAuthenticationResponseEsipa(template (present) octetstring euiccChallenge := ?,
				       template (present) universal charstring serverAddress := ?) := {
	initiateAuthenticationResponseEsipa := {
		initiateAuthenticationOkEsipa := {
			transactionId := *,
			serverSigned1 := {
				transactionId := ?,
				euiccChallenge := euiccChallenge,
				serverAddress := serverAddress,
				serverChallenge := ?
			},
			serverSignature1 := ?,
			euiccCiPKIdToBeUsed := ?,
			serverCertificate := ?,
			matchingId := *,
			ctxParams1 := *
		}
	}
}

template (value) EsipaMessageFromEimToIpa
ts_initiateAuthenticationResponseEsipa(template (value) octetstring euiccChallenge := '00112233445566778899AABBCCDDEEFF'O,
				       template (value) universal charstring serverAddress := "smdp.example.com") := {
	initiateAuthenticationResponseEsipa := {
		initiateAuthenticationOkEsipa := {
			transactionId := omit,
			serverSigned1 := {
				transactionId := 'ABCDEF'O,
				euiccChallenge := euiccChallenge,
				serverAddress := "smdp.example.com",
				serverChallenge := '01020304050607080910111213141516'O
			},
			serverSignature1 := '01020304'O,
			euiccCiPKIdToBeUsed := 'F54172BDF98A95D65CBEB88A38A1C11D800A85C3'O, /* NIST */
			serverCertificate := ts_cert_s_sm_dpauth_nist,
//			serverCertificate := ts_cert_s_sm_dpauth_brp,
//			serverCertificate := ts_cert_s_sm_dp2auth_nist,
//			serverCertificate := ts_cert_s_sm_dp2auth_brp,
			matchingId := omit,
			ctxParams1 := omit
		}
	}
}

/* GSMA SGP.32, section 6.3.2.1 */
template (present) EsipaMessageFromIpaToEim
tr_initiateAuthenticationRequestEsipa(template (present) octetstring euiccChallenge := ?) := {
	initiateAuthenticationRequestEsipa := {
		euiccChallenge := euiccChallenge,
		smdpAddress := *,
		euiccInfo1 := *
	}
}
template (value) EsipaMessageFromIpaToEim
ts_initiateAuthenticationRequestEsipa(template (value) octetstring euiccChallenge := '00112233445566778899aabbccddeeff'O,
				      template (omit) charstring smdpAddress := "smdp.example.com",
				      template (omit) EUICCInfo1 euiccInfo1 := ts_EUICCInfo1) := {
	initiateAuthenticationRequestEsipa := {
		euiccChallenge := euiccChallenge,
		smdpAddress := smdpAddress,
		euiccInfo1 := euiccInfo1
	}
}

/* GSMA SGP.32, section 6.3.2.2 */
template (present) EsipaMessageFromIpaToEim
tr_authenticateClientRequestEsipa := {
	authenticateClientRequestEsipa := {
		transactionId := ?,
		authenticateServerResponse := {
			authenticateResponseOk := ?
		}
	}
}
/* TODO: create coresponding ts_ template */

/* GSMA SGP.32, section 6.3.2.2 */
template (present) EsipaMessageFromEimToIpa
tr_authenticateClientResponseEsipa_dse(template (present) octetstring transactionId := ?,
				       template (present) charstring activationCode := ?) := {
	authenticateClientResponseEsipa := {
		authenticateClientOkDSEsipa := {
			transactionId := transactionId,
				profileDownloadTrigger := {
				profileDownloadData := {
					activationCode := ?
				},
				eimTransactionId := *
			}
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_authenticateClientResponseEsipa_dse(template (value) octetstring transactionId := 'ABCDEF'O,
				       template (value) charstring activationCode := "1$SMDP.EXAMPLE.COM$$1.3.6.1.4.1.31746") := {
	authenticateClientResponseEsipa := {
		authenticateClientOkDSEsipa := {
			transactionId := transactionId,
			profileDownloadTrigger := {
				profileDownloadData := {
					activationCode := activationCode
				},
				eimTransactionId := omit
			}
		}
	}
}

/* GSMA SGP.32, section 6.3.2.2 */
template (present) EsipaMessageFromEimToIpa
tr_authenticateClientResponseEsipa_dpe(template (present) octetstring transactionId := ?) := {
	authenticateClientResponseEsipa := {
		authenticateClientOkDPEsipa := {
			transactionId := transactionId,
			profileMetaData := *,
			smdpSigned2 := {
				transactionId := ?,
				ccRequiredFlag := ?,
				bppEuiccOtpk := *
			},
			smdpSignature2 := ?,
			smdpCertificate := ?,
			hashCc := *
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_authenticateClientResponseEsipa_dpe(template (value) octetstring transactionId := 'ABCDEF'O) := {
	authenticateClientResponseEsipa := {
		authenticateClientOkDPEsipa := {
			transactionId := transactionId,
			profileMetaData := omit,
			smdpSigned2 := {
				transactionId := transactionId,
				ccRequiredFlag := false,
				bppEuiccOtpk := omit
			},
			smdpSignature2 := 'AAAAAAAAAAAAAAAAAAAAAAAA'O,
			smdpCertificate := ts_cert_s_sm_dpauth_nist,
//			smdpCertificate := ts_cert_s_sm_dpauth_brp,
//			smdpCertificate := ts_cert_s_sm_dp2auth_nist,
//			smdpCertificate := ts_cert_s_sm_dp2auth_brp,
			hashCc := omit
		}
	}
}

/* GSMA SGP.32, section 6.3.2.6 */
template (present) EsipaMessageFromIpaToEim
tr_getEimPackageRequest(template (present) octetstring eidValue := ?) := {
	getEimPackageRequest := {
		eidValue := eidValue,
		notifyStateChange := *,
		rPLMN := *
	}
}
template (value) EsipaMessageFromIpaToEim
ts_getEimPackageRequest(template (value) octetstring eidValue) := {
	getEimPackageRequest := {
		eidValue := eidValue,
		notifyStateChange := omit,
		rPLMN := omit
	}
}

/* GSMA SGP.32, section 6.3.2.6 and 2.11.1.3 */
template (present) EsipaMessageFromEimToIpa
tr_getEimPackageResponse_dnlTrigReq(template (present) charstring activationCode := ?) := {
	getEimPackageResponse := {
		profileDownloadTriggerRequest := {
			profileDownloadData := {
				activationCode := activationCode
			},
			eimTransactionId := *
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_getEimPackageResponse_dnlTrigReq(template (value) charstring activationCode := "1$SMDP.EXAMPLE.COM$$1.3.6.1.4.1.31746") := {
	getEimPackageResponse := {
		profileDownloadTriggerRequest := {
			profileDownloadData := {
				activationCode := activationCode
			},
			eimTransactionId := omit
		}
	}
}

/* GSMA SGP.32, section 6.3.2.6 and 2.11.1.2 */
template (present) EsipaMessageFromEimToIpa
tr_getEimPackageResponse_euiccDataReq := {
	getEimPackageResponse := {
		ipaEuiccDataRequest := {
			tagList := ?,
			euiccCiPKId := *,
			searchCriteria := *
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_getEimPackageResponse_euiccDataReq := {
	getEimPackageResponse := {
		ipaEuiccDataRequest := {
			tagList := '80BF20BF228384A5A688A9BF2B'O,
			euiccCiPKId := omit,
			searchCriteria := omit
		}
	}
}

/* GSMA SGP.32, section 6.3.2.6 */
template (present) EsipaMessageFromEimToIpa
tr_getEimPackageResponse_eimPkgErrUndef := {
	getEimPackageResponse := {
		eimPackageError := ?
	}
}
template (value) EsipaMessageFromEimToIpa
ts_getEimPackageResponse_eimPkgErrUndef := {
	getEimPackageResponse := {
		eimPackageError := 127
	}
}

/* GSMA SGP.32, section 6.3.2.6 */
template (value) EsipaMessageFromEimToIpa
ts_getEimPackageResponse_euiccPkgReq := {
	getEimPackageResponse := {
		euiccPackageRequest := {
			euiccPackageSigned := {
				eimId := "myEim",
				eidValue := '00112233445566778899AABBCCDDEEFF'O,
				counterValue := 123,
				transactionId := omit,
				euiccPackage := {
					psmoList := {
						{
							enable := {
								iccid := '123456789ABCDEFFAAAA'O,
								rollbackFlag := NULL
							}
						}
					}
				}
			},
			eimSignature := '1234567890'O
		}
	}
}

/* GSMA SGP.32, section 6.3.2.5 */
template (present) EsipaMessageFromIpaToEim
tr_cancelSessionRequestEsipa := {
	cancelSessionRequestEsipa := {
		transactionId := ?,
		cancelSessionResponse := {
			cancelSessionResponseOk := tr_cancelSessionResponseOk
		}
	}
}
template (value) EsipaMessageFromIpaToEim
ts_cancelSessionRequestEsipa := {
	cancelSessionRequestEsipa := {
		transactionId := 'AABBCC'O,
		cancelSessionResponse := {
			cancelSessionResponseOk := ts_cancelSessionResponseOk
		}
	}
}

/* GSMA SGP.32, section 6.3.2.5 */
template (present) EsipaMessageFromEimToIpa
tr_cancelSessionResponseEsipa := {
	cancelSessionResponseEsipa := {
		cancelSessionOk := {
			/* This function has no output data */
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_cancelSessionResponseEsipa := {
	cancelSessionResponseEsipa := {
		cancelSessionOk := {
			/* This function has no output data */
		}
	}
}

/* GSMA SGP.32, section 6.3.2.3 */
template (present) EsipaMessageFromEimToIpa
tr_getBoundProfilePackageResponseEsipa := {
	getBoundProfilePackageResponseEsipa := {
		getBoundProfilePackageOkEsipa := {
			transactionId := *,
			boundProfilePackage := tr_boundProfilePackage
		}
	}
}
template (value) EsipaMessageFromEimToIpa
ts_getBoundProfilePackageResponseEsipa := {
	getBoundProfilePackageResponseEsipa := {
		getBoundProfilePackageOkEsipa := {
			transactionId := omit,
			boundProfilePackage := ts_boundProfilePackage
		}
	}
}

/* GSMA SGP.32, section 5.9.1 */
template (present) EuiccPackageResult
tr_euiccPackageResult := {
	euiccPackageResultSigned := {
		euiccPackageResultDataSigned := {
			eimId := ?,
			counterValue := ?,
			transactionId := *,
			seqNumber := ?,
			euiccResult := ?
		},
		euiccSignEPR := ?
	}
}
template (value) EuiccPackageResult
ts_euiccPackageResult := {
	euiccPackageResultSigned := {
		euiccPackageResultDataSigned := {
			eimId := "myEim",
			counterValue := 333,
			transactionId := omit,
			seqNumber := 1234,
			euiccResult := {
				{
					enableResult := 0
				}
			}
		},
		euiccSignEPR := 'AABBCCDDEEFF'O
	}
}

/* GSMA SGP.32, section 6.3.2.7 */
template (present) EsipaMessageFromIpaToEim
tr_provideEimPackageResult_ePRAndNotif := {
	provideEimPackageResult := {
		ePRAndNotifications := {
			euiccPackageResult := ?,
			notificationList := ?
		}
	}
}
template (present) EsipaMessageFromEimToIpa
tr_provideEimPackageResultResponse_eimAck := {
	provideEimPackageResultResponse := {
		eimAcknowledgements := *
	}
}
template (value) EsipaMessageFromEimToIpa
ts_provideEimPackageResultResponse_eimAck(template (value) EimAcknowledgements eimAcknowledgements := {}) := {
	provideEimPackageResultResponse := {
		eimAcknowledgements := eimAcknowledgements
	}
}

/* GSMA SGP.32, section 2.11.1.2 */
template (present) GetCertsResponse
tr_getCertsResponse := {
	certs := {
		eumCertificate := ?,
		euiccCertificate := ?
	}
}
template (value) GetCertsResponse
ts_getCertsResponse := {
	certs := {
		eumCertificate := ts_cert_s_sm_dpauth_nist,
		euiccCertificate := ts_cert_eum_nist
	}
}

/* GSMA SGP.32, section 5.9.18 */
template (present) GetEimConfigurationDataResponse
tr_getEimConfigurationDataResponse := {
	eimConfigurationDataList := ?
}
template (value) GetEimConfigurationDataResponse
ts_getEimConfigurationDataResponse(template (value) charstring eimFqdn := "127.0.0.1") := {
	eimConfigurationDataList := {
		{
			eimId := "myEIM",
			eimFqdn := eimFqdn,
			eimIdType := omit,
			counterValue := omit,
			associationToken := 123,
			eimPublicKeyData := omit,
			trustedPublicKeyDataTls := omit,
			eimSupportedProtocol := omit,
			euiccCiPKId := omit
		}
	}
}

/* GSMA SGP.32, section 5.9.4 */
template (present) AddInitialEimResponse
tr_addInitialEimResponse := {
	addInitialEimOk := ?
}
template (value) AddInitialEimResponse
ts_addInitialEimResponse := {
	addInitialEimOk := {
		{
			addOk := NULL
		}
	}
}

/* GSMA SGP.32, section 5.9.16 */
template (present) ProfileRollbackRequest
tr_profileRollbackRequest := {
	refreshFlag := ?
}
template (value) ProfileRollbackRequest
ts_profileRollbackRequest := {
	refreshFlag := false
}
template (present) ProfileRollbackResponse
tr_profileRollbackResponse := {
	cmdResult := ?,
	eUICCPackageResult := ?
}
template (value) ProfileRollbackResponse
ts_profileRollbackResponse := {
	cmdResult := 0,
	eUICCPackageResult := {
		euiccPackageResultSigned := {
			euiccPackageResultDataSigned := {
				eimId := "myEim",
				counterValue := 333,
				transactionId := omit,
				seqNumber := 1234,
				euiccResult := {
					{
						enableResult := 0
					},
					{
						rollbackResult := 0
					}
				}
			},
			euiccSignEPR := 'AABBCCDDEEFF'O
		}
	}
}


}
