[Help-gnutls] Re: Getting keys for my own crtypto functions (opencdk)

Mario Lenz mario.lenz at gmx.net
Sun Jan 14 15:18:04 CET 2007


Hi!

> > Would you please have a look at these functions? If you think they're ok
> > I'll do some tests:
> 
> Hi!  Yes, that was what I had in mind.

I've done some tests now and everything's working.

to be included in opencdk.h:

cdk_error_t cdk_pubkey_to_sexp (cdk_pkt_pubkey_t pk, char **sexp, size_t * len);
cdk_error_t cdk_seckey_to_sexp (cdk_pkt_seckey_t sk, char **sexp, size_t * len);

to be added to src/pubkey.c:

/**
 * cdk_pubkey_to_sexp:
 * @pk: the public key
 * @sexp: where to store the S- expression
 * @len: the length of sexp
 *
 * Convert a public key to an S- expression. sexp is allocated
 * by this function, but you have to cdk_free() it yourself.
 * The S- expression is stored in canonical format as used by
 * libgcrypt (GCRYSEXP_FMT_CANON).
 **/

cdk_error_t
cdk_pubkey_to_sexp (cdk_pkt_pubkey_t pk, char **sexp, size_t * len)
{
  int rc;
  char *buf;
  size_t sexp_len;
  gcry_sexp_t pk_sexp;

  if (!pk || !sexp)
    return CDK_Inv_Value;

  rc = pubkey_to_sexp (&pk_sexp, pk);
  if (rc)
    return rc;

  sexp_len = gcry_sexp_sprint (pk_sexp, GCRYSEXP_FMT_CANON, NULL, 0);
  if (!sexp_len)
    {
      return CDK_Gcry_Error;
    }

  buf = (char *) cdk_malloc (sexp_len);
  if (!buf)
    {
      gcry_sexp_release (pk_sexp);
      return CDK_Out_Of_Core;
    }

  sexp_len =
    gcry_sexp_sprint (pk_sexp, GCRYSEXP_FMT_CANON, buf, sexp_len);

  gcry_sexp_release (pk_sexp);

  if (!sexp_len)
    {
      cdk_free (buf);
      return CDK_Gcry_Error;
    }

  if (len)
    *len = sexp_len;
  *sexp = buf;

  return CDK_Success;
}

/**
 * cdk_seckey_to_sexp:
 * @sk: the secret key
 * @sexp: where to store the S- expression
 * @len: the length of sexp
 *
 * Convert a public key to an S- expression. sexp is allocated
 * by this function, but you have to cdk_free() it yourself.
 * The S- expression is stored in canonical format as used by
 * libgcrypt (GCRYSEXP_FMT_CANON).
 **/

cdk_error_t
cdk_seckey_to_sexp (cdk_pkt_seckey_t sk, char **sexp, size_t * len)
{
  int rc;
  char *buf;
  size_t sexp_len;
  gcry_sexp_t sk_sexp;

  if (!sk || !sexp)
    return CDK_Inv_Value;

  rc = seckey_to_sexp (&sk_sexp, sk);
  if (rc)
    return rc;

  sexp_len = gcry_sexp_sprint (sk_sexp, GCRYSEXP_FMT_CANON, NULL, 0);
  if (!sexp_len)
    {
      return CDK_Gcry_Error;
    }

  buf = (char *) cdk_malloc (sexp_len);
  if (!buf)
    {
      gcry_sexp_release (sk_sexp);
      return CDK_Out_Of_Core;
    }

  sexp_len =
    gcry_sexp_sprint (sk_sexp, GCRYSEXP_FMT_CANON, buf, sexp_len);

  gcry_sexp_release (sk_sexp);

  if (!sexp_len)
    {
      cdk_free (buf);
      return CDK_Gcry_Error;
    }

  if (len)
    *len = sexp_len;
  *sexp = buf;

  return CDK_Success;
}


> Btw, you'll need to assign the copyright of your patch for us to be
> able to use it.  I hope this is ok.  I'll send you the form privately.

I've sent it just a moment ago.

greez

   Mario






More information about the Gnutls-help mailing list