*/
/********************************************************/
/* */
+/* Procedure to load the certificat beeing as root */
+/* */
+/********************************************************/
+static _Bool load_certs(TLSTYP *tls,const char *certs[])
+
+{
+#define OPEP "unitls.c:load_certs,"
+
+_Bool isok;
+uid_t gid; //ccurrent group id
+uid_t uid; //ccurrent user id
+
+gid=getegid(); //let be back to root if needed
+uid=geteuid(); //to open certificate file
+if (setegid(getgid())<0)
+ (void) rou_core_dump("%s Unable to set the Egid to '%d' (error=<%s>",
+ OPEP,getgid(),strerror(errno));
+if (seteuid(getuid())<0)
+ (void) rou_core_dump("%s Unable to set the Euid to '%d' (error=<%s>",
+ OPEP,getuid(),strerror(errno));
+isok=true;
+for (int i=0;(i<3)&&(isok==true);i++) {
+ switch (i) {
+ case 0 : //loading the key file
+ (void) rou_alert(7,"%s key file=<%s>",OPEP,certs[i]);
+ isok=(SSL_CTX_use_PrivateKey_file(tls->ctx,certs[i],SSL_FILETYPE_PEM)==1);
+ break;
+ case 1 : //loading the chain file
+ (void) rou_alert(7,"%s chain file=<%s>",OPEP,certs[i]);
+ isok=(SSL_CTX_use_certificate_chain_file(tls->ctx,certs[i])==1);
+ break;
+ case 2 : //loading the root certificate
+ (void) rou_alert(7,"%s root certificate=<%s>",OPEP,certs[i]);
+ isok=(SSL_CTX_load_verify_locations(tls->ctx,certs[i],(const char *)0)==1);
+ break;
+ default : //SAFE Guard
+ (void) rou_alert(0,"%s value override (Bug!)",OPEP);
+ break;
+ }
+ if (isok==false) {
+ char msg[200];
+
+ (void) snprintf(msg,sizeof(msg),"%s, file[%d] <%s> missing?",OPEP,i,certs[i]);
+ (void) showtlserror(tls,0,msg);
+ break;
+ }
+ }
+(void) setegid(gid); //recover the standard application
+(void) seteuid(uid); //uid:gid
+return isok;
+
+#undef OPEP
+}
+/*
+^L
+*/
+/********************************************************/
+/* */
/* Procedure to set the link certificate */
/* */
/********************************************************/
phase=999; //no need to go furter
}
break;
- case 2 : //first load certificate key
- (void) rou_alert(7,"%s key file=<%s>",OPEP,certs[0]);
- if (SSL_CTX_use_PrivateKey_file(tls->ctx,certs[0],SSL_FILETYPE_PEM)!=1) {
- char msg[200];
-
- (void) snprintf(msg,sizeof(msg),"%s, file <%s> missing?",
- "Probleme with Certificate key",certs[0]);
- (void) showtlserror(tls,0,msg);
- phase=999;
- }
- break;
- case 3 : //load certificate + chain file
- (void) rou_alert(7,"%s chain file=<%s>",OPEP,certs[1]);
- if (SSL_CTX_use_certificate_chain_file(tls->ctx,certs[1])!=1) {
- char msg[200];
-
- (void) snprintf(msg,sizeof(msg),"%s, file <%s> missing?",
- "No chain Certificate",certs[1]);
- (void) showtlserror(tls,0,msg);
- phase=999; //no need to go furter
- }
- break;
- case 4 : //loading root certificate
- (void) rou_alert(7,"%s root certificate=<%s>",OPEP,certs[2]);
- if (SSL_CTX_load_verify_locations(tls->ctx,certs[2],(const char *)0)!=1) {
- char msg[200];
-
- (void) snprintf(msg,sizeof(msg),"%s, file <%s> missing?",
- "No root Certificate",certs[2]);
- (void) showtlserror(tls,0,msg);
+ case 2 : //load certificate information
+ if (load_certs(tls,certs)==false) {
+ (void) rou_alert(0,"%s Unable to load certificate information (config?)",
+ OPEP);
phase=999; //no need to go furter
}
break;
- case 5 : //verify management
+ case 3 : //verify management
if (((mode&SSL_VERIFY_PEER)!=0)||(tls->server==false))
tls->checkpeer=true;
(void) SSL_CTX_set_verify(tls->ctx,mode,(int(*)())0);
phase=999;
}
break;
- case 6 : //allowing partial write
+ case 4 : //allowing partial write
(void) SSL_CTX_set_mode(tls->ctx,SSL_MODE_ENABLE_PARTIAL_WRITE);
break;
- case 7 : //everything fine
+ case 5 : //everything fine
done=true;
break;
default : //SAFE Guard