/* 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 := tr_serverSigned1(euiccChallenge := euiccChallenge, serverAddress := serverAddress),
			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 := ts_serverSigned1(euiccChallenge := euiccChallenge, serverAddress := serverAddress),
			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 := ?
		}
	}
}
template (value) EsipaMessageFromIpaToEim
ts_authenticateClientRequestEsipa(template (value) octetstring transactionId := 'ABCDEF'O) := {
	authenticateClientRequestEsipa := {
		transactionId := transactionId,
		authenticateServerResponse := {
			authenticateResponseOk := {
				euiccSigned1 := ts_euiccSigned1,
				euiccSignature1 := '1234567890'O,
				euiccCertificate := ts_cert_eum_nist,
				eumCertificate := ts_cert_s_sm_dpauth_nist
			}
		}
	}
}

/* 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
		}
	}
}


}
