END_TEST START_TEST(test_skip) { chunk_t skipped, buf, data = chunk_from_chars(0x00, 0x01, 0x02); bio_writer_t *writer; writer = bio_writer_create(4); skipped = writer->skip(writer, 3); ck_assert_int_eq(skipped.len, 3); buf = writer->get_buf(writer); ck_assert(skipped.ptr == buf.ptr); memset(skipped.ptr, 0, skipped.len); writer->write_data(writer, data); buf = writer->get_buf(writer); ck_assert(chunk_equals(buf, chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x01, 0x02))); writer->destroy(writer); writer = bio_writer_create(1); skipped = writer->skip(writer, 3); memcpy(skipped.ptr, data.ptr, data.len); writer->write_data(writer, data); assert_writer_after_write(writer, 2); writer->destroy(writer); }
/** * Prepend a PT-TLS header to a writer, send data, destroy writer */ bool pt_tls_write(tls_socket_t *tls, pt_tls_message_type_t type, uint32_t identifier, chunk_t data) { bio_writer_t *writer; chunk_t out; ssize_t len; len = PT_TLS_HEADER_LEN + data.len; writer = bio_writer_create(len); /* write PT-TLS header */ writer->write_uint8 (writer, 0); writer->write_uint24(writer, 0); writer->write_uint32(writer, type); writer->write_uint32(writer, len); writer->write_uint32(writer, identifier); /* write PT-TLS body */ writer->write_data(writer, data); DBG2(DBG_TNC, "sending PT-TLS message #%d of type '%N' (%d bytes)", identifier, pt_tls_message_type_names, type, len); out = writer->get_buf(writer); len = tls->write(tls, out.ptr, out.len); writer->destroy(writer); return len == out.len; }
/** * Described in header. */ pa_tnc_attr_t* swid_error_create(swid_error_code_t code, u_int32_t request_id, u_int32_t max_attr_size, char *description) { bio_writer_t *writer; chunk_t msg_info; pa_tnc_attr_t *attr; pen_type_t error_code; error_code = pen_type_create( PEN_TCG, code); writer = bio_writer_create(4); writer->write_uint32(writer, request_id); if (code == TCG_SWID_RESPONSE_TOO_LARGE) { writer->write_uint16(writer, max_attr_size); } if (description) { writer->write_data(writer, chunk_from_str(description)); } msg_info = writer->get_buf(writer); attr = ietf_attr_pa_tnc_error_create(error_code, msg_info); writer->destroy(writer); return attr; }
END_TEST START_TEST(test_extract_buf) { bio_writer_t *writer; chunk_t data1, data2; writer = bio_writer_create(0); writer->write_uint8(writer, 1); data1 = writer->extract_buf(writer); ck_assert_int_eq(data1.len, 1); ck_assert(data1.ptr[0] == 1); data2 = writer->get_buf(writer); ck_assert_int_eq(data2.len, 0); ck_assert(data2.ptr == NULL); data2 = writer->extract_buf(writer); ck_assert_int_eq(data2.len, 0); ck_assert(data2.ptr == NULL); writer->write_uint8(writer, 1); data2 = writer->get_buf(writer); ck_assert(chunk_equals(data1, data2)); ck_assert(data1.ptr != data2.ptr); writer->destroy(writer); chunk_free(&data1); }
END_TEST /******************************************************************************* * test data extraction */ START_TEST(test_get_buf) { bio_writer_t *writer; chunk_t data1, data2; writer = bio_writer_create(0); writer->write_uint8(writer, 1); data1 = writer->get_buf(writer); ck_assert_int_eq(data1.len, 1); ck_assert(data1.ptr[0] == 1); data2 = writer->get_buf(writer); ck_assert(chunk_equals(data1, data2)); ck_assert(data1.ptr == data2.ptr); writer->destroy(writer); }
/** * Encode the public key as Base64 encoded SSH key blob */ static bool build_public_key(chunk_t *encoding, va_list args) { bio_writer_t *writer; chunk_t n, e; if (cred_encoding_args(args, CRED_PART_RSA_MODULUS, &n, CRED_PART_RSA_PUB_EXP, &e, CRED_PART_END)) { writer = bio_writer_create(0); writer->write_data32(writer, chunk_from_str("ssh-rsa")); writer->write_data32(writer, e); writer->write_data32(writer, n); *encoding = chunk_to_base64(writer->get_buf(writer), NULL); writer->destroy(writer); return TRUE; } else if (cred_encoding_args(args, CRED_PART_EDDSA_PUB_ASN1_DER, &n, CRED_PART_END)) { chunk_t alg; char *prefix; int oid; /* parse subjectPublicKeyInfo */ if (asn1_unwrap(&n, &n) != ASN1_SEQUENCE) { return FALSE; } oid = asn1_parse_algorithmIdentifier(n, 1, NULL); switch (oid) { case OID_ED25519: prefix = "ssh-ed25519"; break; case OID_ED448: prefix = "ssh-ed448"; break; default: return FALSE; } if (asn1_unwrap(&n, &alg) != ASN1_SEQUENCE || asn1_unwrap(&n, &n) != ASN1_BIT_STRING || !n.len) { return FALSE; } writer = bio_writer_create(0); writer->write_data32(writer, chunk_from_str(prefix)); writer->write_data32(writer, chunk_skip(n, 1)); *encoding = chunk_to_base64(writer->get_buf(writer), NULL); writer->destroy(writer); return TRUE; } else if (cred_encoding_args(args, CRED_PART_ECDSA_PUB_ASN1_DER, &n, CRED_PART_END)) { chunk_t params, alg, q; int oid; /* parse subjectPublicKeyInfo */ if (asn1_unwrap(&n, &n) != ASN1_SEQUENCE) { return FALSE; } oid = asn1_parse_algorithmIdentifier(n, 1, ¶ms); if (oid != OID_EC_PUBLICKEY || asn1_unwrap(¶ms, ¶ms) != ASN1_OID) { return FALSE; } oid = asn1_known_oid(params); if (oid == OID_UNKNOWN) { return FALSE; } if (asn1_unwrap(&n, &alg) != ASN1_SEQUENCE || asn1_unwrap(&n, &q) != ASN1_BIT_STRING) { return FALSE; } writer = bio_writer_create(0); write_ec_identifier(writer, ECDSA_PREFIX, oid, params); write_ec_identifier(writer, "", oid, params); q = chunk_skip_zero(q); writer->write_data32(writer, q); *encoding = chunk_to_base64(writer->get_buf(writer), NULL); writer->destroy(writer); return TRUE; } return FALSE; }