int KSI_OctetString_toTlv(KSI_CTX *ctx, KSI_OctetString *o, unsigned tag, int isNonCritical, int isForward, KSI_TLV **tlv) { int res = KSI_UNKNOWN_ERROR; KSI_TLV *tmp = NULL; KSI_ERR_clearErrors(ctx); if (ctx == NULL || o == NULL || tlv == NULL) { KSI_pushError(ctx, res = KSI_INVALID_ARGUMENT, NULL); goto cleanup; } res = KSI_TLV_new(ctx, tag, isNonCritical, isForward, &tmp); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } res = KSI_TLV_setRawValue(tmp, o->data, o->data_len); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } *tlv = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_TLV_free(tmp); return res; }
int KSI_Integer_toTlv(KSI_CTX *ctx, KSI_Integer *o, unsigned tag, int isNonCritical, int isForward, KSI_TLV **tlv) { int res = KSI_UNKNOWN_ERROR; KSI_TLV *tmp = NULL; unsigned char raw[8]; unsigned len = 0; KSI_uint64_t val; KSI_ERR_clearErrors(ctx); if (ctx == NULL || o == NULL || tlv == NULL) { KSI_pushError(ctx, res = KSI_INVALID_ARGUMENT, NULL); goto cleanup; } val = o->value; res = KSI_TLV_new(ctx, tag, isNonCritical, isForward, &tmp); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } /* Encode the integer value. */ while (val != 0) { raw[7 - len++] = val & 0xff; val >>= 8; } /* If the length is greater than 0 (val > 0), add the raw value. */ if (len > 0) { res = KSI_TLV_setRawValue(tmp, raw + 8 - len, len); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } } *tlv = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_TLV_free(tmp); return res; }
int KSI_PKISignature_toTlv(KSI_CTX *ctx, KSI_PKISignature *sig, unsigned tag, int isNonCritical, int isForward, KSI_TLV **tlv) { int res = KSI_UNKNOWN_ERROR; KSI_TLV *tmp = NULL; unsigned char *raw = NULL; unsigned raw_len = 0; KSI_ERR_clearErrors(ctx); if (ctx == NULL || sig == NULL || tlv == NULL){ res = KSI_INVALID_ARGUMENT; goto cleanup; } res = KSI_TLV_new(ctx, KSI_TLV_PAYLOAD_RAW, tag, isNonCritical, isForward, &tmp); if (res != KSI_OK){ KSI_pushError(ctx, res, NULL); goto cleanup; } res = KSI_PKISignature_serialize(sig, &raw, &raw_len); if (res != KSI_OK){ KSI_pushError(ctx, res, NULL); goto cleanup; } res = KSI_TLV_setRawValue(tmp, raw, raw_len); if (res != KSI_OK){ KSI_pushError(ctx, res, NULL); goto cleanup; } *tlv = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_nofree(raw); KSI_TLV_free(tmp); return res; }
int KSI_DataHash_toTlv(KSI_CTX *ctx, KSI_DataHash *hsh, unsigned tag, int isNonCritical, int isForward, KSI_TLV **tlv) { int res = KSI_UNKNOWN_ERROR; KSI_TLV *tmp = NULL; const unsigned char *raw = NULL; size_t raw_len = 0; KSI_ERR_clearErrors(ctx); if (ctx == NULL || hsh == NULL || tlv == NULL) { res = KSI_INVALID_ARGUMENT; goto cleanup; } res = KSI_TLV_new(ctx, tag, isNonCritical, isForward, &tmp); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } res = KSI_DataHash_getImprint(hsh, &raw, &raw_len); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } res = KSI_TLV_setRawValue(tmp, raw, raw_len); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } *tlv = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_nofree(raw); KSI_TLV_free(tmp); return res; }
int KSI_Utf8String_toTlv(KSI_CTX *ctx, KSI_Utf8String *o, unsigned tag, int isNonCritical, int isForward, KSI_TLV **tlv) { int res = KSI_UNKNOWN_ERROR; KSI_TLV *tmp = NULL; KSI_ERR_clearErrors(ctx); if (ctx == NULL || o == NULL || tlv == NULL) { KSI_pushError(ctx, res = KSI_INVALID_ARGUMENT, NULL); goto cleanup; } res = KSI_TLV_new(ctx, tag, isNonCritical, isForward, &tmp); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } if (o->len > 0xffff){ KSI_pushError(ctx, res = KSI_INVALID_ARGUMENT, "UTF8 string too long for TLV conversion."); goto cleanup; } res = KSI_TLV_setRawValue(tmp, o->value, (unsigned)o->len); if (res != KSI_OK) { KSI_pushError(ctx, res, NULL); goto cleanup; } *tlv = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_TLV_free(tmp); return res; }