Use hardening option to add only hardening flags
[tinc] / src / gcrypt / rsa.c
index 83f177b..292c773 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "pem.h"
 
+#include "asn1.h"
 #include "rsa.h"
 #include "../logger.h"
 #include "../rsa.h"
@@ -84,20 +85,11 @@ static size_t ber_read_len(unsigned char **p, size_t *buflen) {
        }
 }
 
-
-static bool ber_read_sequence(unsigned char **p, size_t *buflen, size_t *result) {
+static bool ber_skip_sequence(unsigned char **p, size_t *buflen) {
        int tag = ber_read_id(p, buflen);
-       size_t len = ber_read_len(p, buflen);
 
-       if(tag == 0x10) {
-               if(result) {
-                       *result = len;
-               }
-
-               return true;
-       } else {
-               return false;
-       }
+       return tag == TAG_SEQUENCE &&
+              ber_read_len(p, buflen) > 0;
 }
 
 static bool ber_read_mpi(unsigned char **p, size_t *buflen, gcry_mpi_t *mpi) {
@@ -119,8 +111,12 @@ static bool ber_read_mpi(unsigned char **p, size_t *buflen, gcry_mpi_t *mpi) {
        return mpi ? !err : true;
 }
 
+rsa_t *rsa_new(void) {
+       return xzalloc(sizeof(rsa_t));
+}
+
 rsa_t *rsa_set_hex_public_key(const char *n, const char *e) {
-       rsa_t *rsa = xzalloc(sizeof(rsa_t));
+       rsa_t *rsa = rsa_new();
 
        gcry_error_t err = gcry_mpi_scan(&rsa->n, GCRYMPI_FMT_HEX, n, 0, NULL);
 
@@ -138,7 +134,7 @@ rsa_t *rsa_set_hex_public_key(const char *n, const char *e) {
 }
 
 rsa_t *rsa_set_hex_private_key(const char *n, const char *e, const char *d) {
-       rsa_t *rsa = xzalloc(sizeof(rsa_t));
+       rsa_t *rsa = rsa_new();
 
        gcry_error_t err = gcry_mpi_scan(&rsa->n, GCRYMPI_FMT_HEX, n, 0, NULL);
 
@@ -170,9 +166,9 @@ rsa_t *rsa_read_pem_public_key(FILE *fp) {
                return NULL;
        }
 
-       rsa_t *rsa = xzalloc(sizeof(rsa_t));
+       rsa_t *rsa = rsa_new();
 
-       if(!ber_read_sequence(&derp, &derlen, NULL)
+       if(!ber_skip_sequence(&derp, &derlen)
                        || !ber_read_mpi(&derp, &derlen, &rsa->n)
                        || !ber_read_mpi(&derp, &derlen, &rsa->e)
                        || derlen) {
@@ -193,9 +189,9 @@ rsa_t *rsa_read_pem_private_key(FILE *fp) {
                return NULL;
        }
 
-       rsa_t *rsa = xzalloc(sizeof(rsa_t));
+       rsa_t *rsa = rsa_new();
 
-       if(!ber_read_sequence(&derp, &derlen, NULL)
+       if(!ber_skip_sequence(&derp, &derlen)
                        || !ber_read_mpi(&derp, &derlen, NULL)
                        || !ber_read_mpi(&derp, &derlen, &rsa->n)
                        || !ber_read_mpi(&derp, &derlen, &rsa->e)