la definition est tenue secrète par les developpeurs PAM.
Euh, t'y vas un peu fort là ... PAM c'est du GPL.
Ce qu'il faut comprendre, c'est que PAM c'est un système d'authentification sous linux , et que par conséquent, ça brasse des données noyeau et utilisateur.
Le noyeau t'offre une structure globale mais masque les donneés sensibles qui seront protégées par des pages non accessibles de droit.
Mais garde à l'esprit qu'un truc opaque (pointeur, structure), tu n'as PAS LE DROIT de l'allouer ou de le modifier (Car tu ne cannait rien de ce que tu manipules)
Revois ton design, tu ne dois pas a avoir à créer toi même cette structure, mais tu dois utiliser un appel quelconque à pam.
je vais t'illustrer mes propos avec un exemple tout bête:
Code C/C++ :
// definition d'un message protégé opaque
struct messageOpaque{
char * message;
}
// structure réelle : non opaque
struct messageClear{
char * message;
int checksum;
}
// fonction abstraite que je ne commente pas qui réalise un checksum du
// message (un code symbolisant son contenu)
int makeChksum(const char * msg);
// fonction qui fabrique un message protégé
struct messageOpaque * createMessage(const char * message){
struct messageClear * msg = malloc(sizeof(messageClear));
msg->message=strdup(message);
msg->checksum=makeChksum(message);
return (struct messageOpaque*) msg; // hop on change le type du pointeur comme ça personne ne peut acceder au checksum
}
int isMessageTrafiqued(const struct messageOpaque *msg){
// on demasque le message
struct messageClear * realMsg= (struct messageClear) msg;
return makeChksum(msg->message)!=msg->checksum;
}
Voici un exemple d'utilisation
Code C/C++ :
struct messageOpaque * msg = createMessage("rick roll");
msg->message="pouet pouet";
if(isMessageTrafiqued()){
// on passera par la
}
En mémoire, la fonction createMessage va écrire à un endroit quelconque :
[ pointeur de chaine "rick roll" , 456747] (le 456747 étant le checksum présumé ...)
Ici, je fais aparaitre un champ caché (checksum) qui n'aparait pas dans la version opaque de la structure.
Imagine qu'un malin face
Code C/C++ :
struct messageOpaque *truc=malloc(sizeof(struct messageOpaque));
truc->message="CHEZ MOI IL PLEUT";
isMessageTrafiqued(truc);
En mémoiore, tu aura uniquement [pointeur de chaine "CHEZ MOI IL PLEUT"] [données aléatoires etinaccessibles]
la fonction isMessageTrafiqued qui lit apres le pointeur de chaine, va lire n'importe ou.
Dans la fonction truc, on va essayer d'acceder au checksum, mais e
; I'm just keeping the hopeless cross to increase the meaninglessness