forked from wolfSSL/wolfssl
add srp example to test.c
This commit is contained in:
@ -53,6 +53,7 @@
|
|||||||
#include <wolfssl/wolfcrypt/hmac.h>
|
#include <wolfssl/wolfcrypt/hmac.h>
|
||||||
#include <wolfssl/wolfcrypt/dh.h>
|
#include <wolfssl/wolfcrypt/dh.h>
|
||||||
#include <wolfssl/wolfcrypt/dsa.h>
|
#include <wolfssl/wolfcrypt/dsa.h>
|
||||||
|
#include <wolfssl/wolfcrypt/srp.h>
|
||||||
#include <wolfssl/wolfcrypt/hc128.h>
|
#include <wolfssl/wolfcrypt/hc128.h>
|
||||||
#include <wolfssl/wolfcrypt/rabbit.h>
|
#include <wolfssl/wolfcrypt/rabbit.h>
|
||||||
#include <wolfssl/wolfcrypt/chacha.h>
|
#include <wolfssl/wolfcrypt/chacha.h>
|
||||||
@ -179,6 +180,7 @@ int camellia_test(void);
|
|||||||
int rsa_test(void);
|
int rsa_test(void);
|
||||||
int dh_test(void);
|
int dh_test(void);
|
||||||
int dsa_test(void);
|
int dsa_test(void);
|
||||||
|
int srp_test(void);
|
||||||
int random_test(void);
|
int random_test(void);
|
||||||
int pwdbased_test(void);
|
int pwdbased_test(void);
|
||||||
int ripemd_test(void);
|
int ripemd_test(void);
|
||||||
@ -500,6 +502,13 @@ int wolfcrypt_test(void* args)
|
|||||||
printf( "DSA test passed!\n");
|
printf( "DSA test passed!\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WOLFCRYPT_HAVE_SRP
|
||||||
|
if ( (ret = srp_test()) != 0)
|
||||||
|
return err_sys("SRP test failed!\n", ret);
|
||||||
|
else
|
||||||
|
printf( "SRP test passed!\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef NO_PWDBASED
|
#ifndef NO_PWDBASED
|
||||||
if ( (ret = pwdbased_test()) != 0)
|
if ( (ret = pwdbased_test()) != 0)
|
||||||
return err_sys("PWDBASED test failed!\n", ret);
|
return err_sys("PWDBASED test failed!\n", ret);
|
||||||
@ -4541,6 +4550,101 @@ int dsa_test(void)
|
|||||||
|
|
||||||
#endif /* NO_DSA */
|
#endif /* NO_DSA */
|
||||||
|
|
||||||
|
#ifdef WOLFCRYPT_HAVE_SRP
|
||||||
|
|
||||||
|
int srp_test(void)
|
||||||
|
{
|
||||||
|
Srp cli, srv;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
byte clientPubKey[80]; /* A */
|
||||||
|
byte serverPubKey[80]; /* B */
|
||||||
|
word32 clientPubKeySz = 80;
|
||||||
|
word32 serverPubKeySz = 80;
|
||||||
|
byte clientProof[SRP_MAX_DIGEST_SIZE]; /* M1 */
|
||||||
|
byte serverProof[SRP_MAX_DIGEST_SIZE]; /* M2 */
|
||||||
|
word32 clientProofSz = SRP_MAX_DIGEST_SIZE;
|
||||||
|
word32 serverProofSz = SRP_MAX_DIGEST_SIZE;
|
||||||
|
|
||||||
|
byte username[] = "user";
|
||||||
|
word32 usernameSz = 4;
|
||||||
|
|
||||||
|
byte password[] = "password";
|
||||||
|
word32 passwordSz = 8;
|
||||||
|
|
||||||
|
byte N[] = {
|
||||||
|
0xC9, 0x4D, 0x67, 0xEB, 0x5B, 0x1A, 0x23, 0x46, 0xE8, 0xAB, 0x42, 0x2F,
|
||||||
|
0xC6, 0xA0, 0xED, 0xAE, 0xDA, 0x8C, 0x7F, 0x89, 0x4C, 0x9E, 0xEE, 0xC4,
|
||||||
|
0x2F, 0x9E, 0xD2, 0x50, 0xFD, 0x7F, 0x00, 0x46, 0xE5, 0xAF, 0x2C, 0xF7,
|
||||||
|
0x3D, 0x6B, 0x2F, 0xA2, 0x6B, 0xB0, 0x80, 0x33, 0xDA, 0x4D, 0xE3, 0x22,
|
||||||
|
0xE1, 0x44, 0xE7, 0xA8, 0xE9, 0xB1, 0x2A, 0x0E, 0x46, 0x37, 0xF6, 0x37,
|
||||||
|
0x1F, 0x34, 0xA2, 0x07, 0x1C, 0x4B, 0x38, 0x36, 0xCB, 0xEE, 0xAB, 0x15,
|
||||||
|
0x03, 0x44, 0x60, 0xFA, 0xA7, 0xAD, 0xF4, 0x83
|
||||||
|
};
|
||||||
|
|
||||||
|
byte g[] = {
|
||||||
|
0x02
|
||||||
|
};
|
||||||
|
|
||||||
|
byte salt[] = {
|
||||||
|
0xB2, 0xE5, 0x8E, 0xCC, 0xD0, 0xCF, 0x9D, 0x10, 0x3A, 0x56
|
||||||
|
};
|
||||||
|
|
||||||
|
byte verifier[] = {
|
||||||
|
0x7C, 0xAB, 0x17, 0xFE, 0x54, 0x3E, 0x8C, 0x13, 0xF2, 0x3D, 0x21, 0xE7,
|
||||||
|
0xD2, 0xAF, 0xAF, 0xDB, 0xA1, 0x52, 0x69, 0x9D, 0x49, 0x01, 0x79, 0x91,
|
||||||
|
0xCF, 0xD1, 0x3F, 0xE5, 0x28, 0x72, 0xCA, 0xBE, 0x13, 0xD1, 0xC2, 0xDA,
|
||||||
|
0x65, 0x34, 0x55, 0x8F, 0x34, 0x0E, 0x05, 0xB8, 0xB4, 0x0F, 0x7F, 0x6B,
|
||||||
|
0xBB, 0xB0, 0x6B, 0x50, 0xD8, 0xB1, 0xCC, 0xB7, 0x81, 0xFE, 0xD4, 0x42,
|
||||||
|
0xF5, 0x11, 0xBC, 0x8A, 0x28, 0xEB, 0x50, 0xB3, 0x46, 0x08, 0xBA, 0x24,
|
||||||
|
0xA2, 0xFB, 0x7F, 0x2E, 0x0A, 0xA5, 0x33, 0xCC
|
||||||
|
};
|
||||||
|
|
||||||
|
/* client knows username and password. */
|
||||||
|
/* server knows N, g, salt and verifier. */
|
||||||
|
|
||||||
|
r = wc_SrpInit(&cli, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
|
||||||
|
if (!r) r = wc_SrpSetUsername(&cli, username, usernameSz);
|
||||||
|
|
||||||
|
/* client sends username to server */
|
||||||
|
|
||||||
|
if (!r) r = wc_SrpInit(&srv, SRP_TYPE_SHA, SRP_SERVER_SIDE);
|
||||||
|
if (!r) r = wc_SrpSetUsername(&srv, username, usernameSz);
|
||||||
|
if (!r) r = wc_SrpSetParams(&srv, N, sizeof(N),
|
||||||
|
g, sizeof(g),
|
||||||
|
salt, sizeof(salt));
|
||||||
|
if (!r) r = wc_SrpSetVerifier(&srv, verifier, sizeof(verifier));
|
||||||
|
if (!r) r = wc_SrpGetPublic(&srv, serverPubKey, &serverPubKeySz);
|
||||||
|
|
||||||
|
/* server sends N, g, salt and B to client */
|
||||||
|
|
||||||
|
if (!r) r = wc_SrpSetParams(&cli, N, sizeof(N),
|
||||||
|
g, sizeof(g),
|
||||||
|
salt, sizeof(salt));
|
||||||
|
if (!r) r = wc_SrpSetPassword(&cli, password, passwordSz);
|
||||||
|
if (!r) r = wc_SrpGetPublic(&cli, clientPubKey, &clientPubKeySz);
|
||||||
|
if (!r) r = wc_SrpComputeKey(&cli, clientPubKey, clientPubKeySz,
|
||||||
|
serverPubKey, serverPubKeySz);
|
||||||
|
if (!r) r = wc_SrpGetProof(&cli, clientProof, &clientProofSz);
|
||||||
|
|
||||||
|
/* client sends A and M1 to server */
|
||||||
|
|
||||||
|
if (!r) r = wc_SrpComputeKey(&srv, clientPubKey, clientPubKeySz,
|
||||||
|
serverPubKey, serverPubKeySz);
|
||||||
|
if (!r) r = wc_SrpVerifyPeersProof(&srv, clientProof, clientProofSz);
|
||||||
|
if (!r) r = wc_SrpGetProof(&srv, serverProof, &serverProofSz);
|
||||||
|
|
||||||
|
/* server sends M2 to client */
|
||||||
|
|
||||||
|
if (!r) r = wc_SrpVerifyPeersProof(&cli, serverProof, serverProofSz);
|
||||||
|
|
||||||
|
wc_SrpTerm(&cli);
|
||||||
|
wc_SrpTerm(&srv);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* WOLFCRYPT_HAVE_SRP */
|
||||||
|
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user