The information is very helpful! Thank you very much!
But what is the functions/APIs from open SSl to derive
the master secret from premaster secret(DH shared secret)
and generate the symmetric key for a algorithm?
regards,
patty
Vadim Fedukovich <[EMAIL PROTECTED]> wrote:
>On Tue, Jun 18, 2002 at 11:52:22AM -0400, Patty Zheng wrote:
>> Hi,
>>
>> I am doing Diffie-Hellman key exchange using open ssl.
>> I generate parameters p and g using DH_generate_parameters().
>> I use DH_generate_key() to generate public and private keys.
>> Then I use DH_compute_key() to compute the DH key(the shared secret).
>> But the DH_compute_key() doesn't generate the DH key for a specific algorithm.
>
>This was never specified by DH. Shared secret is the only output of DH
>
>> For example I would like to generate the DH key for DES or Blowfish. How
>> can I get the key
>> for a specific algorithm?
>
>One could keep talking about DES key derived somehow from shared secret.
>
>To get DES keys, TLS/SSL specify expansion function (PRF)
>applied to master secret. Also, PRF is used to derive this master secret
>from premaster secret and client and server random values.
>DH shared secret is used as premaster secret.
>see 6.3, 8.1, 8.1.2 of rfc 2246
>
>> The attached is the sample code from open ssl.
>>
>> Your response is appreciated!
>>
>> patty
>>
>>
>>
>>
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <string.h>
>> #ifdef WINDOWS
>> #include "../bio/bss_file.c"
>> #endif
>> #include <openssl/crypto.h>
>> #include <openssl/bio.h>
>> #include <openssl/bn.h>
>> #include <openssl/rand.h>
>>
>> #ifdef NO_DH
>> int main(int argc, char *argv[])
>> {
>> printf("No DH support\n");
>> return(0);
>> }
>> #else
>> #include <openssl/dh.h>
>>
>> #ifdef WIN16
>> #define MS_CALLBACK _far _loadds
>> #else
>> #define MS_CALLBACK
>> #endif
>>
>> static void MS_CALLBACK cb(int p, int n, void *arg);
>> #ifdef NO_STDIO
>> #define APPS_WIN16
>> #include "bss_file.c"
>> #endif
>>
>> static const char rnd_seed[] = "string to make the random number generator
>> think it has entropy";
>>
>> int main(int argc, char *argv[])
>> {
>> DH *a;
>> DH *b=NULL;
>> char buf[12];
>> unsigned char *abuf=NULL,*bbuf=NULL;
>> int i,alen,blen,aout,bout,ret=1;
>> BIO *out;
>>
>> #ifdef WIN32
>> CRYPTO_malloc_init();
>> #endif
>>
>> RAND_seed(rnd_seed, sizeof rnd_seed);
>>
>> out=BIO_new(BIO_s_file());
>> if (out == NULL) exit(1);
>> BIO_set_fp(out,stdout,BIO_NOCLOSE);
>>
>> a=DH_generate_parameters(1024,DH_GENERATOR_2,cb,out);
>> if (a == NULL) goto err;
>>
>> BIO_puts(out,"\np =");
>> BN_print(out,a->p);
>> BIO_puts(out,"\ng =");
>> BN_print(out,a->g);
>> BIO_puts(out,"\n");
>>
>> b=DH_new();
>> if (b == NULL) goto err;
>>
>> b->p=BN_dup(a->p);
>> b->g=BN_dup(a->g);
>> if ((b->p == NULL) || (b->g == NULL)) goto err;
>>
>> if (!DH_generate_key(a)) goto err;
>>
>> BIO_puts(out,"pri 1=");
>> BN_print(out,a->priv_key);
>> BIO_puts(out,"\npub 1=");
>> BN_print(out,a->pub_key);
>> BIO_puts(out,"\n");
>>
>> if (!DH_generate_key(b)) goto err;
>> BIO_puts(out,"pri 2=");
>> BN_print(out,b->priv_key);
>> BIO_puts(out,"\npub 2=");
>> BN_print(out,b->pub_key);
>> BIO_puts(out,"\n");
>>
>> alen=DH_size(a);
>> abuf=(unsigned char *)OPENSSL_malloc(alen);
>> aout=DH_compute_key(abuf,b->pub_key,a);
>>
>>
>> BIO_puts(out,"key1 =");
>> for (i=0; i<aout; i++)
>> {
>> sprintf(buf,"%02X",abuf[i]);
>> BIO_puts(out,buf);
>> }
>> BIO_puts(out,"\n");
>>
>> blen=DH_size(b);
>> bbuf=(unsigned char *)OPENSSL_malloc(blen);
>> bout=DH_compute_key(bbuf,a->pub_key,b);
>>
>> BIO_puts(out,"key2 =");
>> for (i=0; i<bout; i++)
>> {
>> sprintf(buf,"%02X",bbuf[i]);
>> BIO_puts(out,buf);
>> }
>> BIO_puts(out,"\n");
>> if ((aout < 4) || (bout != aout) || (memcmp(abuf,bbuf,aout) != 0))
>> {
>> fprintf(stderr,"Error in DH routines\n");
>> ret=1;
>> }
>> else
>> ret=0;
>> err:
>> if (abuf != NULL) OPENSSL_free(abuf);
>> if (bbuf != NULL) OPENSSL_free(bbuf);
>> if(b != NULL) DH_free(b);
>> if(a != NULL) DH_free(a);
>> BIO_free(out);
>> exit(ret);
>> return(ret);
>> }
>>
>> static void MS_CALLBACK cb(int p, int n, void *arg)
>> {
>> char c='*';
>>
>> if (p == 0) c='.';
>> if (p == 1) c='+';
>> if (p == 2) c='*';
>> if (p == 3) c='\n';
>> BIO_write((BIO *)arg,&c,1);
>> (void)BIO_flush((BIO *)arg);
>> #ifdef LINT
>> p=n;
>> #endif
>> }
>> #endif
>--
>Naina library: http://www.unity.net/~vf/naina_r1.tgz
>______________________________________________________________________
>OpenSSL Project http://www.openssl.org
>User Support Mailing List [EMAIL PROTECTED]
>Automated List Manager [EMAIL PROTECTED]
>