#define SAFE_LEN(x) (x==NULL?0:strlen(x))
-static int tpm_open_session(struct tpm_ctx_st *s, const char *srk_password)
+static int tpm_open_session(struct tpm_ctx_st *s, const char *_srk_password)
{
int err, ret;
+ char *password = NULL;
err = pTspi_Context_Create(&s->tpm_ctx);
if (err) {
return tss_err(err);
}
+ if (_srk_password != NULL) {
+ gnutls_datum_t pout;
+ ret = _gnutls_utf8_password_normalize(_srk_password, strlen(_srk_password), &pout);
+ if (ret < 0) {
+ gnutls_assert();
+ goto out_tspi_ctx;
+ }
+ password = (char*)pout.data;
+ }
+
err = pTspi_Context_Connect(s->tpm_ctx, NULL);
if (err) {
gnutls_assert();
}
err = myTspi_Policy_SetSecret(s->srk_policy,
- SAFE_LEN(srk_password),
- (BYTE *) srk_password);
+ SAFE_LEN(password),
+ (BYTE *) password);
if (err) {
gnutls_assert();
ret = tss_err(err);
out_tspi_ctx:
pTspi_Context_Close(s->tpm_ctx);
s->tpm_ctx = 0;
+ gnutls_free(password);
return ret;
}
return ret;
}
-
static int
import_tpm_key(gnutls_privkey_t pkey,
const gnutls_datum_t * fdata,
gnutls_tpmkey_fmt_t format,
TSS_UUID * uuid,
TSS_FLAG storage,
- const char *srk_password, const char *key_password)
+ const char *srk_password, const char *_key_password)
{
int err, ret;
struct tpm_ctx_st *s;
gnutls_datum_t tmp_sig;
+ char *key_password = NULL;
s = gnutls_malloc(sizeof(*s));
if (s == NULL) {
return GNUTLS_E_MEMORY_ERROR;
}
+ if (_key_password != NULL) {
+ gnutls_datum_t pout;
+ ret = _gnutls_utf8_password_normalize(_key_password, strlen(_key_password), &pout);
+ if (ret < 0) {
+ gnutls_assert();
+ goto out_ctx;
+ }
+ key_password = (char*)pout.data;
+ }
+
+ /* normalization of srk_password happens in tpm_open_session() */
+
ret = tpm_open_session(s, srk_password);
if (ret < 0) {
gnutls_assert();
goto out_session;
}
+ gnutls_free(key_password);
+
return 0;
out_key_policy:
pTspi_Context_CloseObject(s->tpm_ctx, s->tpm_key_policy);
tpm_close_session(s);
out_ctx:
gnutls_free(s);
+ gnutls_free(key_password);
return ret;
}
/* set the password of the actual key */
if (key_password) {
+ gnutls_datum_t pout;
+ char *password = NULL;
+
tssret =
pTspi_GetPolicyObject(key_ctx, TSS_POLICY_USAGE,
&key_policy);
goto err_sa;
}
+ ret = _gnutls_utf8_password_normalize(key_password, strlen(key_password), &pout);
+ if (ret < 0) {
+ gnutls_assert();
+ goto err_sa;
+ }
+ password = (char*)pout.data;
+
tssret = myTspi_Policy_SetSecret(key_policy,
- SAFE_LEN(key_password),
- (void *) key_password);
+ SAFE_LEN(password),
+ (void *)password);
+ gnutls_free(password);
if (tssret != 0) {
gnutls_assert();
ret = tss_err(tssret);