コード例 #1
0
ファイル: ndn_name_util.c プロジェクト: github188/mypeek
/**
 * 找到ndnb编码过的名字中的 组件边界
 *
 * Find Component boundaries in a ndnb-encoded Name.
 *
 * Thin veneer over ndn_parse_Name().
 * components arg may be NULL to just do a validity check
 *
 * @returns -1 for error, otherwise the number of Components.
 */
int
ndn_name_split(const struct ndn_charbuf *c, struct ndn_indexbuf *components)
{
    struct ndn_buf_decoder decoder;
    struct ndn_buf_decoder *d;
    d = ndn_buf_decoder_start(&decoder, c->buf, c->length);
    return(ndn_parse_Name(d, components));
}
コード例 #2
0
ファイル: ndn_reg_mgmt.c プロジェクト: cawka/ndnd-tlv
struct ndn_forwarding_entry *
ndn_forwarding_entry_parse(const unsigned char *p, size_t size)
{
    struct ndn_buf_decoder decoder;
    struct ndn_buf_decoder *d = ndn_buf_decoder_start(&decoder, p, size);
    struct ndn_charbuf *store = ndn_charbuf_create();
    struct ndn_forwarding_entry *result;
    const unsigned char *val;
    size_t sz;
    size_t start;
    size_t end;
    int action_off = -1;
    int ndnd_id_off = -1;
    
    if (store == NULL)
        return(NULL);
    result = calloc(1, sizeof(*result));
    if (result == NULL) {
        ndn_charbuf_destroy(&store);
        return(NULL);
    }
    if (ndn_buf_match_dtag(d, NDN_DTAG_ForwardingEntry)) {
        ndn_buf_advance(d);
        action_off = ndn_parse_tagged_string(d, NDN_DTAG_Action, store);
        if (ndn_buf_match_dtag(d, NDN_DTAG_Name)) {
            result->name_prefix = ndn_charbuf_create();
            start = d->decoder.token_index;
            ndn_parse_Name(d, NULL);
            end = d->decoder.token_index;
            ndn_charbuf_append(result->name_prefix, p + start, end - start);
        }
        else
            result->name_prefix = NULL;
        if (ndn_buf_match_dtag(d, NDN_DTAG_PublisherPublicKeyDigest)) {
            ndn_buf_advance(d);
            if (ndn_buf_match_blob(d, &val, &sz)) {
                ndn_buf_advance(d);
                if (sz != 32)
                    d->decoder.state = -__LINE__;
            }
            ndn_buf_check_close(d);
            if (d->decoder.state >= 0) {
                ndnd_id_off = store->length;
                ndn_charbuf_append(store, val, sz);
                result->ndnd_id_size = sz;
            }
        }
        result->faceid = ndn_parse_optional_tagged_nonNegativeInteger(d, NDN_DTAG_FaceID);
        result->flags = ndn_parse_optional_tagged_nonNegativeInteger(d, NDN_DTAG_ForwardingFlags);
        result->lifetime = ndn_parse_optional_tagged_nonNegativeInteger(d, NDN_DTAG_FreshnessSeconds);
        ndn_buf_check_close(d);
    }
    else
        d->decoder.state = -__LINE__;
    
    if (d->decoder.index != size || !NDN_FINAL_DSTATE(d->decoder.state) ||
        store->length > sizeof(result->store))
        ndn_forwarding_entry_destroy(&result);
    else {
        char *b = (char *)result->store;
        memcpy(b, store->buf, store->length);
        result->action = (action_off == -1) ? NULL : b + action_off;
        result->ndnd_id = (ndnd_id_off == -1) ? NULL : result->store + ndnd_id_off;
    }
    ndn_charbuf_destroy(&store);
    return(result);
}
コード例 #3
0
ファイル: methods_key.c プロジェクト: named-data/PyNDN
PyObject *
KeyLocator_obj_from_ndn(PyObject *py_keylocator)
{
    struct ndn_buf_decoder decoder, *d;
    struct ndn_charbuf *keylocator;
    struct ndn_charbuf *name;
    struct ndn_pkey *pubkey;
    size_t start, stop;
    int r;
    PyObject *py_o;
    PyObject *py_KeyLocator_obj = NULL;

    keylocator = NDNObject_Get(KEY_LOCATOR, py_keylocator);

    debug("KeyLocator_from_ndn start\n");

    d = ndn_buf_decoder_start(&decoder, keylocator->buf, keylocator->length);
    assert(d); //should always succeed

    if (!ndn_buf_match_dtag(d, NDN_DTAG_KeyLocator)) {
        PyErr_SetString(g_PyExc_NDNKeyLocatorError, "The input isn't a valid"
                        " KeyLocator");
        return NULL;
    }
    ndn_buf_advance(d);

    if (ndn_buf_match_dtag(d, NDN_DTAG_KeyName)) {
        const unsigned char *bname;
        size_t bname_size;
        PyObject *py_name_obj;

        ndn_buf_advance(d);

        start = d->decoder.token_index;
        r = ndn_parse_Name(d, NULL);
        stop = d->decoder.token_index;
        if (r < 0)
            return PyErr_Format(g_PyExc_NDNKeyLocatorError, "Error finding"
                                " NDN_DTAG_Name for KeyName (decoder state: %d)",
                                d->decoder.state);

        assert(stop > start);
        bname_size = stop - start;
        bname = d->buf + start;
        /*
        		r = ndn_ref_tagged_BLOB(NDN_DTAG_Name, d->buf, start, stop, &bname,
        				&bname_size);
        		if (r < 0)
        			return PyErr_Format(g_PyExc_NDNKeyLocatorError, "Error getting"
        				" NDN_DTAG_Name BLOB for KeyName (decoder state: %d)",
        				d->decoder.state);
         */

        debug("Parse NDN_DTAG_Name inside KeyName, len=%zd\n", bname_size);

        py_o = NDNObject_New_charbuf(NAME, &name);
        if (!py_o)
            return NULL;

        r = ndn_charbuf_append(name, bname, bname_size);
        if (r < 0) {
            Py_DECREF(py_o);
            return PyErr_NoMemory();
        }

        py_name_obj = Name_obj_from_ndn(py_o);
        Py_DECREF(py_o);
        if (!py_name_obj)
            return NULL;

        py_KeyLocator_obj = PyObject_CallObject(g_type_KeyLocator, NULL);
        if (!py_KeyLocator_obj) {
            Py_DECREF(py_name_obj);
            goto error;
        }

        r = PyObject_SetAttrString(py_KeyLocator_obj, "keyName", py_name_obj);
        Py_DECREF(py_name_obj);
        JUMP_IF_NEG(r, error);

#pragma message "Parse and add digest to the keylocator"
    } else if (ndn_buf_match_dtag(d, NDN_DTAG_Key)) {
        const unsigned char *dkey;
        size_t dkey_size;
        PyObject *py_key_obj, *py_ndn_key;

        start = d->decoder.token_index;
        r = ndn_parse_required_tagged_BLOB(d, NDN_DTAG_Key, 1, -1);
        stop = d->decoder.token_index;
        if (r < 0)
            return PyErr_Format(g_PyExc_NDNKeyLocatorError, "Error finding"
                                " NDN_DTAG_Key for Key (decoder state: %d)", d->decoder.state);

        r = ndn_ref_tagged_BLOB(NDN_DTAG_Key, d->buf, start, stop, &dkey,
                                &dkey_size);
        if (r < 0)
            return PyErr_Format(g_PyExc_NDNKeyLocatorError, "Error getting"
                                " NDN_DTAG_Key BLOB for Key (decoder state: %d)",
                                d->decoder.state);

        debug("Parse NDN_DTAG_Key, len=%zd\n", dkey_size);

        pubkey = ndn_d2i_pubkey(dkey, dkey_size); // free with ndn_pubkey_free()
        if (!pubkey) {
            PyErr_SetString(g_PyExc_NDNKeyLocatorError, "Unable to parse key to"
                            " internal representation");
            return NULL;
        }
        py_ndn_key = NDNObject_New(PKEY_PUB, pubkey);
        if (!py_ndn_key) {
            ndn_pubkey_free(pubkey);
            return NULL;
        }

        py_key_obj = Key_obj_from_ndn(py_ndn_key);
        Py_DECREF(py_ndn_key);
        if (!py_key_obj)
            return NULL;

        py_KeyLocator_obj = PyObject_CallObject(g_type_KeyLocator, NULL);
        if (!py_KeyLocator_obj) {
            Py_DECREF(py_key_obj);
            goto error;
        }

        r = PyObject_SetAttrString(py_KeyLocator_obj, "key", py_key_obj);
        Py_DECREF(py_key_obj);
        JUMP_IF_NEG(r, error);
    } else if (ndn_buf_match_dtag(d, NDN_DTAG_Certificate)) {
        PyErr_SetString(PyExc_NotImplementedError, "Found certificate DTAG,"
                        " which currently is unsupported");
        return NULL;
    } else {
        PyErr_SetString(g_PyExc_NDNKeyLocatorError, "Unknown KeyLocator Type");
        return NULL;
    }

    ndn_buf_check_close(d); // we don't really check the parser, though-

    return py_KeyLocator_obj;

error:
    Py_XDECREF(py_KeyLocator_obj);
    return NULL;
}