+int read_rsa_public_key(RSA **key, const char *file)
+{
+ FILE *fp;
+
+ if((fp = fopen(file, "r")) == NULL)
+ {
+ syslog(LOG_ERR, _("Error reading RSA public key file `%s': %m"),
+ file);
+ return -1;
+ }
+ if(PEM_read_RSAPublicKey(fp, key, NULL, NULL) == NULL)
+ {
+ syslog(LOG_ERR, _("Reading RSA private key file `%s' failed: %m"),
+ file);
+ return -1;
+ }
+
+ return 0;
+}
+
+int read_rsa_private_key(RSA **key, const char *file)
+{
+ FILE *fp;
+
+ if((fp = fopen(file, "r")) == NULL)
+ {
+ syslog(LOG_ERR, _("Error reading RSA private key file `%s': %m"),
+ file);
+ return -1;
+ }
+ if(PEM_read_RSAPrivateKey(fp, key, NULL, NULL) == NULL)
+ {
+ syslog(LOG_ERR, _("Reading RSA private key file `%s' failed: %m"),
+ file);
+ return -1;
+ }
+
+ return 0;
+}
+
+int read_rsa_keys(void)
+{
+ config_t const *cfg;
+
+ if(!(cfg = get_config_val(config, config_privatekey)))
+ {
+ syslog(LOG_ERR, _("Private key for tinc daemon required!"));
+ return -1;
+ }
+
+ myself->rsa_key = RSA_new();
+
+ return read_rsa_private_key(&(myself->rsa_key), cfg->data.ptr);
+}
+