static int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s, const char *v) { unsigned char tmp[MAX_LEN]; int len; vinfo->v = NULL; vinfo->s = NULL; len = t_fromb64(tmp, sizeof(tmp), v); if (len < 0) return 0; if (NULL == (vinfo->v = BN_bin2bn(tmp, len, NULL))) return 0; len = t_fromb64(tmp, sizeof(tmp), s); if (len < 0) goto err; vinfo->s = BN_bin2bn(tmp, len, NULL); if (vinfo->s == NULL) goto err; return 1; err: BN_free(vinfo->v); vinfo->v = NULL; return 0; }
static SRP_gN_cache *SRP_gN_new_init(const char *ch) { unsigned char tmp[MAX_LEN]; int len; SRP_gN_cache *newgN = OPENSSL_malloc(sizeof(*newgN)); if (newgN == NULL) return NULL; len = t_fromb64(tmp, sizeof(tmp), ch); if (len < 0) goto err; if ((newgN->b64_bn = OPENSSL_strdup(ch)) == NULL) goto err; if ((newgN->bn = BN_bin2bn(tmp, len, NULL))) return newgN; OPENSSL_free(newgN->b64_bn); err: OPENSSL_free(newgN); return NULL; }
int main() { int index; struct t_client * tc; struct t_preconf *tcp; struct t_num n; struct t_num g; struct t_num s; struct t_num B; char username[MAXUSERLEN]; char hexbuf[MAXHEXPARAMLEN]; char buf1[MAXPARAMLEN], buf2[MAXPARAMLEN], buf3[MAXSALTLEN]; unsigned char cbuf[20]; struct t_num * A; unsigned char * skey; char pass[128]; printf("Enter username: "******"Enter index (from server): "); fgets(hexbuf, sizeof(hexbuf), stdin); index = atoi(hexbuf); tcp = t_getpreparam(index - 1); printf("Enter salt (from server): "); fgets(hexbuf, sizeof(hexbuf), stdin); s.data = buf3; s.len = t_fromb64(s.data, hexbuf); tc = t_clientopen(username, &tcp->modulus, &tcp->generator, &s); if (tc == 0) { printf("invalid n, g\n"); exit(1); } A = t_clientgenexp(tc); printf("A (to server): %s\n", t_tob64(hexbuf, A->data, A->len)); t_getpass(pass, 128, "Enter password:"******"Enter B (from server): "); fgets(hexbuf, sizeof(hexbuf), stdin); B.data = buf1; B.len = t_fromb64(B.data, hexbuf); skey = t_clientgetkey(tc, &B); printf("Session key: %s\n", t_tohex(hexbuf, skey, 40)); printf("Response (to server): %s\n", t_tohex(hexbuf, t_clientresponse(tc), RESPONSE_LEN)); printf("Enter server response: "); fgets(hexbuf, sizeof(hexbuf), stdin); hexbuf[strlen(hexbuf) - 1] = '\0'; t_fromhex(cbuf, hexbuf); if (t_clientverify(tc, cbuf) == 0) printf("Server authentication successful.\n"); else printf("Server authentication failed.\n"); t_clientclose(tc); return 0; }