x25519 preinit
parent
0b2242727b
commit
eb7a8f7cfd
|
@ -0,0 +1,137 @@
|
|||
#include<openssl/crypto.h>
|
||||
#include <openssl/evp.h>
|
||||
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
|
||||
#define LENKEY 32
|
||||
static size_t len_key = LENKEY;
|
||||
struct keysPair{
|
||||
EVP_PKEY * privKey; //, *pubKey ;
|
||||
unsigned char pubKey[LENKEY+1];
|
||||
EVP_PKEY_CTX * pKeyCtx;//just ctx
|
||||
};
|
||||
|
||||
|
||||
struct keysPair createKeyPair(const uint8_t * priv, const uint8_t * pub){
|
||||
struct keysPair ret;
|
||||
bzero(ret.pubKey,sizeof(ret.pubKey));
|
||||
EVP_PKEY_CTX * ctx = /*(EVP_CIPHER_CTX*)*/EVP_PKEY_CTX_new_id (NID_X25519, NULL);
|
||||
if (!ctx){
|
||||
fprintf(stderr,"Cant create x25519 pair\n");
|
||||
return ret;
|
||||
}
|
||||
EVP_PKEY * privKey = EVP_PKEY_new_raw_private_key (EVP_PKEY_X25519, NULL, priv, len_key);
|
||||
EVP_PKEY_get_raw_public_key(privKey, ret.pubKey, &len_key);
|
||||
ret.privKey = privKey;
|
||||
//ret.pubKey = pubKey;
|
||||
ret.pKeyCtx=ctx;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void freeKeyPair(struct keysPair * pair){
|
||||
EVP_PKEY_CTX_free( pair->pKeyCtx );
|
||||
EVP_PKEY_free(pair->privKey);
|
||||
// EVP_PKEY_free(pair->pubKey);
|
||||
}
|
||||
void freeSharedKeys(uint8_t * w, ...){
|
||||
va_list ap;
|
||||
va_start(ap,w);
|
||||
while(*w){
|
||||
OPENSSL_free(w);
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
struct keysPair generateKeyPair(void){
|
||||
struct keysPair ret;
|
||||
EVP_PKEY_CTX *ctx;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
ctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL);
|
||||
if (!ctx){
|
||||
fprintf(stderr,"Cant create x25519 pair\n");
|
||||
return ret;
|
||||
}
|
||||
if (EVP_PKEY_keygen_init(ctx) <= 0){
|
||||
fprintf(stderr, "can't keygen x25519 pair\n");
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
return ret;
|
||||
}
|
||||
EVP_PKEY_keygen (ctx, &pkey);
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
ctx = EVP_PKEY_CTX_new (pkey, NULL);
|
||||
bzero(ret.pubKey,sizeof(ret.pubKey));
|
||||
EVP_PKEY_get_raw_public_key (pkey, ret.pubKey, &len_key);
|
||||
//EVP_PKEY_CTX_free (ctx);
|
||||
|
||||
ret.privKey=pkey;
|
||||
//ret.pubKey=pubKey;
|
||||
ret.pKeyCtx=ctx;
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t * getSharedKey( struct keysPair * pair, const uint8_t * pubPeer, size_t * skeylen ){
|
||||
if (!pubPeer || (pubPeer[31] & 0x80)){
|
||||
fprintf(stderr,"Is not pubkey!\n");
|
||||
return NULL;
|
||||
}// not x25519 key
|
||||
|
||||
if(EVP_PKEY_derive_init(pair->pKeyCtx) <= 0){
|
||||
fprintf(stderr,"derive init error\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
EVP_PKEY * pkey = EVP_PKEY_new_raw_public_key (NID_X25519, NULL, pubPeer, len_key);
|
||||
|
||||
if (EVP_PKEY_derive_set_peer(pair->pKeyCtx, pkey) <= 0)
|
||||
{
|
||||
fprintf(stderr,"Seet peer key error\n");
|
||||
EVP_PKEY_free (pkey);
|
||||
return NULL;
|
||||
}
|
||||
if( EVP_PKEY_derive (pair->pKeyCtx, NULL, skeylen) <= 0){
|
||||
fprintf(stderr, "buffer length derive err\n");
|
||||
EVP_PKEY_free (pkey);
|
||||
return NULL;
|
||||
}
|
||||
uint8_t * ret = OPENSSL_malloc(*skeylen);
|
||||
if(ret == 0){
|
||||
fprintf(stderr,"OPENSSL malloc err\n");
|
||||
EVP_PKEY_free (pkey);
|
||||
return NULL;
|
||||
}
|
||||
if( EVP_PKEY_derive (pair->pKeyCtx, ret, skeylen) <= 0){
|
||||
fprintf(stderr, "shared key write err\n");
|
||||
EVP_PKEY_free (pkey);
|
||||
return NULL;
|
||||
}
|
||||
EVP_PKEY_free (pkey);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int test(void){
|
||||
struct keysPair pair = generateKeyPair();
|
||||
struct keysPair pair1 = generateKeyPair();
|
||||
if(pair.pKeyCtx == NULL || pair1.pKeyCtx == NULL ) {
|
||||
return fprintf(stderr,"can't CTX init\n");
|
||||
}
|
||||
printf("pubKey: %s\nLen(strlen): %d\n", pair.pubKey,strlen(pair.pubKey));
|
||||
printf("pubKey1: %s\nLen(strlen): %d\n", pair1.pubKey,strlen(pair1.pubKey));
|
||||
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
||||
size_t skeylen,skeylen1;
|
||||
|
||||
//bzero(shared0,sizeof(shared0));
|
||||
//bzero(shared1,sizeof(shared0));
|
||||
uint8_t * shared0 = getSharedKey(&pair, pair1.pubKey,&skeylen);
|
||||
uint8_t * shared1 = getSharedKey(&pair1, pair.pubKey, &skeylen1);
|
||||
printf("shared0: %s \nshared1: %s \n",shared0,shared1);
|
||||
freeSharedKeys(shared0,shared1,NULL);
|
||||
freeKeyPair(&pair);freeKeyPair(&pair1);
|
||||
}
|
||||
|
||||
int main(void){
|
||||
puts("Start test");
|
||||
test();
|
||||
puts("Test is done");
|
||||
}
|
Loading…
Reference in New Issue