pubkey: Re-map all depreccated RSA algo numbers.
[libgcrypt.git] / cipher / pubkey-util.c
index a591c0d..514f1eb 100644 (file)
@@ -62,9 +62,9 @@ _gcry_pk_util_parse_flaglist (gcry_sexp_t list,
   int flags = 0;
   int igninvflag = 0;
 
-  for (i=list?gcry_sexp_length (list)-1:0; i > 0; i--)
+  for (i = list ? sexp_length (list)-1 : 0; i > 0; i--)
     {
-      s = gcry_sexp_nth_data (list, i, &n);
+      s = sexp_nth_data (list, i, &n);
       if (!s)
         continue; /* Not a data element. */
 
@@ -113,6 +113,15 @@ _gcry_pk_util_parse_flaglist (gcry_sexp_t list,
               encoding = PUBKEY_ENC_PKCS1;
               flags |= PUBKEY_FLAG_FIXEDLEN;
             }
+          else if (!memcmp (s, "param", 5))
+            flags |= PUBKEY_FLAG_PARAM;
+          else if (!igninvflag)
+            rc = GPG_ERR_INV_FLAG;
+          break;
+
+        case 6:
+          if (!memcmp (s, "nocomp", 6))
+            flags |= PUBKEY_FLAG_NOCOMP;
           else if (!igninvflag)
             rc = GPG_ERR_INV_FLAG;
           break;
@@ -121,7 +130,7 @@ _gcry_pk_util_parse_flaglist (gcry_sexp_t list,
           if (!memcmp (s, "rfc6979", 7))
             flags |= PUBKEY_FLAG_RFC6979;
           else if (!memcmp (s, "noparam", 7))
-            flags |= PUBKEY_FLAG_NOPARAM;
+            ; /* Ignore - it is the default.  */
           else if (!igninvflag)
             rc = GPG_ERR_INV_FLAG;
           break;
@@ -133,6 +142,16 @@ _gcry_pk_util_parse_flaglist (gcry_sexp_t list,
             rc = GPG_ERR_INV_FLAG;
           break;
 
+       case 9:
+          if (!memcmp (s, "pkcs1-raw", 9) && encoding == PUBKEY_ENC_UNKNOWN)
+            {
+              encoding = PUBKEY_ENC_PKCS1_RAW;
+              flags |= PUBKEY_FLAG_FIXEDLEN;
+            }
+          else if (!igninvflag)
+            rc = GPG_ERR_INV_FLAG;
+          break;
+
         case 10:
           if (!memcmp (s, "igninvflag", 10))
             igninvflag = 1;
@@ -209,15 +228,15 @@ get_hash_algo (const char *s, size_t n)
         algorithm names. */
       char *tmpname;
 
-      tmpname = gcry_malloc (n+1);
+      tmpname = xtrymalloc (n+1);
       if (!tmpname)
        algo = 0;  /* Out of core - silently give up.  */
       else
        {
          memcpy (tmpname, s, n);
          tmpname[n] = 0;
-         algo = gcry_md_map_name (tmpname);
-         gcry_free (tmpname);
+         algo = _gcry_md_map_name (tmpname);
+         xfree (tmpname);
        }
     }
   return algo;
@@ -250,21 +269,21 @@ _gcry_pk_util_get_nbits (gcry_sexp_t list, unsigned int *r_nbits)
 
   *r_nbits = 0;
 
-  list = gcry_sexp_find_token (list, "nbits", 0);
+  list = sexp_find_token (list, "nbits", 0);
   if (!list)
     return 0; /* No NBITS found.  */
 
-  s = gcry_sexp_nth_data (list, 1, &n);
+  s = sexp_nth_data (list, 1, &n);
   if (!s || n >= DIM (buf) - 1 )
     {
       /* NBITS given without a cdr.  */
-      gcry_sexp_release (list);
+      sexp_release (list);
       return GPG_ERR_INV_OBJ;
     }
   memcpy (buf, s, n);
   buf[n] = 0;
   *r_nbits = (unsigned int)strtoul (buf, NULL, 0);
-  gcry_sexp_release (list);
+  sexp_release (list);
   return 0;
 }
 
@@ -297,24 +316,24 @@ _gcry_pk_util_get_rsa_use_e (gcry_sexp_t list, unsigned long *r_e)
 
   *r_e = 0;
 
-  list = gcry_sexp_find_token (list, "rsa-use-e", 0);
+  list = sexp_find_token (list, "rsa-use-e", 0);
   if (!list)
     {
       *r_e = 65537; /* Not given, use the value generated by old versions. */
       return 0;
     }
 
-  s = gcry_sexp_nth_data (list, 1, &n);
+  s = sexp_nth_data (list, 1, &n);
   if (!s || n >= DIM (buf) - 1 )
     {
       /* No value or value too large.  */
-      gcry_sexp_release (list);
+      sexp_release (list);
       return GPG_ERR_INV_OBJ;
     }
   memcpy (buf, s, n);
   buf[n] = 0;
   *r_e = strtoul (buf, NULL, 0);
-  gcry_sexp_release (list);
+  sexp_release (list);
   return 0;
 }
 
@@ -341,20 +360,20 @@ _gcry_pk_util_preparse_sigval (gcry_sexp_t s_sig, const char **algo_names,
     *r_eccflags = 0;
 
   /* Extract the signature value.  */
-  l1 = gcry_sexp_find_token (s_sig, "sig-val", 0);
+  l1 = sexp_find_token (s_sig, "sig-val", 0);
   if (!l1)
     {
       rc = GPG_ERR_INV_OBJ; /* Does not contain a signature value object.  */
       goto leave;
     }
 
-  l2 = gcry_sexp_nth (l1, 1);
+  l2 = sexp_nth (l1, 1);
   if (!l2)
     {
       rc = GPG_ERR_NO_OBJ;   /* No cadr for the sig object.  */
       goto leave;
     }
-  name = _gcry_sexp_nth_string (l2, 0);
+  name = sexp_nth_string (l2, 0);
   if (!name)
     {
       rc = GPG_ERR_INV_OBJ;  /* Invalid structure of object.  */
@@ -365,15 +384,15 @@ _gcry_pk_util_preparse_sigval (gcry_sexp_t s_sig, const char **algo_names,
       /* Skip a "flags" parameter and look again for the algorithm
         name.  This is not used but here just for the sake of
         consistent S-expressions we need to handle it. */
-      gcry_sexp_release (l2);
-      l2 = gcry_sexp_nth (l1, 2);
+      sexp_release (l2);
+      l2 = sexp_nth (l1, 2);
       if (!l2)
        {
          rc = GPG_ERR_INV_OBJ;
           goto leave;
        }
-      gcry_free (name);
-      name = _gcry_sexp_nth_string (l2, 0);
+      xfree (name);
+      name = sexp_nth_string (l2, 0);
       if (!name)
         {
           rc = GPG_ERR_INV_OBJ;  /* Invalid structure of object.  */
@@ -402,9 +421,9 @@ _gcry_pk_util_preparse_sigval (gcry_sexp_t s_sig, const char **algo_names,
   rc = 0;
 
  leave:
-  gcry_free (name);
-  gcry_sexp_release (l2);
-  gcry_sexp_release (l1);
+  xfree (name);
+  sexp_release (l2);
+  sexp_release (l1);
   return rc;
 }
 
@@ -444,14 +463,14 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
   *r_parms = NULL;
 
   /* Check that the first element is valid.  */
-  l1 = gcry_sexp_find_token (sexp, "enc-val" , 0);
+  l1 = sexp_find_token (sexp, "enc-val" , 0);
   if (!l1)
     {
       rc = GPG_ERR_INV_OBJ; /* Does not contain an encrypted value object.  */
       goto leave;
     }
 
-  l2 = gcry_sexp_nth (l1, 1);
+  l2 = sexp_nth (l1, 1);
   if (!l2)
     {
       rc = GPG_ERR_NO_OBJ;  /* No cadr for the data object.  */
@@ -459,7 +478,7 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
     }
 
   /* Extract identifier of sublist.  */
-  name = _gcry_sexp_nth_string (l2, 0);
+  name = sexp_nth_string (l2, 0);
   if (!name)
     {
       rc = GPG_ERR_INV_OBJ; /* Invalid structure of object.  */
@@ -484,11 +503,11 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
       if (ctx->encoding == PUBKEY_ENC_OAEP)
        {
          /* Get HASH-ALGO. */
-          gcry_sexp_release (l2);
-         l2 = gcry_sexp_find_token (l1, "hash-algo", 0);
+          sexp_release (l2);
+         l2 = sexp_find_token (l1, "hash-algo", 0);
          if (l2)
            {
-             s = gcry_sexp_nth_data (l2, 1, &n);
+             s = sexp_nth_data (l2, 1, &n);
              if (!s)
                rc = GPG_ERR_NO_OBJ;
              else
@@ -502,16 +521,16 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
            }
 
          /* Get LABEL. */
-          gcry_sexp_release (l2);
-         l2 = gcry_sexp_find_token (l1, "label", 0);
+          sexp_release (l2);
+         l2 = sexp_find_token (l1, "label", 0);
          if (l2)
            {
-             s = gcry_sexp_nth_data (l2, 1, &n);
+             s = sexp_nth_data (l2, 1, &n);
              if (!s)
                rc = GPG_ERR_NO_OBJ;
              else if (n > 0)
                {
-                 ctx->label = gcry_malloc (n);
+                 ctx->label = xtrymalloc (n);
                  if (!ctx->label)
                    rc = gpg_err_code_from_syserror ();
                  else
@@ -526,9 +545,9 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
        }
 
       /* Get the next which has the actual data - skip HASH-ALGO and LABEL. */
-      for (i = 2; (gcry_sexp_release (l2), l2 = gcry_sexp_nth (l1, i)); i++)
+      for (i = 2; (sexp_release (l2), l2 = sexp_nth (l1, i)); i++)
        {
-         s = gcry_sexp_nth_data (l2, 0, &n);
+         s = sexp_nth_data (l2, 0, &n);
          if (!(n == 9 && !memcmp (s, "hash-algo", 9))
              && !(n == 5 && !memcmp (s, "label", 5))
              && !(n == 15 && !memcmp (s, "random-override", 15)))
@@ -541,8 +560,8 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
         }
 
       /* Extract sublist identifier.  */
-      gcry_free (name);
-      name = _gcry_sexp_nth_string (l2, 0);
+      xfree (name);
+      name = sexp_nth_string (l2, 0);
       if (!name)
         {
           rc = GPG_ERR_INV_OBJ; /* Invalid structure of object. */
@@ -567,9 +586,9 @@ _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names,
   rc = 0;
 
  leave:
-  gcry_free (name);
-  gcry_sexp_release (l2);
-  gcry_sexp_release (l1);
+  xfree (name);
+  sexp_release (l2);
+  sexp_release (l1);
   return rc;
 }
 
@@ -596,7 +615,7 @@ _gcry_pk_util_init_encoding_ctx (struct pk_encoding_ctx *ctx,
 void
 _gcry_pk_util_free_encoding_ctx (struct pk_encoding_ctx *ctx)
 {
-  gcry_free (ctx->label);
+  xfree (ctx->label);
 }
 
 
@@ -641,22 +660,22 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
   int parsed_flags = 0;
 
   *ret_mpi = NULL;
-  ldata = gcry_sexp_find_token (input, "data", 0);
+  ldata = sexp_find_token (input, "data", 0);
   if (!ldata)
     { /* assume old style */
-      *ret_mpi = gcry_sexp_nth_mpi (input, 0, 0);
+      *ret_mpi = sexp_nth_mpi (input, 0, 0);
       return *ret_mpi ? GPG_ERR_NO_ERROR : GPG_ERR_INV_OBJ;
     }
 
   /* See whether there is a flags list.  */
   {
-    gcry_sexp_t lflags = gcry_sexp_find_token (ldata, "flags", 0);
+    gcry_sexp_t lflags = sexp_find_token (ldata, "flags", 0);
     if (lflags)
       {
         if (_gcry_pk_util_parse_flaglist (lflags,
                                           &parsed_flags, &ctx->encoding))
           unknown_flag = 1;
-        gcry_sexp_release (lflags);
+        sexp_release (lflags);
       }
   }
 
@@ -664,8 +683,8 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
     ctx->encoding = PUBKEY_ENC_RAW; /* default to raw */
 
   /* Get HASH or MPI */
-  lhash = gcry_sexp_find_token (ldata, "hash", 0);
-  lvalue = lhash? NULL : gcry_sexp_find_token (ldata, "value", 0);
+  lhash = sexp_find_token (ldata, "hash", 0);
+  lvalue = lhash? NULL : sexp_find_token (ldata, "value", 0);
 
   if (!(!lhash ^ !lvalue))
     rc = GPG_ERR_INV_OBJ; /* none or both given */
@@ -685,10 +704,10 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
           goto leave;
         }
       /* Get HASH-ALGO. */
-      list = gcry_sexp_find_token (ldata, "hash-algo", 0);
+      list = sexp_find_token (ldata, "hash-algo", 0);
       if (list)
         {
-          s = gcry_sexp_nth_data (list, 1, &n);
+          s = sexp_nth_data (list, 1, &n);
           if (!s)
             rc = GPG_ERR_NO_OBJ;
           else
@@ -697,7 +716,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
               if (!ctx->hash_algo)
                 rc = GPG_ERR_DIGEST_ALGO;
             }
-          gcry_sexp_release (list);
+          sexp_release (list);
         }
       else
         rc = GPG_ERR_INV_OBJ;
@@ -705,27 +724,27 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
         goto leave;
 
       /* Get VALUE.  */
-      value = gcry_sexp_nth_buffer (lvalue, 1, &valuelen);
+      value = sexp_nth_buffer (lvalue, 1, &valuelen);
       if (!value)
         {
           /* We assume that a zero length message is meant by
              "(value)".  This is commonly used by test vectors.  Note
              that S-expression do not allow zero length items. */
           valuelen = 0;
-          value = gcry_malloc (1);
+          value = xtrymalloc (1);
           if (!value)
             rc = gpg_err_code_from_syserror ();
         }
       else if ((valuelen * 8) < valuelen)
         {
-          gcry_free (value);
+          xfree (value);
           rc = GPG_ERR_TOO_LARGE;
         }
       if (rc)
         goto leave;
 
       /* Note that mpi_set_opaque takes ownership of VALUE.  */
-      *ret_mpi = gcry_mpi_set_opaque (NULL, value, valuelen*8);
+      *ret_mpi = mpi_set_opaque (NULL, value, valuelen*8);
     }
   else if (ctx->encoding == PUBKEY_ENC_RAW && lhash
            && ((parsed_flags & PUBKEY_FLAG_RAW_FLAG)
@@ -735,9 +754,9 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
          used for DSA.  For better backward error compatibility we
          allow this only if either the rfc6979 flag has been given or
          the raw flags was explicitly given.  */
-      if (gcry_sexp_length (lhash) != 3)
+      if (sexp_length (lhash) != 3)
         rc = GPG_ERR_INV_OBJ;
-      else if ( !(s=gcry_sexp_nth_data (lhash, 1, &n)) || !n )
+      else if ( !(s=sexp_nth_data (lhash, 1, &n)) || !n )
         rc = GPG_ERR_INV_OBJ;
       else
         {
@@ -747,15 +766,15 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
          ctx->hash_algo = get_hash_algo (s, n);
           if (!ctx->hash_algo)
             rc = GPG_ERR_DIGEST_ALGO;
-          else if (!(value=gcry_sexp_nth_buffer (lhash, 2, &valuelen)))
+          else if (!(value=sexp_nth_buffer (lhash, 2, &valuelen)))
             rc = GPG_ERR_INV_OBJ;
           else if ((valuelen * 8) < valuelen)
             {
-              gcry_free (value);
+              xfree (value);
               rc = GPG_ERR_TOO_LARGE;
             }
           else
-            *ret_mpi = gcry_mpi_set_opaque (NULL, value, valuelen*8);
+            *ret_mpi = mpi_set_opaque (NULL, value, valuelen*8);
         }
     }
   else if (ctx->encoding == PUBKEY_ENC_RAW && lvalue)
@@ -769,7 +788,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
         }
 
       /* Get the value */
-      *ret_mpi = gcry_sexp_nth_mpi (lvalue, 1, GCRYMPI_FMT_USG);
+      *ret_mpi = sexp_nth_mpi (lvalue, 1, GCRYMPI_FMT_USG);
       if (!*ret_mpi)
         rc = GPG_ERR_INV_OBJ;
     }
@@ -782,20 +801,20 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
       void *random_override = NULL;
       size_t random_override_len = 0;
 
-      if ( !(value=gcry_sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
+      if ( !(value=sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
         rc = GPG_ERR_INV_OBJ;
       else
         {
           /* Get optional RANDOM-OVERRIDE.  */
-          list = gcry_sexp_find_token (ldata, "random-override", 0);
+          list = sexp_find_token (ldata, "random-override", 0);
           if (list)
             {
-              s = gcry_sexp_nth_data (list, 1, &n);
+              s = sexp_nth_data (list, 1, &n);
               if (!s)
                 rc = GPG_ERR_NO_OBJ;
               else if (n > 0)
                 {
-                  random_override = gcry_malloc (n);
+                  random_override = xtrymalloc (n);
                   if (!random_override)
                     rc = gpg_err_code_from_syserror ();
                   else
@@ -804,7 +823,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                       random_override_len = n;
                     }
                 }
-              gcry_sexp_release (list);
+              sexp_release (list);
               if (rc)
                 goto leave;
             }
@@ -813,15 +832,15 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                                                value, valuelen,
                                                random_override,
                                                random_override_len);
-          gcry_free (random_override);
+          xfree (random_override);
         }
     }
   else if (ctx->encoding == PUBKEY_ENC_PKCS1 && lhash
           && (ctx->op == PUBKEY_OP_SIGN || ctx->op == PUBKEY_OP_VERIFY))
     {
-      if (gcry_sexp_length (lhash) != 3)
+      if (sexp_length (lhash) != 3)
         rc = GPG_ERR_INV_OBJ;
-      else if ( !(s=gcry_sexp_nth_data (lhash, 1, &n)) || !n )
+      else if ( !(s=sexp_nth_data (lhash, 1, &n)) || !n )
         rc = GPG_ERR_INV_OBJ;
       else
         {
@@ -832,7 +851,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
 
           if (!ctx->hash_algo)
             rc = GPG_ERR_DIGEST_ALGO;
-          else if ( !(value=gcry_sexp_nth_data (lhash, 2, &valuelen))
+          else if ( !(value=sexp_nth_data (lhash, 2, &valuelen))
                     || !valuelen )
             rc = GPG_ERR_INV_OBJ;
           else
@@ -841,13 +860,28 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                                                  ctx->hash_algo);
         }
     }
+  else if (ctx->encoding == PUBKEY_ENC_PKCS1_RAW && lvalue
+          && (ctx->op == PUBKEY_OP_SIGN || ctx->op == PUBKEY_OP_VERIFY))
+    {
+      const void * value;
+      size_t valuelen;
+
+      if (sexp_length (lvalue) != 2)
+        rc = GPG_ERR_INV_OBJ;
+      else if ( !(value=sexp_nth_data (lvalue, 1, &valuelen))
+                || !valuelen )
+        rc = GPG_ERR_INV_OBJ;
+      else
+        rc = _gcry_rsa_pkcs1_encode_raw_for_sig (ret_mpi, ctx->nbits,
+                                                 value, valuelen);
+    }
   else if (ctx->encoding == PUBKEY_ENC_OAEP && lvalue
           && ctx->op == PUBKEY_OP_ENCRYPT)
     {
       const void * value;
       size_t valuelen;
 
-      if ( !(value=gcry_sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
+      if ( !(value=sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
        rc = GPG_ERR_INV_OBJ;
       else
        {
@@ -856,10 +890,10 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
           size_t random_override_len = 0;
 
          /* Get HASH-ALGO. */
-         list = gcry_sexp_find_token (ldata, "hash-algo", 0);
+         list = sexp_find_token (ldata, "hash-algo", 0);
          if (list)
            {
-             s = gcry_sexp_nth_data (list, 1, &n);
+             s = sexp_nth_data (list, 1, &n);
              if (!s)
                rc = GPG_ERR_NO_OBJ;
              else
@@ -868,21 +902,21 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                  if (!ctx->hash_algo)
                    rc = GPG_ERR_DIGEST_ALGO;
                }
-             gcry_sexp_release (list);
+             sexp_release (list);
              if (rc)
                goto leave;
            }
 
          /* Get LABEL. */
-         list = gcry_sexp_find_token (ldata, "label", 0);
+         list = sexp_find_token (ldata, "label", 0);
          if (list)
            {
-             s = gcry_sexp_nth_data (list, 1, &n);
+             s = sexp_nth_data (list, 1, &n);
              if (!s)
                rc = GPG_ERR_NO_OBJ;
              else if (n > 0)
                {
-                 ctx->label = gcry_malloc (n);
+                 ctx->label = xtrymalloc (n);
                  if (!ctx->label)
                    rc = gpg_err_code_from_syserror ();
                  else
@@ -891,20 +925,20 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                      ctx->labellen = n;
                    }
                }
-             gcry_sexp_release (list);
+             sexp_release (list);
              if (rc)
                goto leave;
            }
           /* Get optional RANDOM-OVERRIDE.  */
-          list = gcry_sexp_find_token (ldata, "random-override", 0);
+          list = sexp_find_token (ldata, "random-override", 0);
           if (list)
             {
-              s = gcry_sexp_nth_data (list, 1, &n);
+              s = sexp_nth_data (list, 1, &n);
               if (!s)
                 rc = GPG_ERR_NO_OBJ;
               else if (n > 0)
                 {
-                  random_override = gcry_malloc (n);
+                  random_override = xtrymalloc (n);
                   if (!random_override)
                     rc = gpg_err_code_from_syserror ();
                   else
@@ -913,7 +947,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                       random_override_len = n;
                     }
                 }
-              gcry_sexp_release (list);
+              sexp_release (list);
               if (rc)
                 goto leave;
             }
@@ -923,15 +957,15 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                                       ctx->label, ctx->labellen,
                                       random_override, random_override_len);
 
-          gcry_free (random_override);
+          xfree (random_override);
        }
     }
   else if (ctx->encoding == PUBKEY_ENC_PSS && lhash
           && ctx->op == PUBKEY_OP_SIGN)
     {
-      if (gcry_sexp_length (lhash) != 3)
+      if (sexp_length (lhash) != 3)
         rc = GPG_ERR_INV_OBJ;
-      else if ( !(s=gcry_sexp_nth_data (lhash, 1, &n)) || !n )
+      else if ( !(s=sexp_nth_data (lhash, 1, &n)) || !n )
         rc = GPG_ERR_INV_OBJ;
       else
         {
@@ -944,7 +978,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
 
           if (!ctx->hash_algo)
             rc = GPG_ERR_DIGEST_ALGO;
-          else if ( !(value=gcry_sexp_nth_data (lhash, 2, &valuelen))
+          else if ( !(value=sexp_nth_data (lhash, 2, &valuelen))
                     || !valuelen )
             rc = GPG_ERR_INV_OBJ;
           else
@@ -952,29 +986,29 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
              gcry_sexp_t list;
 
              /* Get SALT-LENGTH. */
-             list = gcry_sexp_find_token (ldata, "salt-length", 0);
+             list = sexp_find_token (ldata, "salt-length", 0);
              if (list)
                {
-                 s = gcry_sexp_nth_data (list, 1, &n);
+                 s = sexp_nth_data (list, 1, &n);
                  if (!s)
                    {
                      rc = GPG_ERR_NO_OBJ;
                      goto leave;
                    }
                  ctx->saltlen = (unsigned int)strtoul (s, NULL, 10);
-                 gcry_sexp_release (list);
+                 sexp_release (list);
                }
 
               /* Get optional RANDOM-OVERRIDE.  */
-              list = gcry_sexp_find_token (ldata, "random-override", 0);
+              list = sexp_find_token (ldata, "random-override", 0);
               if (list)
                 {
-                  s = gcry_sexp_nth_data (list, 1, &n);
+                  s = sexp_nth_data (list, 1, &n);
                   if (!s)
                     rc = GPG_ERR_NO_OBJ;
                   else if (n > 0)
                     {
-                      random_override = gcry_malloc (n);
+                      random_override = xtrymalloc (n);
                       if (!random_override)
                         rc = gpg_err_code_from_syserror ();
                       else
@@ -983,7 +1017,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                           random_override_len = n;
                         }
                     }
-                  gcry_sexp_release (list);
+                  sexp_release (list);
                   if (rc)
                     goto leave;
                 }
@@ -994,16 +1028,16 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
                                          value, valuelen, ctx->saltlen,
                                          random_override, random_override_len);
 
-              gcry_free (random_override);
+              xfree (random_override);
            }
         }
     }
   else if (ctx->encoding == PUBKEY_ENC_PSS && lhash
           && ctx->op == PUBKEY_OP_VERIFY)
     {
-      if (gcry_sexp_length (lhash) != 3)
+      if (sexp_length (lhash) != 3)
         rc = GPG_ERR_INV_OBJ;
-      else if ( !(s=gcry_sexp_nth_data (lhash, 1, &n)) || !n )
+      else if ( !(s=sexp_nth_data (lhash, 1, &n)) || !n )
         rc = GPG_ERR_INV_OBJ;
       else
         {
@@ -1013,7 +1047,7 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
             rc = GPG_ERR_DIGEST_ALGO;
          else
            {
-             *ret_mpi = gcry_sexp_nth_mpi (lhash, 2, GCRYMPI_FMT_USG);
+             *ret_mpi = sexp_nth_mpi (lhash, 2, GCRYMPI_FMT_USG);
              if (!*ret_mpi)
                rc = GPG_ERR_INV_OBJ;
              ctx->verify_cmp = pss_verify_cmp;
@@ -1025,15 +1059,15 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
     rc = GPG_ERR_CONFLICT;
 
  leave:
-  gcry_sexp_release (ldata);
-  gcry_sexp_release (lhash);
-  gcry_sexp_release (lvalue);
+  sexp_release (ldata);
+  sexp_release (lhash);
+  sexp_release (lvalue);
 
   if (!rc)
     ctx->flags = parsed_flags;
   else
     {
-      gcry_free (ctx->label);
+      xfree (ctx->label);
       ctx->label = NULL;
     }