Compare commits
739
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58b423fe00 | ||
|
|
e72ce81d2b | ||
|
|
bdfb53aa09 | ||
|
|
287a7faad9 | ||
|
|
fa33f8d532 | ||
|
|
1caa634dca | ||
|
|
e36aae1eb8 | ||
|
|
670a52f2a3 | ||
|
|
97ee811129 | ||
|
|
599623c303 | ||
|
|
483087f56d | ||
|
|
81bd696ed9 | ||
|
|
17d7c47ca9 | ||
|
|
933a567c8a | ||
|
|
f2c4c53208 | ||
|
|
6b2cb79748 | ||
|
|
b74bbdab84 | ||
|
|
6d024bad65 | ||
|
|
8afba42296 | ||
|
|
2ca5e79633 | ||
|
|
905d40fad9 | ||
|
|
355fd789c8 | ||
|
|
75c3af824a | ||
|
|
46cdf909a5 | ||
|
|
9d1089aa29 | ||
|
|
6e262f0f1e | ||
|
|
09236c2b8d | ||
|
|
f601e1988b | ||
|
|
ab9d7ed25a | ||
|
|
3de8aac22d | ||
|
|
f165bb4e77 | ||
|
|
78ffc635cc | ||
|
|
14c56cd8bd | ||
|
|
bc2e78e074 | ||
|
|
a3c8bd1772 | ||
|
|
40ebaad603 | ||
|
|
3ad8923060 | ||
|
|
25d4f1c95e | ||
|
|
71c622bb68 | ||
|
|
394977c2f2 | ||
|
|
fbb6990abc | ||
|
|
702467b816 | ||
|
|
4c68b6e62c | ||
|
|
78338c5ee8 | ||
|
|
9603325ba6 | ||
|
|
ab7300b747 | ||
|
|
52a803cb9d | ||
|
|
2349e28c6d | ||
|
|
d776a93c9c | ||
|
|
ce9c1952ff | ||
|
|
53533947d1 | ||
|
|
97242f78e9 | ||
|
|
bc17d950e0 | ||
|
|
d247d49469 | ||
|
|
8d6d10ae53 | ||
|
|
9c8f00e3fb | ||
|
|
3b9a2c8b74 | ||
|
|
cf8ffd495a | ||
|
|
a39c0b5c48 | ||
|
|
21a4ea5ad7 | ||
|
|
813ae5831b | ||
|
|
7c67ab5938 | ||
|
|
39cb402377 | ||
|
|
39570d9313 | ||
|
|
009062db2e | ||
|
|
a421c80b10 | ||
|
|
0a6456cbe7 | ||
|
|
4fb35d8a35 | ||
|
|
12cef87c0c | ||
|
|
bc997e5ddd | ||
|
|
73940c93a6 | ||
|
|
56a812d633 | ||
|
|
e6e125ea1b | ||
|
|
5e494c0c3b | ||
|
|
cb672523a5 | ||
|
|
835f027df8 | ||
|
|
28a5bf107b | ||
|
|
75c56016a9 | ||
|
|
2fdb274627 | ||
|
|
0e0b389c80 | ||
|
|
ef654dd3ba | ||
|
|
140e9cbc62 | ||
|
|
869b11e5c5 | ||
|
|
4c5b7b88d6 | ||
|
|
92dbb008fe | ||
|
|
6c6e3854be | ||
|
|
b3f78b5db8 | ||
|
|
43eac58ed6 | ||
|
|
5149350bb4 | ||
|
|
7b2f58c9df | ||
|
|
fe407f2ddc | ||
|
|
65f697f5e8 | ||
|
|
2b0cc7bf01 | ||
|
|
720e25c294 | ||
|
|
adc9aa230c | ||
|
|
576b4ff50e | ||
|
|
ecfb391e20 | ||
|
|
700e12a0b8 | ||
|
|
9a04ddacb9 | ||
|
|
cf0baa2375 | ||
|
|
8b0344d4bc | ||
|
|
57a3276d44 | ||
|
|
c81637150c | ||
|
|
1bac111c3c | ||
|
|
ccce0bc969 | ||
|
|
3243c3dad3 | ||
|
|
48f97244b8 | ||
|
|
4ad933a757 | ||
|
|
77d9e815c5 | ||
|
|
0fe72eacc6 | ||
|
|
2ad2fbeb20 | ||
|
|
3510d299ba | ||
|
|
e37ec7ded4 | ||
|
|
530c10f523 | ||
|
|
5223ea82f5 | ||
|
|
c9650e4cb5 | ||
|
|
2ec13ebc10 | ||
|
|
fcdc873185 | ||
|
|
f1bb38d3aa | ||
|
|
0d748af32f | ||
|
|
0c31537e48 | ||
|
|
6b33040eae | ||
|
|
599ee3f242 | ||
|
|
78e3549c16 | ||
|
|
b310efbdaa | ||
|
|
fa995ac3d3 | ||
|
|
3891244ec3 | ||
|
|
9c19a3900b | ||
|
|
4bb06bcedf | ||
|
|
46b04a5f84 | ||
|
|
e7b90e5575 | ||
|
|
5437aa2375 | ||
|
|
1660d00046 | ||
|
|
a5f233e103 | ||
|
|
fd6123173d | ||
|
|
4fc9080417 | ||
|
|
fc27d3b659 | ||
|
|
77f1c7665e | ||
|
|
e209961817 | ||
|
|
923ba4415f | ||
|
|
fccb2dc91c | ||
|
|
4fdcb274a3 | ||
|
|
da9761f8e6 | ||
|
|
fd674016ab | ||
|
|
8fdae8909d | ||
|
|
d0fef21ce5 | ||
|
|
5c803b9b28 | ||
|
|
459a653226 | ||
|
|
b72360faee | ||
|
|
80609d44c3 | ||
|
|
7c5bc1e218 | ||
|
|
07115cc106 | ||
|
|
4e0cc6cf21 | ||
|
|
322e76e7ed | ||
|
|
6b99b6f185 | ||
|
|
ca48851110 | ||
|
|
c53df03ff3 | ||
|
|
60aaef0622 | ||
|
|
8db6152556 | ||
|
|
ec475a7da5 | ||
|
|
c554551d96 | ||
|
|
bfe3139ede | ||
|
|
22f7bc3006 | ||
|
|
64ae55d781 | ||
|
|
534b841bc0 | ||
|
|
ebe156c92f | ||
|
|
19b87de693 | ||
|
|
70d76eb4da | ||
|
|
1d23ff9277 | ||
|
|
1e36ceb0ff | ||
|
|
d1fc9a7104 | ||
|
|
24c5a00073 | ||
|
|
2c1d349bdb | ||
|
|
7e78064871 | ||
|
|
cf8a3684c2 | ||
|
|
946a51cc0e | ||
|
|
74daf741cd | ||
|
|
1944281719 | ||
|
|
3e3a989096 | ||
|
|
1bbce6df87 | ||
|
|
17b61b4101 | ||
|
|
8dfd91367f | ||
|
|
511712d863 | ||
|
|
dca56eacba | ||
|
|
679dbb006f | ||
|
|
241df42555 | ||
|
|
8b753a2e54 | ||
|
|
7b1124674a | ||
|
|
f714d1b520 | ||
|
|
ee77ca017a | ||
|
|
3e39a4d6a3 | ||
|
|
13fffa38f5 | ||
|
|
279f366d3f | ||
|
|
2cb33fa5ed | ||
|
|
a3bf4319ed | ||
|
|
d2c750b37a | ||
|
|
e3ecad7bc7 | ||
|
|
8bd3b8a305 | ||
|
|
cdb5d8f646 | ||
|
|
e80d1167d4 | ||
|
|
648ae9ef8e | ||
|
|
3c7969fa9d | ||
|
|
1748b1e817 | ||
|
|
fbda933b7b | ||
|
|
4b8eab72f3 | ||
|
|
5ee8ec032a | ||
|
|
502b47956c | ||
|
|
4fc6db23b6 | ||
|
|
474c3b2f33 | ||
|
|
8127d1ab65 | ||
|
|
755f8a89eb | ||
|
|
52bc4e918c | ||
|
|
2b322eb8c6 | ||
|
|
426d500681 | ||
|
|
107749982a | ||
|
|
dc5bb96988 | ||
|
|
a0b2a2c1d4 | ||
|
|
4053bd525f | ||
|
|
d2e6063788 | ||
|
|
b38664e317 | ||
|
|
68b5385cb0 | ||
|
|
3b101d0682 | ||
|
|
cf0aff8a03 | ||
|
|
b55e5d39e2 | ||
|
|
54d74c25a0 | ||
|
|
643b7f5ddf | ||
|
|
5c1c444c6c | ||
|
|
3a3e188d0e | ||
|
|
bc76da1fa4 | ||
|
|
570b20dd9d | ||
|
|
14883ad4c8 | ||
|
|
2aec97a1d0 | ||
|
|
50b9226465 | ||
|
|
4c45fd8906 | ||
|
|
2b765f8ae7 | ||
|
|
33063399fc | ||
|
|
e345baa02a | ||
|
|
71a2f03d72 | ||
|
|
ca660f116a | ||
|
|
31fd46714e | ||
|
|
57d02b65ef | ||
|
|
db4da5e4fb | ||
|
|
634a62bb74 | ||
|
|
3c9bc042f3 | ||
|
|
90db7eeafc | ||
|
|
436e46f73e | ||
|
|
59e266ad15 | ||
|
|
1fd00240e0 | ||
|
|
e24042225f | ||
|
|
cc910cd0aa | ||
|
|
21be81676f | ||
|
|
844b09331b | ||
|
|
d9b083e825 | ||
|
|
7c4ad512a3 | ||
|
|
c93c2ce269 | ||
|
|
d89f002da8 | ||
|
|
1c9c96c3d3 | ||
|
|
974b81aeed | ||
|
|
72c0c64751 | ||
|
|
9c9672e230 | ||
|
|
6d43393669 | ||
|
|
7d9039bef9 | ||
|
|
6efa3b7124 | ||
|
|
d95274bda8 | ||
|
|
0c145ec508 | ||
|
|
a2550a9d41 | ||
|
|
3688d72de5 | ||
|
|
25038f3034 | ||
|
|
8d3f834c6c | ||
|
|
a36f15d667 | ||
|
|
ebfe4a207f | ||
|
|
b849f61b6b | ||
|
|
4ffbb9d937 | ||
|
|
cf4ac5b0c7 | ||
|
|
c6500a9e00 | ||
|
|
92e4d5c170 | ||
|
|
8a8c01bb0c | ||
|
|
5df42a893d | ||
|
|
5560fd40ae | ||
|
|
5e2ccca06f | ||
|
|
df5053824f | ||
|
|
3c8a8b08f1 | ||
|
|
f47cef64a2 | ||
|
|
38a061d1a0 | ||
|
|
5b323d16c8 | ||
|
|
08378cb4e3 | ||
|
|
be86d989cd | ||
|
|
a7ab06d616 | ||
|
|
8b6eda9998 | ||
|
|
c5ba65bb6a | ||
|
|
d567aab38e | ||
|
|
b984e3248b | ||
|
|
07d05c97b4 | ||
|
|
e66040efa6 | ||
|
|
22f856821a | ||
|
|
1534b3dab6 | ||
|
|
233f67c51f | ||
|
|
0f8308012b | ||
|
|
1c109b4bbd | ||
|
|
457f09a1ae | ||
|
|
9412d12678 | ||
|
|
5afbb0b3dd | ||
|
|
e84d1eb0ef | ||
|
|
720f3ba262 | ||
|
|
82d6a4cf1a | ||
|
|
fe13f56bc7 | ||
|
|
34429cc4f5 | ||
|
|
7dffab6f6b | ||
|
|
7429390ec7 | ||
|
|
4d0d096b2e | ||
|
|
7f01247b5b | ||
|
|
130076fd99 | ||
|
|
b6828918cd | ||
|
|
0296074a34 | ||
|
|
19745dc335 | ||
|
|
45ab9a9462 | ||
|
|
af1d6cfa64 | ||
|
|
7e6f6f8ee3 | ||
|
|
e245b055a8 | ||
|
|
9ced9e690b | ||
|
|
a1302f64eb | ||
|
|
935d7fe420 | ||
|
|
57e238f8d6 | ||
|
|
3647af06a1 | ||
|
|
c381bca7f6 | ||
|
|
49650bef43 | ||
|
|
35de339b94 | ||
|
|
bdcedf4def | ||
|
|
2520371449 | ||
|
|
5d0b0106df | ||
|
|
5759be36ad | ||
|
|
478206eea1 | ||
|
|
c4a0176704 | ||
|
|
a52eb1f404 | ||
|
|
1c597a1a64 | ||
|
|
864e8e8c47 | ||
|
|
ff3bf2cfb8 | ||
|
|
3ce6d4e75a | ||
|
|
476200b785 | ||
|
|
f0c827eaac | ||
|
|
ac8b4ca202 | ||
|
|
c33e1c2578 | ||
|
|
b3d0a8ef7f | ||
|
|
c3a4679205 | ||
|
|
b10024cebc | ||
|
|
4a036152d2 | ||
|
|
b82d8c3a1b | ||
|
|
def60f1647 | ||
|
|
3504cc4405 | ||
|
|
9219f5885d | ||
|
|
eaa93f438e | ||
|
|
8a14b9b93c | ||
|
|
8aad372379 | ||
|
|
06f1bdf9c4 | ||
|
|
87039537fc | ||
|
|
c21979d3ba | ||
|
|
cafa4026ec | ||
|
|
c3dfc24ea6 | ||
|
|
1c31a7144f | ||
|
|
f45fa21ccf | ||
|
|
bcf23a3b99 | ||
|
|
859888f53e | ||
|
|
b88c6bf5ce | ||
|
|
79a7a16304 | ||
|
|
f9b880ba42 | ||
|
|
22ee089ada | ||
|
|
464da53017 | ||
|
|
0f5078e9e6 | ||
|
|
941fd8c9b8 | ||
|
|
e062a18359 | ||
|
|
6fd26cf09a | ||
|
|
6aff024492 | ||
|
|
605671de01 | ||
|
|
1ad0b4bad3 | ||
|
|
006b7cedeb | ||
|
|
adc71845c5 | ||
|
|
e5a19b8d86 | ||
|
|
0daa92bdfd | ||
|
|
88a0d816b8 | ||
|
|
a84f464e10 | ||
|
|
cdcde90588 | ||
|
|
e87156e008 | ||
|
|
b38e6d49c0 | ||
|
|
2bea5c4fe0 | ||
|
|
b6e276f277 | ||
|
|
2ed9e07e2a | ||
|
|
5c9ee28a15 | ||
|
|
5174232342 | ||
|
|
a9181d7bc8 | ||
|
|
6158f4739a | ||
|
|
b6355e8a2b | ||
|
|
3cf9078a82 | ||
|
|
364eeeeba0 | ||
|
|
5d75fd9473 | ||
|
|
d9153ce792 | ||
|
|
020123afed | ||
|
|
4460e82998 | ||
|
|
9da07c5e01 | ||
|
|
7d3c14b3ae | ||
|
|
d2777fa4ed | ||
|
|
baab7325e2 | ||
|
|
d701e5bebc | ||
|
|
4f92d873c0 | ||
|
|
6938e3461b | ||
|
|
9b845359f9 | ||
|
|
81206d580d | ||
|
|
760cc7b45f | ||
|
|
6dfeffed54 | ||
|
|
2dd711d0a3 | ||
|
|
c542f63d03 | ||
|
|
4ab3be28d0 | ||
|
|
4f756900af | ||
|
|
c2ac5d27fd | ||
|
|
c008798266 | ||
|
|
f35c4270f2 | ||
|
|
dc4277a03c | ||
|
|
b501b121b3 | ||
|
|
5bcab5621a | ||
|
|
f0bf99960b | ||
|
|
adc334e434 | ||
|
|
46a9bd3219 | ||
|
|
b2ae336a4b | ||
|
|
10b24be850 | ||
|
|
770f904735 | ||
|
|
db7464d93b | ||
|
|
bb8d4a31c3 | ||
|
|
251e5f7d1b | ||
|
|
71ff231d94 | ||
|
|
8609bf2dcc | ||
|
|
c2e12b418b | ||
|
|
6717fbdc1c | ||
|
|
9436831c30 | ||
|
|
b2a70338e1 | ||
|
|
9c154cb8cf | ||
|
|
909ffef5e7 | ||
|
|
899277a653 | ||
|
|
13d85e0947 | ||
|
|
c18aa19535 | ||
|
|
5722cfe59e | ||
|
|
bd2cedbefd | ||
|
|
4346290491 | ||
|
|
9bf5581530 | ||
|
|
ba4fbbefbb | ||
|
|
6824783077 | ||
|
|
0b1b4678d8 | ||
|
|
2dc416d5a1 | ||
|
|
d21abd3f0d | ||
|
|
25467941b9 | ||
|
|
2a890771d2 | ||
|
|
830ba9719c | ||
|
|
71430486d7 | ||
|
|
724d65ae2f | ||
|
|
37271c5b48 | ||
|
|
688a64121c | ||
|
|
5bcee10c84 | ||
|
|
7cd43abee3 | ||
|
|
3b3355cc07 | ||
|
|
0cf887df3d | ||
|
|
e387423942 | ||
|
|
b1a2a4b4b4 | ||
|
|
2063952229 | ||
|
|
9333887a8d | ||
|
|
b54aa57d7b | ||
|
|
cab16964be | ||
|
|
35109a19d0 | ||
|
|
6bf48a07c4 | ||
|
|
f4c1eb3e9e | ||
|
|
71aecaecb7 | ||
|
|
81bf95cc69 | ||
|
|
82c359c10d | ||
|
|
2ea079316b | ||
|
|
a468ff5215 | ||
|
|
80782e06cd | ||
|
|
b555b00c28 | ||
|
|
e6835fe12b | ||
|
|
8e3cf0a091 | ||
|
|
794f687e16 | ||
|
|
9285686ef5 | ||
|
|
50f6675183 | ||
|
|
2bf35a6a37 | ||
|
|
80fba6c52d | ||
|
|
8c2ab2e0b8 | ||
|
|
d97c95365c | ||
|
|
144c7e36d0 | ||
|
|
e8e48c2644 | ||
|
|
354f382f4b | ||
|
|
c44cc83c33 | ||
|
|
f714c1fd88 | ||
|
|
1de6be6044 | ||
|
|
6336c5f2fd | ||
|
|
855eaa5818 | ||
|
|
9a53d786c2 | ||
|
|
d5c2f0c471 | ||
|
|
f4908b16fc | ||
|
|
d7f5b28582 | ||
|
|
b4ecadcc4b | ||
|
|
156c1ea502 | ||
|
|
6db1360806 | ||
|
|
cf4157658c | ||
|
|
1709aa7099 | ||
|
|
a10b2ffb39 | ||
|
|
5af04a71ff | ||
|
|
95c8070b3e | ||
|
|
e78eeca5cc | ||
|
|
56bd3eef44 | ||
|
|
e17898926d | ||
|
|
e55589cda6 | ||
|
|
88eb748914 | ||
|
|
0a1afdf834 | ||
|
|
d1a415c840 | ||
|
|
484bbe5448 | ||
|
|
6ad3d53a43 | ||
|
|
f8503d2ef5 | ||
|
|
a6f32ca351 | ||
|
|
a341ae80b5 | ||
|
|
a54d5a6d2c | ||
|
|
25e3d8c738 | ||
|
|
4ec7a5a1f9 | ||
|
|
0eaf444b79 | ||
|
|
a825d26977 | ||
|
|
8422f5780f | ||
|
|
9f9bd8a3a3 | ||
|
|
eba76ad8f6 | ||
|
|
b5f8bccc3b | ||
|
|
0fba51a13c | ||
|
|
791badbf04 | ||
|
|
218e5be977 | ||
|
|
2a6d45ae00 | ||
|
|
dd46143beb | ||
|
|
fdda2411ee | ||
|
|
03115ce0c1 | ||
|
|
7e693be4c2 | ||
|
|
fe1239a61f | ||
|
|
aa8b3785d6 | ||
|
|
5fade68665 | ||
|
|
ba2cf39469 | ||
|
|
7bc10fad91 | ||
|
|
7e7214103e | ||
|
|
3e2c3a0738 | ||
|
|
e19643deed | ||
|
|
7f20d6ec6c | ||
|
|
574aa86e88 | ||
|
|
1ece2e3744 | ||
|
|
609f0615ac | ||
|
|
4caa0ccb6d | ||
|
|
f8379173cf | ||
|
|
414697588f | ||
|
|
bc6beb10e6 | ||
|
|
70244f4018 | ||
|
|
1b58a03a9f | ||
|
|
fc99b51355 | ||
|
|
4c9a3d59c4 | ||
|
|
83eb1cc88e | ||
|
|
d6d78aa0a4 | ||
|
|
fe4733a160 | ||
|
|
c95f564778 | ||
|
|
5f1820e60f | ||
|
|
48becde5b4 | ||
|
|
cbe72b07ac | ||
|
|
1013fd0d33 | ||
|
|
0399768e18 | ||
|
|
1e164cc096 | ||
|
|
9cbd010333 | ||
|
|
7b3b5e9d02 | ||
|
|
6ee2d36cf4 | ||
|
|
0b60e7a9aa | ||
|
|
97709c0b6e | ||
|
|
c08d7d6c2c | ||
|
|
f4bb5c7b7e | ||
|
|
10bf63ab61 | ||
|
|
7399651ea8 | ||
|
|
0669061ae8 | ||
|
|
e1081cdc0c | ||
|
|
f78cb705bc | ||
|
|
8ac8754b88 | ||
|
|
57c07df414 | ||
|
|
de2a1c20f4 | ||
|
|
3ed6247de3 | ||
|
|
70f95fa87e | ||
|
|
18244e842b | ||
|
|
eee3e823c2 | ||
|
|
99832d4979 | ||
|
|
433686c0dd | ||
|
|
7ba99e129c | ||
|
|
0a939b41ed | ||
|
|
4d261b6a24 | ||
|
|
d7f4fda329 | ||
|
|
0530b5bf86 | ||
|
|
ed1e99daa0 | ||
|
|
a3973e0c8a | ||
|
|
f64a7451a2 | ||
|
|
010f0868cd | ||
|
|
69ec4549d8 | ||
|
|
465c973274 | ||
|
|
ab9aad0d48 | ||
|
|
1cd9f6ebd6 | ||
|
|
1aa3e1ec67 | ||
|
|
f767eba3d7 | ||
|
|
4df2230ba3 | ||
|
|
1ce8ab2d0e | ||
|
|
50e20023cc | ||
|
|
848a1e6f86 | ||
|
|
ec2fe54d5e | ||
|
|
0934888603 | ||
|
|
c828dfc735 | ||
|
|
02948ecc83 | ||
|
|
b8deee0eec | ||
|
|
16cbc4fde2 | ||
|
|
1b0f486b4a | ||
|
|
67fba7fa32 | ||
|
|
a1478db476 | ||
|
|
7357ef2dd7 | ||
|
|
02b51259f0 | ||
|
|
a88c9c7716 | ||
|
|
435bb558f5 | ||
|
|
4ce0bcf3f6 | ||
|
|
5a67310e89 | ||
|
|
160701a0a4 | ||
|
|
1aecae22d3 | ||
|
|
cfaa1addf4 | ||
|
|
62204f4ff7 | ||
|
|
2fa5939375 | ||
|
|
667370f102 | ||
|
|
e7c7f154f4 | ||
|
|
138ef2c900 | ||
|
|
ba6baaf687 | ||
|
|
f2515a772b | ||
|
|
2d4be252a3 | ||
|
|
c177988cb8 | ||
|
|
da916d679d | ||
|
|
aeeb3fc376 | ||
|
|
c152e6f5be | ||
|
|
198c381393 | ||
|
|
7f8e8febfe | ||
|
|
387e57ba81 | ||
|
|
0b537b9250 | ||
|
|
b263f151d7 | ||
|
|
202a2e9c43 | ||
|
|
8751661059 | ||
|
|
99b2a001df | ||
|
|
1349d2d72e | ||
|
|
f8bf1b0aff | ||
|
|
86dfa53fee | ||
|
|
d50f2b4746 | ||
|
|
9f764b5aea | ||
|
|
e7bb6c8c08 | ||
|
|
ae0b418784 | ||
|
|
41abef8bc7 | ||
|
|
54f727dd0f | ||
|
|
f5b5ae2585 | ||
|
|
76e0eb287b | ||
|
|
43a7932ed2 | ||
|
|
1fe7ce5850 | ||
|
|
103d8ed2d6 | ||
|
|
750472b63d | ||
|
|
5537d13e56 | ||
|
|
93adaff244 | ||
|
|
e6f87511e7 | ||
|
|
cbdacb29e2 | ||
|
|
7d05427cc1 | ||
|
|
dc2d6d254b | ||
|
|
85d9083b35 | ||
|
|
3e62a83f5c | ||
|
|
55ea01adbe | ||
|
|
d12fb97dce | ||
|
|
ae734279c3 | ||
|
|
38317e5940 | ||
|
|
3168c30134 | ||
|
|
b3015bdfb7 | ||
|
|
224044fc30 | ||
|
|
044bb7e9e5 | ||
|
|
cf9c6bb8d7 | ||
|
|
19d7a57248 | ||
|
|
8c56538c2a | ||
|
|
446de3c52f | ||
|
|
3188c403b2 | ||
|
|
b80e947432 | ||
|
|
2b65d95938 | ||
|
|
09bcab5bb8 | ||
|
|
d4919b4311 | ||
|
|
600f71185d | ||
|
|
df4b24e3d5 | ||
|
|
d5827ce7d5 | ||
|
|
0f3f0b4356 | ||
|
|
6b872a93ba | ||
|
|
1eacb97e25 | ||
|
|
cf490555ff | ||
|
|
e4f8c3bec2 | ||
|
|
8cf1c56dbb | ||
|
|
57e003638d | ||
|
|
034c188722 | ||
|
|
67cb75c7d8 | ||
|
|
2bc2df0fb3 | ||
|
|
4f512fb24e | ||
|
|
8e998e415f | ||
|
|
1e787c46fd | ||
|
|
aa82eb6adc | ||
|
|
e6e6fde5bd | ||
|
|
e11c8d85b8 | ||
|
|
2e52d7cab4 | ||
|
|
4b4f754fbd | ||
|
|
077862e7d8 | ||
|
|
606e665e61 | ||
|
|
404eafd9a7 | ||
|
|
5d69550c8c | ||
|
|
8c6880f58e | ||
|
|
9a8bae5bc4 | ||
|
|
537dc3a262 | ||
|
|
699d2eab1e | ||
|
|
641de4cec3 | ||
|
|
6617e49878 | ||
|
|
1b6187ff70 | ||
|
|
8b156555fe | ||
|
|
ce7b062a6f | ||
|
|
ed2aebafae | ||
|
|
bb64c17b38 | ||
|
|
9bdbb83022 | ||
|
|
3a6da36b4b | ||
|
|
bbca1b9ec1 | ||
|
|
ce306cae09 | ||
|
|
3b5f4eae19 | ||
|
|
48c291be07 | ||
|
|
9fae3dbbc2 | ||
|
|
efa22d6722 | ||
|
|
308bc4470a | ||
|
|
66ca203453 | ||
|
|
4b4699897c | ||
|
|
f58f8f4539 | ||
|
|
e3e2505aa0 | ||
|
|
664dc03fa6 | ||
|
|
1ddc13d462 | ||
|
|
56b0bf8ff9 | ||
|
|
82838beab5 | ||
|
|
b1990df208 | ||
|
|
42db045d04 | ||
|
|
7c02b472c2 | ||
|
|
fd5de11497 | ||
|
|
a2de7e4eab | ||
|
|
be7804f19c |
No files matched your search
+22
-10
@@ -1,17 +1,29 @@
|
||||
# Emacs temp files
|
||||
# Emacs
|
||||
*~
|
||||
\#*\#
|
||||
/.emacs.desktop
|
||||
/.emacs.desktop.lock
|
||||
*.elc
|
||||
.\#*
|
||||
|
||||
# Mac OSX
|
||||
.DS_*
|
||||
# Visual Studio Code
|
||||
.vscode/
|
||||
|
||||
# waf build system
|
||||
.waf-1*
|
||||
.waf3-*
|
||||
.lock*
|
||||
build/
|
||||
# macOS
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
._*
|
||||
|
||||
# Waf build system
|
||||
/build/
|
||||
.waf-*-*/
|
||||
.waf3-*-*/
|
||||
.lock-waf*
|
||||
|
||||
# Compiled python code
|
||||
*.pyc
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# Other
|
||||
VERSION
|
||||
/VERSION.info
|
||||
@@ -1,10 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
source .jenkins.d/util.sh
|
||||
|
||||
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
export CACHE_DIR=${CACHE_DIR:-/tmp}
|
||||
export WAF_JOBS=${WAF_JOBS:-1}
|
||||
[[ $JOB_NAME == *"code-coverage" ]] && export DISABLE_ASAN=yes
|
||||
|
||||
for file in "$DIR"/.jenkins.d/*; do
|
||||
nanos() {
|
||||
# Cannot use date(1) because macOS does not support %N format specifier
|
||||
python3 -c 'import time; print(int(time.time() * 1e9))'
|
||||
}
|
||||
|
||||
for file in .jenkins.d/*; do
|
||||
[[ -f $file && -x $file ]] || continue
|
||||
echo "Run: $file"
|
||||
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
label=$(basename "$file" | sed -E 's/[[:digit:]]+-(.*)\..*/\1/')
|
||||
echo -ne "travis_fold:start:${label}\r"
|
||||
echo -ne "travis_time:start:${label}\r"
|
||||
start=$(nanos)
|
||||
fi
|
||||
|
||||
echo "\$ $file"
|
||||
"$file"
|
||||
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
finish=$(nanos)
|
||||
echo -ne "travis_time:end:${label}:start=${start},finish=${finish},duration=$((finish-start)),event=${label}\r"
|
||||
echo -ne "travis_fold:end:${label}\r"
|
||||
fi
|
||||
done
|
||||
+30
-21
@@ -1,29 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
set -ex
|
||||
|
||||
if has OSX $NODE_LABELS; then
|
||||
if has OSX-10.8 $NODE_LABELS; then
|
||||
EXTRA_FLAGS=--c++11
|
||||
FORMULAE=(boost openssl pkg-config)
|
||||
if has OSX-10.13 $NODE_LABELS || has OSX-10.14 $NODE_LABELS; then
|
||||
FORMULAE+=(python)
|
||||
fi
|
||||
|
||||
set -x
|
||||
brew update
|
||||
brew upgrade
|
||||
brew install boost pkg-config cryptopp $EXTRA_FLAGS
|
||||
brew cleanup
|
||||
fi
|
||||
|
||||
if has Ubuntu $NODE_LABELS; then
|
||||
BOOST_PKG=libboost-all-dev
|
||||
if has Ubuntu-12.04 $NODE_LABELS; then
|
||||
BOOST_PKG=libboost1.48-all-dev
|
||||
if [[ -n $TRAVIS ]]; then
|
||||
# Travis images come with a large number of pre-installed
|
||||
# brew packages, don't waste time upgrading all of them
|
||||
brew list --versions "${FORMULAE[@]}" || brew update
|
||||
for FORMULA in "${FORMULAE[@]}"; do
|
||||
brew list --versions "$FORMULA" || brew install "$FORMULA"
|
||||
done
|
||||
# Ensure /usr/local/opt/openssl exists
|
||||
brew reinstall openssl
|
||||
else
|
||||
brew update
|
||||
brew upgrade
|
||||
brew install "${FORMULAE[@]}"
|
||||
brew cleanup
|
||||
fi
|
||||
|
||||
set -x
|
||||
sudo apt-get update -qq -y
|
||||
sudo apt-get -qq -y install build-essential pkg-config $BOOST_PKG \
|
||||
libcrypto++-dev libsqlite3-dev
|
||||
elif has Ubuntu $NODE_LABELS; then
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qy install g++ pkg-config python3-minimal \
|
||||
libboost-all-dev libssl-dev libsqlite3-dev
|
||||
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
sudo apt-get -qy install gcovr lcov
|
||||
fi
|
||||
|
||||
elif has CentOS-8 $NODE_LABELS; then
|
||||
sudo dnf -y install gcc-c++ libasan pkgconf-pkg-config python3 \
|
||||
boost-devel openssl-devel sqlite-devel
|
||||
fi
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
set -ex
|
||||
|
||||
sudo rm -f /usr/local/bin/ndnsec*
|
||||
sudo rm -fr /usr/local/include/ndn-cxx
|
||||
sudo rm -f /usr/local/lib{,64}/libndn-cxx*
|
||||
sudo rm -f /usr/local/lib{,64}/pkgconfig/libndn-cxx.pc
|
||||
+36
-33
@@ -1,45 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
set -x
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
git submodule sync
|
||||
git submodule update --init
|
||||
|
||||
sudo rm -Rf /usr/local/include/ndn-cxx
|
||||
sudo rm -f /usr/local/lib/libndn-cxx*
|
||||
sudo rm -f /usr/local/lib/pkgconfig/libndn-cxx*
|
||||
|
||||
# Cleanup
|
||||
sudo ./waf -j1 --color=yes distclean
|
||||
|
||||
# Configure/build static library in debug mode with precompiled headers
|
||||
./waf -j1 --color=yes configure --enable-static --disable-shared --with-tests --debug
|
||||
./waf -j1 --color=yes build
|
||||
|
||||
# Cleanup
|
||||
sudo ./waf -j1 --color=yes distclean
|
||||
|
||||
# Configure/build static and shared library in optimized mode without tests with precompiled headers
|
||||
./waf -j1 --color=yes configure --enable-shared --enable-static
|
||||
./waf -j1 --color=yes build
|
||||
|
||||
# Cleanup
|
||||
sudo ./waf -j1 --color=yes distclean
|
||||
|
||||
# Configure/build shared library in debug mode with examples without precompiled headers
|
||||
if [[ "$JOB_NAME" == *"code-coverage" ]]; then
|
||||
if [[ -z $DISABLE_ASAN ]]; then
|
||||
ASAN="--with-sanitizer=address"
|
||||
fi
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
COVERAGE="--with-coverage"
|
||||
fi
|
||||
./waf -j1 --color=yes configure --debug --enable-shared --disable-static --with-tests --without-pch --with-examples $COVERAGE
|
||||
./waf -j1 --color=yes build
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1721553
|
||||
PCH="--without-pch"
|
||||
fi
|
||||
|
||||
# (tests will be run against debug version)
|
||||
if [[ $JOB_NAME != *"code-coverage" && $JOB_NAME != *"limited-build" ]]; then
|
||||
# Build static library in release mode with tests and without precompiled headers
|
||||
./waf --color=yes configure --enable-static --disable-shared --with-tests --without-pch
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# Cleanup
|
||||
./waf --color=yes distclean
|
||||
|
||||
# Build static and shared library in release mode without tests
|
||||
./waf --color=yes configure --enable-static --enable-shared $PCH
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# Cleanup
|
||||
./waf --color=yes distclean
|
||||
fi
|
||||
|
||||
# Build shared library in debug mode with tests and examples
|
||||
./waf --color=yes configure --disable-static --enable-shared --debug --with-tests --with-examples $ASAN $COVERAGE $PCH
|
||||
./waf --color=yes build -j$WAF_JOBS
|
||||
|
||||
# (tests will be run against the debug version)
|
||||
|
||||
# Install
|
||||
sudo ./waf -j1 --color=yes install
|
||||
sudo_preserve_env PATH -- ./waf --color=yes install
|
||||
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
sudo tee /etc/ld.so.conf.d/ndn.conf >/dev/null <<< /usr/local/lib64
|
||||
fi
|
||||
if has Linux $NODE_LABELS; then
|
||||
sudo ldconfig
|
||||
elif has FreeBSD $NODE_LABELS; then
|
||||
sudo ldconfig -a
|
||||
fi
|
||||
+19
-13
@@ -1,23 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
set -x
|
||||
set -e
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
set -ex
|
||||
|
||||
# Prepare environment
|
||||
rm -Rf ~/.ndn
|
||||
rm -rf ~/.ndn
|
||||
|
||||
if has OSX $NODE_LABELS; then
|
||||
echo "Unlocking OSX Keychain"
|
||||
security unlock-keychain -p "named-data"
|
||||
security unlock-keychain -p named-data
|
||||
fi
|
||||
|
||||
ndnsec-keygen "/tmp/jenkins/$NODE_NAME" | ndnsec-install-cert -
|
||||
|
||||
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
|
||||
ASAN_OPTIONS="color=always"
|
||||
ASAN_OPTIONS+=":check_initialization_order=1"
|
||||
ASAN_OPTIONS+=":detect_stack_use_after_return=1"
|
||||
ASAN_OPTIONS+=":strict_init_order=1"
|
||||
ASAN_OPTIONS+=":strict_string_checks=1"
|
||||
ASAN_OPTIONS+=":detect_invalid_pointer_pairs=2"
|
||||
ASAN_OPTIONS+=":strip_path_prefix=${PWD}/"
|
||||
export ASAN_OPTIONS
|
||||
|
||||
export BOOST_TEST_BUILD_INFO=1
|
||||
export BOOST_TEST_COLOR_OUTPUT=1
|
||||
export BOOST_TEST_DETECT_MEMORY_LEAK=0
|
||||
export BOOST_TEST_LOGGER=HRF,test_suite,stdout:XML,all,build/xunit-log.xml
|
||||
|
||||
# Run unit tests
|
||||
if [[ -n "$XUNIT" ]]; then
|
||||
./build/unit-tests --log_format=XML --log_sink=build/xunit-report.xml --log_level=all --report_level=no
|
||||
else
|
||||
./build/unit-tests -l test_suite
|
||||
fi
|
||||
./build/unit-tests
|
||||
@@ -1,11 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
set -x
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
source "$JDIR"/util.sh
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
gcovr --object-directory=build \
|
||||
--output=build/coverage.xml \
|
||||
--exclude="$PWD/(examples|tests)" \
|
||||
--root=. \
|
||||
--xml
|
||||
|
||||
if [[ "$JOB_NAME" == *"code-coverage" ]]; then
|
||||
BASE="`pwd | sed -e 's|/|\\\/|g'`\\"
|
||||
(cd build && gcovr -x -f $BASE/src -r ../ -o coverage.xml -b ./)
|
||||
# Generate also a detailed HTML output, but using lcov (better results)
|
||||
lcov --quiet \
|
||||
--capture \
|
||||
--directory . \
|
||||
--no-external \
|
||||
--rc lcov_branch_coverage=1 \
|
||||
--output-file build/coverage-with-tests.info
|
||||
|
||||
lcov --quiet \
|
||||
--remove build/coverage-with-tests.info "$PWD/tests/*" \
|
||||
--rc lcov_branch_coverage=1 \
|
||||
--output-file build/coverage.info
|
||||
|
||||
genhtml --branch-coverage \
|
||||
--demangle-cpp \
|
||||
--legend \
|
||||
--output-directory build/coverage \
|
||||
--title "ndn-cxx unit tests" \
|
||||
build/coverage.info
|
||||
fi
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# It's intentional not to use `set -x`, because this script explicitly prints useful information
|
||||
# and should not run in trace mode.
|
||||
# It's intentional not to use `set -e`, because this script wants to check all headers
|
||||
# (similar to running all test cases), instead of failing at the first error.
|
||||
|
||||
if [[ -n $DISABLE_HEADERS_CHECK ]]; then
|
||||
echo 'Skipping headers check.'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if has CentOS-8 $NODE_LABELS; then
|
||||
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
|
||||
fi
|
||||
|
||||
CXX=${CXX:-g++}
|
||||
STD=-std=c++14
|
||||
CXXFLAGS="-O2 -Wall -Wno-unneeded-internal-declaration -Wno-unused-const-variable $(pkg-config --cflags libndn-cxx)"
|
||||
INCLUDEDIR="$(pkg-config --variable=includedir libndn-cxx)"/ndn-cxx
|
||||
|
||||
echo "Using: $CXX $STD $CXXFLAGS"
|
||||
|
||||
NCHECKED=0
|
||||
NERRORS=0
|
||||
while IFS= read -r -d '' H; do
|
||||
echo "Checking header ${H#${INCLUDEDIR}/}"
|
||||
"$CXX" -xc++ $STD $CXXFLAGS -c -o /dev/null "$H"
|
||||
[[ $? -eq 0 ]] || ((NERRORS++))
|
||||
((NCHECKED++))
|
||||
done < <(find "$INCLUDEDIR" -name '*.hpp' -type f -print0 2>/dev/null)
|
||||
|
||||
if [[ $NCHECKED -eq 0 ]]; then
|
||||
echo 'No headers found. Is ndn-cxx installed?'
|
||||
exit 1
|
||||
else
|
||||
echo "$NCHECKED headers checked."
|
||||
fi
|
||||
|
||||
if [[ $NERRORS -gt 0 ]]; then
|
||||
echo "$NERRORS headers could not be compiled."
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# It's intentional not to use `set -x`, because this script explicitly prints useful information
|
||||
# and should not run in trace mode.
|
||||
# It's intentional not to use `set -e`, because this script wants to check all headers
|
||||
# (similar to running all test cases), instead of failing at the first error.
|
||||
|
||||
CXX=${CXX:-g++}
|
||||
|
||||
STD=
|
||||
if $CXX -xc++ /dev/null -o /dev/null -c -std=c++11 &>/dev/null; then
|
||||
STD=-std=c++11
|
||||
elif $CXX -xc++ /dev/null -o /dev/null -c -std=c++0x &>/dev/null; then
|
||||
STD=-std=c++0x
|
||||
fi
|
||||
|
||||
STDLIB=
|
||||
if $CXX -xc++ /dev/null -o /dev/null -c $STD -stdlib=libc++ &>/dev/null; then
|
||||
STDLIB=-stdlib=libc++
|
||||
fi
|
||||
|
||||
echo 'Compiler flags:' $CXX $STD $STDLIB
|
||||
|
||||
INCLUDEDIR=/usr/local/include/ndn-cxx
|
||||
NCHECKED=0
|
||||
NERRORS=0
|
||||
while IFS= read -r -d '' H; do
|
||||
echo 'Verifying standalone header compilation for' $H
|
||||
$CXX -xc++ "$INCLUDEDIR/$H" -o /dev/null -c $STD $STDLIB $(pkg-config --cflags libndn-cxx)
|
||||
[[ $? -eq 0 ]] || ((NERRORS++))
|
||||
((NCHECKED++))
|
||||
done < <(cd "$INCLUDEDIR" && find * -name '*.hpp' -type f -print0 2>/dev/null)
|
||||
|
||||
if [[ $NCHECKED -eq 0 ]]; then
|
||||
echo 'No header found. Is ndn-cxx installed?'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $NERRORS -gt 0 ]]; then
|
||||
echo $NERRORS 'headers cannot compile on its own'
|
||||
exit 1
|
||||
fi
|
||||
+18
-20
@@ -1,30 +1,28 @@
|
||||
CONTINUOUS INTEGRATION SCRIPTS
|
||||
==============================
|
||||
# CONTINUOUS INTEGRATION SCRIPTS
|
||||
|
||||
Environment Variables Used in Build Scripts
|
||||
-------------------------------------------
|
||||
## Environment Variables Used in Build Scripts
|
||||
|
||||
- `NODE_LABELS`: the variable defines a list of OS properties. The set values are used by the
|
||||
build scripts to select proper behavior for different OS.
|
||||
- `NODE_LABELS`: space-separated list of platform properties. The included values are used by
|
||||
the build scripts to select the proper behavior for different operating systems and versions.
|
||||
|
||||
The list should include at least `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
|
||||
The list should normally contain `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
|
||||
|
||||
Possible values for Linux OS:
|
||||
Example values:
|
||||
|
||||
* `[OS_TYPE]`: `Linux`
|
||||
* `[DISTRO_TYPE]`: `Ubuntu`
|
||||
* `[DISTRO_VERSION]`: `Ubuntu-12.04`, `Ubuntu-14.04`, `Ubuntu-15.04`
|
||||
- `[OS_TYPE]`: `Linux`, `OSX`
|
||||
- `[DISTRO_TYPE]`: `Ubuntu`, `CentOS`
|
||||
- `[DISTRO_VERSION]`: `Ubuntu-16.04`, `Ubuntu-18.04`, `CentOS-8`, `OSX-10.14`, `OSX-10.15`
|
||||
|
||||
Possible values of OSX OS:
|
||||
|
||||
* `[OS_TYPE]`: `OSX`
|
||||
* `[DISTRO_TYPE]`: `OSX` (can be absent)
|
||||
* `[DISTRO_VERSION]`: `OSX-10.10`, `OSX-10.9`, `OSX-10.8`, `OSX-10.7`
|
||||
|
||||
- `JOB_NAME`: optional variable to define type of the job. Depending on the defined job type,
|
||||
- `JOB_NAME`: optional variable that defines the type of build job. Depending on the job type,
|
||||
the build scripts can perform different tasks.
|
||||
|
||||
Possible values:
|
||||
|
||||
* empty: default build process
|
||||
* `<any-string-with-extra-job-description>code-coverage` (Linux OS is assumed): build process with code coverage analysis
|
||||
- empty: default build task
|
||||
- `code-coverage`: debug build with tests and code coverage analysis (Ubuntu Linux is assumed)
|
||||
- `limited-build`: only a single debug build with tests
|
||||
|
||||
- `CACHE_DIR`: directory containing cached files from previous builds, e.g., a compiled version
|
||||
of ndn-cxx. If not set, `/tmp` is used.
|
||||
|
||||
- `WAF_JOBS`: number of parallel build threads used by waf, defaults to 1.
|
||||
Executable → Regular
+34
-4
@@ -1,9 +1,39 @@
|
||||
has() {
|
||||
local saved_xtrace
|
||||
[[ $- == *x* ]] && saved_xtrace=-x || saved_xtrace=+x
|
||||
set +x
|
||||
|
||||
local p=$1
|
||||
shift
|
||||
local x
|
||||
for x in "$@"; do
|
||||
[[ "${x}" == "${p}" ]] && return 0
|
||||
local i ret=1
|
||||
for i in "$@"; do
|
||||
if [[ "${i}" == "${p}" ]]; then
|
||||
ret=0
|
||||
break
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
|
||||
set ${saved_xtrace}
|
||||
return ${ret}
|
||||
}
|
||||
export -f has
|
||||
|
||||
sudo_preserve_env() {
|
||||
local saved_xtrace
|
||||
[[ $- == *x* ]] && saved_xtrace=-x || saved_xtrace=+x
|
||||
set +x
|
||||
|
||||
local vars=()
|
||||
while [[ $# -gt 0 ]]; do
|
||||
local arg=$1
|
||||
shift
|
||||
case ${arg} in
|
||||
--) break ;;
|
||||
*) vars+=("${arg}=${!arg}") ;;
|
||||
esac
|
||||
done
|
||||
|
||||
set ${saved_xtrace}
|
||||
sudo env "${vars[@]}" "$@"
|
||||
}
|
||||
export -f sudo_preserve_env
|
||||
@@ -0,0 +1,9 @@
|
||||
<jefft0@remap.ucla.edu> <jefft0@gmail.com>
|
||||
<aa@cs.fiu.edu> <alexander.afanasyev@ucla.edu>
|
||||
<davidepesa@gmail.com> <davide.pesavento@lip6.fr>
|
||||
<enewberry@email.arizona.edu> <enewberry@cs.arizona.edu>
|
||||
Teng Liang <philoliang2011@gmail.com>
|
||||
<lybmath2009@gmail.com> <lybmath@ucla.edu>
|
||||
Hila Ben Abraham <hilata@gmail.com>
|
||||
Laqin Fan <flq12021@gmail.com>
|
||||
Jeremy Clark <jrclark2@memphis.edu>
|
||||
+113
-12
@@ -1,15 +1,116 @@
|
||||
sudo: true
|
||||
version: ~> 1.0
|
||||
language: cpp
|
||||
os:
|
||||
- linux
|
||||
compiler:
|
||||
- gcc
|
||||
notifications:
|
||||
email:
|
||||
on_success: always
|
||||
on_failure: always
|
||||
os: linux
|
||||
dist: bionic
|
||||
|
||||
arch:
|
||||
- amd64
|
||||
- arm64
|
||||
- ppc64le
|
||||
- s390x
|
||||
|
||||
env:
|
||||
- COMPILER=g++-7
|
||||
- COMPILER=g++-9
|
||||
- COMPILER=clang++-6.0
|
||||
- COMPILER=clang++-9
|
||||
|
||||
jobs:
|
||||
include:
|
||||
# Linux
|
||||
- env: COMPILER=g++-5
|
||||
- env: COMPILER=g++-6
|
||||
- env: COMPILER=g++-8
|
||||
- env: COMPILER=clang++-4.0
|
||||
- env: COMPILER=clang++-5.0
|
||||
- env: COMPILER=clang++-7
|
||||
- env: COMPILER=clang++-8
|
||||
- env: COMPILER=clang++-10
|
||||
- env: COMPILER=clang++-11
|
||||
- env: COMPILER=clang++-12
|
||||
|
||||
# macOS
|
||||
- os: osx
|
||||
osx_image: xcode9.4
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode10.3
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode11.3
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode11.6
|
||||
env: # default compiler
|
||||
- os: osx
|
||||
osx_image: xcode12
|
||||
env: # default compiler
|
||||
|
||||
allow_failures:
|
||||
- env: COMPILER=g++-5
|
||||
- env: COMPILER=g++-6
|
||||
- env: COMPILER=clang++-4.0
|
||||
- env: COMPILER=clang++-12
|
||||
|
||||
fast_finish: true
|
||||
|
||||
before_install:
|
||||
- |
|
||||
: Adding apt repositories
|
||||
case ${COMPILER} in
|
||||
g++-9)
|
||||
# https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages
|
||||
travis_retry sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
travis_retry sudo apt-get -qq update
|
||||
;;
|
||||
clang++-1?)
|
||||
# https://apt.llvm.org/
|
||||
LLVM_REPO=${COMPILER/clang++/llvm-toolchain-${TRAVIS_DIST}}
|
||||
travis_retry wget -nv -O - "https://apt.llvm.org/llvm-snapshot.gpg.key" | sudo apt-key add -
|
||||
travis_retry sudo add-apt-repository -y "deb http://apt.llvm.org/${TRAVIS_DIST}/ ${LLVM_REPO%-12} main"
|
||||
travis_retry sudo apt-get -qq update
|
||||
;;
|
||||
esac
|
||||
|
||||
install:
|
||||
- |
|
||||
: Installing C++ compiler
|
||||
if [[ -n ${COMPILER} ]]; then
|
||||
travis_retry sudo apt-get -qy install ${COMPILER/clang++/clang}
|
||||
fi
|
||||
|
||||
before_script:
|
||||
- |
|
||||
: Setting environment variables
|
||||
if [[ -n ${COMPILER} ]]; then
|
||||
export CXX=${COMPILER}
|
||||
fi
|
||||
case ${TRAVIS_OS_NAME} in
|
||||
linux) export NODE_LABELS="Linux Ubuntu Ubuntu-18.04" ;;
|
||||
osx) export NODE_LABELS="OSX OSX-$(sw_vers -productVersion | cut -d . -f -2)" ;;
|
||||
esac
|
||||
export JOB_NAME=limited-build
|
||||
export WAF_JOBS=2
|
||||
- |
|
||||
: Enabling workarounds
|
||||
case "${TRAVIS_CPU_ARCH},${COMPILER}" in
|
||||
arm64,g++*)
|
||||
# Avoid exceeding the per-job time limit
|
||||
export DISABLE_HEADERS_CHECK=yes
|
||||
;;
|
||||
ppc64le,g++-7)
|
||||
# AddressSanitizer does not seem to be working
|
||||
export DISABLE_ASAN=yes
|
||||
;;
|
||||
*,clang++-8)
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=40808
|
||||
export DISABLE_ASAN=yes
|
||||
;;
|
||||
esac
|
||||
- ${CXX:-c++} --version
|
||||
|
||||
script:
|
||||
- if [[ $TRAVIS_OS_NAME == linux ]]; then export NODE_LABELS="Linux Ubuntu Ubuntu-12.04"; fi
|
||||
- if [[ $TRAVIS_OS_NAME == osx ]]; then export NODE_LABELS="OSX OSX-10.10"; fi
|
||||
- echo $NODE_LABELS
|
||||
- ./.jenkins
|
||||
+254
-102
@@ -30,15 +30,15 @@ When using this tool, the wscript will look like:
|
||||
|
||||
Options are generated, in order to specify the location of boost includes/libraries.
|
||||
The `check_boost` configuration function allows to specify the used boost libraries.
|
||||
It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
|
||||
It can also provide default arguments to the --boost-mt command-line arguments.
|
||||
Everything will be packaged together in a BOOST component that you can use.
|
||||
|
||||
When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
|
||||
- you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
|
||||
Errors: C4530
|
||||
- boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
|
||||
So before calling `conf.check_boost` you might want to disabling by adding:
|
||||
conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
|
||||
So before calling `conf.check_boost` you might want to disabling by adding
|
||||
conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
|
||||
Errors:
|
||||
- boost might also be compiled with /MT, which links the runtime statically.
|
||||
If you have problems with redefined symbols,
|
||||
@@ -52,27 +52,60 @@ import sys
|
||||
import re
|
||||
from waflib import Utils, Logs, Errors
|
||||
from waflib.Configure import conf
|
||||
from waflib.TaskGen import feature, after_method
|
||||
|
||||
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
|
||||
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
|
||||
|
||||
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib',
|
||||
'/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
|
||||
'/usr/local/ndn/lib', '/opt/ndn/lib']
|
||||
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include',
|
||||
'/usr/local/ndn/include', '/opt/ndn/include']
|
||||
BOOST_VERSION_FILE = 'boost/version.hpp'
|
||||
BOOST_VERSION_CODE = '''
|
||||
#include <iostream>
|
||||
#include <boost/version.hpp>
|
||||
int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
|
||||
'''
|
||||
BOOST_SYSTEM_CODE = '''
|
||||
|
||||
BOOST_ERROR_CODE = '''
|
||||
#include <boost/system/error_code.hpp>
|
||||
int main() { boost::system::error_code c; }
|
||||
'''
|
||||
|
||||
PTHREAD_CODE = '''
|
||||
#include <pthread.h>
|
||||
static void* f(void*) { return 0; }
|
||||
int main() {
|
||||
pthread_t th;
|
||||
pthread_attr_t attr;
|
||||
pthread_attr_init(&attr);
|
||||
pthread_create(&th, &attr, &f, 0);
|
||||
pthread_join(th, 0);
|
||||
pthread_cleanup_push(0, 0);
|
||||
pthread_cleanup_pop(0);
|
||||
pthread_attr_destroy(&attr);
|
||||
}
|
||||
'''
|
||||
|
||||
BOOST_THREAD_CODE = '''
|
||||
#include <boost/thread.hpp>
|
||||
int main() { boost::thread t; }
|
||||
'''
|
||||
|
||||
BOOST_LOG_CODE = '''
|
||||
#include <boost/log/trivial.hpp>
|
||||
int main() { BOOST_LOG_TRIVIAL(info) << "boost_log is working"; }
|
||||
'''
|
||||
|
||||
BOOST_LOG_SETUP_CODE = '''
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/log/utility/setup/console.hpp>
|
||||
#include <boost/log/utility/setup/common_attributes.hpp>
|
||||
int main() {
|
||||
using namespace boost::log;
|
||||
add_common_attributes();
|
||||
add_console_log(std::clog, keywords::format = "%Message%");
|
||||
BOOST_LOG_TRIVIAL(info) << "boost_log_setup is working";
|
||||
}
|
||||
'''
|
||||
|
||||
# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
|
||||
PLATFORM = Utils.unversioned_sys_platform()
|
||||
detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
|
||||
@@ -104,34 +137,37 @@ BOOST_TOOLSETS = {
|
||||
|
||||
def options(opt):
|
||||
opt = opt.add_option_group('Boost Options')
|
||||
|
||||
opt.add_option('--boost-includes', type='string',
|
||||
default='', dest='boost_includes',
|
||||
help='''path to the directory where the boost includes are, e.g., /path/to/boost_1_55_0/stage/include''')
|
||||
help='''path to the directory where the boost includes are,
|
||||
e.g., /path/to/boost_1_55_0/stage/include''')
|
||||
opt.add_option('--boost-libs', type='string',
|
||||
default='', dest='boost_libs',
|
||||
help='''path to the directory where the boost libs are, e.g., /path/to/boost_1_55_0/stage/lib''')
|
||||
opt.add_option('--boost-static', action='store_true',
|
||||
default=False, dest='boost_static',
|
||||
help='link with static boost libraries (.lib/.a)')
|
||||
help='''path to the directory where the boost libs are,
|
||||
e.g., path/to/boost_1_55_0/stage/lib''')
|
||||
opt.add_option('--boost-mt', action='store_true',
|
||||
default=False, dest='boost_mt',
|
||||
help='select multi-threaded libraries')
|
||||
opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
|
||||
help='''select libraries with tags (dgsyp, d for debug), see doc Boost, Getting Started, chapter 6.1''')
|
||||
opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
|
||||
help='''select libraries with tags (gd for debug, static is automatically added),
|
||||
see doc Boost, Getting Started, chapter 6.1''')
|
||||
opt.add_option('--boost-linkage_autodetect', action='store_true', dest='boost_linkage_autodetect',
|
||||
help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
|
||||
opt.add_option('--boost-toolset', type='string',
|
||||
default='', dest='boost_toolset',
|
||||
help='force a toolset e.g. msvc, vc90, gcc, mingw, mgw45 (default: auto)')
|
||||
help='force a toolset e.g. msvc, vc90, \
|
||||
gcc, mingw, mgw45 (default: auto)')
|
||||
py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
|
||||
opt.add_option('--boost-python', type='string',
|
||||
default=py_version, dest='boost_python',
|
||||
help='select the lib python with this version (default: %s)' % py_version)
|
||||
help='select the lib python with this version \
|
||||
(default: %s)' % py_version)
|
||||
|
||||
|
||||
@conf
|
||||
def __boost_get_version_file(self, d):
|
||||
if not d:
|
||||
return None
|
||||
dnode = self.root.find_dir(d)
|
||||
if dnode:
|
||||
return dnode.find_node(BOOST_VERSION_FILE)
|
||||
@@ -144,33 +180,30 @@ def boost_get_version(self, d):
|
||||
if node:
|
||||
try:
|
||||
txt = node.read()
|
||||
except (OSError, IOError):
|
||||
Logs.error("Could not read the file %r" % node.abspath())
|
||||
except EnvironmentError:
|
||||
Logs.error('Could not read the file %r' % node.abspath())
|
||||
else:
|
||||
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M)
|
||||
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
|
||||
m1 = re_but1.search(txt)
|
||||
|
||||
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d*)', re.M)
|
||||
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d+)', re.M)
|
||||
m2 = re_but2.search(txt)
|
||||
|
||||
if m1 and m2:
|
||||
return (m1.group(1), m2.group(1))
|
||||
|
||||
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
|
||||
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(':')
|
||||
|
||||
@conf
|
||||
def boost_get_includes(self, *k, **kw):
|
||||
includes = k and k[0] or kw.get('includes', None)
|
||||
if includes and self.__boost_get_version_file(includes):
|
||||
return includes
|
||||
for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
|
||||
for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
|
||||
if self.__boost_get_version_file(d):
|
||||
return d
|
||||
if includes:
|
||||
self.end_msg('headers not found in %s' % includes)
|
||||
self.end_msg('headers not found in %s' % includes, 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
|
||||
self.end_msg('headers not found, please provide a --boost-includes argument (see help)', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
|
||||
|
||||
@@ -198,7 +231,9 @@ def __boost_get_libs_path(self, *k, **kw):
|
||||
path = self.root.find_dir(libs)
|
||||
files = path.ant_glob('*boost_*')
|
||||
if not libs or not files:
|
||||
for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
|
||||
for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS:
|
||||
if not d:
|
||||
continue
|
||||
path = self.root.find_dir(d)
|
||||
if path:
|
||||
files = path.ant_glob('*boost_*')
|
||||
@@ -211,10 +246,10 @@ def __boost_get_libs_path(self, *k, **kw):
|
||||
break
|
||||
if not path:
|
||||
if libs:
|
||||
self.end_msg('libs not found in %s' % libs)
|
||||
self.end_msg('libs not found in %s' % libs, 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
|
||||
self.end_msg('libs not found, please provide a --boost-libs argument (see help)', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
|
||||
self.to_log('Found the boost path in %r with the libraries:' % path)
|
||||
@@ -229,15 +264,10 @@ def boost_get_libs(self, *k, **kw):
|
||||
according to the parameters
|
||||
'''
|
||||
path, files = self.__boost_get_libs_path(**kw)
|
||||
t = []
|
||||
if kw.get('mt', False):
|
||||
t.append('mt')
|
||||
if kw.get('abi', None):
|
||||
t.append(kw['abi'])
|
||||
tags = t and '(-%s)+' % '-'.join(t) or ''
|
||||
files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
|
||||
toolset = self.boost_get_toolset(kw.get('toolset', ''))
|
||||
toolset_pat = '(-%s[0-9]{0,3})+' % toolset
|
||||
version = '(-%s)+' % self.env.BOOST_VERSION
|
||||
toolset_pat = '(-%s[0-9]{0,3})' % toolset
|
||||
version = '-%s' % self.env.BOOST_VERSION
|
||||
|
||||
def find_lib(re_lib, files):
|
||||
for file in files:
|
||||
@@ -251,28 +281,109 @@ def boost_get_libs(self, *k, **kw):
|
||||
name = name[3:]
|
||||
return name[:name.rfind('.')]
|
||||
|
||||
libs = []
|
||||
for lib in Utils.to_list(k and k[0] or kw.get('lib', None)):
|
||||
py = (lib == 'python') and '(-py%s)+' % kw['python'] or ''
|
||||
# Trying libraries, from most strict match to least one
|
||||
for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version),
|
||||
'boost_%s%s%s%s' % (lib, tags, py, version),
|
||||
'boost_%s%s%s' % (lib, tags, version),
|
||||
# Give up trying to find the right version
|
||||
'boost_%s%s%s%s' % (lib, toolset_pat, tags, py),
|
||||
'boost_%s%s%s' % (lib, tags, py),
|
||||
'boost_%s%s' % (lib, tags)]:
|
||||
self.to_log('Trying pattern %s' % pattern)
|
||||
file = find_lib(re.compile(pattern), files)
|
||||
if file:
|
||||
libs.append(format_lib_name(file.name))
|
||||
break
|
||||
else:
|
||||
self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
|
||||
self.fatal('The configuration failed')
|
||||
def match_libs(lib_names, is_static):
|
||||
libs = []
|
||||
lib_names = Utils.to_list(lib_names)
|
||||
if not lib_names:
|
||||
return libs
|
||||
t = []
|
||||
if kw.get('mt', False):
|
||||
t.append('-mt')
|
||||
if kw.get('abi', None):
|
||||
t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
|
||||
elif is_static:
|
||||
t.append('-s')
|
||||
tags_pat = t and ''.join(t) or ''
|
||||
ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
|
||||
ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
|
||||
|
||||
return path.abspath(), libs
|
||||
for lib in lib_names:
|
||||
if lib == 'python':
|
||||
# for instance, with python='27',
|
||||
# accepts '-py27', '-py2', '27' and '2'
|
||||
# but will reject '-py3', '-py26', '26' and '3'
|
||||
tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python'])
|
||||
else:
|
||||
tags = tags_pat
|
||||
# Trying libraries, from most strict match to least one
|
||||
for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext),
|
||||
'boost_%s%s%s%s$' % (lib, tags, version, ext),
|
||||
# Give up trying to find the right version
|
||||
'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext),
|
||||
'boost_%s%s%s$' % (lib, tags, ext),
|
||||
'boost_%s%s$' % (lib, ext),
|
||||
'boost_%s' % lib]:
|
||||
self.to_log('Trying pattern %s' % pattern)
|
||||
file = find_lib(re.compile(pattern), files)
|
||||
if file:
|
||||
libs.append(format_lib_name(file.name))
|
||||
break
|
||||
else:
|
||||
self.end_msg('lib %s not found in %s' % (lib, path.abspath()), 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
return libs
|
||||
|
||||
return path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
|
||||
|
||||
@conf
|
||||
def _check_pthread_flag(self, *k, **kw):
|
||||
'''
|
||||
Computes which flags should be added to CXXFLAGS and LINKFLAGS to compile in multi-threading mode
|
||||
|
||||
Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3,
|
||||
boost/thread.hpp will trigger a #error if -pthread isn't used:
|
||||
boost/config/requires_threads.hpp:47:5: #error "Compiler threading support
|
||||
is not turned on. Please set the correct command line options for
|
||||
threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
|
||||
|
||||
Based on _BOOST_PTHREAD_FLAG(): https://github.com/tsuna/boost.m4/blob/master/build-aux/boost.m4
|
||||
'''
|
||||
|
||||
var = kw.get('uselib_store', 'BOOST')
|
||||
|
||||
self.start_msg('Checking the flags needed to use pthreads')
|
||||
|
||||
# The ordering *is* (sometimes) important. Some notes on the
|
||||
# individual items follow:
|
||||
# (none): in case threads are in libc; should be tried before -Kthread and
|
||||
# other compiler flags to prevent continual compiler warnings
|
||||
# -lpthreads: AIX (must check this before -lpthread)
|
||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||
# -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||
# -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads)
|
||||
# -pthreads: Solaris/GCC
|
||||
# -mthreads: MinGW32/GCC, Lynx/GCC
|
||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||
# doesn't hurt to check since this sometimes defines pthreads too;
|
||||
# also defines -D_REENTRANT)
|
||||
# ... -mt is also the pthreads flag for HP/aCC
|
||||
# -lpthread: GNU Linux, etc.
|
||||
# --thread-safe: KAI C++
|
||||
if Utils.unversioned_sys_platform() == 'sunos':
|
||||
# On Solaris (at least, for some versions), libc contains stubbed
|
||||
# (non-functional) versions of the pthreads routines, so link-based
|
||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
||||
# a function called by this macro, so we could check for that, but
|
||||
# who knows whether they'll stub that too in a future libc.) So,
|
||||
# we'll just look for -pthreads and -lpthread first:
|
||||
boost_pthread_flags = ['-pthreads', '-lpthread', '-mt', '-pthread']
|
||||
else:
|
||||
boost_pthread_flags = ['', '-lpthreads', '-Kthread', '-kthread', '-llthread', '-pthread',
|
||||
'-pthreads', '-mthreads', '-lpthread', '--thread-safe', '-mt']
|
||||
|
||||
for boost_pthread_flag in boost_pthread_flags:
|
||||
try:
|
||||
self.env.stash()
|
||||
self.env['CXXFLAGS_%s' % var] += [boost_pthread_flag]
|
||||
self.env['LINKFLAGS_%s' % var] += [boost_pthread_flag]
|
||||
self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False, quiet=True)
|
||||
self.end_msg(boost_pthread_flag)
|
||||
return
|
||||
except self.errors.ConfigurationError:
|
||||
self.env.revert()
|
||||
self.end_msg('none')
|
||||
|
||||
@conf
|
||||
def check_boost(self, *k, **kw):
|
||||
@@ -285,7 +396,10 @@ def check_boost(self, *k, **kw):
|
||||
if not self.env['CXX']:
|
||||
self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
|
||||
|
||||
params = {'lib': k and k[0] or kw.get('lib', None)}
|
||||
params = {
|
||||
'lib': k and k[0] or kw.get('lib', None),
|
||||
'stlib': kw.get('stlib', None)
|
||||
}
|
||||
for key, value in self.options.__dict__.items():
|
||||
if not key.startswith('boost_'):
|
||||
continue
|
||||
@@ -294,48 +408,70 @@ def check_boost(self, *k, **kw):
|
||||
|
||||
var = kw.get('uselib_store', 'BOOST')
|
||||
|
||||
self.start_msg('Checking boost includes')
|
||||
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
|
||||
versions = self.boost_get_version(inc)
|
||||
self.env.BOOST_VERSION = versions[0]
|
||||
self.env.BOOST_VERSION_NUMBER = int(versions[1])
|
||||
self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
|
||||
int(versions[1]) / 100 % 1000,
|
||||
int(versions[1]) % 100))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
|
||||
if not self.env.DONE_FIND_BOOST_COMMON:
|
||||
self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
|
||||
if self.env.DPKG_ARCHITECTURE:
|
||||
deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
|
||||
BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
|
||||
|
||||
if not params['lib']:
|
||||
self.start_msg('Checking boost includes')
|
||||
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
|
||||
versions = self.boost_get_version(inc)
|
||||
self.env.BOOST_VERSION = versions[0]
|
||||
self.env.BOOST_VERSION_NUMBER = int(versions[1])
|
||||
self.end_msg('%d.%d.%d' % (int(versions[1]) / 100000,
|
||||
int(versions[1]) / 100 % 1000,
|
||||
int(versions[1]) % 100))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
|
||||
|
||||
self.env.DONE_FIND_BOOST_COMMON = True
|
||||
|
||||
if not params['lib'] and not params['stlib']:
|
||||
return
|
||||
if 'static' in kw or 'static' in params:
|
||||
Logs.warn('boost: static parameter is deprecated, use stlib instead.')
|
||||
self.start_msg('Checking boost libs')
|
||||
suffix = params.get('static', None) and 'ST' or ''
|
||||
path, libs = self.boost_get_libs(**params)
|
||||
self.env['%sLIBPATH_%s' % (suffix, var)] = [path]
|
||||
self.env['%sLIB_%s' % (suffix, var)] = libs
|
||||
self.end_msg('ok')
|
||||
path, libs, stlibs = self.boost_get_libs(**params)
|
||||
self.env['LIBPATH_%s' % var] = [path]
|
||||
self.env['STLIBPATH_%s' % var] = [path]
|
||||
self.env['LIB_%s' % var] = libs
|
||||
self.env['STLIB_%s' % var] = stlibs
|
||||
self.end_msg(' '.join(libs + stlibs))
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN', ' path : %s' % path)
|
||||
Logs.pprint('CYAN', ' libs : %s' % libs)
|
||||
Logs.pprint('CYAN', ' shared libs : %s' % libs)
|
||||
Logs.pprint('CYAN', ' static libs : %s' % stlibs)
|
||||
|
||||
def has_shlib(lib):
|
||||
return params['lib'] and lib in params['lib']
|
||||
def has_stlib(lib):
|
||||
return params['stlib'] and lib in params['stlib']
|
||||
def has_lib(lib):
|
||||
return has_shlib(lib) or has_stlib(lib)
|
||||
if has_lib('thread'):
|
||||
# not inside try_link to make check visible in the output
|
||||
self._check_pthread_flag(k, kw)
|
||||
|
||||
def try_link():
|
||||
if 'system' in params['lib']:
|
||||
self.check_cxx(
|
||||
fragment=BOOST_SYSTEM_CODE,
|
||||
use=var,
|
||||
execute=False,
|
||||
)
|
||||
if 'thread' in params['lib']:
|
||||
self.check_cxx(
|
||||
fragment=BOOST_THREAD_CODE,
|
||||
use=var,
|
||||
execute=False,
|
||||
)
|
||||
if has_lib('system'):
|
||||
self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
|
||||
if has_lib('thread'):
|
||||
self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
|
||||
if has_lib('log') or has_lib('log_setup'):
|
||||
if not has_lib('thread'):
|
||||
self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
|
||||
if has_shlib('log') or has_shlib('log_setup'):
|
||||
self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
|
||||
if has_lib('log_setup'):
|
||||
self.check_cxx(fragment=BOOST_LOG_SETUP_CODE, use=var, execute=False)
|
||||
else:
|
||||
self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
|
||||
|
||||
if params.get('linkage_autodetect', False):
|
||||
self.start_msg("Attempting to detect boost linkage flags")
|
||||
self.start_msg('Attempting to detect boost linkage flags')
|
||||
toolset = self.boost_get_toolset(kw.get('toolset', ''))
|
||||
if toolset in ['vc']:
|
||||
if toolset in ('vc',):
|
||||
# disable auto-linking feature, causing error LNK1181
|
||||
# because the code wants to be linked against
|
||||
self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
|
||||
@@ -355,27 +491,43 @@ def check_boost(self, *k, **kw):
|
||||
# we attempt to play with some known-to-work CXXFLAGS combinations
|
||||
for cxxflags in (['/MD', '/EHsc'], []):
|
||||
self.env.stash()
|
||||
self.env["CXXFLAGS_%s" % var] += cxxflags
|
||||
self.env['CXXFLAGS_%s' % var] += cxxflags
|
||||
try:
|
||||
try_link()
|
||||
self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
|
||||
e = None
|
||||
self.end_msg('ok: winning cxxflags combination: %s' % (self.env['CXXFLAGS_%s' % var]))
|
||||
exc = None
|
||||
break
|
||||
except Errors.ConfigurationError as exc:
|
||||
except Errors.ConfigurationError as e:
|
||||
self.env.revert()
|
||||
e = exc
|
||||
exc = e
|
||||
|
||||
if e is not None:
|
||||
self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e)
|
||||
if exc is not None:
|
||||
self.end_msg('Could not auto-detect boost linking flags combination, you may report it to boost.py author', ex=exc)
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
|
||||
self.end_msg('Boost linkage flags auto-detection not implemented (needed ?) for this toolchain')
|
||||
self.fatal('The configuration failed')
|
||||
else:
|
||||
self.start_msg('Checking for boost linkage')
|
||||
try:
|
||||
try_link()
|
||||
except Errors.ConfigurationError as e:
|
||||
self.end_msg("Could not link against boost libraries using supplied options")
|
||||
self.end_msg('Could not link against boost libraries using supplied options', 'YELLOW')
|
||||
self.fatal('The configuration failed')
|
||||
self.end_msg('ok')
|
||||
|
||||
|
||||
@feature('cxx')
|
||||
@after_method('apply_link')
|
||||
def install_boost(self):
|
||||
if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'):
|
||||
return
|
||||
install_boost.done = True
|
||||
inst_to = getattr(self, 'install_path', '${BINDIR}')
|
||||
for lib in self.env.LIB_BOOST:
|
||||
try:
|
||||
file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST)
|
||||
self.bld.install_files(inst_to, self.bld.root.find_node(file))
|
||||
except:
|
||||
continue
|
||||
install_boost.done = False
|
||||
@@ -2,78 +2,10 @@
|
||||
|
||||
from waflib.Configure import conf
|
||||
|
||||
FRIEND_TYPENAME = '''
|
||||
class A;
|
||||
|
||||
template<typename T>
|
||||
class B
|
||||
{
|
||||
friend T;
|
||||
};
|
||||
|
||||
B<A> g_b;
|
||||
'''
|
||||
|
||||
FRIEND_WRAPPER = '''
|
||||
class A;
|
||||
|
||||
template<typename T>
|
||||
struct TypeWrapper
|
||||
{
|
||||
typedef T Type;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class B
|
||||
{
|
||||
friend class TypeWrapper<T>::Type;
|
||||
};
|
||||
|
||||
B<A> g_b;
|
||||
'''
|
||||
|
||||
@conf
|
||||
def check_friend_typename(self):
|
||||
if self.check_cxx(msg='Checking for friend typename-specifier',
|
||||
fragment=FRIEND_TYPENAME,
|
||||
features='cxx', mandatory=False):
|
||||
self.define('HAVE_CXX_FRIEND_TYPENAME', 1)
|
||||
elif self.check_cxx(msg='Checking for friend typename using wrapper',
|
||||
fragment=FRIEND_WRAPPER,
|
||||
features='cxx', mandatory=True):
|
||||
self.define('HAVE_CXX_FRIEND_TYPENAME_WRAPPER', 1)
|
||||
|
||||
OVERRIDE = '''
|
||||
class Base
|
||||
{
|
||||
virtual void
|
||||
f(int a);
|
||||
};
|
||||
|
||||
class Derived : public Base
|
||||
{
|
||||
virtual void
|
||||
f(int a) override;
|
||||
};
|
||||
|
||||
class Final : public Derived
|
||||
{
|
||||
virtual void
|
||||
f(int a) final;
|
||||
};
|
||||
'''
|
||||
|
||||
@conf
|
||||
def check_override(self):
|
||||
if self.check_cxx(msg='Checking for override and final specifiers',
|
||||
fragment=OVERRIDE,
|
||||
features='cxx', mandatory=False):
|
||||
self.define('HAVE_CXX_OVERRIDE_FINAL', 1)
|
||||
|
||||
STD_TO_STRING = '''
|
||||
#include <string>
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
main()
|
||||
{
|
||||
std::string s = std::to_string(0);
|
||||
s = std::to_string(0l);
|
||||
@@ -85,41 +17,14 @@ main(int argc, char** argv)
|
||||
s = std::to_string(0.0);
|
||||
s = std::to_string(0.0l);
|
||||
s.clear();
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
@conf
|
||||
def check_std_to_string(self):
|
||||
if self.check_cxx(msg='Checking for std::to_string',
|
||||
fragment=STD_TO_STRING,
|
||||
features='cxx', mandatory=False):
|
||||
fragment=STD_TO_STRING, mandatory=False):
|
||||
self.define('HAVE_STD_TO_STRING', 1)
|
||||
|
||||
VECTOR_INSERT_ERASE_CONST_ITERATOR = '''
|
||||
#include <vector>
|
||||
int
|
||||
main()
|
||||
{
|
||||
std::vector<int> v;
|
||||
std::vector<int>::const_iterator it = v.cbegin();
|
||||
|
||||
v.insert(it, 2);
|
||||
it = v.cend() - 1;
|
||||
v.erase(it);
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
@conf
|
||||
def check_vector_const_iterators(self):
|
||||
if self.check_cxx(msg='Checking for std::vector::insert with const_iterator',
|
||||
fragment=VECTOR_INSERT_ERASE_CONST_ITERATOR,
|
||||
features='cxx', mandatory=False):
|
||||
self.define('HAVE_VECTOR_INSERT_ERASE_CONST_ITERATOR', 1)
|
||||
|
||||
def configure(conf):
|
||||
conf.check_friend_typename()
|
||||
conf.check_override()
|
||||
conf.check_std_to_string()
|
||||
conf.check_vector_const_iterators()
|
||||
@@ -1,15 +1,15 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
from waflib import TaskGen, Logs
|
||||
from waflib import TaskGen
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
|
||||
help='''Set compiler flags for gcc to enable code coverage information''')
|
||||
opt.add_option('--with-coverage', action='store_true', default=False,
|
||||
help='Add compiler flags to enable code coverage information')
|
||||
|
||||
def configure(conf):
|
||||
if conf.options.with_coverage:
|
||||
if not conf.options.debug:
|
||||
conf.fatal("Code coverage flags require debug mode compilation (add --debug)")
|
||||
conf.fatal('Code coverage flags require debug mode compilation (add --debug)')
|
||||
conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'],
|
||||
linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True)
|
||||
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
'''
|
||||
|
||||
When using this tool, the wscript will look like:
|
||||
|
||||
def options(opt):
|
||||
opt.load('compiler_cxx cryptopp')
|
||||
|
||||
def configure(conf):
|
||||
conf.load('compiler_cxx cryptopp')
|
||||
conf.check_cryptopp()
|
||||
|
||||
def build(bld):
|
||||
bld(source='main.cpp', target='app', use='CRYPTOPP')
|
||||
|
||||
Options are generated, in order to specify the location of cryptopp includes/libraries.
|
||||
|
||||
|
||||
'''
|
||||
import sys
|
||||
import re
|
||||
from waflib import Utils,Logs,Errors
|
||||
from waflib.Configure import conf
|
||||
CRYPTOPP_DIR = ['/usr', '/usr/local', '/opt/local', '/sw', '/usr/local/ndn', '/opt/ndn']
|
||||
CRYPTOPP_VERSION_FILE = 'config.h'
|
||||
|
||||
CRYPTOPP_CHECK_FRAGMENT = '''
|
||||
#include "../../src/security/cryptopp.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace CryptoPP;
|
||||
|
||||
std::string buffer = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
|
||||
SHA256 hash;
|
||||
StringSource(buffer, true, new HashFilter(hash, new FileSink(std::cout)));
|
||||
StringSource(reinterpret_cast<const uint8_t*>(buffer.c_str()), buffer.size(),
|
||||
true, new HashFilter(hash, new FileSink(std::cout)));
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-cryptopp', type='string', default=None, dest='cryptopp_dir',
|
||||
help='''Path to where CryptoPP is installed, e.g., /usr/local''')
|
||||
|
||||
@conf
|
||||
def __cryptopp_get_version_file(self, dir):
|
||||
try:
|
||||
return self.root.find_dir(dir).find_node('%s/%s' % ('include/cryptopp',
|
||||
CRYPTOPP_VERSION_FILE))
|
||||
except:
|
||||
return None
|
||||
|
||||
@conf
|
||||
def __cryptopp_find_root_and_version_file(self, *k, **kw):
|
||||
root = k and k[0] or kw.get('path', self.options.cryptopp_dir)
|
||||
|
||||
file = self.__cryptopp_get_version_file(root)
|
||||
if root and file:
|
||||
return (root, file)
|
||||
for dir in CRYPTOPP_DIR:
|
||||
file = self.__cryptopp_get_version_file(dir)
|
||||
if file:
|
||||
return (dir, file)
|
||||
|
||||
if root:
|
||||
self.fatal('CryptoPP not found in %s' % root)
|
||||
else:
|
||||
self.fatal('CryptoPP not found, please provide a --with-cryptopp=PATH argument (see help)')
|
||||
|
||||
@conf
|
||||
def check_cryptopp(self, *k, **kw):
|
||||
if not self.env['CXX']:
|
||||
self.fatal('Load a c++ compiler first, e.g., conf.load("compiler_cxx")')
|
||||
|
||||
var = kw.get('uselib_store', 'CRYPTOPP')
|
||||
mandatory = kw.get('mandatory', True)
|
||||
|
||||
use = kw.get('use', 'PTHREAD')
|
||||
|
||||
self.start_msg('Checking Crypto++ lib')
|
||||
(root, file) = self.__cryptopp_find_root_and_version_file(*k, **kw)
|
||||
|
||||
try:
|
||||
txt = file.read()
|
||||
re_version = re.compile('^#define\\s+CRYPTOPP_VERSION\\s+(.*)', re.M)
|
||||
match = re_version.search(txt)
|
||||
|
||||
if match:
|
||||
self.env.CRYPTOPP_VERSION = match.group(1)
|
||||
self.end_msg(self.env.CRYPTOPP_VERSION)
|
||||
else:
|
||||
self.fatal('CryptoPP files are present, but are not recognizable')
|
||||
except:
|
||||
self.fatal('CryptoPP not found or is not usable')
|
||||
|
||||
isLibWorking = False
|
||||
for defines in ['', 'CRYPTOPP_DISABLE_ASM']:
|
||||
try:
|
||||
self.check_cxx(msg='Checking if CryptoPP library works',
|
||||
fragment=CRYPTOPP_CHECK_FRAGMENT,
|
||||
lib='cryptopp',
|
||||
includes="%s/include" % root,
|
||||
libpath="%s/lib" % root,
|
||||
mandatory=True,
|
||||
use=use,
|
||||
defines=defines,
|
||||
uselib_store=var)
|
||||
isLibWorking = True
|
||||
break
|
||||
except:
|
||||
# try another flags
|
||||
pass
|
||||
|
||||
if mandatory and not isLibWorking:
|
||||
self.fatal('CryptoPP is present, but is not usable')
|
||||
@@ -1,46 +1,76 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
from waflib import Logs, Configure, Utils
|
||||
import platform
|
||||
from waflib import Configure, Logs, Utils
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
|
||||
help='''Compile in debugging mode without optimizations (-O0 or -Og)''')
|
||||
opt.add_option('--debug', '--with-debug', action='store_true', default=False,
|
||||
help='Compile in debugging mode with minimal optimizations (-Og)')
|
||||
|
||||
def configure(conf):
|
||||
cxx = conf.env['CXX_NAME'] # CXX_NAME represents generic name of the compiler
|
||||
conf.start_msg('Checking C++ compiler version')
|
||||
|
||||
cxx = conf.env.CXX_NAME # generic name of the compiler
|
||||
ccver = tuple(int(i) for i in conf.env.CC_VERSION)
|
||||
ccverstr = '.'.join(conf.env.CC_VERSION)
|
||||
errmsg = ''
|
||||
warnmsg = ''
|
||||
if cxx == 'gcc':
|
||||
flags = GccFlags()
|
||||
if ccver < (5, 3, 0):
|
||||
errmsg = ('The version of gcc you are using is too old.\n'
|
||||
'The minimum supported gcc version is 7.4.0.')
|
||||
elif ccver < (7, 4, 0):
|
||||
warnmsg = ('Using a version of gcc older than 7.4.0 is not '
|
||||
'officially supported and may result in build failures.')
|
||||
conf.flags = GccFlags()
|
||||
elif cxx == 'clang':
|
||||
flags = ClangFlags()
|
||||
if Utils.unversioned_sys_platform() == 'darwin' and ccver < (9, 0, 0):
|
||||
errmsg = ('The version of Xcode you are using is too old.\n'
|
||||
'The minimum supported Xcode version is 9.0.')
|
||||
elif ccver < (4, 0, 0):
|
||||
errmsg = ('The version of clang you are using is too old.\n'
|
||||
'The minimum supported clang version is 4.0.')
|
||||
conf.flags = ClangFlags()
|
||||
else:
|
||||
flags = CompilerFlags()
|
||||
Logs.warn('The code has not yet been tested with %s compiler' % cxx)
|
||||
warnmsg = '%s compiler is unsupported' % cxx
|
||||
conf.flags = CompilerFlags()
|
||||
|
||||
areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
|
||||
if errmsg:
|
||||
conf.end_msg(ccverstr, color='RED')
|
||||
conf.fatal(errmsg)
|
||||
elif warnmsg:
|
||||
conf.end_msg(ccverstr, color='YELLOW')
|
||||
Logs.warn('WARNING: ' + warnmsg)
|
||||
else:
|
||||
conf.end_msg(ccverstr)
|
||||
|
||||
# General flags are always applied (e.g., selecting C++11 mode)
|
||||
generalFlags = flags.getGeneralFlags(conf)
|
||||
conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
|
||||
|
||||
# General flags are always applied (e.g., selecting C++ language standard)
|
||||
generalFlags = conf.flags.getGeneralFlags(conf)
|
||||
conf.add_supported_cxxflags(generalFlags['CXXFLAGS'])
|
||||
conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
|
||||
conf.env.DEFINES += generalFlags['DEFINES']
|
||||
|
||||
@Configure.conf
|
||||
def check_compiler_flags(conf):
|
||||
# Debug or optimized CXXFLAGS and LINKFLAGS are applied only if the
|
||||
# corresponding environment variables are not set.
|
||||
# DEFINES are always applied.
|
||||
if conf.options.debug:
|
||||
extraFlags = flags.getDebugFlags(conf)
|
||||
if areCustomCxxflagsPresent:
|
||||
extraFlags = conf.flags.getDebugFlags(conf)
|
||||
if conf.areCustomCxxflagsPresent:
|
||||
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
|
||||
if len(missingFlags) > 0:
|
||||
Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
|
||||
% " ".join(conf.env.CXXFLAGS))
|
||||
Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
|
||||
if missingFlags:
|
||||
Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"'
|
||||
% ' '.join(conf.env.CXXFLAGS))
|
||||
Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags))
|
||||
else:
|
||||
extraFlags = flags.getOptimizedFlags(conf)
|
||||
extraFlags = conf.flags.getOptimizedFlags(conf)
|
||||
|
||||
if not areCustomCxxflagsPresent:
|
||||
if not conf.areCustomCxxflagsPresent:
|
||||
conf.add_supported_cxxflags(extraFlags['CXXFLAGS'])
|
||||
conf.add_supported_cxxflags(extraFlags['LINKFLAGS'])
|
||||
conf.add_supported_linkflags(extraFlags['LINKFLAGS'])
|
||||
|
||||
conf.env.DEFINES += extraFlags['DEFINES']
|
||||
|
||||
@@ -55,12 +85,13 @@ def add_supported_cxxflags(self, cxxflags):
|
||||
self.start_msg('Checking supported CXXFLAGS')
|
||||
|
||||
supportedFlags = []
|
||||
for flag in cxxflags:
|
||||
if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False):
|
||||
supportedFlags += [flag]
|
||||
for flags in cxxflags:
|
||||
flags = Utils.to_list(flags)
|
||||
if self.check_cxx(cxxflags=['-Werror'] + flags, mandatory=False):
|
||||
supportedFlags += flags
|
||||
|
||||
self.end_msg(' '.join(supportedFlags))
|
||||
self.env.CXXFLAGS = supportedFlags + self.env.CXXFLAGS
|
||||
self.env.prepend_value('CXXFLAGS', supportedFlags)
|
||||
|
||||
@Configure.conf
|
||||
def add_supported_linkflags(self, linkflags):
|
||||
@@ -73,101 +104,124 @@ def add_supported_linkflags(self, linkflags):
|
||||
self.start_msg('Checking supported LINKFLAGS')
|
||||
|
||||
supportedFlags = []
|
||||
for flag in linkflags:
|
||||
if self.check_cxx(linkflags=['-Werror', flag], mandatory=False):
|
||||
supportedFlags += [flag]
|
||||
for flags in linkflags:
|
||||
flags = Utils.to_list(flags)
|
||||
if self.check_cxx(linkflags=['-Werror'] + flags, mandatory=False):
|
||||
supportedFlags += flags
|
||||
|
||||
self.end_msg(' '.join(supportedFlags))
|
||||
self.env.LINKFLAGS = supportedFlags + self.env.LINKFLAGS
|
||||
self.env.prepend_value('LINKFLAGS', supportedFlags)
|
||||
|
||||
|
||||
class CompilerFlags(object):
|
||||
def getCompilerVersion(self, conf):
|
||||
return tuple(int(i) for i in conf.env.CC_VERSION)
|
||||
|
||||
def getGeneralFlags(self, conf):
|
||||
"""Get dict {'CXXFLAGS':[...], LINKFLAGS:[...], DEFINES:[...]} that are always needed"""
|
||||
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed"""
|
||||
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in debug mode"""
|
||||
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in debug mode"""
|
||||
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['_DEBUG']}
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in optimized mode"""
|
||||
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in optimized mode"""
|
||||
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['NDEBUG']}
|
||||
|
||||
class GccBasicFlags(CompilerFlags):
|
||||
"""
|
||||
This class defines basic flags that work for both gcc and clang compilers
|
||||
"""
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(GccBasicFlags, self).getGeneralFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-std=c++14']
|
||||
if Utils.unversioned_sys_platform() == 'linux':
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=gold']
|
||||
elif Utils.unversioned_sys_platform() == 'freebsd':
|
||||
flags['LINKFLAGS'] += ['-fuse-ld=lld']
|
||||
return flags
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(GccBasicFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-pedantic',
|
||||
'-Wall',
|
||||
'-O0',
|
||||
flags['CXXFLAGS'] += ['-Og',
|
||||
'-g3',
|
||||
'-pedantic',
|
||||
'-Wall',
|
||||
'-Wextra',
|
||||
'-Werror',
|
||||
'-Wcatch-value=2',
|
||||
'-Wextra-semi',
|
||||
'-Wnon-virtual-dtor',
|
||||
'-Wno-error=deprecated-declarations', # Bug #3795
|
||||
'-Wno-error=maybe-uninitialized', # Bug #1615
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
flags['LINKFLAGS'] += ['-Wl,-O1']
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(GccBasicFlags, self).getOptimizedFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-pedantic',
|
||||
'-Wall',
|
||||
'-O2',
|
||||
flags['CXXFLAGS'] += ['-O2',
|
||||
'-g',
|
||||
'-pedantic',
|
||||
'-Wall',
|
||||
'-Wextra',
|
||||
'-Wcatch-value=2',
|
||||
'-Wextra-semi',
|
||||
'-Wnon-virtual-dtor',
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
flags['LINKFLAGS'] += ['-Wl,-O1']
|
||||
return flags
|
||||
|
||||
class GccFlags(GccBasicFlags):
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(GccFlags, self).getGeneralFlags(conf)
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if version < (4, 6, 0):
|
||||
conf.fatal('The version of gcc you are using (%s) is too old.\n' %
|
||||
'.'.join(conf.env['CC_VERSION']) +
|
||||
'The minimum supported gcc version is 4.6.0.')
|
||||
elif version < (4, 7, 0):
|
||||
flags['CXXFLAGS'] += ['-std=c++0x']
|
||||
else:
|
||||
flags['CXXFLAGS'] += ['-std=c++11']
|
||||
if version < (4, 8, 0):
|
||||
flags['DEFINES'] += ['_GLIBCXX_USE_NANOSLEEP'] # Bug #2499
|
||||
return flags
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(GccFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-Og', # gcc >= 4.8
|
||||
'-fdiagnostics-color', # gcc >= 4.9
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color',
|
||||
'-Wredundant-tags',
|
||||
]
|
||||
if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(GccFlags, self).getOptimizedFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color',
|
||||
'-Wredundant-tags',
|
||||
]
|
||||
if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
|
||||
return flags
|
||||
|
||||
class ClangFlags(GccBasicFlags):
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getGeneralFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-std=c++11']
|
||||
if Utils.unversioned_sys_platform() == 'darwin':
|
||||
flags['CXXFLAGS'] += ['-stdlib=libc++']
|
||||
flags['LINKFLAGS'] += ['-stdlib=libc++']
|
||||
# Bug #4296
|
||||
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew
|
||||
['-isystem', '/opt/local/include']] # for MacPorts
|
||||
elif Utils.unversioned_sys_platform() == 'freebsd':
|
||||
# Bug #4790
|
||||
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include']]
|
||||
return flags
|
||||
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getDebugFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
|
||||
'-Wundefined-func-template',
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
'-Wno-error=unneeded-internal-declaration', # Bug #1588
|
||||
'-Wno-error=deprecated-register',
|
||||
'-Wno-error=keyword-macro', # Bug #3235
|
||||
]
|
||||
if self.getCompilerVersion(conf) < (6, 0, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getOptimizedFlags(conf)
|
||||
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
|
||||
'-Wundefined-func-template',
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
]
|
||||
if self.getCompilerVersion(conf) < (6, 0, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
|
||||
return flags
|
||||
@@ -85,7 +85,7 @@ class doxygen(Task.Task):
|
||||
|
||||
# Override with any parameters passed to the task generator
|
||||
if getattr(self.generator, 'pars', None):
|
||||
for k, v in self.generator.pars.iteritems():
|
||||
for k, v in self.generator.pars.items():
|
||||
self.pars[k] = v
|
||||
|
||||
self.doxy_inputs = getattr(self, 'doxy_inputs', [])
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# Yingdi Yu (UCLA) 2016
|
||||
|
||||
'''
|
||||
|
||||
When using this tool, the wscript will look like:
|
||||
|
||||
def options(opt):
|
||||
opt.load('openssl')
|
||||
|
||||
def configure(conf):
|
||||
conf.load('compiler_cxx openssl')
|
||||
conf.check_openssl()
|
||||
|
||||
def build(bld):
|
||||
bld(source='main.cpp', target='app', use='OPENSSL')
|
||||
|
||||
'''
|
||||
|
||||
import re
|
||||
from waflib import Utils
|
||||
from waflib.Configure import conf
|
||||
|
||||
OPENSSL_DIR_OSX = ['/usr/local', '/opt/local', '/usr/local/opt/openssl']
|
||||
OPENSSL_DIR = ['/usr', '/usr/local', '/opt/local', '/sw']
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-openssl', type='string', default=None, dest='openssl_dir',
|
||||
help='directory where OpenSSL is installed, e.g., /usr/local')
|
||||
|
||||
@conf
|
||||
def __openssl_get_version_file(self, dir):
|
||||
try:
|
||||
return self.root.find_dir(dir).find_node('include/openssl/opensslv.h')
|
||||
except:
|
||||
return None
|
||||
|
||||
@conf
|
||||
def __openssl_find_root_and_version_file(self, *k, **kw):
|
||||
root = k and k[0] or kw.get('path', self.options.openssl_dir)
|
||||
|
||||
file = self.__openssl_get_version_file(root)
|
||||
if root and file:
|
||||
return (root, file)
|
||||
|
||||
openssl_dir = []
|
||||
if Utils.unversioned_sys_platform() == 'darwin':
|
||||
openssl_dir = OPENSSL_DIR_OSX
|
||||
else:
|
||||
openssl_dir = OPENSSL_DIR
|
||||
|
||||
if not root:
|
||||
for dir in openssl_dir:
|
||||
file = self.__openssl_get_version_file(dir)
|
||||
if file:
|
||||
return (dir, file)
|
||||
|
||||
if root:
|
||||
self.fatal('OpenSSL not found in %s' % root)
|
||||
else:
|
||||
self.fatal('OpenSSL not found, please provide a --with-openssl=PATH argument (see help)')
|
||||
|
||||
@conf
|
||||
def check_openssl(self, *k, **kw):
|
||||
self.start_msg('Checking for OpenSSL version')
|
||||
(root, file) = self.__openssl_find_root_and_version_file(*k, **kw)
|
||||
|
||||
try:
|
||||
txt = file.read()
|
||||
re_version = re.compile('^#\\s*define\\s+OPENSSL_VERSION_NUMBER\\s+(.*)L', re.M)
|
||||
version_number = re_version.search(txt)
|
||||
|
||||
re_version_text = re.compile('^#\\s*define\\s+OPENSSL_VERSION_TEXT\\s+(.*)', re.M)
|
||||
version_text = re_version_text.search(txt)
|
||||
|
||||
if version_number and version_text:
|
||||
version = version_number.group(1)
|
||||
self.end_msg(version_text.group(1))
|
||||
else:
|
||||
self.fatal('OpenSSL version file is present, but is not recognizable')
|
||||
except:
|
||||
self.fatal('OpenSSL version file is not found or is not usable')
|
||||
|
||||
atleast_version = kw.get('atleast_version', 0)
|
||||
if int(version, 16) < atleast_version:
|
||||
self.fatal('The version of OpenSSL is too old\n'
|
||||
'Please upgrade your distribution or manually install a newer version of OpenSSL')
|
||||
|
||||
if 'msg' not in kw:
|
||||
kw['msg'] = 'Checking if OpenSSL library works'
|
||||
if 'lib' not in kw:
|
||||
kw['lib'] = ['ssl', 'crypto']
|
||||
if 'uselib_store' not in kw:
|
||||
kw['uselib_store'] = 'OPENSSL'
|
||||
if 'define_name' not in kw:
|
||||
kw['define_name'] = 'HAVE_%s' % kw['uselib_store']
|
||||
if root:
|
||||
kw['includes'] = '%s/include' % root
|
||||
kw['libpath'] = '%s/lib' % root
|
||||
|
||||
self.check_cxx(**kw)
|
||||
@@ -0,0 +1,42 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
from waflib import Logs, Utils, TaskGen
|
||||
from waflib.Configure import conf
|
||||
|
||||
@conf
|
||||
def check_osx_framework_cxx(conf, fw_name, **kw):
|
||||
conf.check_cxx(framework_name=fw_name,
|
||||
uselib_store='OSX_' + fw_name.upper(),
|
||||
fragment='#include <{0}/{0}.h>\nint main() {{}}'.format(fw_name),
|
||||
**kw)
|
||||
|
||||
@conf
|
||||
def check_osx_framework_mm(conf, fw_name, **kw):
|
||||
conf.check_cxx(framework_name=fw_name,
|
||||
uselib_store='OSX_' + fw_name.upper(),
|
||||
fragment='#import <{0}/{0}.h>\nint main() {{}}'.format(fw_name),
|
||||
compile_filename='test.mm',
|
||||
**kw)
|
||||
|
||||
@conf
|
||||
def check_osx_frameworks(conf, *k, **kw):
|
||||
if Utils.unversioned_sys_platform() == 'darwin':
|
||||
try:
|
||||
conf.check_osx_framework_cxx('CoreFoundation', mandatory=True)
|
||||
conf.check_osx_framework_cxx('Security', use='OSX_COREFOUNDATION', mandatory=True)
|
||||
conf.check_osx_framework_cxx('SystemConfiguration', use='OSX_COREFOUNDATION', mandatory=True)
|
||||
|
||||
conf.check_osx_framework_mm('Foundation', mandatory=True)
|
||||
conf.check_osx_framework_mm('CoreWLAN', use='OSX_FOUNDATION', mandatory=True)
|
||||
|
||||
conf.define('HAVE_OSX_FRAMEWORKS', 1)
|
||||
conf.env['HAVE_OSX_FRAMEWORKS'] = True
|
||||
except:
|
||||
Logs.warn('Building on macOS, but one or more required frameworks are not functional.')
|
||||
Logs.warn('Note that the frameworks are known to work only with the Apple clang compiler.')
|
||||
|
||||
@TaskGen.extension('.mm')
|
||||
def m_hook(self, node):
|
||||
'''Alias .mm files to be compiled the same as .cpp files, clang will do the right thing.'''
|
||||
return self.create_compiled_task('cxx', node)
|
||||
@@ -1,36 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
from waflib import Logs, Utils
|
||||
from waflib.Configure import conf
|
||||
|
||||
OSX_SECURITY_CODE='''
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <Security/Security.h>
|
||||
#include <Security/SecRandom.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <Security/SecDigestTransform.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
(void)argc; (void)argv;
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
@conf
|
||||
def check_osx_security(conf, *k, **kw):
|
||||
if Utils.unversioned_sys_platform() == "darwin":
|
||||
try:
|
||||
conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION',
|
||||
mandatory=True)
|
||||
conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES',
|
||||
mandatory=True)
|
||||
conf.check_cxx(framework_name='Security', uselib_store='OSX_SECURITY',
|
||||
define_name='HAVE_SECURITY', use="OSX_COREFOUNDATION",
|
||||
fragment=OSX_SECURITY_CODE, mandatory=True)
|
||||
|
||||
conf.define('HAVE_OSX_SECURITY', 1)
|
||||
conf.env['HAVE_OSX_SECURITY'] = True
|
||||
except:
|
||||
Logs.warn("Compiling on OSX, but CoreFoundation, CoreServices, or Security framework is not functional.")
|
||||
Logs.warn("The frameworks are known to work only with Apple-specific compilers: llvm-gcc-4.2 or clang")
|
||||
+2
-7
@@ -52,7 +52,7 @@ Note that precompiled header must have multiple inclusion guards. If the guards
|
||||
"""
|
||||
|
||||
import os
|
||||
from waflib import Task, TaskGen, Logs, Utils
|
||||
from waflib import Task, TaskGen, Utils
|
||||
from waflib.Tools import c_preproc, cxx
|
||||
|
||||
|
||||
@@ -67,11 +67,6 @@ def options(opt):
|
||||
|
||||
def configure(conf):
|
||||
if (conf.options.with_pch and conf.env['COMPILER_CXX'] in PCH_COMPILER_OPTIONS.keys()):
|
||||
if Utils.unversioned_sys_platform() == "darwin" and conf.env['CXX_NAME'] == 'clang':
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if version < (6, 1, 0):
|
||||
# Issue #2804
|
||||
return
|
||||
conf.env.WITH_PCH = True
|
||||
flags = PCH_COMPILER_OPTIONS[conf.env['COMPILER_CXX']]
|
||||
conf.env.CXXPCH_F = flags[0]
|
||||
@@ -134,7 +129,7 @@ def add_pch(self):
|
||||
x.env.append_value('CXXFLAGS', self.env['CXXPCH_F'] + [pch.target])
|
||||
|
||||
class gchx(Task.Task):
|
||||
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()}'
|
||||
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()} ${CPPFLAGS}'
|
||||
scan = c_preproc.scan
|
||||
color = 'BLUE'
|
||||
ext_out=['.h']
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-sanitizer', action='store', default='', dest='sanitizers',
|
||||
help='Comma-separated list of compiler sanitizers to enable [default=none]')
|
||||
|
||||
def configure(conf):
|
||||
for san in conf.options.sanitizers.split(','):
|
||||
if not san:
|
||||
continue
|
||||
|
||||
sanflag = '-fsanitize=%s' % san
|
||||
conf.start_msg('Checking if compiler supports %s' % sanflag)
|
||||
|
||||
if conf.check_cxx(cxxflags=['-Werror', sanflag, '-fno-omit-frame-pointer'],
|
||||
linkflags=[sanflag], mandatory=False):
|
||||
conf.end_msg('yes')
|
||||
conf.env.append_unique('CXXFLAGS', [sanflag, '-fno-omit-frame-pointer'])
|
||||
conf.env.append_unique('LINKFLAGS', [sanflag])
|
||||
else:
|
||||
conf.end_msg('no', color='RED')
|
||||
conf.fatal('%s sanitizer is not supported by the current compiler' % san)
|
||||
@@ -44,28 +44,28 @@ def apply_sphinx(self):
|
||||
task.inputs.append(conf)
|
||||
|
||||
confdir = conf.parent.abspath()
|
||||
buildername = getattr(self, "builder", "html")
|
||||
srcdir = getattr(self, "srcdir", confdir)
|
||||
outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
|
||||
doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
|
||||
buildername = getattr(self, 'builder', 'html')
|
||||
srcdir = getattr(self, 'srcdir', confdir)
|
||||
outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
|
||||
doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
|
||||
|
||||
task.env['BUILDERNAME'] = buildername
|
||||
task.env['SRCDIR'] = srcdir
|
||||
task.env['DOCTREEDIR'] = doctreedir
|
||||
task.env['OUTDIR'] = outdir.abspath()
|
||||
task.env['VERSION'] = "version=%s" % self.VERSION
|
||||
task.env['RELEASE'] = "release=%s" % self.VERSION
|
||||
task.env['VERSION'] = 'version=%s' % self.version
|
||||
task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
|
||||
|
||||
import imp
|
||||
confData = imp.load_source('sphinx_conf', conf.abspath())
|
||||
|
||||
if buildername == "man":
|
||||
if buildername == 'man':
|
||||
for i in confData.man_pages:
|
||||
target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
|
||||
task.outputs.append(target)
|
||||
|
||||
if self.install_path:
|
||||
self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
|
||||
self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
|
||||
else:
|
||||
task.outputs.append(outdir)
|
||||
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
from waflib import Options, Logs
|
||||
from waflib.Configure import conf
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-sqlite3', type='string', default=None,
|
||||
dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
|
||||
opt.add_option('--with-sqlite3', type='string', default=None, dest='sqlite3_dir',
|
||||
help='directory where SQLite3 is installed, e.g., /usr/local')
|
||||
|
||||
@conf
|
||||
def check_sqlite3(self, *k, **kw):
|
||||
root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
|
||||
root = k and k[0] or kw.get('path', self.options.sqlite3_dir)
|
||||
mandatory = kw.get('mandatory', True)
|
||||
var = kw.get('uselib_store', 'SQLITE3')
|
||||
|
||||
@@ -20,8 +19,8 @@ def check_sqlite3(self, *k, **kw):
|
||||
define_name='HAVE_%s' % var,
|
||||
uselib_store=var,
|
||||
mandatory=mandatory,
|
||||
includes="%s/include" % root,
|
||||
libpath="%s/lib" % root)
|
||||
includes='%s/include' % root,
|
||||
libpath='%s/lib' % root)
|
||||
else:
|
||||
try:
|
||||
self.check_cfg(package='sqlite3',
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
def checkForTypeProperty(conf, prop, tparams):
|
||||
if conf.check_cxx(msg=('Checking for std::%s' % prop),
|
||||
fragment=('#include <type_traits>\nstatic_assert(std::%s<%s>::value, "");' %
|
||||
(prop, tparams)),
|
||||
features='cxx', mandatory=False):
|
||||
define = 'HAVE_' + prop.upper()
|
||||
conf.define(define, 1)
|
||||
conf.env[define] = True
|
||||
|
||||
def configure(conf):
|
||||
checkForTypeProperty(conf, 'is_default_constructible', 'int')
|
||||
checkForTypeProperty(conf, 'is_nothrow_move_constructible', 'int')
|
||||
checkForTypeProperty(conf, 'is_nothrow_move_assignable', 'int')
|
||||
+57
-34
@@ -1,38 +1,61 @@
|
||||
ndn-cxx authors
|
||||
===============
|
||||
# ndn-cxx Authors
|
||||
|
||||
## The primary authors are (and/or have been):
|
||||
The following lists maintainers, primary developers, and all much-appreciated contributors to ndn-cxx in alphabetic order.
|
||||
The specific contributions of individual authors can be obtained from the git history of the [official ndn-cxx repository](https://github.com/named-data/ndn-cxx).
|
||||
If you would like to become a contributor to the official repository, please follow the recommendations in https://github.com/named-data/.github/blob/master/CONTRIBUTING.md.
|
||||
|
||||
* Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
|
||||
* Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
|
||||
* Junxiao Shi <http://www.cs.arizona.edu/people/shijunxiao/>
|
||||
* Jeff Thompson <jefft0@remap.ucla.edu>
|
||||
* Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
|
||||
* Sepehr Abdous <https://sepehrabdous.github.io>
|
||||
* ***(Maintainer)*** Alexander Afanasyev <https://users.cs.fiu.edu/~afanasyev>
|
||||
* Syed Obaid Amin <http://obaidamin.weebly.com>
|
||||
* Hila Ben Abraham <https://sites.wustl.edu/hbabraham>
|
||||
* Shuo Chen <https://github.com/chenatu>
|
||||
* Muktadir R. Chowdhury <https://github.com/alvyC>
|
||||
* Jeremy Clark <https://github.com/jrandallclark>
|
||||
* Damian Coomes <https://github.com/dmcoomes>
|
||||
* Stephanie DiBenedetto
|
||||
* Qiuhan Ding <https://irl.cs.ucla.edu/~qiuhanding>
|
||||
* Chengyu Fan <https://github.com/chengyu>
|
||||
* Laqin Fan <https://github.com/laqinfan>
|
||||
* Ashlesh Gawande <https://www.linkedin.com/in/agawande>
|
||||
* Chavoosh Ghasemi <https://chavoosh.github.io>
|
||||
* Mathias Gibbens <https://calenhad.com>
|
||||
* Nick Gordon <https://github.com/gorgonical>
|
||||
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock>
|
||||
* Marcin Juszkiewicz <https://marcin.juszkiewicz.com.pl>
|
||||
* Luca Keidel <https://lucakeidel.de>
|
||||
* Spencer Lee <https://wwsw.linkedin.com/in/spenlee>
|
||||
* Vince Lehman <http://vslehman.com>
|
||||
* Yanbiao Li <https://www.linkedin.com/pub/yanbiao-li/24/7a1/4ba>
|
||||
* Teng Liang <https://cs.arizona.edu/~philoliang>
|
||||
* Weiwei Liu <https://www.linkedin.com/in/weiweiliu10>
|
||||
* Tianxing Ma <https://github.com/matianxing1992>
|
||||
* Xingyu Ma <https://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
|
||||
* Spyridon Mastorakis <https://sites.google.com/site/spyridonmastorakis>
|
||||
* Ernest McCracken <https://github.com/emccrckn>
|
||||
* Stephen McQuistin <https://smcquistin.uk>
|
||||
* Ilya Moiseenko <https://www.linkedin.com/in/ilya-moiseenko-52884317>
|
||||
* Alex Nano <http://alexnano.net>
|
||||
* Eric Newberry <https://ericnewberry.com>
|
||||
* Arthi Padmanabhan <https://github.com/arthipadmanabhan>
|
||||
* Ju Pan <https://cs-jupan.com>
|
||||
* João Pereira <http://website.jpereira.co.uk>
|
||||
* Davide Pesavento <https://github.com/Pesa>
|
||||
* José Quevedo <http://atnog.av.it.pt/members/jquevedo>
|
||||
* Md Ashiqur Rahman <https://ashiqrahman.com>
|
||||
* Niv Sardi <http://core.evilgiggle.com>
|
||||
* Wentao Shang <https://irl.cs.ucla.edu/~wentao>
|
||||
* Susmit Shannigrahi <https://susm.it>
|
||||
* Junxiao Shi <https://cs.arizona.edu/~shijunxiao>
|
||||
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Jiewen Tan <https://github.com/alanwaketan>
|
||||
* ***(Former Maintainer)*** Jeff Thompson <https://remap.ucla.edu/jeff-thompson>
|
||||
* Yukai Tu <https://irl.cs.ucla.edu/~yukai>
|
||||
* Yingdi Yu <https://irl.cs.ucla.edu/~yingdi>
|
||||
* Zhiyi Zhang <https://zhiyi-zhang.com>
|
||||
* Zhenkai Zhu <https://irl.cs.ucla.edu/~zhenkai>
|
||||
|
||||
## All project authors and contributors
|
||||
## Technical Advisors
|
||||
|
||||
The following is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS,
|
||||
people who have reported bugs, submitted patches, and implemented new features
|
||||
in the library:
|
||||
|
||||
* Wentao Shang <http://irl.cs.ucla.edu/~wentao/>
|
||||
* Steve DiBenedetto <http://www.cs.colostate.edu/~dibenede/>
|
||||
* Davide Pesavento <http://www.lip6.fr/actualite/personnes-fiche.php?ident=D1469>
|
||||
* Syed Obaid Amin <http://obaidamin.weebly.com/>
|
||||
* Shuo Chen <chenatu2006@gmail.com>
|
||||
* Hila Ben Abraham <http://research.engineering.wustl.edu/~abrahamh/>
|
||||
* Xingyu Ma <http://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
|
||||
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Lixia Zhang <http://www.cs.ucla.edu/~lixia/home.html>
|
||||
* Jeff Burke <http://remap.ucla.edu/jburke/>
|
||||
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock/>
|
||||
* Jiewen Tan <alanwake@ucla.edu>
|
||||
* Vince Lehman <http://vslehman.com>
|
||||
* Mathias Gibbens <gibmat@cs.arizona.edu>
|
||||
* Chengyu Fan <chengyu@cs.colostate.edu>
|
||||
* Qiuhan Ding <http://irl.cs.ucla.edu/~qiuhanding/>
|
||||
* Spyridon Mastorakis <http://cs.ucla.edu/~mastorakis/>
|
||||
* Eric Newberry <http://ericnewberry.com>
|
||||
* João Pereira <http://website.jpereira.co.uk>
|
||||
* Mickey Sweatt <https://www.linkedin.com/in/michaelsweatt>
|
||||
* Yanbiao Li <https://www.linkedin.com/pub/yanbiao-li/24/7a1/4ba>
|
||||
* Jeff Burke <https://jeff-burke.com>
|
||||
* Beichuan Zhang <https://cs.arizona.edu/~bzhang>
|
||||
* Lixia Zhang <https://cs.ucla.edu/~lixia>
|
||||
+473
-474
File diff suppressed because it is too large.
Load diff
+65
-7
@@ -1,22 +1,24 @@
|
||||
Notes for ndn-cxx developers
|
||||
============================
|
||||
|
||||
If you are new to the NDN community of software generally, read the
|
||||
[Contributor's Guide](https://github.com/named-data/.github/blob/master/CONTRIBUTING.md).
|
||||
|
||||
Code style
|
||||
----------
|
||||
|
||||
ndn-cxx code is subject to [ndn-cxx code style](http://named-data.net/doc/ndn-cxx/current/code-style.html).
|
||||
ndn-cxx code is subject to [ndn-cxx code style](https://named-data.net/doc/ndn-cxx/current/code-style.html).
|
||||
|
||||
Licensing
|
||||
---------
|
||||
|
||||
Contributions to the library must be licensed under LGPL 3.0 or compatible license. If
|
||||
you are choosing LGPL 3.0, please use the following license boilerplate in all `.hpp` and
|
||||
Contributions to the library must be licensed under the LGPL v3 or compatible license. If
|
||||
you are choosing LGPL v3, please use the following license boilerplate in all `.hpp` and
|
||||
`.cpp` files:
|
||||
|
||||
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/**
|
||||
* Copyright (c) [Year(s)] [Copyright Holder].
|
||||
/*
|
||||
* Copyright (c) [Year(s)] [Copyright Holder(s)].
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -41,4 +43,60 @@ you are choosing LGPL 3.0, please use the following license boilerplate in all `
|
||||
*/
|
||||
|
||||
If you are affiliated to an NSF-supported NDN project institution, please use the [NDN Team License
|
||||
Boilerplate](http://redmine.named-data.net/projects/ndn-cxx/wiki/NDN_Team_License_Boilerplate_(ndn-cxx)).
|
||||
Boilerplate](https://redmine.named-data.net/projects/ndn-cxx/wiki/NDN_Team_License_Boilerplate_(ndn-cxx)).
|
||||
|
||||
Running unit tests
|
||||
------------------
|
||||
|
||||
To run the unit tests, ndn-cxx needs to be built with unit test support and installed
|
||||
into the configured location. For example:
|
||||
|
||||
./waf configure --with-tests # --debug is also strongly recommended while developing
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
**Note**: On Linux you also need to run `sudo ldconfig` to reconfigure dynamic loader
|
||||
run-time bindings.
|
||||
|
||||
The simplest way to run the tests is to launch the compiled binary without any parameters:
|
||||
|
||||
./build/unit-tests
|
||||
|
||||
The [Boost.Test framework](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html)
|
||||
is very flexible and allows a number of run-time customization of what tests should be run.
|
||||
For example, it is possible to choose to run only a specific test suite, only a specific
|
||||
test case within a suite, or specific test cases within specific test suites:
|
||||
|
||||
# Run only Face test suite tests (tests/unit/face.t.cpp)
|
||||
./build/unit-tests -t TestFace
|
||||
|
||||
# Run only test case ExpressInterestData from the same test suite
|
||||
./build/unit-tests -t TestFace/ExpressInterestData
|
||||
|
||||
# Run Basic test case from all test suites
|
||||
./build/unit-tests -t */Basic
|
||||
|
||||
By default, Boost.Test framework will produce verbose output only when a test case fails.
|
||||
If it is desired to see verbose output (result of each test assertion), add `-l all`
|
||||
option to `./build/unit-tests` command. To see test progress, you can use `-l test_suite`,
|
||||
or `-p` to show a progress bar:
|
||||
|
||||
# Show report all log messages including the passed test notification
|
||||
./build/unit-tests -l all
|
||||
|
||||
# Show test suite messages
|
||||
./build/unit-tests -l test_suite
|
||||
|
||||
# Show nothing
|
||||
./build/unit-tests -l nothing
|
||||
|
||||
# Show progress bar
|
||||
./build/unit-tests -p
|
||||
|
||||
There are many more command line options available, information about which can be obtained
|
||||
either from the command line using the `--help` switch, or online on the
|
||||
[Boost.Test website](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html).
|
||||
|
||||
**Warning:** If you have customized parameters for NDN platform using `client.conf` in
|
||||
`/etc/ndn` or `/usr/local/etc/ndn` (or other `@SYSCONFDIR@/etc` if it was configured to custom
|
||||
path during `./waf configure`), Face-related test cases may fail.
|
||||
@@ -1,30 +1,42 @@
|
||||
ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
=====================================================
|
||||
# ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications. The library is currently being used as part
|
||||
of the following projects:
|
||||

|
||||
[](https://travis-ci.org/named-data/ndn-cxx)
|
||||

|
||||
|
||||
**ndn-cxx** is a C++14 library implementing Named Data Networking (NDN) primitives
|
||||
that can be used to write various NDN applications. The library is currently being
|
||||
used by the following projects:
|
||||
|
||||
* [NFD - NDN Forwarding Daemon](https://github.com/named-data/NFD)
|
||||
* [NLSR - Named-data Link-State Routing protocol](https://github.com/named-data/NLSR)
|
||||
* [repo-ng - Next generation of NDN repository](https://github.com/named-data/repo-ng)
|
||||
* [ChronoChat - Multi-user NDN chat application](https://github.com/named-data/ChronoChat)
|
||||
* [ChronoSync - Sync library for multiuser realtime applications for NDN](https://github.com/named-data/ChronoSync)
|
||||
* [ndn-tlv-ping - Ping Application For NDN](https://github.com/named-data/ndn-tlv-ping)
|
||||
* [ndn-traffic-generator - Traffic Generator For NDN](https://github.com/named-data/ndn-traffic-generator)
|
||||
* [ndn-tools - Essential NDN command-line tools](https://github.com/named-data/ndn-tools)
|
||||
* [repo-ng - Next generation NDN repository](https://github.com/named-data/repo-ng)
|
||||
* [ChronoSync - Sync library for multi-user real-time applications](https://github.com/named-data/ChronoSync)
|
||||
* [PSync - Partial and full synchronization library](https://github.com/named-data/PSync)
|
||||
* [ndn-traffic-generator - Traffic generator for NDN](https://github.com/named-data/ndn-traffic-generator)
|
||||
* [NAC - Name-based Access Control](https://github.com/named-data/name-based-access-control)
|
||||
* [NDNS - Domain Name Service for NDN](https://github.com/named-data/ndns)
|
||||
|
||||
See the file [`docs/INSTALL.rst`](https://github.com/cawka/ndn-cxx/blob/master/docs/INSTALL.rst)
|
||||
for build and install instructions.
|
||||
## Documentation
|
||||
|
||||
Please submit any bugs or issues to the ndn-cxx issue tracker:
|
||||
http://redmine.named-data.net/projects/ndn-cxx/issues
|
||||
See [`docs/INSTALL.rst`](docs/INSTALL.rst) for compilation and installation instructions.
|
||||
|
||||
## More documentation
|
||||
Extensive documentation is available on the library's [homepage](https://named-data.net/doc/ndn-cxx/).
|
||||
|
||||
Extensive documentation of the library is available on the library's homepage:
|
||||
http://www.named-data.net/doc/ndn-cxx/
|
||||
## Reporting bugs
|
||||
|
||||
Please submit any bugs or feature requests to the
|
||||
[ndn-cxx issue tracker](https://redmine.named-data.net/projects/ndn-cxx/issues).
|
||||
|
||||
## Contributing
|
||||
|
||||
We greatly appreciate contributions to the ndn-cxx code base.
|
||||
If you are new to the NDN software community, please read the
|
||||
[Contributor's Guide](https://github.com/named-data/.github/blob/master/CONTRIBUTING.md)
|
||||
to get started.
|
||||
|
||||
## License
|
||||
|
||||
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
|
||||
the license, refer to [`COPYING.md`](https://github.com/named-data/ndn-cxx/blob/master/COPYING.md).
|
||||
ndn-cxx is an open source project licensed under the LGPL version 3.
|
||||
See [`COPYING.md`](COPYING.md) for more information.
|
||||
+1
-1
@@ -1 +1 @@
|
||||
docs/release-notes/release-notes-0.4.0.rst
|
||||
docs/release-notes-latest.rst
|
||||
+14
-12
@@ -1,25 +1,27 @@
|
||||
; "transport" specifies Face's default transport connection.
|
||||
; The value is a unix or tcp4 scheme Face URI.
|
||||
; The value can be a "unix:" or "tcp4:" Face URI.
|
||||
;
|
||||
; For example:
|
||||
;
|
||||
; unix:///var/run/nfd.sock
|
||||
; tcp://192.0.2.1
|
||||
; tcp4://example.com:6363
|
||||
|
||||
transport=unix:///var/run/nfd.sock
|
||||
;
|
||||
; The default value of this field is platform-dependent, being unix:///run/nfd.sock on Linux and
|
||||
; unix:///var/run/nfd.sock on other platforms.
|
||||
;
|
||||
;transport=unix:///var/run/nfd.sock
|
||||
|
||||
; "pib" determines which Public Info Base (PIB) should used by default in applications.
|
||||
; If "pib" is not specified, the default PIB will be used.
|
||||
; Note that default PIB could be different on different system.
|
||||
; If "pib" is not specified, a platform-dependent default will be used.
|
||||
; If "pib" is specified, it may have a value of:
|
||||
; pib-sqlite3
|
||||
; pib=pib-sqlite3
|
||||
;
|
||||
;pib=pib-sqlite3
|
||||
|
||||
; "tpm" determines which Trusted Platform Module (TPM) should used by default in applications.
|
||||
; If "tpm" is not specified, the default TPM will be used.
|
||||
; Note that default TPM could be different on different system.
|
||||
; If "tpm" is not specified, a platform-dependent default will be used.
|
||||
; If "tpm" is specified, it may have a value of:
|
||||
; tpm-osxkeychain (default in OS X)
|
||||
; tpm-file (default in operating systems other than OS X)
|
||||
; tpm=tpm-file
|
||||
; tpm-osxkeychain (default on macOS)
|
||||
; tpm-file (default in operating systems other than macOS)
|
||||
;
|
||||
;tpm=tpm-file
|
||||
+172
-201
@@ -1,226 +1,215 @@
|
||||
.. _Getting Started with ndn-cxx:
|
||||
|
||||
Getting started with ndn-cxx
|
||||
============================
|
||||
|
||||
Supported platforms
|
||||
-------------------
|
||||
|
||||
ndn-cxx uses continuous integration and has been tested on the following
|
||||
platforms:
|
||||
ndn-cxx is built against a continuous integration system and has been tested on the
|
||||
following platforms:
|
||||
|
||||
- Ubuntu 12.04 (64-bit and 32-bit)
|
||||
- Ubuntu 14.04 (64-bit and 32-bit)
|
||||
- Ubuntu 14.10 (64-bit and 32-bit)
|
||||
- OS X 10.8
|
||||
- OS X 10.9
|
||||
- OS X 10.10
|
||||
- Ubuntu 18.04 (amd64, armhf, i386)
|
||||
- Ubuntu 20.04 (amd64)
|
||||
- macOS 10.13
|
||||
- macOS 10.14
|
||||
- macOS 10.15
|
||||
- CentOS 8
|
||||
|
||||
ndn-cxx is known to work on the following platforms, although they are not officially
|
||||
supported:
|
||||
|
||||
- Fedora >= 20
|
||||
- CentOS >= 6.2
|
||||
- Debian 10 (Buster)
|
||||
- Fedora >= 29
|
||||
- Gentoo Linux
|
||||
- FreeBSD >= 10.0
|
||||
- Raspbian >= 3.12
|
||||
- Raspbian >= 2019-06-20 (Buster)
|
||||
- FreeBSD >= 11.3
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
|
||||
Required:
|
||||
~~~~~~~~~
|
||||
Required
|
||||
~~~~~~~~
|
||||
|
||||
- ``python`` >= 2.6
|
||||
- ``libsqlite3``
|
||||
- ``libcrypto++``
|
||||
- ``pkg-config``
|
||||
- Boost libraries >= 1.48
|
||||
- OSX Security framework (on OSX platform only)
|
||||
- GCC >= 7.4 or clang >= 4.0 (on Linux and FreeBSD)
|
||||
- Xcode >= 9.0 (on macOS)
|
||||
- Python >= 3.6
|
||||
- pkg-config
|
||||
- Boost >= 1.65.1
|
||||
- OpenSSL >= 1.0.2
|
||||
- SQLite 3.x
|
||||
|
||||
Following are the detailed steps for each platform to install the compiler, all necessary
|
||||
development tools and libraries, and ndn-cxx prerequisites.
|
||||
To build ndn-cxx from source, one must first install a C++ compiler and all necessary
|
||||
development tools and libraries:
|
||||
|
||||
- OS X
|
||||
- On **Ubuntu**
|
||||
|
||||
Install Xcode. In Xcode Preferences > Downloads, install "Command
|
||||
Line Tools".
|
||||
In a terminal, enter::
|
||||
|
||||
If using MacPorts, dependencies can be installed using the following
|
||||
commands::
|
||||
sudo apt install g++ pkg-config python3-minimal libboost-all-dev libssl-dev libsqlite3-dev
|
||||
|
||||
sudo port install pkgconfig boost sqlite3 libcryptopp
|
||||
- On **CentOS** and **Fedora**
|
||||
|
||||
.. note::
|
||||
In a terminal, enter::
|
||||
|
||||
If a major OS X system upgrade is performed after installing dependencies with MacPorts,
|
||||
remember to `reinstall all ports <https://trac.macports.org/wiki/Migration>`__.
|
||||
sudo dnf install gcc-c++ pkgconf-pkg-config python3 boost-devel openssl-devel sqlite-devel
|
||||
|
||||
- Ubuntu
|
||||
- On **macOS**
|
||||
|
||||
In a terminal, enter::
|
||||
* Install either Xcode (from the App Store) or the Command Line Tools
|
||||
(with ``xcode-select --install``)
|
||||
|
||||
sudo apt-get install build-essential
|
||||
sudo apt-get install libsqlite3-dev libcrypto++-dev
|
||||
* If using Homebrew (recommended), enter the following in a terminal::
|
||||
|
||||
# For Ubuntu 12.04
|
||||
sudo apt-get install libboost1.48-all-dev
|
||||
brew install boost openssl pkg-config
|
||||
|
||||
# For all other Ubuntu versions
|
||||
sudo apt-get install libboost-all-dev
|
||||
.. warning::
|
||||
|
||||
- Fedora
|
||||
If a major OS upgrade is performed after installing the dependencies
|
||||
with Homebrew, remember to reinstall all packages.
|
||||
|
||||
In a terminal, enter::
|
||||
- On **FreeBSD**
|
||||
|
||||
sudo yum install gcc-g++ git
|
||||
sudo yum install sqlite-devel cryptopp-devel boost-devel
|
||||
In a terminal, enter::
|
||||
|
||||
Optional:
|
||||
~~~~~~~~~
|
||||
sudo pkg install pkgconf python3 boost-libs openssl sqlite3
|
||||
|
||||
To build tutorials, manpages, and API documentation the following
|
||||
dependencies need to be installed:
|
||||
Optional
|
||||
~~~~~~~~
|
||||
|
||||
- ``doxygen``
|
||||
- ``graphviz``
|
||||
- ``python-sphinx`` and sphinx extensions ``sphinxcontrib-doxylink``,
|
||||
``sphinxcontrib-googleanalytics``
|
||||
To build tutorials, manpages, and API documentation the following additional dependencies
|
||||
need to be installed:
|
||||
|
||||
The following lists steps for common platforms to install these prerequisites:
|
||||
- doxygen
|
||||
- graphviz
|
||||
- sphinx >= 1.3
|
||||
- sphinxcontrib-doxylink
|
||||
|
||||
- On OS X with MacPorts::
|
||||
The following lists the steps to install these prerequisites on various common platforms.
|
||||
|
||||
sudo port install doxygen graphviz py27-sphinx sphinx_select
|
||||
sudo port select sphinx py27-sphinx
|
||||
- On **Ubuntu**:
|
||||
|
||||
# Install sphinx extensions
|
||||
sudo port install py27-pip
|
||||
sudo port select pip pip27
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
.. code-block:: sh
|
||||
|
||||
- On Ubuntu::
|
||||
sudo apt install doxygen graphviz python3-pip
|
||||
sudo pip3 install sphinx sphinxcontrib-doxylink
|
||||
|
||||
sudo apt-get install doxygen graphviz python-sphinx python-pip
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
- On **CentOS** and **Fedora**:
|
||||
|
||||
- On Fedora::
|
||||
.. code-block:: sh
|
||||
|
||||
sudo yum install doxygen graphviz python-sphinx
|
||||
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
|
||||
sudo dnf config-manager --enable PowerTools # on CentOS only
|
||||
sudo dnf install doxygen graphviz python3-pip
|
||||
pip3 install --user sphinx sphinxcontrib-doxylink
|
||||
|
||||
.. _build:
|
||||
- On **macOS**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
brew install doxygen graphviz
|
||||
sudo pip install sphinx sphinxcontrib-doxylink
|
||||
|
||||
- On **FreeBSD**:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
sudo pkg install doxygen graphviz py37-sphinx
|
||||
|
||||
Build
|
||||
-----
|
||||
|
||||
(These are instructions to build ndn-cxx. To do development of ndn-cxx
|
||||
code and update the build system, see Development.)
|
||||
.. note::
|
||||
These are instructions for regular builds of ndn-cxx (release mode). If you are
|
||||
planning to develop the ndn-cxx code itself, you should do a :ref:`Development build`.
|
||||
|
||||
To build in a terminal, change directory to the ndn-cxx root. Enter:
|
||||
To build in a terminal, change directory to the ndn-cxx root, then enter:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure
|
||||
./waf configure # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
By default, only the shared version of ndn-cxx library is built. To build the static library,
|
||||
use ``--enable-static`` option for ``./waf configure`` command. For example::
|
||||
By default, only the shared variant of the ndn-cxx library will be built. To build the
|
||||
static library, pass ``--enable-static`` to the ``./waf configure`` command:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --enable-static
|
||||
|
||||
To disable build of the shared library and build only the static library, use additional
|
||||
``--disable-shared`` option. Note that at least one version of the library needs to be
|
||||
enabled.
|
||||
To disable the build of the shared library and build only the static library, use the
|
||||
additional ``--disable-shared`` option. Note that at least one variant of the library
|
||||
needs to be enabled.
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --enable-static --disable-shared
|
||||
|
||||
On Linux, it is necessary to run the following command after the shared library has
|
||||
been installed:
|
||||
|
||||
After the shared library is built and installed, some systems require additional actions.
|
||||
.. code-block:: sh
|
||||
|
||||
- on Linux::
|
||||
sudo ldconfig
|
||||
|
||||
sudo ldconfig
|
||||
.. note::
|
||||
When the library is installed in a non-standard path (in general: not in ``/usr/lib``
|
||||
or ``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
|
||||
additional actions may be necessary.
|
||||
|
||||
- on FreeBSD::
|
||||
The installation path should be added to ``/etc/ld.so.conf`` (or in
|
||||
``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example:
|
||||
|
||||
sudo ldconfig -m
|
||||
.. code-block:: sh
|
||||
|
||||
.. note::
|
||||
When library is installed in a non-standard path (in general: not in ``/usr/lib`` or
|
||||
``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
|
||||
additional actions may be necessary.
|
||||
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
|
||||
|
||||
The installation path should be added to ``/etc/ld.so.conf`` (or in
|
||||
``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example::
|
||||
Alternatively, the ``LD_LIBRARY_PATH`` environment variable can be set to point to
|
||||
the installation directory of the shared library:
|
||||
|
||||
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
|
||||
.. code-block:: sh
|
||||
|
||||
Alternatively, ``LD_LIBRARY_PATH`` environment variable should be set to the location of
|
||||
the library::
|
||||
export LD_LIBRARY_PATH=/usr/local/lib
|
||||
|
||||
export LD_LIBRARY_PATH=/usr/local/lib
|
||||
The ``./waf install`` command installs the following files:
|
||||
|
||||
This builds and installs the following items:
|
||||
|
||||
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled)
|
||||
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled).
|
||||
- ``<LIBPATH>/libndn-cxx.so``, ``<LIBPATH>/libndn-cxx.so.<VERSION>`` (on Linux),
|
||||
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on OS X):
|
||||
shared NDN C++ library (if enabled)
|
||||
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all
|
||||
neccessary flags to build against the library. For example, if
|
||||
pkgconfig or pkgconf package is installed and ``PKG_CONFIG_PATH`` is
|
||||
configured properly (or ``<LIBPATH>/pkgconfig`` is a default path),
|
||||
``pkgconfig --libs --clflags libndn-cxx`` will return all necessary
|
||||
compile and link flags for the library.
|
||||
- ``<BINPATH>/tlvdump``: a simple tool to dump contents of
|
||||
TLV-formatted data
|
||||
- ``<BINPATH>/ndncatchunks3``: a simplified equivalent to ndncatchunks2
|
||||
in NDNx package
|
||||
- ``<BINPATH>/ndnputchunks3``: a simplified equivalent to ndnputchunks2
|
||||
in NDNx package
|
||||
- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates
|
||||
- ``<BINPATH>/ndnsec-*``: convenience scripts for ``ndnsec`` tools
|
||||
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on macOS):
|
||||
shared NDN C++ library (if enabled).
|
||||
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all necessary flags to
|
||||
build against the library. For example, if the ``pkg-config`` or ``pkgconf-pkg-config``
|
||||
package is installed and ``PKG_CONFIG_PATH`` is configured properly (or if
|
||||
``<LIBPATH>/pkgconfig`` is a default search path), the command ``pkg-config --cflags
|
||||
--libs libndn-cxx`` will return all necessary compile and link flags for the library.
|
||||
- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates.
|
||||
- ``<BINPATH>/ndnsec-*``: convenience aliases for ``ndnsec`` tools.
|
||||
|
||||
If configured with tests: ``./waf configure --with-tests``), the above
|
||||
commands will also produce:
|
||||
If configured with tests (``./waf configure --with-tests``), the above commands
|
||||
will also produce:
|
||||
|
||||
- ``build/unit-tests``: A unit test binary for the library
|
||||
- ``build/unit-tests``: a unit test binary for the library.
|
||||
|
||||
1.5GB available memory per CPU core is necessary for efficient compilation.
|
||||
On a multi-core machine with less than 1.5GB available memory per CPU core,
|
||||
limit the objects being compiled in parallel with ``./waf -jN`` where N is the amount
|
||||
of available memory divided by 1.5GB (eg. ``./waf -j1`` for 1.5GB memory),
|
||||
which could usually avoid memory thrashing and result in faster compilation.
|
||||
1.5 GB available memory per CPU core is necessary for efficient compilation. On a
|
||||
multi-core machine with less than 1.5 GB available memory per CPU core, limit the
|
||||
objects being compiled in parallel with ``./waf -jN``, where N is the amount of
|
||||
available memory divided by 1.5 GB (e.g., ``./waf -j2`` for 3 GB of memory). This
|
||||
should avoid memory thrashing and result in faster compilation.
|
||||
|
||||
Build with examples
|
||||
-------------------
|
||||
|
||||
By default, examples in ``examples/`` are not build. To enable them, use
|
||||
``--with-examples`` configure option:
|
||||
By default, the examples in the ``examples/`` directory will not be built. To enable
|
||||
them, pass ``--with-examples`` during the configuration step:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --with-examples
|
||||
./waf configure --with-examples # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
sudo ldconfig # on Linux only
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
To run the examples:
|
||||
|
||||
- on Linux::
|
||||
|
||||
sudo ldconfig
|
||||
|
||||
- on FreeBSD::
|
||||
|
||||
sudo ldconfig -m
|
||||
|
||||
To run examples:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
# trivial producer app
|
||||
./build/examples/producer
|
||||
@@ -231,107 +220,89 @@ To run examples:
|
||||
# trivial consumer app with timers
|
||||
./build/examples/consumer-with-timer
|
||||
|
||||
If you want to test out a sample application, just create a ``.cpp`` file in ``examples/``
|
||||
folder and it will be compiled on the next run on ``./waf``. For example:
|
||||
If you want to make a new sample application, just create a ``.cpp`` file inside the
|
||||
``examples/`` directory and it will be compiled during the next run of ``./waf``:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
cp examples/consumer.cpp examples/my-new-consumer-app.cpp
|
||||
cp examples/consumer.cpp examples/my-new-app.cpp
|
||||
... # edit examples/my-new-app.cpp with your preferred editor
|
||||
./waf
|
||||
sudo ./waf install
|
||||
./build/examples/my-new-consumer-app
|
||||
|
||||
sudo ldconfig # on Linux only
|
||||
./build/examples/my-new-app
|
||||
|
||||
Debug symbols
|
||||
~~~~~~~~~~~~~
|
||||
-------------
|
||||
|
||||
The default compiler flags enable debug symbols to be included in binaries (i.e., ``-g``
|
||||
flag for ``./waf configure`` and ``-g3`` for ``./waf configure --debug``). This
|
||||
potentially allows more meaningful debugging information if your application crashes.
|
||||
The default compiler flags include debug symbols in binaries. This should provide
|
||||
more meaningful debugging information if ndn-cxx or your application crashes.
|
||||
|
||||
If it is undesirable, default flags can be easily overridden:
|
||||
If this is not desired, the default flags can be overridden to disable debug symbols.
|
||||
The following example shows how to completely disable debug symbols and configure
|
||||
ndn-cxx to be installed into ``/usr`` with configuration in the ``/etc`` directory.
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
CXXFLAGS="-O2" ./waf configure --prefix=/usr --sysconfdir=/etc
|
||||
./waf
|
||||
sudo ./waf install
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
Customizing the compiler
|
||||
------------------------
|
||||
|
||||
- on Linux::
|
||||
To build ndn-cxx with a different compiler (rather than the platform default), set the
|
||||
``CXX`` environment variable to point to the compiler binary. For example, to build
|
||||
with clang on Linux, use the following:
|
||||
|
||||
sudo ldconfig
|
||||
.. code-block:: sh
|
||||
|
||||
- on FreeBSD::
|
||||
CXX=clang++ ./waf configure
|
||||
|
||||
sudo ldconfig -m
|
||||
Building the documentation
|
||||
--------------------------
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
Tutorials and API documentation can be built using the following commands:
|
||||
|
||||
ndn-cxx tutorials and API documentation can be built using the following
|
||||
commands:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
# Full set of documentation (tutorials + API) in build/docs
|
||||
./waf docs
|
||||
|
||||
# Only tutorials in `build/docs`
|
||||
# Only tutorials in build/docs
|
||||
./waf sphinx
|
||||
|
||||
# Only API docs in `build/docs/doxygen`
|
||||
./waf doxgyen
|
||||
# Only API docs in build/docs/doxygen
|
||||
./waf doxygen
|
||||
|
||||
Manpages are automatically created and installed during the normal build
|
||||
process (e.g., during ``./waf`` and ``./waf install``), if
|
||||
``python-sphinx`` module is detected during ``./waf configure`` stage.
|
||||
By default, manpages are installed into ``${PREFIX}/share/man`` (where
|
||||
default value for ``PREFIX`` is ``/usr/local``). This location can be
|
||||
changed during ``./waf configure`` stage using ``--prefix``,
|
||||
``--datarootdir``, or ``--mandir`` options.
|
||||
If ``sphinx-build`` is detected during ``./waf configure``, manpages will automatically
|
||||
be built and installed during the normal build process (i.e., during ``./waf`` and
|
||||
``./waf install``). By default, manpages will be installed into ``${PREFIX}/share/man``
|
||||
(the default value for ``PREFIX`` is ``/usr/local``). This location can be changed
|
||||
during the ``./waf configure`` stage using the ``--prefix``, ``--datarootdir``, or
|
||||
``--mandir`` options.
|
||||
|
||||
For more details, refer to ``./waf --help``.
|
||||
For further details, please refer to ``./waf --help``.
|
||||
|
||||
Development Build
|
||||
.. _Development build:
|
||||
|
||||
Development build
|
||||
-----------------
|
||||
|
||||
The following is the suggested configure commands for development build.
|
||||
The following is the suggested build procedure for development builds:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
./waf configure --debug --with-tests
|
||||
./waf configure --debug --with-tests # on CentOS, add --without-pch
|
||||
./waf
|
||||
sudo ./waf install
|
||||
sudo ldconfig # on Linux only
|
||||
|
||||
:ref:`Additional step <build>`:
|
||||
In a development build, most compiler optimizations will be disabled and all warnings
|
||||
will be treated as errors. This default behavior can be overridden by setting the
|
||||
``CXXFLAGS`` environment variable before running ``./waf configure``, for example:
|
||||
|
||||
- on Linux::
|
||||
|
||||
sudo ldconfig
|
||||
|
||||
- on FreeBSD::
|
||||
|
||||
sudo ldconfig -m
|
||||
|
||||
In the development build all compiler optimizations are disabled by
|
||||
default and all warnings are treated as error. The default behavior can
|
||||
be overridden by setting ``CXXFLAGS`` environment variable before
|
||||
running ``./waf configure``:
|
||||
|
||||
::
|
||||
.. code-block:: sh
|
||||
|
||||
CXXFLAGS="-O1 -g3" ./waf configure --debug --with-tests
|
||||
...
|
||||
|
||||
Customize Compiler
|
||||
------------------
|
||||
|
||||
To customize compiler, set ``CXX`` environment variable to point to compiler binary and, in
|
||||
some case, specify type of the compiler using ``--check-cxx-compiler``. For example, when
|
||||
using clang compiler on Linux system, use the following:
|
||||
|
||||
::
|
||||
|
||||
CXX=clang++ ./waf configure --check-cxx-compiler=clang++
|
||||
@@ -1,23 +0,0 @@
|
||||
ndn-cxx overview
|
||||
================
|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications. The library is currently being used as part of
|
||||
the following projects:
|
||||
|
||||
- `NFD - NDN Forwarding Daemon <http://named-data.net/doc/NFD>`__
|
||||
- `NLSR - Named-data Link-State Routing
|
||||
protocol <https://github.com/named-data/NLSR>`__
|
||||
- `repo-ng - Next generation of NDN
|
||||
repository <https://github.com/named-data/repo-ng>`__
|
||||
- `ChronoChat - Multi-user NDN chat
|
||||
application <https://github.com/named-data/ChronoChat>`__
|
||||
- `ChronoSync - Sync library for multiuser realtime applications for
|
||||
NDN <https://github.com/named-data/ChronoSync>`__
|
||||
- `ndn-tlv-ping - Ping Application For
|
||||
NDN <https://github.com/named-data/ndn-tlv-ping>`__
|
||||
- `ndn-traffic-generator - Traffic Generator For
|
||||
NDN <https://github.com/named-data/ndn-traffic-generator>`__
|
||||
|
||||
Please submit any bugs or issues to the `ndn-cxx issue tracker
|
||||
<http://redmine.named-data.net/projects/ndn-cxx/issues>`__.
|
||||
@@ -1,4 +1,4 @@
|
||||
Release Notes
|
||||
+++++++++++++
|
||||
|
||||
.. include:: release-notes/release-notes-0.4.0.rst
|
||||
.. include:: release-notes-latest.rst
|
||||
+101
-158
@@ -7,7 +7,7 @@ Based on
|
||||
The original document is available at `<http://geosoft.no/development/cppstyle.html>`_
|
||||
|
||||
* NDN Platform "C++, C, C#, Java and JavaScript Code Guidelines".
|
||||
The original document available at `<http://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`_
|
||||
The original document available at `<https://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`_
|
||||
|
||||
1. Code layout
|
||||
--------------
|
||||
@@ -52,7 +52,7 @@ extended it to C++.
|
||||
|
||||
} // namespace example
|
||||
|
||||
Note that code inside namespace is **not** indented. Avoid following:
|
||||
Note that code inside namespace is **not** indented. Avoid the following:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -65,7 +65,7 @@ extended it to C++.
|
||||
//
|
||||
// } // namespace example
|
||||
|
||||
1.4. The class declarations should have the following form:
|
||||
1.4. Class declarations should have the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -73,21 +73,25 @@ extended it to C++.
|
||||
{
|
||||
public:
|
||||
... <public methods> ...
|
||||
|
||||
protected:
|
||||
... <protected methods> ...
|
||||
|
||||
private:
|
||||
... <private methods> ...
|
||||
|
||||
public:
|
||||
... <public data> ...
|
||||
|
||||
protected:
|
||||
... <protected data> ...
|
||||
|
||||
private:
|
||||
... <private data> ...
|
||||
};
|
||||
|
||||
``public``, ``protected``, ``private`` may be repeated several times without
|
||||
interleaving (e.g., public, public, public, private, private) if this allows better
|
||||
interleaving (e.g., public, public, public, private, private) if this improves
|
||||
readability of the code.
|
||||
|
||||
Nested classes can be defined in appropriate visibility section, either in methods
|
||||
@@ -135,23 +139,6 @@ extended it to C++.
|
||||
statements;
|
||||
}
|
||||
|
||||
or (less preferred):
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
if (condition)
|
||||
{
|
||||
statements;
|
||||
}
|
||||
else if (condition)
|
||||
{
|
||||
statements;
|
||||
}
|
||||
else
|
||||
{
|
||||
statements;
|
||||
}
|
||||
|
||||
1.7. A ``for`` statement should have the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -160,23 +147,14 @@ extended it to C++.
|
||||
statements;
|
||||
}
|
||||
|
||||
or (less preferred):
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
for (initialization; condition; update)
|
||||
{
|
||||
statements;
|
||||
}
|
||||
|
||||
An empty for statement should have the following form:
|
||||
An empty ``for`` statement should have the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
for (initialization; condition; update)
|
||||
;
|
||||
|
||||
This emphasizes the fact that the for statement is empty and it makes it obvious for
|
||||
This emphasizes the fact that the ``for`` statement is empty and makes it obvious for
|
||||
the reader that this is intentional. Empty loops should be avoided however.
|
||||
|
||||
1.8. A ``while`` statement should have the following form:
|
||||
@@ -187,15 +165,6 @@ extended it to C++.
|
||||
statements;
|
||||
}
|
||||
|
||||
or (less preferred):
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
while (condition)
|
||||
{
|
||||
statements;
|
||||
}
|
||||
|
||||
1.9. A ``do-while`` statement should have the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -211,7 +180,7 @@ extended it to C++.
|
||||
switch (condition) {
|
||||
case ABC: // 2 space indent
|
||||
statements; // 4 space indent
|
||||
// Fallthrough
|
||||
NDN_CXX_FALLTHROUGH;
|
||||
|
||||
case DEF:
|
||||
statements;
|
||||
@@ -242,7 +211,7 @@ extended it to C++.
|
||||
// Correct style
|
||||
case A1: {
|
||||
statements;
|
||||
// Fallthrough
|
||||
NDN_CXX_FALLTHROUGH;
|
||||
}
|
||||
|
||||
// Incorrect style: braces should cover the entire case block
|
||||
@@ -263,7 +232,7 @@ extended it to C++.
|
||||
switch (condition) {
|
||||
case ABC: // no indent
|
||||
statements; // 2 space indent
|
||||
// Fallthrough
|
||||
NDN_CXX_FALLTHROUGH;
|
||||
|
||||
case DEF:
|
||||
statements;
|
||||
@@ -274,9 +243,11 @@ extended it to C++.
|
||||
break;
|
||||
}
|
||||
|
||||
The explicit ``Fallthrough`` comment should be included whenever there is a case
|
||||
statement without a break statement. Leaving the break out is a common error, and it
|
||||
must be made clear that it is intentional when it is not there.
|
||||
The ``NDN_CXX_FALLTHROUGH;`` annotation must be included whenever there is
|
||||
a case without a break statement. Leaving the break out is a common error,
|
||||
and it must be made clear that it is intentional when it is not there.
|
||||
Moreover, modern compilers will warn when a case that falls through is not
|
||||
explicitly annotated.
|
||||
|
||||
1.11. A ``try-catch`` statement should have the following form:
|
||||
|
||||
@@ -289,19 +260,6 @@ extended it to C++.
|
||||
statements;
|
||||
}
|
||||
|
||||
or (less preferred):
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
try
|
||||
{
|
||||
statements;
|
||||
}
|
||||
catch (const Exception& exception)
|
||||
{
|
||||
statements;
|
||||
}
|
||||
|
||||
1.12. The incompleteness of split lines must be made obvious.
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -315,9 +273,9 @@ extended it to C++.
|
||||
...
|
||||
}
|
||||
|
||||
Split lines occurs when a statement exceed the 80 column limit given above. It is
|
||||
Split lines occur when a statement exceeds the column limit given in rule 1.1. It is
|
||||
difficult to give rigid rules for how lines should be split, but the examples above should
|
||||
give a general hint.In general:
|
||||
give a general hint. In general:
|
||||
|
||||
* Break after a comma.
|
||||
* Break after an operator.
|
||||
@@ -325,7 +283,7 @@ extended it to C++.
|
||||
|
||||
Exceptions:
|
||||
|
||||
* The following is the standard practice with operator<<:
|
||||
* The following is standard practice with ``operator<<``:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -371,7 +329,7 @@ should take the following form:
|
||||
statements;
|
||||
}
|
||||
|
||||
If the function has no parameters, ``()`` should be omitted.
|
||||
If the lambda has no parameters, ``()`` should be omitted.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -379,8 +337,8 @@ should take the following form:
|
||||
statements;
|
||||
}
|
||||
|
||||
Capture-all (``[&]`` and ``[=]``) is permitted, but its usage should be minimized.
|
||||
Only use capture-all when it significantly simplifies code and improves readability.
|
||||
Either capture-default (``[&]`` or ``[=]``) is permitted, but its usage should be minimized.
|
||||
Only use a capture-default when it significantly simplifies code and improves readability.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -392,9 +350,9 @@ should take the following form:
|
||||
statements;
|
||||
}
|
||||
|
||||
Trailing return type should be omitted. Write them only when compiler cannot deduce
|
||||
return type automatically, or when it improves readability.
|
||||
``()`` is required by C++ standard when trailing return type is written.
|
||||
Trailing return type should be omitted whenever possible. Add it only when the compiler
|
||||
cannot deduce the return type automatically, or when it improves readability.
|
||||
``()`` is required by the C++ standard when ``mutable`` or a trailing return type is used.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -440,7 +398,7 @@ should take the following form:
|
||||
class Class
|
||||
{
|
||||
private:
|
||||
T m_member = {arg1, arg2}; // not supported by GCC 4.6
|
||||
T m_member = {arg1, arg2};
|
||||
static T s_member = {arg1, arg2};
|
||||
};
|
||||
|
||||
@@ -474,7 +432,6 @@ extension ``.cpp``
|
||||
|
||||
my-class.hpp, my-class.cpp
|
||||
|
||||
|
||||
2.2. Names representing types must be written in English in mixed case starting with upper case.
|
||||
|
||||
.. code-block:: c++
|
||||
@@ -502,11 +459,11 @@ to separate words.
|
||||
static const double PI = 3.14;
|
||||
|
||||
In some cases, it is a better (or is the only way for complex constants in header-only
|
||||
classes) to implement the value as a method:
|
||||
classes) to implement the value as a method.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
int
|
||||
static int // declare constexpr if possible
|
||||
getMaxIterations()
|
||||
{
|
||||
return 25;
|
||||
@@ -541,19 +498,19 @@ written in mixed case starting with lower case.
|
||||
} // namespace analyzer
|
||||
} // namespace model
|
||||
|
||||
2.7. Names representing generic template types should be a single uppercase letter
|
||||
2.7. Names representing generic template types should be a single uppercase letter.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
template<class T> ...
|
||||
template<class C, class D> ...
|
||||
|
||||
However, when template parameter represents a certain concept and expected to have a
|
||||
certain interface, the name should be explicitly spelled out:
|
||||
However, when a template parameter represents a certain concept and is expected
|
||||
to have a certain interface, the name should be explicitly spelled out.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
template<class FaceBase> ...
|
||||
template<class InputIterator> ...
|
||||
template<class Packet> ...
|
||||
|
||||
2.8. Abbreviations and acronyms must not be uppercase when used as name.
|
||||
@@ -586,7 +543,6 @@ written in mixed case starting with lower case.
|
||||
static std::string s_name;
|
||||
};
|
||||
|
||||
|
||||
2.11. Variables with a large scope should have long (explicit) names, variables with a small
|
||||
scope can have short names.
|
||||
|
||||
@@ -654,16 +610,11 @@ scope can have short names.
|
||||
The notation is taken from mathematics where it is an established convention for
|
||||
indicating a number of objects.
|
||||
|
||||
|
||||
2.18. The suffix ``No`` should be used for variables representing an entity number.
|
||||
2.18. The suffix ``Num`` or ``No`` should be used for variables representing an entity number.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
tableNo, employeeNo
|
||||
|
||||
The notation is taken from mathematics where it is an established convention for
|
||||
indicating an entity number. An elegant alternative is to prefix such variables with
|
||||
an ``i``: ``iTable``, ``iEmployee``. This effectively makes them named iterators.
|
||||
tableNum, tableNo, employeeNum, employeeNo
|
||||
|
||||
2.19. The prefix ``is``, ``has``, ``need``, or similar should be used for boolean variables and
|
||||
methods.
|
||||
@@ -718,9 +669,9 @@ notation).
|
||||
2.24. Exceptions can be suffixed with either ``Exception`` (e.g., ``SecurityException``) or
|
||||
``Error`` (e.g., ``SecurityError``).
|
||||
|
||||
The recommended method is to declare exception class ``Exception`` or ``Error`` as an
|
||||
inner class, from which the exception is thrown. For example, when declaring class
|
||||
``Foo`` that can throw errors, one can write the following:
|
||||
The recommended method is to declare an exception class ``Exception`` or ``Error`` as
|
||||
a nested type inside the class from which the exception is thrown. For example, when
|
||||
defining a class ``Foo`` that can throw errors, one can write the following:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -728,12 +679,16 @@ notation).
|
||||
|
||||
class Foo
|
||||
{
|
||||
public:
|
||||
class Error : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
explicit
|
||||
Error(const std::string& what)
|
||||
: std::runtime_error(what)
|
||||
// You can inherit constructors from std::runtime_error like this:
|
||||
using std::runtime_error::runtime_error;
|
||||
|
||||
// Additional constructors, if desired, can be declared as usual:
|
||||
Error(const std::string& what, const std::exception& inner)
|
||||
: std::runtime_error(what + ": " + inner.what())
|
||||
{
|
||||
}
|
||||
};
|
||||
@@ -743,7 +698,6 @@ notation).
|
||||
hierarchy, then child classes should should define their own ``Error`` or
|
||||
``Exception`` classes that are inherited from the parent's Error class.
|
||||
|
||||
|
||||
2.25. Functions (methods returning something) should be named after what they return and
|
||||
procedures (void methods) after what they do.
|
||||
|
||||
@@ -759,8 +713,8 @@ not in the primary processing path.
|
||||
|
||||
3.2. Header files must contain an include guard.
|
||||
|
||||
For example, header file located in ``module/class-name.hpp`` or in
|
||||
``src/module/class-name.hpp`` should have header guard in the following form:
|
||||
For example, a header file named ``module/class-name.hpp`` or
|
||||
``src/module/class-name.hpp`` should have a header guard in the following form:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -769,40 +723,43 @@ not in the primary processing path.
|
||||
...
|
||||
#endif // APP_MODULE_CLASS_NAME_HPP
|
||||
|
||||
The name should follow the location of the file inside the source tree and prevents
|
||||
naming conflicts. Header guard should be prefixed with the application/library name
|
||||
to avoid conflicts with other packaged and libraries.
|
||||
The macro name should reflect the path of the header file relative to the root of the
|
||||
source tree, in order to prevent naming conflicts. The header guard should be prefixed
|
||||
with the application/library name to avoid conflicts with other packages and libraries.
|
||||
|
||||
3.3. Header files which are in the same source distribution should be included in
|
||||
``"quotes"``, if possible with a path relative to the source file. Header files for
|
||||
system and other external libraries should be included in ``<angle brackets>``.
|
||||
3.3. Include directives for system headers and other external libraries should use
|
||||
``<angle brackets>``. Header files in the same source code repository should be included
|
||||
using ``"quotes"``.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "ndn-cxx/util/random.hpp"
|
||||
|
||||
#include <string>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "util/random.hpp"
|
||||
All of a project's header files should be included with their path relative to
|
||||
the project's source directory. The use of UNIX directory shortcuts ``.``
|
||||
(the current directory) and ``..`` (the parent directory) is discouraged.
|
||||
|
||||
3.4. Include statements should be sorted and grouped. Sorted by their hierarchical position
|
||||
in the system with low level files included first. Leave an empty line between groups
|
||||
of include statements.
|
||||
3.4. Include statements should be grouped. Same-project headers should be included first.
|
||||
Leave an empty line between groups of include statements. Sort alphabetically within a group.
|
||||
For example, the include section of ``ndn-cxx/foo/bar.cpp`` may look like this:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "ndn-cxx/impl/pending-interest.hpp"
|
||||
#include "ndn-cxx/util/random.hpp"
|
||||
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
#include "detail/pending-interest.hpp"
|
||||
#include "util/random.hpp"
|
||||
|
||||
|
||||
3.5. Types that are local to one file only can be declared inside that file.
|
||||
|
||||
|
||||
3.6. Implicit conversion is generally allowed.
|
||||
|
||||
Implicit conversion between integer and floating point numbers can cause problems and
|
||||
@@ -816,11 +773,10 @@ of include statements.
|
||||
``const_cast`` instead where appropriate. Use ``static_pointer_cast``,
|
||||
``dynamic_pointer_cast``, ``const_pointer_cast`` when dealing with ``shared_ptr``.
|
||||
|
||||
|
||||
3.7. Variables should be initialized where they are declared.
|
||||
|
||||
This ensures that variables are valid at any time. Sometimes it is impossible to
|
||||
initialize a variable to a valid value where it is declared:
|
||||
initialize a variable to a valid value where it is declared.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -830,21 +786,20 @@ of include statements.
|
||||
In these cases it should be left uninitialized rather than initialized to some phony
|
||||
value.
|
||||
|
||||
3.8. In most cases, class instance variables should not be declared public.
|
||||
3.8. In most cases, class data members should not be declared ``public``.
|
||||
|
||||
The concepts of information hiding and encapsulation are violated by public variables. Use
|
||||
private variables and access methods instead.
|
||||
Public data members violate the concepts of information hiding and encapsulation.
|
||||
Use private variables and public accessor methods instead.
|
||||
|
||||
Exceptions to this rule:
|
||||
|
||||
* when the class is essentially a dumb data structure with no or minimal behavior
|
||||
(equivalent to a C struct, also known as PODS). In this case it is appropriate to make
|
||||
the instance variables public by using struct.
|
||||
* When the class is essentially a dumb data structure with no or minimal behavior
|
||||
(equivalent to a C struct, also known as POD type). In this case it is appropriate
|
||||
to make the instance variables public by using ``struct``.
|
||||
|
||||
* when the class is used only inside the compilation unit, e.g., when implementing pImpl
|
||||
* When the class is used only inside the compilation unit, e.g., when implementing pImpl
|
||||
idiom (aka Bridge pattern) or similar cases.
|
||||
|
||||
|
||||
3.9. C++ pointers and references should have their reference symbol next to the type rather
|
||||
than to the name.
|
||||
|
||||
@@ -860,23 +815,19 @@ than to the name.
|
||||
if (nLines != 0) // NOT: if (nLines)
|
||||
if (value != 0.0) // NOT: if (value)
|
||||
|
||||
3.11. When checking if ``shared_ptr`` points to an object, explicit ``static_cast<bool>``
|
||||
must be used.
|
||||
|
||||
``shared_ptr`` in C++11 (unlike ``boost::shared_ptr``) does not have implicit
|
||||
conversion to bool.
|
||||
3.11. *(removed)*
|
||||
|
||||
3.12. Loop variables should be initialized immediately before the loop.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
isDone = false; // NOT: bool isDone = false;
|
||||
bool isDone = false; // NOT: bool isDone = false;
|
||||
while (!isDone) { // // other stuff
|
||||
: // while (!isDone) {
|
||||
} // :
|
||||
... // while (!isDone) {
|
||||
} // ...
|
||||
// }
|
||||
|
||||
3.13. The form while (true) should be used for infinite loops.
|
||||
3.13. The form ``while (true)`` should be used for infinite loops.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -909,7 +860,7 @@ instead.
|
||||
// }
|
||||
|
||||
By assigning boolean variables to expressions, the program gets automatic
|
||||
documentation. The construction will be easier to read, debug and maintain.
|
||||
documentation. The construction will be easier to read, debug, and maintain.
|
||||
|
||||
3.15. The conditional should be put on a separate line.
|
||||
|
||||
@@ -939,11 +890,11 @@ instead.
|
||||
should be considered declared as named constants instead.
|
||||
|
||||
If the number does not have an obvious meaning by itself, the readability is enhanced
|
||||
by introducing a named constant instead. A different approach is to introduce a method
|
||||
by introducing a named constant instead. A different approach is to introduce a method
|
||||
from which the constant can be accessed.
|
||||
|
||||
3.18. Floating point constants should always be written with decimal point, at least one
|
||||
decimal, and without omitting 0 before decimal point.
|
||||
3.18. Floating point literals should always be written with a decimal point, at least one
|
||||
decimal, and without omitting 0 before the decimal point.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -956,9 +907,9 @@ should be considered declared as named constants instead.
|
||||
|
||||
3.19. ``goto`` should not be used.
|
||||
|
||||
Goto statements violate the idea of structured code. Only in some very few cases (for
|
||||
instance breaking out of deeply nested structures) should goto be considered, and only if
|
||||
the alternative structured counterpart is proven to be less readable.
|
||||
``goto`` statements violate the idea of structured code. Only in very few cases (for
|
||||
instance, breaking out of deeply nested structures) should ``goto`` be considered,
|
||||
and only if the alternative structured counterpart is proven to be less readable.
|
||||
|
||||
3.20. ``nullptr`` should be used to represent a null pointer, instead of "0" or "NULL".
|
||||
|
||||
@@ -1008,7 +959,7 @@ the alternative structured counterpart is proven to be less readable.
|
||||
|
||||
3.24. All comments should be written in English.
|
||||
|
||||
In an international environment English is the preferred language.
|
||||
In an international environment, English is the preferred language.
|
||||
|
||||
3.25. Use ``//`` for all comments, including multi-line comments.
|
||||
|
||||
@@ -1025,7 +976,7 @@ the alternative structured counterpart is proven to be less readable.
|
||||
always start with an upper case letter and end with a period.
|
||||
|
||||
However, method and class documentation comments should use ``/** */`` style for
|
||||
Doxygen, JavaDoc and JSDoc.
|
||||
Doxygen, JavaDoc and JSDoc. License boilerplate should use ``/* */`` style.
|
||||
|
||||
3.26. Comments should be included relative to their position in the code.
|
||||
|
||||
@@ -1093,7 +1044,6 @@ the alternative structured counterpart is proven to be less readable.
|
||||
.. code-block:: c++
|
||||
|
||||
std::list<std::string> strings;
|
||||
|
||||
for (const auto& str : strings) {
|
||||
statements; // cannot modify `str`
|
||||
}
|
||||
@@ -1101,11 +1051,14 @@ the alternative structured counterpart is proven to be less readable.
|
||||
statements; // can modify `str`
|
||||
}
|
||||
|
||||
3.30. Annotate with ``override`` or ``final`` when overriding a virtual method or destructor.
|
||||
3.30. Use the ``override`` or ``final`` specifier when overriding a virtual
|
||||
member function or a virtual destructor.
|
||||
|
||||
``virtual`` should still be used along with ``override`` and ``final``,
|
||||
so that a human reader can easily recognize a virtual method
|
||||
without looking toward the end of the function signature.
|
||||
``virtual`` MUST NOT be used along with ``final``, so that the compiler
|
||||
can generate an error when a final function does not override.
|
||||
|
||||
``virtual`` SHOULD NOT be used along with ``override``, for consistency
|
||||
with ``final``.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
@@ -1119,28 +1072,18 @@ the alternative structured counterpart is proven to be less readable.
|
||||
class InputStream : public Stream
|
||||
{
|
||||
public:
|
||||
virtual void
|
||||
void
|
||||
open() override;
|
||||
};
|
||||
|
||||
class Console : public InputStream
|
||||
{
|
||||
public:
|
||||
virtual void
|
||||
open() override;
|
||||
void
|
||||
open() final;
|
||||
};
|
||||
|
||||
ndn-cxx declares ``NDN_CXX_DECL_OVERRIDE`` and ``NDN_CXX_DECL_FINAL`` macros that
|
||||
expand to ``override`` and ``final`` if the compiler supports this feature,
|
||||
but expand to nothing with older compilers.
|
||||
These must be used in place of ``override`` and ``final``,
|
||||
so that ndn-cxx remains compatible with older compilers.
|
||||
|
||||
``NDN_CXX_DECL_OVERRIDE`` and ``NDN_CXX_DECL_FINAL`` macros are for ndn-cxx internal use.
|
||||
Other projects, if adopting this style guide, should define their own macros if needed.
|
||||
|
||||
3.31. The recommended way to throw an exception derived from ``std::exception`` is to use
|
||||
the ``BOOST_THROW_EXCEPTION``
|
||||
`macro <http://www.boost.org/doc/libs/1_42_0/libs/exception/doc/BOOST_THROW_EXCEPTION.html>`__.
|
||||
Exceptions thrown using this macro will be bundled with additional diagnostic information, including
|
||||
filename, line number, and function name from where the exception was thrown.
|
||||
``NDN_THROW`` or one of the other ``NDN_THROW_*`` macros.
|
||||
Exceptions thrown using these macros will be augmented with additional diagnostic information,
|
||||
including the file name, line number, and function name from which the exception was thrown.
|
||||
+82
-202
@@ -1,37 +1,51 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# NFD - Named Data Networking Forwarding Daemon documentation build configuration file, created by
|
||||
# sphinx-quickstart on Sun Apr 6 19:58:22 2014.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath('.'))
|
||||
#
|
||||
# import os
|
||||
import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = u'ndn-cxx: NDN C++ library with eXperimental eXtensions'
|
||||
copyright = u'Copyright © 2013-2020 Regents of the University of California.'
|
||||
author = u'Named Data Networking Project'
|
||||
|
||||
# The short X.Y version.
|
||||
#version = ''
|
||||
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
#release = ''
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%Y-%m-%d'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#needs_sphinx = '1.0'
|
||||
#
|
||||
needs_sphinx = '1.3'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.extlinks',
|
||||
'sphinx.ext.todo',
|
||||
'redmine_issue',
|
||||
]
|
||||
|
||||
def addExtensionIfExists(extension):
|
||||
@@ -39,240 +53,106 @@ def addExtensionIfExists(extension):
|
||||
__import__(extension)
|
||||
extensions.append(extension)
|
||||
except ImportError:
|
||||
sys.stderr.write("Extension '%s' in not available. "
|
||||
sys.stderr.write("Extension '%s' not found. "
|
||||
"Some documentation may not build correctly.\n" % extension)
|
||||
sys.stderr.write("To install, use \n"
|
||||
" sudo pip install %s\n" % extension.replace('.', '-'))
|
||||
|
||||
addExtensionIfExists('sphinxcontrib.doxylink')
|
||||
|
||||
if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
addExtensionIfExists('sphinxcontrib.googleanalytics')
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'ndn-cxx: NDN C++ library with eXperimental eXtensions'
|
||||
copyright = u'Copyright (c) 2013-2015 Regents of the University of California.'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = []
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
# html_theme = 'default'
|
||||
#
|
||||
html_theme = 'named_data_theme'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
html_theme_path = ['./']
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
html_theme_path = ['.']
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
html_copy_source = False
|
||||
html_show_sourcelink = False
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
html_file_suffix = ".html"
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'ndn-cxx-docs'
|
||||
# Disable syntax highlighting of code blocks by default.
|
||||
highlight_language = 'none'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
('index', 'ndn-cxx-docs.tex', u'NDN C++ library with eXperimental eXtensions',
|
||||
u'Named Data Networking Project', 'manual'),
|
||||
('index', 'ndn-cxx-docs.tex', u'NDN C++ library with eXperimental eXtensions',
|
||||
author, 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
# -- Options for manual page output ------------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('manpages/ndnsec', 'ndnsec', u'NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-revoke', 'ndnsec-cert-revoke', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-cert-install', 'ndnsec-cert-instal', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-delete', 'ndnsec-delete', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-export', 'ndnsec-export', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-import', 'ndnsec-import', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-list', 'ndnsec-list', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-set-acl', 'ndnsec-set-acl', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'part of NDN security tools', None, 1),
|
||||
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'part of NDN security tools', None, 1),
|
||||
('tutorials/security-validator-config', 'ndnsec-validator.conf',
|
||||
'NDN trust validator configuration file', None, 5),
|
||||
('manpages/tlvdump', 'tlvdump', 'Decode structure of TLV encoded buffer', None, 1),
|
||||
('manpages/ndn-client.conf', 'ndn-client.conf', 'Configuration file for NDN platform', None, 5),
|
||||
('manpages/ndnsec', 'ndnsec', 'NDN security toolkit', None, 1),
|
||||
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'export an NDN certificate', None, 1),
|
||||
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'create an NDN certificate for an identity', None, 1),
|
||||
('manpages/ndnsec-cert-install', 'ndnsec-cert-install', 'import an NDN certificate from a file', None, 1),
|
||||
('manpages/ndnsec-delete', 'ndnsec-delete', 'delete an NDN identity, key, or certificate', None, 1),
|
||||
('manpages/ndnsec-export', 'ndnsec-export', 'export an NDN certificate and its private key to a file', None, 1),
|
||||
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'show the default NDN identity, key, and certificate for the current user', None, 1),
|
||||
('manpages/ndnsec-import', 'ndnsec-import', 'import an NDN certificate and its private key from a file', None, 1),
|
||||
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'generate an NDN key for an identity', None, 1),
|
||||
('manpages/ndnsec-list', 'ndnsec-list', 'list all known NDN identities, keys, and certificates', None, 1),
|
||||
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'change the default NDN identity, key, or certificate for the current user', None, 1),
|
||||
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'generate an NDN certificate signing request', None, 1),
|
||||
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'unlock the TPM', None, 1),
|
||||
('manpages/ndn-client.conf', 'ndn-client.conf', 'configuration file for NDN applications', None, 5),
|
||||
('manpages/ndn-log', 'ndn-log', 'ndn-cxx logging', None, 7),
|
||||
]
|
||||
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
man_show_urls = True
|
||||
#man_show_urls = True
|
||||
|
||||
|
||||
# ---- Custom options --------
|
||||
# -- Custom options ----------------------------------------------------------
|
||||
|
||||
doxylink = {
|
||||
'ndn-cxx' : ('ndn-cxx.tag', 'doxygen/'),
|
||||
'ndn-cxx': ('ndn-cxx.tag', 'doxygen/'),
|
||||
}
|
||||
|
||||
if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
googleanalytics_id = os.environ['GOOGLE_ANALYTICS']
|
||||
googleanalytics_enabled = True
|
||||
|
||||
# exclude_patterns = ['RELEASE_NOTES.rst']
|
||||
|
||||
redmine_project_url = "http://redmine.named-data.net/"
|
||||
extlinks = {
|
||||
'issue': ('https://redmine.named-data.net/issues/%s', 'issue #'),
|
||||
}
|
||||
+338
-177
File diff suppressed because it is too large.
Load diff
+14
-17
@@ -5,21 +5,20 @@ Trivial applications
|
||||
|
||||
To successfully run the following examples, please make sure that NFD is properly
|
||||
configured and running. For more information about NFD, refer to `NFD's official
|
||||
homepage <http://named-data.net/doc/NFD/>`_.
|
||||
homepage <https://named-data.net/doc/NFD/>`_.
|
||||
|
||||
Trivial consumer
|
||||
----------------
|
||||
|
||||
In the following trivial example, a consumer creates a :ndn-cxx:`Face` with default
|
||||
transport (:ndn-cxx:`UnixTransport`) and sends an Interest for
|
||||
``/localhost/testApp/randomData``. While expressing Interest, the app specifies two
|
||||
callbacks to be called when Data is retrieved or Interest times out.
|
||||
``/localhost/testApp/randomData``. While expressing Interest, the app specifies three
|
||||
callbacks to be called when Data/Nack is retrieved or Interest times out.
|
||||
|
||||
.. literalinclude:: ../examples/consumer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 24-27,39,43-46,50,57,67
|
||||
|
||||
:emphasize-lines: 39-45,48,59,65,71
|
||||
|
||||
Trivial producer
|
||||
----------------
|
||||
@@ -42,29 +41,27 @@ using :ndn-cxx:`Face::put` method.
|
||||
.. literalinclude:: ../examples/producer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 42,55-58,61,64,67,70,76
|
||||
:emphasize-lines: 41,50,57-59,62,70,74
|
||||
|
||||
Consumer that uses Scheduler
|
||||
----------------------------
|
||||
|
||||
Consumer that uses ndn::Scheduler
|
||||
---------------------------------
|
||||
|
||||
The following example demonstrates how to use :ndn-cxx:`ndn::Scheduler` to schedule arbitrary
|
||||
The following example demonstrates how to use :ndn-cxx:`Scheduler` to schedule arbitrary
|
||||
events for execution at specific points of time.
|
||||
|
||||
The library internally uses `boost::asio::io_service
|
||||
<http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/io_service.html>`_ to
|
||||
<https://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/io_service.html>`_ to
|
||||
implement fully asynchronous NDN operations (i.e., sending and receiving Interests and
|
||||
Data). In addition to network-related operations, ``boost::asio::io_service`` can be used
|
||||
to execute any arbitrary callback within the processing thread (run either explicitly via
|
||||
``io.run`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous examples).
|
||||
:ndn-cxx:`ndn::Scheduler` is just a wrapper on top of ``boost::asio::io_service``,
|
||||
allowing simple interface to schedule tasks at specific times.
|
||||
``io_service::run()`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous
|
||||
examples). :ndn-cxx:`Scheduler` is just a wrapper on top of ``io_service``, providing a
|
||||
simple interface to schedule tasks at specific times.
|
||||
|
||||
The highlighted lines in the example demonstrate all that is needed to express a second
|
||||
Interest approximately 2 seconds after the first one.
|
||||
Interest approximately 3 seconds after the first one.
|
||||
|
||||
.. literalinclude:: ../examples/consumer-with-timer.cpp
|
||||
:language: c++
|
||||
:linenos:
|
||||
:emphasize-lines: 39-40,51-54,58-59,61-62,99-100
|
||||
|
||||
:emphasize-lines: 39-40,56,62,93,106,114-116
|
||||
+27
-17
@@ -1,11 +1,22 @@
|
||||
ndn-cxx: NDN C++ library with eXperimental eXtensions
|
||||
=====================================================
|
||||
|
||||
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
|
||||
used to implement various NDN applications.
|
||||
**ndn-cxx** is a C++14 library implementing Named Data Networking (NDN) primitives
|
||||
that can be used to write various NDN applications. The library is currently being
|
||||
used by the following projects:
|
||||
|
||||
Please submit any bugs or issues to the `ndn-cxx issue tracker
|
||||
<http://redmine.named-data.net/projects/ndn-cxx/issues>`__.
|
||||
* `NFD - NDN Forwarding Daemon <https://github.com/named-data/NFD>`_
|
||||
* `NLSR - Named-data Link-State Routing protocol <https://github.com/named-data/NLSR>`_
|
||||
* `ndn-tools - Essential NDN command-line tools <https://github.com/named-data/ndn-tools>`_
|
||||
* `repo-ng - Next generation of NDN repository <https://github.com/named-data/repo-ng>`_
|
||||
* `ChronoSync - Sync library for multiuser realtime applications <https://github.com/named-data/ChronoSync>`_
|
||||
* `PSync - Partial and full synchronization library <https://github.com/named-data/PSync>`_
|
||||
* `ndn-traffic-generator - Traffic generator for NDN <https://github.com/named-data/ndn-traffic-generator>`_
|
||||
* `NAC - Name-based Access Control <https://github.com/named-data/name-based-access-control>`_
|
||||
* `NDNS - Domain Name Service for NDN <https://github.com/named-data/ndns>`_
|
||||
|
||||
Please submit any bugs or feature requests to the `ndn-cxx issue tracker
|
||||
<https://redmine.named-data.net/projects/ndn-cxx/issues>`_.
|
||||
|
||||
ndn-cxx Documentation
|
||||
---------------------
|
||||
@@ -14,10 +25,10 @@ ndn-cxx Documentation
|
||||
:hidden:
|
||||
:maxdepth: 3
|
||||
|
||||
README
|
||||
INSTALL
|
||||
examples
|
||||
tutorials
|
||||
specs
|
||||
manpages
|
||||
|
||||
.. toctree::
|
||||
@@ -28,34 +39,33 @@ ndn-cxx Documentation
|
||||
RELEASE_NOTES
|
||||
releases
|
||||
|
||||
- :doc:`README`
|
||||
|
||||
- :doc:`INSTALL`
|
||||
|
||||
- :doc:`examples`
|
||||
|
||||
- :doc:`tutorials`
|
||||
|
||||
+ :doc:`tutorials/security-library`
|
||||
+ `NDN Software Contributor's Guide <https://github.com/named-data/.github/blob/master/CONTRIBUTING.md>`_ (guide for newcomers to the NDN community of software generally)
|
||||
+ :doc:`tutorials/utils-ndn-regex`
|
||||
+ :doc:`tutorials/security-validator-config`
|
||||
+ :doc:`tutorials/signed-interest`
|
||||
+ :doc:`tutorials/certificate-format`
|
||||
|
||||
- :doc:`specs`
|
||||
|
||||
+ :doc:`specs/signed-interest`
|
||||
+ :doc:`specs/certificate-format`
|
||||
+ :doc:`specs/safe-bag`
|
||||
+ :doc:`specs/validation-error-code`
|
||||
|
||||
- :doc:`manpages`
|
||||
|
||||
**Additional documentation**
|
||||
Additional Documentation
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- `API documentation (doxygen) <doxygen/annotated.html>`_
|
||||
|
||||
- :doc:`code-style`
|
||||
|
||||
- :doc:`RELEASE_NOTES`
|
||||
|
||||
- :doc:`releases`
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
|
||||
ndn-cxx is an open source project licensed under the LGPL version 3. For more information about
|
||||
the license, refer to `COPYING.md <https://github.com/named-data/ndn-cxx/blob/master/COPYING.md>`_.
|
||||
+1
-9
@@ -3,26 +3,18 @@ Manpages
|
||||
|
||||
.. toctree::
|
||||
ndn-client.conf <manpages/ndn-client.conf>
|
||||
ndn-cxx logging <manpages/ndn-log>
|
||||
manpages/ndnsec
|
||||
ndnsec-list <manpages/ndnsec-list>
|
||||
ndnsec-get-default <manpages/ndnsec-get-default>
|
||||
ndnsec-set-default <manpages/ndnsec-set-default>
|
||||
ndnsec-key-gen <manpages/ndnsec-key-gen>
|
||||
ndnsec-dsk-gen <manpages/ndnsec-dsk-gen>
|
||||
ndnsec-sign-req <manpages/ndnsec-sign-req>
|
||||
ndnsec-cert-gen <manpages/ndnsec-cert-gen>
|
||||
ndnsec-cert-revoke <manpages/ndnsec-cert-revoke>
|
||||
ndnsec-cert-install <manpages/ndnsec-cert-install>
|
||||
ndnsec-cert-dump <manpages/ndnsec-cert-dump>
|
||||
ndnsec-delete <manpages/ndnsec-delete>
|
||||
ndnsec-export <manpages/ndnsec-export>
|
||||
ndnsec-import <manpages/ndnsec-import>
|
||||
ndnsec-unlock-tpm <manpages/ndnsec-unlock-tpm>
|
||||
ndnsec-set-acl <manpages/ndnsec-set-acl>
|
||||
manpages/tlvdump
|
||||
:maxdepth: 1
|
||||
|
||||
..
|
||||
manpages/ndnsec-op-tool
|
||||
manpages/ndnsec-set-acl
|
||||
manpages/ndnsec-sig-verify
|
||||
@@ -5,32 +5,30 @@ System configuration of NDN platform is specified in ``client.conf``.
|
||||
|
||||
The configuration file ``client.conf`` is looked up in several directories in the following order:
|
||||
|
||||
- ``$HOME/.ndn/``: user-specific settings
|
||||
- ``@SYSCONFDIR@/ndn/`` (``/usr/local/etc/ndn``, ``/opt/local/etc/ndn``, or other, depending how the library is configured): system-wide settings
|
||||
- ``$HOME/.ndn``: user-specific settings
|
||||
- ``SYSCONFDIR/ndn``: system-wide settings (where ``SYSCONFDIR`` can be ``/usr/local/etc``,
|
||||
``/opt/local/etc``, or other, depending on how the library is configured)
|
||||
- ``/etc/ndn``: default system-wide settings
|
||||
|
||||
Here is an example of ``client.conf`` for current ndn-cxx package:
|
||||
Here is an example of ``client.conf`` for the current ndn-cxx package:
|
||||
|
||||
.. literalinclude:: ../../client.conf.sample
|
||||
:language: ini
|
||||
|
||||
|
||||
NFD
|
||||
---
|
||||
|
||||
transport
|
||||
FaceUri for default connection toward local NDN forwarder. Only ``unix`` and ``tcp4`` FaceUri
|
||||
can be specified here.
|
||||
FaceUri for default connection toward local NDN forwarder. Only ``unix``, ``tcp``, ``tcp4``, and
|
||||
``tcp6`` FaceUris can be specified here.
|
||||
|
||||
By default, ``unix:///var/run/nfd.sock`` is used.
|
||||
By default, ``unix:///run/nfd.sock`` is used on Linux and ``unix:///var/run/nfd.sock`` is used on
|
||||
other platforms.
|
||||
|
||||
Prefix Registration
|
||||
-------------------
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_TRANSPORT`` environment variable.
|
||||
|
||||
protocol
|
||||
The prefix registration protocol. For now, only one protocol ``nrd-0.1`` is supported.
|
||||
With this protocol, applications send prefix registration requests to NFD RIB manager.
|
||||
NFD RIB Manager, after authenticating the request, will set up corresponding FIB entries
|
||||
in NFD.
|
||||
|
||||
Key Management
|
||||
--------------
|
||||
@@ -54,12 +52,18 @@ pib
|
||||
|
||||
pib=pib-sqlite3
|
||||
|
||||
Changing PIB scheme without changing location is **not** allowed. If such change is
|
||||
necessary, the whole backend storage must be destroyed. For example, when default location
|
||||
is used::
|
||||
Changing PIB scheme without changing location is **not** allowed. If a change like this is
|
||||
necessary, the whole backend storage must be destroyed. For example, when the default location is
|
||||
used::
|
||||
|
||||
rm -rf ~/.ndn/ndnsec-*
|
||||
|
||||
It is not recommended to share the same directory between machines, e.g. via NFS.
|
||||
Simultaneous access from multiple machines may cause errors.
|
||||
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_PIB`` environment variable.
|
||||
|
||||
tpm
|
||||
Trusted Platform Module (TPM) where the private keys are stored. The format for this setting
|
||||
is::
|
||||
@@ -68,15 +72,15 @@ tpm
|
||||
|
||||
Possible values for ``[scheme]``:
|
||||
|
||||
* ``tpm-osx-keychain`` (default on OS X platform): secure storage of private keys in OS X
|
||||
* ``tpm-osx-keychain`` (default on macOS): secure storage of private keys in the macOS
|
||||
Keychain with OS-provided access restrictions.
|
||||
|
||||
``[location]`` parameter is ignored.
|
||||
|
||||
May not work for daemon applications, as user interaction may be required to access OS X
|
||||
Keychain.
|
||||
May not work for daemon applications, as user interaction may be required to access the
|
||||
macOS Keychain.
|
||||
|
||||
* ``tpm-file`` (default on all other platforms): file-based storage of private keys
|
||||
* ``tpm-file`` (default on all other platforms): file-based storage of private keys.
|
||||
|
||||
Possible values for ``[location]``:
|
||||
|
||||
@@ -89,5 +93,11 @@ tpm
|
||||
|
||||
tpm=tpm-file
|
||||
|
||||
**Change of ``tpm`` setting is only possible together with ``pib`` setting. Otherwise, an
|
||||
error will be generated during PIB/TPM access**
|
||||
**Changing the ``tpm`` setting is only possible together with ``pib`` setting. Otherwise,
|
||||
an error will be generated during PIB/TPM access.**
|
||||
|
||||
It is not recommended to share the same directory between machines, e.g. via NFS.
|
||||
Simultaneous access from multiple machines may cause errors.
|
||||
|
||||
.. note::
|
||||
This value can be overridden using the ``NDN_CLIENT_TPM`` environment variable.
|
||||
@@ -0,0 +1,100 @@
|
||||
ndn-log
|
||||
=======
|
||||
|
||||
The ndn-cxx logging facility exposes the internal state of NDN libraries and
|
||||
applications so the user can investigate internal interactions, such as interest
|
||||
dispatch inside ndn::Face, Data and Interest validation in the security framework,
|
||||
sync and recovery Interest processing inside ChronoSync, etc. During runtime, the
|
||||
user is able to specify the types of messages he or she would like to receive from
|
||||
a set of logging modules pre-configured by library and application developers.
|
||||
|
||||
Environment Variable
|
||||
--------------------
|
||||
|
||||
One way to control ndn-cxx logging facility is through the environment variable
|
||||
``NDN_LOG``. Using this variable, one can set the log levels for the available logging
|
||||
modules. Logging modules within different libraries and applications usually have
|
||||
distinguishing prefixes (``ndn.``, ``sync.``, etc.), which can be specified when
|
||||
setting the environment variable. Wildcards can be used to enable logging for all
|
||||
modules (just ``*``) or all modules under a selected prefix (e.g., ``ndn.*``).
|
||||
|
||||
If an additional environment variable ``NDN_LOG_NOFLUSH`` is set, the automatic flushing
|
||||
after each log record will be disabled. This can improve logging performance but may
|
||||
cause the log records to appear delayed or, in case of application crash, the last
|
||||
few log records may be lost.
|
||||
|
||||
ndn-cxx logging facility provides a mechanism to manage the type of log messages
|
||||
that are written by classifying log messages by severity levels. Listed below
|
||||
are the available log levels.
|
||||
|
||||
**Log Levels:**
|
||||
|
||||
::
|
||||
|
||||
TRACE
|
||||
DEBUG
|
||||
INFO
|
||||
WARN
|
||||
ERROR
|
||||
FATAL
|
||||
|
||||
A message's severity level will determine whether the log is written. For instance,
|
||||
if an application sets its log severity level to DEBUG, all messages marked with
|
||||
DEBUG, or any of those below that level, are written. FATAL level logs are always
|
||||
written.
|
||||
|
||||
Setting NDN_LOG requires the following syntax with as many prefixes and
|
||||
corresponding loglevels as the user desires:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="<prefix1>=<loglevel1>:<prefix2>=<loglevel2>"
|
||||
|
||||
*Example:*
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="ndn.*=DEBUG"
|
||||
export NDN_LOG="ndn.UnixTransport=INFO"
|
||||
export NDN_LOG="sync.Logic=ERROR"
|
||||
export NDN_LOG="*=DEBUG:ndn.UnixTransport=INFO:sync.Logic=ERROR"
|
||||
|
||||
**Note:**
|
||||
|
||||
The loglevel assignments in ``NDN_LOG`` are processed left-to-right. Thus, shorter
|
||||
(more general) prefixes should be listed before longer (more specific) prefixes.
|
||||
Otherwise, the loglevel setting of a more specific prefix may be overwritten by a
|
||||
more general assignment appearing later in the string. For example:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="ndn.UnixTransport=TRACE:ndn.*=ERROR:*=INFO"
|
||||
|
||||
will set all modules to INFO. To obtain the desired effect, it should instead be
|
||||
written as:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export NDN_LOG="*=INFO:ndn.*=ERROR:ndn.UnixTransport=TRACE"
|
||||
|
||||
**Note:**
|
||||
|
||||
Setting the environment variable with sudo requires the application to be run
|
||||
in the same command.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
# Correct
|
||||
sudo env NDN_LOG=logLevel ./ndn-application
|
||||
|
||||
# Also correct
|
||||
sudo -s
|
||||
export NDN_LOG=logLevel
|
||||
./ndn-application
|
||||
|
||||
# Incorrect
|
||||
sudo export NDN_LOG=logLevel
|
||||
sudo ./ndn-application
|
||||
|
||||
# Incorrect
|
||||
NDN_LOG=logLevel sudo ./ndn-application
|
||||
@@ -1,56 +1,54 @@
|
||||
ndnsec-cert-dump
|
||||
================
|
||||
|
||||
``ndnsec-cert-dump`` is a tool to dump a certificate from **Public Info Base** or file and output
|
||||
it to standard output.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-dump [-h] [-p] [-ikf] name
|
||||
**ndnsec-cert-dump** [**-h**] [**-p**] [**-r** [**-H** *host*] [**-P** *port*]]
|
||||
[**-i**\|\ **-k**\|\ **-f**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-dump`` can read a certificate from **Public Info Base (PIB)** or a file and output
|
||||
the certificate to standard output.
|
||||
:program:`ndnsec-cert-dump` reads a certificate from the **Public Info Base (PIB)**
|
||||
or from a file, and prints it on the standard output.
|
||||
|
||||
By default, ``name`` is interpreted as a certificate name.
|
||||
By default, *name* is interpreted as a certificate name.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-i``
|
||||
Interpret ``name`` as an identity name. If specified, the certificate to dump is the default
|
||||
certificate of the identity.
|
||||
.. option:: -i, --identity
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name. If specified, the certificate to dump is the default certificate
|
||||
of the key.
|
||||
Interpret *name* as an identity name. If specified, the certificate to dump
|
||||
is the default certificate of the identity.
|
||||
|
||||
``-f``
|
||||
Interpret ``name`` as a path to a file containing the certificate. If ``name`` is ``-``,
|
||||
certificate will be read from standard input.
|
||||
.. option:: -k, --key
|
||||
|
||||
``-p``
|
||||
Print out the certificate to a human-readable format.
|
||||
Interpret *name* as a key name. If specified, the certificate to dump is the
|
||||
default certificate of the key.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -f, --file
|
||||
|
||||
Dump a certificate from PIB to standard output:
|
||||
::
|
||||
Interpret *name* as a path to a file containing the certificate. If *name*
|
||||
is "-", the certificate will be read from the standard input.
|
||||
|
||||
$ ndnsec-cert-dump /ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
.. option:: -p, --pretty
|
||||
|
||||
Dump a certificate to a human-readable format:
|
||||
::
|
||||
Print the certificate in a human-readable format.
|
||||
|
||||
$ ndnsec-cert-dump -p /ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
Example
|
||||
-------
|
||||
|
||||
Dump a certificate from PIB to standard output::
|
||||
|
||||
$ ndnsec-cert-dump /ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
|
||||
Dump a certificate in human-readable format::
|
||||
|
||||
$ ndnsec-cert-dump -p /ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
Certificate name:
|
||||
/ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
/ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
|
||||
Validity:
|
||||
NotBefore: 20140401T000000
|
||||
NotAfter: 20150331T235959
|
||||
|
||||
@@ -1,79 +1,91 @@
|
||||
ndnsec-cert-gen
|
||||
===============
|
||||
|
||||
``ndnsec-cert-gen`` is a tool to issue an identity certificate.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-gen [-h] [-S timestamp] [-E timestamp] [-N name] [-I info] [-s sign-id] [-p cert-prefix] request
|
||||
**ndnsec-cert-gen** [**-h**] [**-S** *timestamp*] [**-E** *timestamp*]
|
||||
[**-I** *info*]... [**-s** *signer*] [**-i** *issuer*] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-gen`` takes signing request as input and issues an identity certificate for the key in
|
||||
the signing request. The signing request can be created during ``ndnsec-keygen`` and can be
|
||||
re-generated with ``ndnsec-sign-req``.
|
||||
:program:`ndnsec-cert-gen` takes a signing request as input and issues an
|
||||
identity certificate for the key in the signing request. The signing request
|
||||
can be created with :program:`ndnsec-key-gen` and can be re-generated with
|
||||
:program:`ndnsec-sign-req`.
|
||||
|
||||
By default, the default key/certificate will be used to sign the issued certificate.
|
||||
By default, the default key is used to sign the issued certificate.
|
||||
|
||||
``request`` could be a path to a file that contains the signing request. If ``request`` is ``-``,
|
||||
then signing request will be read from standard input.
|
||||
|
||||
The generated certificate will be written to standard output in base64 encoding.
|
||||
*file* is the name of a file that contains the signing request. If *file* is
|
||||
"-", the signing request is read from the standard input.
|
||||
|
||||
The generated certificate is written to the standard output in base64 encoding.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-S timestamp``
|
||||
Timestamp when the certificate becomes valid. The default value is now.
|
||||
.. option:: -S <timestamp>, --not-before <timestamp>
|
||||
|
||||
``-E timestamp``
|
||||
Timestamp when the certificate expires. The default value is one year from now.
|
||||
Date and time when the certificate becomes valid, in "YYYYMMDDhhmmss" format.
|
||||
The default value is now.
|
||||
|
||||
``-N name``
|
||||
Name of the certificate owner.
|
||||
.. option:: -E <timestamp>, --not-after <timestamp>
|
||||
|
||||
``-I info``
|
||||
Other information about the certificate owner. ``subject-info`` is a list of pairs of OID and
|
||||
corresponding value. For example, "2.5.4.10 'Some Organization' 2.5.4.3 'http://home.page/'".
|
||||
Date and time when the certificate expires, in "YYYYMMDDhhmmss" format.
|
||||
The default value is 365 days after the **--not-before** timestamp.
|
||||
|
||||
``-s sign-id``
|
||||
Signing identity. The default key/certificate of ``sign-id`` will be used to sign the requested
|
||||
certificate. If this option is not specified, the system default identity will be used.
|
||||
.. option:: -I <info>, --info <info>
|
||||
|
||||
``-p cert-prefix``
|
||||
The certificate prefix, which is the part of certificate name before ``KEY`` component.
|
||||
Other information to be included in the issued certificate. Must be in the
|
||||
form of key and value pairs, where the key is an arbitrary string without
|
||||
spaces, followed by one or more spaces, followed by an arbitrary string
|
||||
representing the value. This option may be repeated multiple times.
|
||||
|
||||
By default, the certificate prefix will be inferred from the certificate name according
|
||||
to the relation between the signing identity and the subject identity. If the signing
|
||||
identity is a prefix of the subject identity, ``KEY`` will be inserted after the
|
||||
signingIdentity, otherwise ``KEY`` is inserted after subject identity (i.e., before
|
||||
``ksk-....``).
|
||||
For example::
|
||||
|
||||
Examples
|
||||
--------
|
||||
-I "affiliation Some Organization" -I "homepage https://home.page/"
|
||||
|
||||
.. option:: -s <signer>, --sign-id <signer>
|
||||
|
||||
Signing identity. The default key/certificate of *signer* will be used to
|
||||
sign the requested certificate. If this option is not specified, the system
|
||||
default identity will be used.
|
||||
|
||||
.. option:: -i <issuer>, --issuer-id <issuer>
|
||||
|
||||
Issuer's ID to be included in the issued certificate name. The default
|
||||
value is "NA".
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-gen -S 20140401000000 -E 20150331235959 -N "David"
|
||||
-I "2.5.4.10 'Some Organization'" -s /ndn/test sign_request.cert
|
||||
Bv0C9wc9CANuZG4IBHRlc3QIA0tFWQgFZGF2aWQIEWtzay0xMzk2OTEzMDU4MTk2
|
||||
CAdJRC1DRVJUCAgAAAFFPp2g3hQDGAECFf0BdjCCAXIwIhgPMjAxNDA0MDEwMDAw
|
||||
MDBaGA8yMDE1MDMzMTIzNTk1OVowKDAMBgNVBCkTBURhdmlkMBgGA1UEChMRU29t
|
||||
ZSBPcmdhbml6YXRpb24wggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC0
|
||||
urnS2nKcnXnMTESH2XqO+H8c6bCE6mmv+FMQ9hSfZVOHbX4kkiDmkcAAf8NCvwGr
|
||||
kEat0NQIhKHFLFtofC5rXLheAo/UxgFA/9bNwiEjMH/c8EN2YTSMzdCDrK6TwE7B
|
||||
623cLTsa3Bb11+BpzC1oLb3Egedgp+vIf+AFIgNQhvfwzsgsgOBB4iJBwcYegU7w
|
||||
JsO0pjY69WQU2DGjABFef6C2Qh8x0TvtnynRLbWlh928+4ilVUvLuWcV3AbPIKLe
|
||||
eZu13+v01JN6kFzNZDPMFtOFPvJ943IdYu7Q9k93PzhSk0+wFp3cHH21PfWeghWe
|
||||
3zLIER8RTWPIQhWSbxRVAgERFjMbAQEcLgcsCANuZG4IA0tFWQgEdGVzdAgRa3Nr
|
||||
LTEzOTQxMjk2OTQ3ODgIB0lELUNFUlQX/QEABUGcl7U+F8cwMHKckerv+1H2Nvsd
|
||||
OfeqX0+4RzWU+wRx2emMGMZZdHSx8M/i45hb0P5hbNEF99L35/SrSTSzhTZdOriD
|
||||
t/LQOcKBoNXY+iw3EUFM0gvRGU0kaEVBKAHtbYhtoHc48QLEyrsVaMqmrjCmpeF/
|
||||
JOcClhzJfFW3cZ/SlhcTEayF0ntogYLR2cMzIwQhhSj5L/Kl7I7uxNxZhK1DS98n
|
||||
q8oGAxHufEAluPrRpDQfI+jeQ4h/YYKcXPW3Vn7VQAGOqIi6gTlUxrmEbyCDF70E
|
||||
xj5t3wfSUmDa1N+hLRMdEAI+IjRRHDSx2Lhj/QcoPIZPWwKjBz9CBL92og==
|
||||
$ ndnsec-cert-gen -S 20200501000000 -E 20210101000000 -I "affiliation Some Organization" -I "foobar Foo Bar" -i "Universe" -s /ndn/test request.cert > signed.cert
|
||||
|
||||
$ cat signed.cert
|
||||
Bv0BcgctCAdleGFtcGxlCANLRVkICOQUmX8oloLrCAhVbml2ZXJzZQgJ/QAAAXHR
|
||||
Ak6CFAkYAQIZBAA27oAVWzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDpJsCkv
|
||||
E5RMjxRVdyK6W6z+FoCq+qREEn/sxf+n2gnsl25qm1NarCfSGf96zIJy9BRA9btu
|
||||
MMeuWlAN/ymvMFwWkBsBAxwcBxoIA25kbggEdGVzdAgDS0VZCAhJP1OaKLualf0A
|
||||
/Sb9AP4PMjAyMDA1MDFUMDAwMDAw/QD/DzIwMjEwMTAxVDAwMDAwMP0BAkH9AgAk
|
||||
/QIBC2FmZmlsaWF0aW9u/QICEVNvbWUgT3JnYW5pemF0aW9u/QIAFf0CAQZmb29i
|
||||
YXL9AgIHRm9vIEJhchdHMEUCIQDPT9Hq1kvkE0r9W1aYSBVTnHlTEzgtz+v1DwkC
|
||||
ug/vLAIgY3xJITCwf55sqey33q5GIQSk1TRCkNNl58ojvPs5sNU=
|
||||
|
||||
$ ndnsec-dump-certificate -p -f signed.cert
|
||||
Certificate name:
|
||||
/example/KEY/%E4%14%99%7F%28%96%82%EB/Universe/%FD%00%00%01q%D1%02N%82
|
||||
Validity:
|
||||
NotBefore: 20200501T000000
|
||||
NotAfter: 20210101T000000
|
||||
Additional Description:
|
||||
affiliation: Some Organization
|
||||
foobar: Foo Bar
|
||||
Public key bits:
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOkmwKS8TlEyPFFV3IrpbrP4WgKr6
|
||||
pEQSf+zF/6faCeyXbmqbU1qsJ9IZ/3rMgnL0FED1u24wx65aUA3/Ka8wXA==
|
||||
Signature Information:
|
||||
Signature Type: SignatureSha256WithEcdsa
|
||||
Key Locator: Name=/ndn/test/KEY/I%3FS%9A%28%BB%9A%95
|
||||
@@ -1,56 +1,50 @@
|
||||
ndnsec-cert-install
|
||||
===================
|
||||
|
||||
``ndnsec-cert-install`` is a tool to install a certificate into **Public Information Base (PIB)**.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-install [-h] [-IKN] cert-source
|
||||
**ndnsec-cert-install** [**-h**] [**-I**\|\ **-K**\|\ **-N**] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-cert-install`` can insert a certificate into PIB. By default, the installed certificate
|
||||
will be set as the default certificate of its corresponding identity and the identity is set as
|
||||
the system default identity.
|
||||
:program:`ndnsec-cert-install` allows importing a certificate into the
|
||||
**Public Information Base (PIB)**. By default, the installed certificate
|
||||
will be set as the default certificate for the corresponding identity and
|
||||
the identity will be set as the user's default identity.
|
||||
|
||||
``cert-source`` could be a filesystem path or an HTTP URL of a file containing to certificate to
|
||||
install or . If ``cert-file`` is ``-``, the certificate will be read from standard input.
|
||||
*file* can be a filesystem path or an HTTP URL of a file containing the certificate
|
||||
to install. If *file* is "-", the certificate will be read from the standard input.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-I``
|
||||
Set the certificate as the default certificate of its corresponding identity, but do not change
|
||||
the system default identity.
|
||||
.. option:: -I, --identity-default
|
||||
|
||||
``-K``
|
||||
Set the certificate as the default certificate of its corresponding key, but do not change the
|
||||
corresponding identity's default key and the system default identity.
|
||||
Set the certificate as the default certificate for the corresponding identity,
|
||||
but do not change the user's default identity.
|
||||
|
||||
``-N``
|
||||
Install the certificate but do not change any default settings.
|
||||
.. option:: -K, --key-default
|
||||
|
||||
Examples
|
||||
--------
|
||||
Set the certificate as the default certificate for the corresponding key, but
|
||||
do not change the identity's default key or the user's default identity.
|
||||
|
||||
Install a certificate and set it as the system default certificate:
|
||||
.. option:: -N, --no-default
|
||||
|
||||
::
|
||||
Install the certificate but do not change any default settings.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Install a certificate and set it as the default certificate::
|
||||
|
||||
$ ndnsec-cert-install cert_file.cert
|
||||
|
||||
Install a certificate with HTTP URL and set it as the system default certificate:
|
||||
|
||||
::
|
||||
Install a certificate via HTTP and set it as the default certificate::
|
||||
|
||||
$ ndnsec-install-cert "http://ndncert.domain.com/cert/get/my-certificate.ndncert"
|
||||
|
||||
Install a certificate but do not change any default settings:
|
||||
|
||||
::
|
||||
Install a certificate but do not change any default settings::
|
||||
|
||||
$ ndnsec-cert-install -N cert_file.cert
|
||||
@@ -1,36 +0,0 @@
|
||||
ndnsec-cert-revoke
|
||||
==================
|
||||
|
||||
``ndnsec-cert-revoke`` is a tool to generate a certificate revocation data.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-revoke [-h] request
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This command takes an identity ertificate as input.
|
||||
The tool will check whether user is the issuer of the certificate (by checking whether user has the key pointed by the KeyLocator of the certificate).
|
||||
If so, the tool will generate an empty packet named by the certificate name appended with "REVOKED" as a revocation data.
|
||||
If user is not the issuer of the certificate, the command will return error.
|
||||
|
||||
This tool generates a revocation Data.
|
||||
It does not actually revoke a certificate.
|
||||
How to publish and use the revocation Data is not finalized yet.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``request``
|
||||
request is file name of the certificate to revoke (``-`` for standard input)
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-cert-revoke some-cert-to-revoke.ndncert
|
||||
@@ -1,32 +1,32 @@
|
||||
ndnsec-delete
|
||||
=============
|
||||
|
||||
``ndnsec-delete`` is a tool to delete security data from both **Public Info Base** and
|
||||
**Trusted Platform Module**.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
ndnsec-delete [-h] [-kc] name
|
||||
**ndnsec-delete** [**-h**] [**-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
By default, ``ndnsec-delete`` interpret ``name`` as an identity name. If an identity is deleted,
|
||||
all the keys and certificates belonging to the identity will be deleted as well. If a key is
|
||||
deleted, all the certificate belonging to the key will be deleted as well.
|
||||
:program:`ndnsec-delete` allows to delete security data from both the
|
||||
**Public Info Base (PIB)** and the **Trusted Platform Module (TPM)**.
|
||||
|
||||
By default, :program:`ndnsec-delete` will interpret *name* as an identity name.
|
||||
If an identity is deleted, all keys and certificates belonging to that identity
|
||||
will be deleted as well. If a key is deleted, all certificates associated with
|
||||
that key will be deleted as well.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name and delete the key and its related data.
|
||||
.. option:: -k, --delete-key
|
||||
|
||||
``-c``
|
||||
Interpret ``name`` as a certificate name and delete the certificate.
|
||||
Interpret *name* as a key name and delete the key and its associated data.
|
||||
|
||||
.. option:: -c, --delete-cert
|
||||
|
||||
Interpret *name* as a certificate name and delete the certificate.
|
||||
|
||||
Exit Status
|
||||
-----------
|
||||
@@ -35,11 +35,9 @@ Normally, the exit status is 0 if the requested entity is deleted successfully.
|
||||
If the entity to be deleted does not exist, the exit status is 1.
|
||||
For other errors, the exit status is 2.
|
||||
|
||||
Examples
|
||||
--------
|
||||
Example
|
||||
-------
|
||||
|
||||
Delete all data related to an identity:
|
||||
|
||||
::
|
||||
Delete all data related to an identity::
|
||||
|
||||
$ ndnsec-delete /ndn/test/david
|
||||
@@ -1,43 +0,0 @@
|
||||
ndnsec-dsk-gen
|
||||
==============
|
||||
|
||||
``ndnsec-dsk-gen`` is tool to generate a pair of Data-Signing-Key (DSK) for the specified ``identity``
|
||||
and sign the generated key using the corresponding Key-Signing-Key (KSK).
|
||||
The generated DSK will be set as the default key of the identity.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-dsk-gen [-h] [-t keyType] identity
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-dsk-gen`` creates a pair of Data-Signing-Key (DSK) for the specified ``identity``
|
||||
and sign the generated key using the corresponding Key-Signing-Key (KSK).
|
||||
The tool will first check the default KSK of the identity, and then generate a DSK
|
||||
and sign the DSK using the KSK.
|
||||
The information encoded in the DSK certificate is set the same as the KSK certificate.
|
||||
In the end, the DSK is set as the default key of the identity.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-t keyType``
|
||||
Specify the key type, ``r`` (default) for RSA and ``e`` for ECDSA.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-dsk-gen /ndn/test
|
||||
OK: dsk certificate with name [/ndn/test/KEY/dsk-1417501749768/ID-CERT/%FD%00%00%01J%09%B02%8B] has been successfully installed
|
||||
$ ndnsec-list -c
|
||||
* /ndn/test
|
||||
+->* /ndn/test/dsk-1417501749768
|
||||
+->* /ndn/test/KEY/dsk-1417501749768/ID-CERT/%FD%00%00%01J%09%B02%8B
|
||||
+-> /ndn/test/ksk-1417475325879
|
||||
+->* /ndn/test/KEY/ksk-1417475325879/ID-CERT/%FD%00%00%01J%09%AE.Y
|
||||
@@ -1,44 +1,53 @@
|
||||
ndnsec-export
|
||||
=============
|
||||
|
||||
``ndnsec-export`` is a tool to export an identity's security data
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-export [-h] [-o output] [-p] identity
|
||||
**ndnsec-export** [**-h**] [**-o** *file*] [**-P** *passphrase*]
|
||||
[**-i**\|\ **-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-export`` can export public data of the ``identity`` including default key/certificate.
|
||||
``ndnsec-export`` can also export sensitive data (such as private key), but the sensitive data will
|
||||
be encrypted. The exported identity can be imported again using ``ndnsec-import``.
|
||||
|
||||
By default, the command will write exported data to standard output.
|
||||
:program:`ndnsec-export` exports a certificate from the **Public Info Base (PIB)** and
|
||||
its private key to a file. It will ask for a passphrase to encrypt the private key.
|
||||
The resulting file can be imported again using :program:`ndnsec-import`.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-o output``
|
||||
Output the exported data to a file pointed by ``output``.
|
||||
.. option:: -i, --identity
|
||||
|
||||
``-p``
|
||||
Export private key of the identity. A password will be asked for data encryption.
|
||||
Interpret *name* as an identity name. The default certificate of the identity will be exported.
|
||||
This is the default unless **-k** or **-c** is specified.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -k, --key
|
||||
|
||||
Export an identity's security data including private key and store the security data in a file:
|
||||
Interpret *name* as a key name. The default certificate of the key will be exported.
|
||||
|
||||
::
|
||||
.. option:: -c, --cert
|
||||
|
||||
$ ndnsec-export -o id.info -p /ndn/test/alice
|
||||
Interpret *name* as a certificate name.
|
||||
|
||||
Export an identity's security data without private key and write it to standard output:
|
||||
.. option:: -o <file>, --output <file>
|
||||
|
||||
::
|
||||
Write to the specified output file instead of the standard output.
|
||||
|
||||
$ ndnsec-export /ndn/test/alice
|
||||
.. option:: -P <passphrase>, --password <passphrase>
|
||||
|
||||
Passphrase to use for the export. If empty or not specified, the user is
|
||||
interactively asked to type the passphrase on the terminal. Note that
|
||||
specifying the passphrase via this option is insecure, as it can potentially
|
||||
end up in the shell's history, be visible in :command:`ps` output, and so on.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Export an identity's default certificate and private key into a file::
|
||||
|
||||
$ ndnsec-export -o alice.ndnkey /ndn/test/alice
|
||||
|
||||
Export a specific certificate and its private key to the standard output::
|
||||
|
||||
$ ndnsec-export -c /ndn/edu/ucla/alice/KEY/1%5D%A7g%90%B2%CF%AA/self/%FD%00%00%01r-%D3%DC%2A
|
||||
@@ -1,61 +1,56 @@
|
||||
ndnsec-get-default
|
||||
==================
|
||||
|
||||
``ndnsec-get-default`` is a tool to display the default setting of a particular entity.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-get-default [-h] [-kc] [-i identity|-K key] [-q]
|
||||
**ndnsec-get-default** [**-h**] [**-k**\|\ **-c**] [**-i** *identity*\|\ **-K** *key*] [**-q**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
Given a particular entity, ``ndnsec-get-default`` can display its default setting as specified in
|
||||
options. If ``identity`` is specified, the given entity becomes the identity. If ``key`` is
|
||||
specified, the given identity becomes the key. If no entity is specified, the command will take the
|
||||
system default identity as the given entity.
|
||||
Given a particular entity, :program:`ndnsec-get-default` shows its default settings
|
||||
according to the command-line options. By default, if neither **-i** nor **-K** is
|
||||
given, the command displays the default identity or the default key/certificate of
|
||||
the default identity.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Display the given entity's default key name.
|
||||
.. option:: -k, --default-key
|
||||
|
||||
``-c``
|
||||
Display the given entity's default certificate name.
|
||||
Display the chosen entity's default key name.
|
||||
|
||||
``-i identity``
|
||||
Display default setting of the ``identity``
|
||||
.. option:: -c, --default-cert
|
||||
|
||||
``-K key``
|
||||
Display default setting of the ``key``.
|
||||
Display the chosen entity's default certificate name.
|
||||
|
||||
``-q``
|
||||
Disable trailling new line character.
|
||||
.. option:: -i <identity>, --identity <identity>
|
||||
|
||||
Examples
|
||||
--------
|
||||
Display default settings of *identity*.
|
||||
|
||||
Display an identity's default key name.
|
||||
.. option:: -K <key>, --key <key>
|
||||
|
||||
::
|
||||
Display default settings of *key*.
|
||||
|
||||
.. option:: -q, --quiet
|
||||
|
||||
Disable printing the trailing newline character.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
Display an identity's default key name::
|
||||
|
||||
$ ndnsec-get-default -k -i /ndn/test/alice
|
||||
/ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Display an identity's default certificate name.
|
||||
|
||||
::
|
||||
Display an identity's default certificate name::
|
||||
|
||||
$ ndnsec-get-default -c -i /ndn/test/alice
|
||||
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
|
||||
Display a key's default certificate name.
|
||||
|
||||
::
|
||||
Display a key's default certificate name::
|
||||
|
||||
$ ndnsec-get-default -c -K /ndn/test/alice/ksk-1394129695025
|
||||
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
@@ -1,33 +1,33 @@
|
||||
ndnsec-import
|
||||
=============
|
||||
|
||||
``ndnsec-import`` is a tool to import an identity's security data that is prepared by
|
||||
``ndnsec-export``.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-import [-h] [-p] input
|
||||
**ndnsec-import** [**-h**] [**-P** *passphrase*] *file*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-import`` read data from ``input``. It will ask for password if the input contains private
|
||||
key. If ``input`` is ``-``, security data will be read from standard input.
|
||||
:program:`ndnsec-import` imports a certificate and its private key from a file
|
||||
created by :program:`ndnsec-export`. It will ask for the passphrase used to
|
||||
encrypt the private key.
|
||||
|
||||
If *file* is "-", read from the standard input.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-p``
|
||||
Indicates the imported data containing private key. A password will be asked for data encryption.
|
||||
.. option:: -P <passphrase>, --password <passphrase>
|
||||
|
||||
Examples
|
||||
--------
|
||||
Passphrase to use for the export. If empty or not specified, the user is
|
||||
interactively asked to type the passphrase on the terminal. Note that
|
||||
specifying the passphrase via this option is insecure, as it can potentially
|
||||
end up in the shell's history, be visible in :command:`ps` output, and so on.
|
||||
|
||||
Import an identity's security data including private key:
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
Import a certificate and private key from a file::
|
||||
|
||||
$ ndnsec-import -p input_file
|
||||
$ ndnsec-import alice.ndnkey
|
||||
@@ -1,38 +1,47 @@
|
||||
ndnsec-key-gen
|
||||
==============
|
||||
|
||||
``ndnsec-key-gen`` is tool to generate a pair of key.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-key-gen [-h] [-n] [-d] [-t keyType] identity
|
||||
**ndnsec-key-gen** [**-h**] [**-n**] [**-t** *type*]
|
||||
[**-k** *keyidtype*\|\ **--keyid** *keyid*] *identity*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-key-gen`` creates a key pair for the specified ``identity`` and sets the key as the
|
||||
identity's default key. ``ndnsec-key-gen`` will also create a signing request for the generated key.
|
||||
The signing request will be written to standard output in base64 encoding.
|
||||
:program:`ndnsec-key-gen` generates a key pair for the specified *identity* and
|
||||
sets the generated public key as the identity's default key.
|
||||
:program:`ndnsec-key-gen` will also create a signing request for the generated key.
|
||||
The signing request will be written to the standard output in base64 encoding.
|
||||
|
||||
By default, it will also set the identity as the system default identity.
|
||||
By default, it will also set the identity as the user's default identity.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-n``
|
||||
Do not set the identity as the system default identity.
|
||||
.. option:: -n, --not-default
|
||||
|
||||
``-d``
|
||||
Generate Data-Signing-Key (DSK) instead of the default Key-Signing-Key (KSK).
|
||||
Do not set the identity as the user's default identity.
|
||||
|
||||
``-t keyType``
|
||||
Specify the key type. ``r`` (default) for RSA key. ``e`` for ECDSA key.
|
||||
Note that if no other identity/key/certificate exists, then the identity
|
||||
will become the default regardless of this option.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -t <type>, --type <type>
|
||||
|
||||
Type of key to generate. "r" for RSA, "e" for ECDSA (the default).
|
||||
|
||||
.. option:: -k <keyidtype>, --keyid-type <keyidtype>
|
||||
|
||||
Type of KeyId for the generated key. "r" for a 64-bit random number (the default
|
||||
unless **--keyid** is specified), "h" for the SHA-256 of the public key.
|
||||
|
||||
.. option:: --keyid <keyid>
|
||||
|
||||
User-specified KeyId. Must be a non-empty generic name component.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
|
||||
@@ -1,24 +1,20 @@
|
||||
ndnsec-list
|
||||
===========
|
||||
|
||||
``ndnsec-list`` is a tool to display entities stored in **Public Information Base (PIB)**, such as
|
||||
identities, keys, and certificates.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-list [-h] [-KkCc]
|
||||
**ndnsec-list** [**-h**] [**-k**\|\ **-c**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-list`` lists names of all the entities according to the granularity specified in options
|
||||
(The default granularity is identity). The default entities will be marked with ``*`` in front of
|
||||
their names. For example:
|
||||
:program:`ndnsec-list` prints the names of all the entities stored in the
|
||||
**Public Information Base (PIB)**, such as identities, keys, and certificates,
|
||||
up to the given granularity level. By default, only the identity names are
|
||||
shown. The default entities will be marked with a "*" in front of their names.
|
||||
|
||||
::
|
||||
For example::
|
||||
|
||||
$ ndnsec list
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
@@ -26,24 +22,23 @@ their names. For example:
|
||||
/ndn/test/bob
|
||||
/ndn/test/alice
|
||||
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-K, -k``
|
||||
Display key names for each identity. The key name with ``*`` in front is the default key name of
|
||||
the corresponding identity.
|
||||
.. option:: -k, --key
|
||||
|
||||
``-C, -c``
|
||||
Display certificate names for each key. The certificate name with ``*`` in front is the default
|
||||
certificate name of the corresponding key.
|
||||
Display key names for each identity. The key name with a "*" in front is
|
||||
the default key name of the corresponding identity.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -c, --cert
|
||||
|
||||
Display all the key names in PIB.
|
||||
Display certificate names for each key. The certificate name with a "*"
|
||||
in front is the default certificate name of the corresponding key.
|
||||
|
||||
::
|
||||
Example
|
||||
-------
|
||||
|
||||
Display all the key names in PIB::
|
||||
|
||||
$ ndnsec-list -k
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
@@ -59,9 +54,7 @@ Display all the key names in PIB.
|
||||
/ndn/test/alice
|
||||
+->* /ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Display all the certificate names in PIB.
|
||||
|
||||
::
|
||||
Display all the certificate names in PIB::
|
||||
|
||||
$ ndnsec-list -c
|
||||
* /ndn/edu/ucla/cs/yingdi
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
ndnsec-set-acl
|
||||
==============
|
||||
|
||||
``ndnsec-set-acl`` is a tool to add an application into access control list of an private key.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-set-acl [-h] keyName appPath
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-set-acl`` will add the application pointed by ``appPath`` into the ACL of a key with name
|
||||
``keyName``.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Add an application into a key's ACL:
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-set-acl /ndn/test/alice/ksk-1394129695025 /test/app/path
|
||||
@@ -1,49 +1,43 @@
|
||||
ndnsec-set-default
|
||||
==================
|
||||
|
||||
``ndnsec-set-default`` is a tool to change the default security settings.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-set-default [-h] [-k|c] name
|
||||
**ndnsec-set-default** [**-h**] [**-k**\|\ **-c**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
By default, ``ndnsec-set-default`` takes ``name`` as an identity name and sets the identity as the
|
||||
system default identity.
|
||||
:program:`ndnsec-set-default` allows changing the default security settings.
|
||||
|
||||
Without any options, *name*, which must be an identity name, is set as the
|
||||
default identity for the current user.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Set default key. ``name`` should be a key name, ``ndnsec-set-default`` can infer the corresponding
|
||||
identity and set the key as the identity's default key.
|
||||
.. option:: -k, --default-key
|
||||
|
||||
``-c``
|
||||
Set default certificate. ``name`` should be a certificate name, ``ndnsec-set-default`` can
|
||||
infer the corresponding key name and set the certificate as the key's default certificate.
|
||||
Set *name*, which must be a key name, as the default key for the
|
||||
corresponding identity.
|
||||
|
||||
Examples
|
||||
--------
|
||||
.. option:: -c, --default-cert
|
||||
|
||||
Set a key's default certificate:
|
||||
Set *name*, which must be a certificate name, as the default certificate
|
||||
for the corresponding key.
|
||||
|
||||
::
|
||||
Example
|
||||
-------
|
||||
|
||||
Set a key's default certificate::
|
||||
|
||||
$ ndnsec-set-default -c /ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
|
||||
|
||||
Set an identity's default key:
|
||||
|
||||
::
|
||||
Set an identity's default key::
|
||||
|
||||
$ ndnsec-set-default -k /ndn/test/alice/ksk-1394129695025
|
||||
|
||||
Set system default identity:
|
||||
|
||||
::
|
||||
Set the user's default identity::
|
||||
|
||||
$ ndnsec-set-default /ndn/test/alice
|
||||
@@ -1,37 +1,35 @@
|
||||
ndnsec-sign-req
|
||||
===============
|
||||
|
||||
``ndnsec-sign-req`` is a tool to generate a signing request for a particular key.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-sign-req [-h] [-k] name
|
||||
**ndnsec-sign-req** [**-h**] [**-k**] *name*
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The signing request of a key is actually a self-signed certificate. Given key's information,
|
||||
``ndnsec-sign-req`` looks up the key in PIB. If such a key exists, a self-signed certificate of the
|
||||
key, or its signing request, will be outputed to **stdout** with base64 encoding.
|
||||
:program:`ndnsec-sign-req` generates a signing request for a key.
|
||||
|
||||
By default, ``name`` is interpreted as an identity name. ``ndnsec-sign-req`` will generate a
|
||||
signing request for the identity's default key.
|
||||
The signing request of a key is actually a self-signed certificate. Given the
|
||||
key's information, :program:`ndnsec-sign-req` looks up the key in the PIB.
|
||||
If such a key exists, a self-signed certificate for the key, i.e. its signing
|
||||
request, is written to the standard output in base64 encoding.
|
||||
|
||||
By default, *name* is interpreted as an identity name, and the signing request
|
||||
will be generated for that identity's default key.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
``-k``
|
||||
Interpret ``name`` as a key name.
|
||||
.. option:: -k, --key
|
||||
|
||||
Examples
|
||||
--------
|
||||
Interpret *name* as a key name, instead of an identity name.
|
||||
|
||||
Create a signing request for an identity's default key.
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
Create a signing request for an identity's default key::
|
||||
|
||||
$ ndnsec-sign-req /ndn/test/david
|
||||
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTk4Mzg5MjU3
|
||||
@@ -52,10 +50,7 @@ Create a signing request for an identity's default key.
|
||||
0wHjvDS1cuIH2j6XveoUYapRjZXaEZqB/YoBwRqEYq2KVn/ol5knLM6FIISXXjxn
|
||||
cIh62A==
|
||||
|
||||
|
||||
Create a signing request for a particular key.
|
||||
|
||||
::
|
||||
Create a signing request for a particular key::
|
||||
|
||||
$ ndnsec-sign-req -k /ndn/test/david/ksk-1396913058196
|
||||
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTEzMDU4MTk2
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
ndnsec-unlock-tpm
|
||||
=================
|
||||
|
||||
``ndnsec-unlock-tpm`` is a tool to (temporarily) unlock the **Trusted Platform Module (TPM)** that
|
||||
manages private keys.
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-unlock-tpm [-h]
|
||||
ndnsec-unlock-tpm [**-h**]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
``ndnsec-unlock-tpm`` will ask for password to unlock the TPM.
|
||||
:program:`ndnsec-unlock-tpm` can be used to (temporarily) unlock the
|
||||
**Trusted Platform Module (TPM)** that manages private keys.
|
||||
+46
-64
@@ -1,89 +1,71 @@
|
||||
ndnsec
|
||||
======
|
||||
|
||||
``ndnsec`` is a command-line toolkit to perform various NDN security management
|
||||
operation.
|
||||
:program:`ndnsec` is a command-line toolkit to perform various NDN security
|
||||
management operations.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
**ndnsec** *command* [*argument*]...
|
||||
|
||||
$ ndnsec <command> [<args>]
|
||||
|
||||
or alternatively
|
||||
|
||||
::
|
||||
|
||||
$ ndnsec-command [<args>]
|
||||
**ndnsec-**\ *command* [*argument*]...
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The NDN security data are stored and managed in two places: **Public Information Base** and
|
||||
**Trusted Platform Module**. ``ndnsec`` toolkit provides a command-line interface of managing and
|
||||
using the NDN security data.
|
||||
The NDN security data are stored in two places: **Public Information Base**
|
||||
(PIB) and **Trusted Platform Module** (TPM). The :program:`ndnsec` toolkit
|
||||
provides a command-line interface for managing and using the NDN security data.
|
||||
|
||||
ndnsec commands
|
||||
---------------
|
||||
Commands
|
||||
--------
|
||||
|
||||
ndnsec-list_
|
||||
Display information in PublicInfo.
|
||||
list_
|
||||
List all known identities/keys/certificates.
|
||||
|
||||
ndnsec-get-default_
|
||||
Get default setting info.
|
||||
get-default_
|
||||
Show the default identity/key/certificate.
|
||||
|
||||
ndnsec-set-default_
|
||||
Configure default setting.
|
||||
set-default_
|
||||
Change the default identity/key/certificate.
|
||||
|
||||
ndnsec-key-gen_
|
||||
Generate a Key-Signing-Key for an identity.
|
||||
delete_
|
||||
Delete an identity/key/certificate.
|
||||
|
||||
ndnsec-dsk-gen_
|
||||
Generate a Data-Signing-Key (DSK) for an identity and sign the DSK using the corresponding KSK.
|
||||
key-gen_
|
||||
Generate a key for an identity.
|
||||
|
||||
ndnsec-sign-req_
|
||||
sign-req_
|
||||
Generate a certificate signing request.
|
||||
|
||||
ndnsec-cert-gen_
|
||||
Generate an identity certificate.
|
||||
cert-gen_
|
||||
Create a certificate for an identity.
|
||||
|
||||
ndnsec-cert-dump_
|
||||
Dump a certificate from PublicInfo.
|
||||
cert-dump_
|
||||
Export a certificate.
|
||||
|
||||
ndnsec-cert-install_
|
||||
Install a certificate into PublicInfo.
|
||||
cert-install_
|
||||
Import a certificate from a file.
|
||||
|
||||
ndnsec-delete_
|
||||
Delete identity/key/certificate.
|
||||
export_
|
||||
Export an identity as a SafeBag.
|
||||
|
||||
ndnsec-export_
|
||||
Export an identity package.
|
||||
import_
|
||||
Import an identity from a SafeBag.
|
||||
|
||||
ndnsec-import_
|
||||
Import an identity package.
|
||||
unlock-tpm_
|
||||
Unlock the TPM.
|
||||
|
||||
ndnsec-set-acl_
|
||||
Configure ACL of a private key.
|
||||
|
||||
ndnsec-unlock-tpm_
|
||||
Unlock Tpm.
|
||||
|
||||
ndnsec-op-tool_
|
||||
Operator tool.
|
||||
|
||||
.. _ndnsec-list: ndnsec-list.html
|
||||
.. _ndnsec-get-default: ndnsec-get-default.html
|
||||
.. _ndnsec-set-default: ndnsec-set-default.html
|
||||
.. _ndnsec-key-gen: ndnsec-key-gen.html
|
||||
.. _ndnsec-dsk-gen: ndnsec-dsk-gen.html
|
||||
.. _ndnsec-sign-req: ndnsec-sign-req.html
|
||||
.. _ndnsec-cert-gen: ndnsec-cert-gen.html
|
||||
.. _ndnsec-cert-dump: ndnsec-cert-dump.html
|
||||
.. _ndnsec-cert-install: ndnsec-cert-install.html
|
||||
.. _ndnsec-delete: ndnsec-delete.html
|
||||
.. _ndnsec-export: ndnsec-export.html
|
||||
.. _ndnsec-import: ndnsec-import.html
|
||||
.. _ndnsec-set-acl: ndnsec-set-acl.html
|
||||
.. _ndnsec-unlock-tpm: ndnsec-unlock-tpm.html
|
||||
.. _ndnsec-op-tool: ndnsec-op-tool.html
|
||||
.. _list: ndnsec-list.html
|
||||
.. _get-default: ndnsec-get-default.html
|
||||
.. _set-default: ndnsec-set-default.html
|
||||
.. _delete: ndnsec-delete.html
|
||||
.. _key-gen: ndnsec-key-gen.html
|
||||
.. _sign-req: ndnsec-sign-req.html
|
||||
.. _cert-gen: ndnsec-cert-gen.html
|
||||
.. _cert-dump: ndnsec-cert-dump.html
|
||||
.. _cert-install: ndnsec-cert-install.html
|
||||
.. _export: ndnsec-export.html
|
||||
.. _import: ndnsec-import.html
|
||||
.. _unlock-tpm: ndnsec-unlock-tpm.html
|
||||
@@ -1,52 +0,0 @@
|
||||
tlvdump
|
||||
=======
|
||||
|
||||
``tlvdump`` is a simple application allowing to decode structure of TLV-encoded packet.
|
||||
|
||||
Deprecated
|
||||
----------
|
||||
|
||||
tlvdump is deprecated and will be removed in a future release of ndn-cxx.
|
||||
Please use ``ndn-dissect`` program from ndn-tools repository `<https://github.com/named-data/ndn-tools>`__.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
::
|
||||
|
||||
tlvdump [filename]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
If filename is specified, ``tlvdump`` will attempt to read and decode content of the file,
|
||||
otherwise data will be read from standard input.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
$ tlvdump interest.tlv
|
||||
5 (Interest) (size: 89)
|
||||
7 (Name) (size: 20)
|
||||
8 (NameComponent) (size: 5) [[local]]
|
||||
8 (NameComponent) (size: 3) [[ndn]]
|
||||
8 (NameComponent) (size: 6) [[prefix]]
|
||||
9 (Selectors) (size: 55)
|
||||
13 (MinSuffixComponents) (size: 1) [[%01]]
|
||||
14 (MaxSuffixComponents) (size: 1) [[%01]]
|
||||
28 (KeyLocatorDigest) (size: 22)
|
||||
7 (Name) (size: 20)
|
||||
8 (NameComponent) (size: 4) [[test]]
|
||||
8 (NameComponent) (size: 3) [[key]]
|
||||
8 (NameComponent) (size: 7) [[locator]]
|
||||
16 (Exclude) (size: 20)
|
||||
8 (NameComponent) (size: 4) [[alex]]
|
||||
8 (NameComponent) (size: 4) [[xxxx]]
|
||||
19 (Any) (size: 0) [[...]]
|
||||
8 (NameComponent) (size: 4) [[yyyy]]
|
||||
17 (ChildSelector) (size: 1) [[%01]]
|
||||
10 (Nonce) (size: 1) [[%01]]
|
||||
11 (Scope) (size: 1) [[%01]]
|
||||
12 (InterestLifetime) (size: 2) [[%03%E8]]
|
||||
@@ -1,86 +1,45 @@
|
||||
{#
|
||||
named_data_theme/layout.html
|
||||
~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#}
|
||||
{% extends "basic/layout.html" %}
|
||||
{%- extends "agogo/layout.html" %}
|
||||
|
||||
{% block header %}
|
||||
<!--headercontainer-->
|
||||
<div id="header_container">
|
||||
|
||||
<!--header-->
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<div id="logo">
|
||||
<a href="http://named-data.net" title="A Future Internet Architecture"><img src="http://named-data.net/wp-content/uploads/cropped-20130722_Logo2.png" alt="" /></a>
|
||||
</div><!--logo end-->
|
||||
</div>
|
||||
|
||||
<!--top menu-->
|
||||
<div class="nine columns" id="menu_container" >
|
||||
<h1><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></h1>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="three columns">
|
||||
<p class="logo"><a href="https://named-data.net" title="A Future Internet Architecture">
|
||||
<img class="logo" src="{{ pathto('_static/ndn-logo.svg', 1)|e }}" alt="Logo" width="210"/>
|
||||
</a></p>
|
||||
</div>
|
||||
</div><!--header container end-->
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content-wrapper">
|
||||
<div class="content">
|
||||
<div class="document">
|
||||
{%- block document %}
|
||||
{{ super() }}
|
||||
{%- endblock %}
|
||||
<div id="menu_container" class="nine columns">
|
||||
<h1><a href="{{ pathto(master_doc)|e }}">{{ shorttitle|e }}</a></h1>
|
||||
</div>
|
||||
<div class="sidebar">
|
||||
{%- block sidebartoc %}
|
||||
<h3>{{ _('Table Of Contents') }}</h3>
|
||||
{{ toctree(includehidden=True) }}
|
||||
|
||||
<h3>{{ _('Developer documentation') }}</h3>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API documentation (doxygen)</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
|
||||
</ul>
|
||||
{%- endblock %}
|
||||
|
||||
{%- block sidebarsearch %}
|
||||
<h3 style="margin-top: 1.5em;">{{ _('Search') }}</h3>
|
||||
<form class="search" action="{{ pathto('search') }}" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="{{ _('Go') }}" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
{{ _('Enter search terms or a module, class or function name.') }}
|
||||
</p>
|
||||
{%- endblock %}
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{%- block sidebartoc %}
|
||||
<h3>{{ _('Table of Contents') }}</h3>
|
||||
{{ toctree(includehidden=True) }}
|
||||
<h3>{{ _('Developer Documentation') }}</h3>
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API Documentation (doxygen)</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
|
||||
</ul>
|
||||
{%- endblock %}
|
||||
|
||||
{% block footer %}
|
||||
<div id="footer-container">
|
||||
<!--footer container-->
|
||||
<div class="row">
|
||||
</div><!-- footer container-->
|
||||
</div>
|
||||
|
||||
<div id="footer-info">
|
||||
<!--footer container-->
|
||||
<div class="row">
|
||||
<div class="twelve columns">
|
||||
|
||||
<div id="copyright">This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank>">CNS-1040868</a>)<br/><br/><a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="twelve columns">
|
||||
<div id="copyright">
|
||||
This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank">CNS-1040868</a>).<br/><br/>
|
||||
Licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.
|
||||
</div>
|
||||
</div>
|
||||
</div><!--footer info end-->
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block relbar1 %}{% endblock %}
|
||||
{% block relbar2 %}{% endblock %}
|
||||
@@ -1,459 +0,0 @@
|
||||
* {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
html { font-size: 62.5%; }
|
||||
|
||||
body {
|
||||
font-family: {{ theme_bodyfont }};
|
||||
background-color: {{ theme_bgcolor }};
|
||||
color: #777;
|
||||
border-top: 4px solid #fd7800;
|
||||
}
|
||||
|
||||
body { background: white; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1; color: #222222; position: relative; -webkit-font-smoothing: antialiased; }
|
||||
|
||||
/* Page layout */
|
||||
|
||||
div.header, div.content, div.footer {
|
||||
width: 90%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
div.header-wrapper {
|
||||
background: {{ theme_headerbg }};
|
||||
border-bottom: 3px solid #2e3436;
|
||||
}
|
||||
|
||||
|
||||
/* Default body styles */
|
||||
a {
|
||||
color: {{ theme_linkcolor }};
|
||||
}
|
||||
|
||||
div.bodywrapper a, div.footer a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.clearer {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.left {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.line-block {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.line-block .line-block {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 1.5em;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: {{ theme_headerfont }};
|
||||
font-weight: normal;
|
||||
color: {{ theme_headercolor2 }};
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: {{ theme_headercolor1 }};
|
||||
}
|
||||
|
||||
h2 {
|
||||
padding-bottom: .5em;
|
||||
border-bottom: 1px solid {{ theme_headercolor2 }};
|
||||
}
|
||||
|
||||
a.headerlink {
|
||||
visibility: hidden;
|
||||
color: #dddddd;
|
||||
padding-left: .3em;
|
||||
}
|
||||
|
||||
h1:hover > a.headerlink,
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
h4:hover > a.headerlink,
|
||||
h5:hover > a.headerlink,
|
||||
h6:hover > a.headerlink,
|
||||
dt:hover > a.headerlink {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
div.admonition {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding: 2px 7px 1px 7px;
|
||||
border-left: 0.2em solid black;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
margin: 0px 10px 5px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dt:target, .highlighted {
|
||||
background-color: #fbe54e;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
div.header {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
div.header .headertitle {
|
||||
font-family: {{ theme_headerfont }};
|
||||
font-weight: normal;
|
||||
font-size: 180%;
|
||||
letter-spacing: .08em;
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
div.header .headertitle a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.header div.rel {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
div.header div.rel a {
|
||||
color: {{ theme_headerlinkcolor }};
|
||||
letter-spacing: .1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
p.logo {
|
||||
float: right;
|
||||
}
|
||||
|
||||
img.logo {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Content */
|
||||
div.content-wrapper {
|
||||
background-color: white;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 70%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div.body {
|
||||
padding-right: 2em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.document h1 {
|
||||
line-height: 120%;
|
||||
}
|
||||
|
||||
div.document ul {
|
||||
margin-left: 1.5em;
|
||||
list-style-type: square;
|
||||
}
|
||||
|
||||
div.document dd {
|
||||
margin-left: 1.2em;
|
||||
margin-top: .4em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.document .section {
|
||||
margin-top: 1.7em;
|
||||
}
|
||||
div.document .section:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
div.document div.highlight {
|
||||
padding: 3px;
|
||||
background-color: #eeeeec;
|
||||
border-top: 2px solid #dddddd;
|
||||
border-bottom: 2px solid #dddddd;
|
||||
margin-bottom: .8em;
|
||||
}
|
||||
|
||||
div.document h2 {
|
||||
margin-top: .7em;
|
||||
}
|
||||
|
||||
div.document p {
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
div.document li.toctree-l1 {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.document .descname {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.document .docutils.literal {
|
||||
background-color: #eeeeec;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
div.document .docutils.xref.literal {
|
||||
background-color: transparent;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.document ol {
|
||||
margin: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
div.sidebar {
|
||||
width: 20%;
|
||||
float: right;
|
||||
font-size: .9em;
|
||||
}
|
||||
|
||||
div.sidebar a, div.header a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.sidebar a:hover, div.header a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.sidebar h3 {
|
||||
color: #2e3436;
|
||||
text-transform: uppercase;
|
||||
font-size: 130%;
|
||||
letter-spacing: .1em;
|
||||
}
|
||||
|
||||
div.sidebar ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1 a {
|
||||
display: block;
|
||||
padding: 1px;
|
||||
border: 1px solid #dddddd;
|
||||
background-color: #eeeeec;
|
||||
margin-bottom: .4em;
|
||||
padding-left: 3px;
|
||||
color: #2e3436;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l2 a {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
margin-left: 1em;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l3 a {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
margin-left: 2em;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l2:last-child a {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1.current a {
|
||||
border-right: 5px solid {{ theme_headerlinkcolor }};
|
||||
}
|
||||
|
||||
div.sidebar li.toctree-l1.current li.toctree-l2 a {
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
div.sidebar input[type="text"] {
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.sidebar input[type="submit"] {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
|
||||
/* Footer */
|
||||
|
||||
div.footer-wrapper {
|
||||
background: {{ theme_footerbg }};
|
||||
border-top: 4px solid #babdb6;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
min-height: 80px;
|
||||
}
|
||||
|
||||
div.footer, div.footer a {
|
||||
color: #888a85;
|
||||
}
|
||||
|
||||
div.footer .right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.footer .left {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
|
||||
/* Styles copied from basic theme */
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left;
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right;
|
||||
float: right;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* -- search page ----------------------------------------------------------- */
|
||||
|
||||
ul.search {
|
||||
margin: 10px 0 0 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul.search li {
|
||||
padding: 5px 0 5px 20px;
|
||||
background-image: url(file.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 7px;
|
||||
}
|
||||
|
||||
ul.search li a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.search li div.context {
|
||||
color: #888;
|
||||
margin: 2px 0 0 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul.keywordmatches li.goodmatch a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- index page ------------------------------------------------------------ */
|
||||
|
||||
table.contentstable {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
table.contentstable p.biglink {
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
a.biglink {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
span.linkdescr {
|
||||
font-style: italic;
|
||||
padding-top: 5px;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
/* -- general index --------------------------------------------------------- */
|
||||
|
||||
table.indextable td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.indextable dl, table.indextable dd {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
table.indextable tr.pcap {
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
table.indextable tr.cap {
|
||||
margin-top: 10px;
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
img.toggler {
|
||||
margin-right: 3px;
|
||||
margin-top: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* -- viewcode extension ---------------------------------------------------- */
|
||||
|
||||
.viewcode-link {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
float: right;
|
||||
font-family:: {{ theme_bodyfont }};
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
margin: -1px -3px;
|
||||
padding: 0 3px;
|
||||
background-color: #f4debf;
|
||||
border-top: 1px solid #ac9;
|
||||
border-bottom: 1px solid #ac9;
|
||||
}
|
||||
|
||||
td.linenos pre {
|
||||
padding: 5px 0px;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
color: #aaa;
|
||||
margin-top: -10pt;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
@import url("agogo.css");
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: #fafafa;
|
||||
color: #222;
|
||||
line-height: 1.2em;
|
||||
border: 2px solid #C6C9CB;
|
||||
font-size: 1.1em;
|
||||
/* margin: 1.5em 0 1.5em 0; */
|
||||
margin: 0;
|
||||
border-right-style: none;
|
||||
border-left-style: none;
|
||||
}
|
||||
+26
-3
@@ -123,10 +123,10 @@ ul.large li { line-height: 21px; }
|
||||
ol li ul, ol li ol { margin-left: 20px; margin-bottom: 0; }
|
||||
|
||||
/* Blockquotes ---------------------- */
|
||||
blockquote, blockquote p { line-height: 1.5; }
|
||||
blockquote, blockquote p { line-height: 1.5; color: #6f6f6f; }
|
||||
|
||||
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; }
|
||||
blockquote cite { display: block; font-size: 13pt; color: #555555; }
|
||||
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; }
|
||||
blockquote cite { display: block; font-size: 13px; color: #555555; }
|
||||
blockquote cite:before { content: "\2014 \0020"; }
|
||||
blockquote cite a, blockquote cite a:visited { color: #555555; }
|
||||
|
||||
@@ -786,3 +786,26 @@ ul.link-list li a { display: block; }
|
||||
.flex-video.widescreen { padding-bottom: 57.25%; }
|
||||
.flex-video.vimeo { padding-top: 0; }
|
||||
.flex-video iframe, .flex-video object, .flex-video embed, .flex-video video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
|
||||
@media only screen and (max-device-width: 800px), only screen and (device-width: 1024px) and (device-height: 600px), only screen and (width: 1280px) and (orientation: landscape), only screen and (device-width: 800px), only screen and (max-width: 767px) { .flex-video { padding-top: 0; } }
|
||||
|
||||
/* Microformats ---------------------- */
|
||||
ul.vcard { display: inline-block; margin: 0 0 12px 0; border: 1px solid #ddd; padding: 10px; }
|
||||
ul.vcard li { margin: 0; display: block; }
|
||||
ul.vcard li.fn { font-weight: bold; font-size: 15px; font-size: 1.5rem; }
|
||||
|
||||
p.vevent span.summary { font-weight: bold; }
|
||||
p.vevent abbr { cursor: default; text-decoration: none; font-weight: bold; border: none; padding: 0 1px; }
|
||||
|
||||
/* Progress Bar ---------------------- */
|
||||
div.progress { padding: 2px; margin-bottom: 10px; border: 1px solid #cccccc; height: 25px; /* meter */ /* border radii */ }
|
||||
div.progress .meter { background: #fd7800; height: 100%; display: block; width: 50%; }
|
||||
div.progress.secondary .meter { background: #e9e9e9; }
|
||||
div.progress.success .meter { background: #5da423; }
|
||||
div.progress.alert .meter { background: #c60f13; }
|
||||
div.progress.radius { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px; }
|
||||
div.progress.radius .meter { -webkit-border-radius: 2px; -moz-border-radius: 2px; -ms-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; }
|
||||
div.progress.round { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
|
||||
div.progress.round .meter { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
|
||||
|
||||
ul li p { display: inline; }
|
||||
@@ -0,0 +1,75 @@
|
||||
@import "agogo.css";
|
||||
@import "foundation.css";
|
||||
@import "named_data_style.css";
|
||||
|
||||
body, h1, h2, h3, h4, p {
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
|
||||
}
|
||||
|
||||
h1 { font-size: 26px; }
|
||||
h2 { font-size: 20px; }
|
||||
h3 { font-size: 17px; }
|
||||
h4 { font-size: 15px; }
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h2, h3, h4 {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
blockquote p {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
p.logo {
|
||||
float: left;
|
||||
margin: 1px 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
th, td {
|
||||
border: 1px solid #666;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
div.document p {
|
||||
margin: 0.5em 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.document ol,
|
||||
div.document ul {
|
||||
margin: 0 0 0 2em;
|
||||
}
|
||||
|
||||
div.document pre {
|
||||
font-size: 13px;
|
||||
line-height: 1.3;
|
||||
margin: 0;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
div.document table p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.document th p {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.bodywrapper a,
|
||||
div.header a:hover,
|
||||
div.sidebar a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
@@ -0,0 +1,713 @@
|
||||
/* General */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
body {
|
||||
/* background: #ccc;
|
||||
font: normal 12px Verdana, sans-serif;
|
||||
color: #777;
|
||||
line-height:18px; */
|
||||
border-top: 4px solid #fd7800;
|
||||
}
|
||||
|
||||
a {
|
||||
/* color: #000;
|
||||
outline: 0; */
|
||||
}
|
||||
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:active,
|
||||
a:hover {
|
||||
/* color: #ccc; */
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h1 { font-weight: normal; font-size: 24px; line-height: 24px; }
|
||||
h2 { font-weight: normal; font-size: 18px; line-height: 18px; }
|
||||
h3 { font-weight: normal; font-size: 14px; line-height: 14px; }
|
||||
h4 { font-weight: normal; font-size: 12px; line-height: 12px; }
|
||||
|
||||
hr {
|
||||
background-color: #c6c6c6;
|
||||
border:0;
|
||||
height: 1px;
|
||||
margin-bottom: 18px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
div.hr {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr2 {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr hr, div.hr2 hr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0 0 0.5em;
|
||||
line-height:1.6em;
|
||||
}
|
||||
ul {
|
||||
list-style: square;
|
||||
margin: 0 0 18px 0;
|
||||
}
|
||||
ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.5em;
|
||||
}
|
||||
ol ol {
|
||||
list-style:upper-alpha;
|
||||
}
|
||||
ol ol ol {
|
||||
list-style:lower-roman;
|
||||
}
|
||||
ol ol ol ol {
|
||||
list-style:lower-alpha;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
dl {
|
||||
margin:0 0 24px 0;
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
cite,
|
||||
em,
|
||||
i {
|
||||
font-style: italic;
|
||||
border: none;
|
||||
}
|
||||
big {
|
||||
font-size: 131.25%;
|
||||
}
|
||||
ins {
|
||||
background: #FFFFCC;
|
||||
border: none;
|
||||
color: #333;
|
||||
}
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
color: #555;
|
||||
}
|
||||
blockquote {
|
||||
font-style: italic;
|
||||
padding: 0 3em;
|
||||
}
|
||||
blockquote cite,
|
||||
blockquote em,
|
||||
blockquote i {
|
||||
font-style: normal;
|
||||
}
|
||||
pre {
|
||||
background: #f7f7f7;
|
||||
color: #222;
|
||||
line-height: 18px;
|
||||
margin-bottom: 18px;
|
||||
padding: 1.5em;
|
||||
}
|
||||
abbr,
|
||||
acronym {
|
||||
border-bottom: 1px solid #666;
|
||||
cursor: help;
|
||||
}
|
||||
ins {
|
||||
text-decoration: none;
|
||||
}
|
||||
sup,
|
||||
sub {
|
||||
height: 0;
|
||||
line-height: 1;
|
||||
vertical-align: baseline;
|
||||
position: relative;
|
||||
font-size: 10px;
|
||||
}
|
||||
sup {
|
||||
bottom: 1ex;
|
||||
}
|
||||
sub {
|
||||
top: .5ex;
|
||||
}
|
||||
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
dd,
|
||||
pre,
|
||||
hr {
|
||||
margin-bottom:10px;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
pre,
|
||||
kbd,
|
||||
tt,
|
||||
var {
|
||||
font-size: 15px;
|
||||
line-height: 21px;
|
||||
}
|
||||
code {
|
||||
font-size: 13px;
|
||||
}
|
||||
strong,
|
||||
b,
|
||||
dt,
|
||||
th {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
|
||||
/* main_container */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#wrapper {
|
||||
padding: 0px 0px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* header*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search-header{
|
||||
margin-top:15px;
|
||||
padding-bottom:13px;
|
||||
}
|
||||
|
||||
#search-header #search{
|
||||
background: #222;
|
||||
|
||||
}
|
||||
|
||||
#search-header #search #s{
|
||||
background: #222;
|
||||
font-size:12px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
#header_container{
|
||||
padding-bottom: 25px;
|
||||
padding-top: 0px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#header {
|
||||
|
||||
}
|
||||
|
||||
#header2 {
|
||||
|
||||
}
|
||||
|
||||
#content_container{
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#left-col {
|
||||
padding: 10px 20px;
|
||||
padding-left: 0px;
|
||||
background: #fff;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*footer*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
#footer {
|
||||
padding: 5px 20px;
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#footer-container{
|
||||
padding: 5px 20px;
|
||||
background: #303030;
|
||||
border-top: 8px solid #000;
|
||||
font-size:11px;
|
||||
}
|
||||
|
||||
#footer-info {
|
||||
color:#ccc;
|
||||
text-align:left;
|
||||
background: #1b1b1b;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
#footer-info a{
|
||||
text-decoration:none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-info a:hover{
|
||||
color: #ebebeb;
|
||||
}
|
||||
|
||||
#copyright{float: left;}
|
||||
|
||||
.scroll-top {
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
#footer-bar1 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar2 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar3 {
|
||||
}
|
||||
#footer-bar4 {
|
||||
}
|
||||
|
||||
span#follow-box{
|
||||
position: absolute;
|
||||
right: 100px;
|
||||
}
|
||||
|
||||
span#follow-box img{
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
/*logo*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#logo {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo2 {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo img{
|
||||
border: none;
|
||||
}
|
||||
|
||||
#logo2{
|
||||
text-decoration: none;
|
||||
font-size: 42px;
|
||||
letter-spacing: -1pt;
|
||||
font-weight: bold;
|
||||
font-family:arial, "Times New Roman", Times, serif;
|
||||
text-align: left;
|
||||
line-height: 57px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#logo2 a, #slogan{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
#slogan{
|
||||
text-align: left;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
/*search*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search {
|
||||
width:180px;
|
||||
height:28px;
|
||||
border: 1px solid #ccc;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#sidebar #search {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#search #searchsubmit {
|
||||
background:url(images/go-btn.png) no-repeat top right;
|
||||
width:28px;
|
||||
height:28px;
|
||||
border:0px;
|
||||
position:absolute;
|
||||
right: -35px;
|
||||
}
|
||||
|
||||
#search #s {
|
||||
width:170px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#000;
|
||||
display: inline;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*menu bar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#menu_container{
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
/*responsive menu*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/* default style */
|
||||
.selectnav { display: none; }
|
||||
|
||||
/* small screen */
|
||||
@media screen and (max-width: 600px) {
|
||||
.js #nav { display: none; }
|
||||
.js #nav2 { display: none; }
|
||||
.js .selectnav { display: block; }
|
||||
}
|
||||
|
||||
|
||||
/*homepage boxes*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#box_container{
|
||||
padding-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.box-head {
|
||||
float: left;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.box-head img{
|
||||
|
||||
}
|
||||
|
||||
.title-head{
|
||||
padding-top:2px;
|
||||
}
|
||||
|
||||
.title-box{
|
||||
color: #333;
|
||||
line-height: 15px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.title-box h1 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
float: left;
|
||||
padding-top: 10px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* POST */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
.post {
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-shadow{
|
||||
background: url("images/post_shadow.png") no-repeat bottom;
|
||||
height: 9px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.post ol{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.post ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
.post-entry ul { margin: 0 0 10px 10px; }
|
||||
.post-entry ul li {
|
||||
display: block;
|
||||
margin: 5px 0;
|
||||
padding: 0 0 0 20px;
|
||||
/*background: url(images/bullet.png) no-repeat 0 7px;*/
|
||||
}
|
||||
|
||||
.post-entry ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.6em;
|
||||
}
|
||||
.post-entry ol li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.post-entry {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-head {
|
||||
margin-bottom: 5px;
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.post-head h1 a, .post-head h1 {
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
margin: 0px;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-head h1 a:hover {
|
||||
color:#777;
|
||||
}
|
||||
|
||||
|
||||
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
|
||||
margin-bottom: 10px;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-thumb img {
|
||||
border: 0px solid #ebebeb;
|
||||
}
|
||||
|
||||
.post-entry img{
|
||||
margin-bottom: 10px;
|
||||
height:auto;
|
||||
max-width:100% !important;
|
||||
}
|
||||
|
||||
.meta-data{
|
||||
line-height: 16px;
|
||||
padding: 6px 3px;
|
||||
margin-bottom: 3px;
|
||||
font-size: 11px;
|
||||
border-bottom: 1px solid #e9e9e9;
|
||||
}
|
||||
|
||||
.meta-data a{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
.meta-data a:hover{
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.read-more {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-transform: capitalize;
|
||||
cursor: pointer;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.read-more:hover{
|
||||
background: #fff;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.sticky {
|
||||
|
||||
}
|
||||
|
||||
/* content */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#content_container table {
|
||||
border: 1px solid #e7e7e7;
|
||||
margin: 0 -1px 24px 0;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
#content_container tr th,
|
||||
#content_container thead th {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
line-height: 18px;
|
||||
padding: 9px 10px;
|
||||
}
|
||||
#content_container tr td {
|
||||
|
||||
padding: 6px 10px;
|
||||
}
|
||||
#content_container tr.odd td {
|
||||
background: #f2f7fc;
|
||||
}
|
||||
|
||||
/* sidebar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#sidebar {
|
||||
padding:0px 20px 20px 0px;
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar { word-wrap: break-word;}
|
||||
|
||||
/*--navigation--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.navigation {
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
.navigation .alignleft a {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navigation .alignright a {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#nav-single {
|
||||
overflow:hidden;
|
||||
margin-top:20px;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.nav-previous {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.nav-next {
|
||||
float: right;
|
||||
text-align: right;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
/*--slider--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#slider_container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.flex-caption{
|
||||
background: #232323;
|
||||
color: #fff;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
.flexslider p{
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
/*--sub head and breadcrumbs--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#subhead_container{
|
||||
padding: 7px 0px;
|
||||
}
|
||||
|
||||
#subhead h1{
|
||||
color: #000;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
#breadcrumbs {
|
||||
padding-left: 25px;
|
||||
margin-bottom: 15px;
|
||||
color: #9e9e9e;
|
||||
margin:0 auto;
|
||||
width: 964px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#breadcrumbs a{
|
||||
text-decoration: none;
|
||||
color: #9e9e9e;
|
||||
}
|
||||
|
||||
/*Alignments */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.alignleft,
|
||||
img.alignleft {
|
||||
display: inline;
|
||||
float: left;
|
||||
margin-right: 22px;
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.alignright,
|
||||
img.alignright {
|
||||
display: inline;
|
||||
float: right;
|
||||
margin-left: 22px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.aligncenter,
|
||||
img.aligncenter {
|
||||
clear: both;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.alignleft,
|
||||
.alignright,
|
||||
.aligncenter,
|
||||
img.alignleft,
|
||||
img.alignright,
|
||||
img.aligncenter
|
||||
{
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
a img.aligncenter {
|
||||
display:block;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
}
|
||||
@@ -1,813 +0,0 @@
|
||||
@import url("base.css");
|
||||
|
||||
@import url("foundation.css");
|
||||
|
||||
table {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: #fafafa;
|
||||
color: #222;
|
||||
/* line-height: 1.0em; */
|
||||
border: 2px solid #C6C9CB;
|
||||
font-size: 0.9em;
|
||||
/* margin: 1.5em 0 1.5em 0; */
|
||||
margin: 0;
|
||||
border-right-style: none;
|
||||
border-left-style: none;
|
||||
}
|
||||
|
||||
/* General */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:active,
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h1 { font-weight: bold; font-size: 24px; }
|
||||
h2 { font-weight: bold; font-size: 18px; }
|
||||
h3 { font-weight: bold; font-size: 16px; }
|
||||
h4 { font-weight: bold; font-size: 14px; }
|
||||
|
||||
hr {
|
||||
background-color: #c6c6c6;
|
||||
border:0;
|
||||
height: 1px;
|
||||
margin-bottom: 18px;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
div.hr {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr2 {
|
||||
height: 1px;
|
||||
background: #c6c6c6;
|
||||
}
|
||||
|
||||
div.hr hr, div.hr2 hr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0;
|
||||
line-height:1.6em;
|
||||
}
|
||||
ul {
|
||||
list-style: square;
|
||||
margin: 0 0 18px 0;
|
||||
}
|
||||
ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.5em;
|
||||
}
|
||||
ol ol {
|
||||
list-style:upper-alpha;
|
||||
}
|
||||
ol ol ol {
|
||||
list-style:lower-roman;
|
||||
}
|
||||
ol ol ol ol {
|
||||
list-style:lower-alpha;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
dl {
|
||||
margin:0 0 24px 0;
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
cite,
|
||||
em,
|
||||
i {
|
||||
font-style: italic;
|
||||
border: none;
|
||||
}
|
||||
big {
|
||||
font-size: 131.25%;
|
||||
}
|
||||
ins {
|
||||
background: #FFFFCC;
|
||||
border: none;
|
||||
color: #333;
|
||||
}
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
color: #555;
|
||||
}
|
||||
blockquote {
|
||||
padding: 0 3em;
|
||||
}
|
||||
blockquote cite,
|
||||
blockquote em,
|
||||
blockquote i {
|
||||
font-style: normal;
|
||||
}
|
||||
pre {
|
||||
background: #f7f7f7;
|
||||
color: #222;
|
||||
padding: 1.5em;
|
||||
}
|
||||
abbr,
|
||||
acronym {
|
||||
border-bottom: 1px solid #666;
|
||||
cursor: help;
|
||||
}
|
||||
ins {
|
||||
text-decoration: none;
|
||||
}
|
||||
sup,
|
||||
sub {
|
||||
height: 0;
|
||||
line-height: 1;
|
||||
vertical-align: baseline;
|
||||
position: relative;
|
||||
font-size: 10px;
|
||||
}
|
||||
sup {
|
||||
bottom: 1ex;
|
||||
}
|
||||
sub {
|
||||
top: .5ex;
|
||||
}
|
||||
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
dd,
|
||||
hr {
|
||||
margin-bottom:10px;
|
||||
}
|
||||
ul ul,
|
||||
ol ol,
|
||||
ul ol,
|
||||
ol ul {
|
||||
margin-bottom:0;
|
||||
}
|
||||
pre,
|
||||
kbd,
|
||||
tt,
|
||||
var {
|
||||
}
|
||||
code {
|
||||
font-size: 13px;
|
||||
}
|
||||
strong,
|
||||
b,
|
||||
dt,
|
||||
th {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
|
||||
/* main_container */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#wrapper {
|
||||
padding: 0px 0px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* header*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search-header{
|
||||
margin-top:15px;
|
||||
padding-bottom:13px;
|
||||
}
|
||||
|
||||
#search-header #search{
|
||||
background: #222;
|
||||
|
||||
}
|
||||
|
||||
#search-header #search #s{
|
||||
background: #222;
|
||||
font-size:12px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
#header_container{
|
||||
padding-bottom: 25px;
|
||||
padding-top: 0px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#header {
|
||||
|
||||
}
|
||||
|
||||
#header2 {
|
||||
|
||||
}
|
||||
|
||||
#content_container{
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#left-col {
|
||||
padding: 10px 20px;
|
||||
padding-left: 0px;
|
||||
background: #fff;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*footer*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
#footer {
|
||||
padding: 5px 20px;
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
#footer-container{
|
||||
padding: 5px 20px;
|
||||
background: #303030;
|
||||
border-top: 8px solid #000;
|
||||
font-size:11px;
|
||||
}
|
||||
|
||||
#footer-info {
|
||||
color:#ccc;
|
||||
text-align:left;
|
||||
background: #1b1b1b;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
#footer-info a{
|
||||
text-decoration:none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-info a:hover{
|
||||
color: #ebebeb;
|
||||
}
|
||||
|
||||
#copyright{float: left;}
|
||||
|
||||
.scroll-top {
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
#footer-widget{
|
||||
padding: 8px 0px 8px 0px;
|
||||
color:#6f6f6f;
|
||||
}
|
||||
|
||||
#footer-widget #search {
|
||||
width:120px;
|
||||
height:28px;
|
||||
background: #222;
|
||||
margin-left: 0px;
|
||||
position: relative;
|
||||
border: 1px solid #666;
|
||||
}
|
||||
|
||||
#footer-widget #search #s {
|
||||
width:110px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#fff;
|
||||
display: inline;
|
||||
background: #222;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#footer-widget #calendar_wrap {
|
||||
padding: 8px 0px;
|
||||
}
|
||||
|
||||
#footer-widget #wp-calendar td{
|
||||
padding:2px;
|
||||
}
|
||||
|
||||
|
||||
#footer-widget .textwidget {
|
||||
padding: 5px 0px;
|
||||
line-height: 23px;
|
||||
}
|
||||
|
||||
|
||||
#footer-widget .widget_tag_cloud a{
|
||||
text-decoration: none;
|
||||
margin: 5px;
|
||||
line-height: 24px;
|
||||
margin-left: 0px;
|
||||
color: #6f6f6f;
|
||||
}
|
||||
|
||||
#footer-widget .widget_tag_cloud a:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li a {
|
||||
color:#fd7800;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li a:hover {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container h3 {
|
||||
color: #a5a5a5;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 0px;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 25px;
|
||||
padding-bottom: 8px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#footer-widget .widget-container ul li {
|
||||
padding: 5px 0px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
#footer-widget ul {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
#footer-bar1 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar2 {
|
||||
padding-right: 40px;
|
||||
}
|
||||
#footer-bar3 {
|
||||
}
|
||||
#footer-bar4 {
|
||||
}
|
||||
|
||||
span#follow-box{
|
||||
position: absolute;
|
||||
right: 100px;
|
||||
}
|
||||
|
||||
span#follow-box img{
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
/*logo*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#logo {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo2 {
|
||||
margin: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
#logo img{
|
||||
border: none;
|
||||
}
|
||||
|
||||
#logo2{
|
||||
text-decoration: none;
|
||||
font-size: 42px;
|
||||
letter-spacing: -1pt;
|
||||
font-weight: bold;
|
||||
font-family:arial, "Times New Roman", Times, serif;
|
||||
text-align: left;
|
||||
line-height: 57px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#logo2 a, #slogan{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
#slogan{
|
||||
text-align: left;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
/*search*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#search {
|
||||
width:180px;
|
||||
height:28px;
|
||||
border: 1px solid #ccc;
|
||||
margin-left: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#sidebar #search {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#search #searchsubmit {
|
||||
background:url(images/go-btn.png) no-repeat top right;
|
||||
width:28px;
|
||||
height:28px;
|
||||
border:0px;
|
||||
position:absolute;
|
||||
right: -35px;
|
||||
}
|
||||
|
||||
#search #s {
|
||||
width:170px;
|
||||
height:23px;
|
||||
border:0px;
|
||||
margin-left:7px;
|
||||
margin-right:10px;
|
||||
margin-top:3px;
|
||||
color:#000;
|
||||
display: inline;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*menu bar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#menu_container{
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
/*responsive menu*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/* default style */
|
||||
.selectnav { display: none; }
|
||||
|
||||
/* small screen */
|
||||
@media screen and (max-width: 600px) {
|
||||
.js #nav { display: none; }
|
||||
.js #nav2 { display: none; }
|
||||
.js .selectnav { display: block; }
|
||||
}
|
||||
|
||||
|
||||
/*welcome*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#welcome_container h1{
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
/*homepage boxes*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#box_container{
|
||||
padding-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.box-head {
|
||||
float: left;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.box-head img{
|
||||
|
||||
}
|
||||
|
||||
.title-head{
|
||||
padding-top:2px;
|
||||
}
|
||||
|
||||
.title-box{
|
||||
color: #333;
|
||||
line-height: 15px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.title-box h1 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
float: left;
|
||||
padding-top: 10px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* POST */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
.post {
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-shadow{
|
||||
background: url("images/post_shadow.png") no-repeat bottom;
|
||||
height: 9px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.post ol{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.post ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
.post-entry ul { margin: 0 0 10px 10px; }
|
||||
.post-entry ul li {
|
||||
display: block;
|
||||
margin: 5px 0;
|
||||
padding: 0 0 0 20px;
|
||||
/*background: url(images/bullet.png) no-repeat 0 7px;*/
|
||||
}
|
||||
|
||||
.post-entry ol {
|
||||
list-style: decimal;
|
||||
margin: 0 0 18px 1.6em;
|
||||
}
|
||||
.post-entry ol li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.post-entry {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.post-head {
|
||||
margin-bottom: 5px;
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.post-head h1 a, .post-head h1 {
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
margin: 0px;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-head h1 a:hover {
|
||||
color:#777;
|
||||
}
|
||||
|
||||
|
||||
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
|
||||
margin-bottom: 10px;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
color:#000;
|
||||
font-size: 27px;
|
||||
}
|
||||
|
||||
.post-thumb img {
|
||||
border: 0px solid #ebebeb;
|
||||
}
|
||||
|
||||
.post-entry img{
|
||||
margin-bottom: 10px;
|
||||
height:auto;
|
||||
max-width:100% !important;
|
||||
}
|
||||
|
||||
.meta-data{
|
||||
line-height: 16px;
|
||||
padding: 6px 3px;
|
||||
margin-bottom: 3px;
|
||||
font-size: 11px;
|
||||
border-bottom: 1px solid #e9e9e9;
|
||||
}
|
||||
|
||||
.meta-data a{
|
||||
color: #fd7800;
|
||||
}
|
||||
|
||||
.meta-data a:hover{
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.read-more {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-transform: capitalize;
|
||||
cursor: pointer;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.read-more:hover{
|
||||
background: #fff;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.sticky {
|
||||
|
||||
}
|
||||
|
||||
/* content */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
#content_container table {
|
||||
border: 1px solid #e7e7e7;
|
||||
margin: 0 -1px 24px 0;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
#content_container tr th,
|
||||
#content_container thead th {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
line-height: 18px;
|
||||
padding: 9px 10px;
|
||||
}
|
||||
#content_container tr td {
|
||||
|
||||
padding: 6px 10px;
|
||||
}
|
||||
#content_container tr.odd td {
|
||||
background: #f2f7fc;
|
||||
}
|
||||
|
||||
/* sidebar*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#sidebar {
|
||||
padding:0px 20px 20px 0px;
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar { word-wrap: break-word;}
|
||||
|
||||
|
||||
/*--navigation--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.navigation {
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
|
||||
.navigation .alignleft a {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navigation .alignright a {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#nav-single {
|
||||
overflow:hidden;
|
||||
margin-top:20px;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.nav-previous {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.nav-next {
|
||||
float: right;
|
||||
text-align: right;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
/*--slider--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#slider_container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.flex-caption{
|
||||
background: #232323;
|
||||
color: #fff;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
.flexslider p{
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
/*--sub head and breadcrumbs--*/
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#subhead_container{
|
||||
padding: 7px 0px;
|
||||
}
|
||||
|
||||
#subhead h1{
|
||||
color: #000;
|
||||
padding-top: 10px;
|
||||
padding-left: 0px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
#breadcrumbs {
|
||||
padding-left: 25px;
|
||||
margin-bottom: 15px;
|
||||
color: #9e9e9e;
|
||||
margin:0 auto;
|
||||
width: 964px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#breadcrumbs a{
|
||||
text-decoration: none;
|
||||
color: #9e9e9e;
|
||||
}
|
||||
|
||||
/*Alignments */
|
||||
/*////////////////////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
.alignleft,
|
||||
img.alignleft {
|
||||
display: inline;
|
||||
float: left;
|
||||
margin-right: 22px;
|
||||
margin-top: 9px;
|
||||
}
|
||||
|
||||
.alignright,
|
||||
img.alignright {
|
||||
display: inline;
|
||||
float: right;
|
||||
margin-left: 22px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.aligncenter,
|
||||
img.aligncenter {
|
||||
clear: both;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.alignleft,
|
||||
.alignright,
|
||||
.aligncenter,
|
||||
img.alignleft,
|
||||
img.alignright,
|
||||
img.aligncenter
|
||||
{
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
|
||||
a img.aligncenter {
|
||||
display:block;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
}
|
||||
|
||||
|
||||
table {
|
||||
border-collapse:collapse;
|
||||
}
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 152.13 43.86"><defs><style>.cls-1{fill:#dc9610;}.cls-2{fill:#fff;}.cls-3{fill:#bf4818;}</style></defs><rect class="cls-1" width="87.68" height="22.95" rx="5"/><rect class="cls-1" x="89.93" width="62.2" height="22.95" rx="5"/><path class="cls-2" d="M94.88,4.14h5.28c3.16,0,4.82.55,6.22,2.11a8.1,8.1,0,0,1,1.92,5.47,8.41,8.41,0,0,1-2,5.71c-1.35,1.42-3.08,2-6,2h-5.4Zm5.87,12.37A3.29,3.29,0,0,0,104,15a6.14,6.14,0,0,0,.77-3.24A5.94,5.94,0,0,0,104,8.62a3.09,3.09,0,0,0-3-1.54H98.39v9.43Z" transform="translate(-0.18)"/><path class="cls-2" d="M113.7,16.37l-1,3.08h-3.81l5.45-15.31h4.37l5,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-2" d="M131,19.45h-3.5V7.08h-4.73V4.14h13V7.08H131Z" transform="translate(-0.18)"/><path class="cls-2" d="M139.37,16.37l-1,3.08h-3.81L140,4.14h4.37l4.95,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M10.82,43.52,6.4,35.69l-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29H1.66V28.21H5.3l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M29.23,31.15H21.12v3H28.2v2.71H21.12v3.74h8.25v2.94H17.61V28.21H29.23Z" transform="translate(-0.18)"/><path class="cls-3" d="M39,43.52H35.53V31.15H30.81V28.21H43.75v2.94H39Z" transform="translate(-0.18)"/><path class="cls-3" d="M49,43.52l-4.2-15.31h3.48L50,35.07c.3,1.29.47,2,.86,3.81.26-1.74.42-2.66.66-3.81L53,28.21h3.36l1.45,7c.31,1.51.47,2.34.68,3.69.14-.66.4-1.9.79-3.69l1.73-7h3.48L60.11,43.52H56.84l-1.43-6.38c-.35-1.59-.67-3.24-.77-4-.3,1.65-.49,2.64-.79,4l-1.47,6.38Z" transform="translate(-0.18)"/><path class="cls-3" d="M80.76,36c0,4.66-3.15,7.87-7.71,7.87s-7.73-3.21-7.73-8a7.92,7.92,0,0,1,2.4-6A7.73,7.73,0,0,1,73,27.87C77.72,27.87,80.76,31.06,80.76,36ZM69,35.85C69,39,70.5,41,73.05,41s4-1.91,4-5S75.6,30.78,73,30.78,69,32.68,69,35.85Z" transform="translate(-0.18)"/><path class="cls-3" d="M86.88,43.52H83.45V28.21h6.79c2,0,3.13.25,4.07.92a3.81,3.81,0,0,1,1.49,3.21A3.59,3.59,0,0,1,93.21,36c1.54.48,2.08,1.28,2.2,3.3l.11,2.18a3.24,3.24,0,0,0,.63,2H92.72c-.42-.32-.54-.55-.58-1.33L92,40.1c-.14-1.88-1-2.71-2.78-2.71H86.88Zm3.43-8.84c1.29,0,2-.64,2-1.77s-.7-1.76-2-1.76H86.88v3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M112.65,43.52h-4.21l-4.72-6.93L102.27,38v5.49H98.84V28.21h3.43v5.65l5.26-5.65h4.6l-6.07,6Z" transform="translate(-0.18)"/><path class="cls-3" d="M117.83,43.52h-3.5V28.21h3.5Z" transform="translate(-0.18)"/><path class="cls-3" d="M130.28,43.52l-4.41-7.83-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29h-3.2V28.21h3.64l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M151,35.05v8.47h-2.1l-.49-2c-1.08,1.65-2.41,2.29-4.67,2.29-4.42,0-7.13-3-7.13-7.89s3-8.1,7.57-8.1a6.48,6.48,0,0,1,6.71,5l-3.39.2a3.13,3.13,0,0,0-3.3-2.27c-2.52,0-4.08,1.88-4.08,5,0,3.3,1.51,5.28,4.06,5.28A3.71,3.71,0,0,0,148,37.87h-3.81V35.05Z" transform="translate(-0.18)"/><path class="cls-2" d="M14.72,19.45,10.3,11.62l-1.61-3c.05.8.05,1.38.05,1.84,0,.82,0,1.72,0,2.68v6.29H5.56V4.14H9.2l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V4.14h3.21V19.45Z" transform="translate(-0.18)"/><path class="cls-2" d="M24.82,16.37l-1,3.08H20L25.47,4.14h4.38L34.8,19.45h-4L30,16.37Zm2.76-8.81-1.89,6h3.52Z" transform="translate(-0.18)"/><path class="cls-2" d="M42.43,19.45,40.27,11.3c-.16-.69-.3-1.17-.39-1.49-.12-.48-.14-.57-.28-1,0,.55,0,.94,0,1.19l0,1.47v8H36.46V4.14H41.4l2,8c.31,1.19.57,2.46.75,3.47a4.72,4.72,0,0,0,.1-.49l.25-1c.05-.28.14-.62.24-1s.23-1,.23-1l2-8h4.89V19.45h-3.2v-8l0-1.47a11.79,11.79,0,0,1,.05-1.19c-.26.92-.42,1.54-.49,1.74-.14.42-.21.72-.24.74l-2.13,8.17Z" transform="translate(-0.18)"/><path class="cls-2" d="M66.81,7.08H58.7v3h7.08v2.71H58.7v3.74H67v2.94H55.19V4.14H66.81Z" transform="translate(-0.18)"/><path class="cls-2" d="M69.53,4.14h5.28c3.15,0,4.81.55,6.22,2.11a8.09,8.09,0,0,1,1.91,5.47,8.41,8.41,0,0,1-2,5.71c-1.36,1.42-3.09,2-6,2H69.53Zm5.86,12.37A3.29,3.29,0,0,0,78.59,15a6,6,0,0,0,.78-3.24,6,6,0,0,0-.75-3.16,3.11,3.11,0,0,0-3-1.54H73v9.43Z" transform="translate(-0.18)"/></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@@ -1,15 +1,12 @@
|
||||
[theme]
|
||||
inherit = agogo
|
||||
stylesheet = named_data_style.css
|
||||
# pygments_style = sphinx
|
||||
|
||||
theme_bodyfont = "normal 12px Verdana, sans-serif"
|
||||
theme_bgcolor = "#ccc"
|
||||
|
||||
theme_documentwidth = "100%"
|
||||
theme_textalign = "left"
|
||||
stylesheet = named_data.css
|
||||
|
||||
[options]
|
||||
|
||||
stickysidebar = true
|
||||
collapsiblesidebar = true
|
||||
pagewidth = 90%
|
||||
documentwidth = 70%
|
||||
sidebarwidth = 20%
|
||||
bgcolor = white
|
||||
headerbg = none
|
||||
footerbg = none
|
||||
textalign = left
|
||||
@@ -1,70 +0,0 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
# Based on http://doughellmann.com/2010/05/09/defining-custom-roles-in-sphinx.html
|
||||
|
||||
"""Integration of Sphinx with Redmine.
|
||||
"""
|
||||
|
||||
from docutils import nodes, utils
|
||||
from docutils.parsers.rst.roles import set_classes
|
||||
|
||||
def redmine_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
|
||||
"""Link to a Redmine issue.
|
||||
|
||||
Returns 2 part tuple containing list of nodes to insert into the
|
||||
document and a list of system messages. Both are allowed to be
|
||||
empty.
|
||||
|
||||
:param name: The role name used in the document.
|
||||
:param rawtext: The entire markup snippet, with role.
|
||||
:param text: The text marked with the role.
|
||||
:param lineno: The line number where rawtext appears in the input.
|
||||
:param inliner: The inliner instance that called us.
|
||||
:param options: Directive options for customization.
|
||||
:param content: The directive content for customization.
|
||||
"""
|
||||
try:
|
||||
issue_num = int(text)
|
||||
if issue_num <= 0:
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
msg = inliner.reporter.error(
|
||||
'Redmine issue number must be a number greater than or equal to 1; '
|
||||
'"%s" is invalid.' % text, line=lineno)
|
||||
prb = inliner.problematic(rawtext, rawtext, msg)
|
||||
return [prb], [msg]
|
||||
app = inliner.document.settings.env.app
|
||||
node = make_link_node(rawtext, app, 'issues', str(issue_num), options)
|
||||
return [node], []
|
||||
|
||||
def make_link_node(rawtext, app, type, slug, options):
|
||||
"""Create a link to a Redmine resource.
|
||||
|
||||
:param rawtext: Text being replaced with link node.
|
||||
:param app: Sphinx application context
|
||||
:param type: Link type (issue, changeset, etc.)
|
||||
:param slug: ID of the thing to link to
|
||||
:param options: Options dictionary passed to role func.
|
||||
"""
|
||||
#
|
||||
try:
|
||||
base = app.config.redmine_project_url
|
||||
if not base:
|
||||
raise AttributeError
|
||||
except AttributeError, err:
|
||||
raise ValueError('redmine_project_url configuration value is not set (%s)' % str(err))
|
||||
#
|
||||
slash = '/' if base[-1] != '/' else ''
|
||||
ref = base + slash + type + '/' + slug + '/'
|
||||
set_classes(options)
|
||||
node = nodes.reference(rawtext, 'Issue #' + utils.unescape(slug), refuri=ref,
|
||||
**options)
|
||||
return node
|
||||
|
||||
def setup(app):
|
||||
"""Install the plugin.
|
||||
|
||||
:param app: Sphinx application context.
|
||||
"""
|
||||
app.add_role('issue', redmine_role)
|
||||
app.add_config_value('redmine_project_url', None, 'env')
|
||||
return
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
release-notes/release-notes-0.7.1.rst
|
||||
@@ -17,17 +17,17 @@ The current features include:
|
||||
- **Base**
|
||||
|
||||
+ Fully asynchronous, event-driven communication model, which is implemented using `Boost.Asio
|
||||
<http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
|
||||
+ Single-threaded, but thread-safe Face operations
|
||||
|
||||
A single Face object can be safely used in multiple threads to express Interests and
|
||||
publish Data packets
|
||||
|
||||
+ Explicit time management for NDN operations using `Boost.Chrono
|
||||
<http://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
|
||||
+ Simplified and extended `NDN API <doxygen/annotated.html>`_
|
||||
+ Extensive set of unit-tests based on `Boost.Test framework
|
||||
<http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
|
||||
<https://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
|
||||
|
||||
- Continuous integration using an in-house installation of Jenkins build bots and the
|
||||
hosted `Travis CI <https://travis-ci.org/named-data/ndn-cxx>`_ continuous
|
||||
@@ -35,7 +35,7 @@ The current features include:
|
||||
|
||||
- **Wire format**
|
||||
|
||||
+ Full support of `NDN-TLV packet format v0.1 <http://named-data.net/doc/NDN-TLV/0.1/>`_
|
||||
+ Full support of `NDN-TLV packet format v0.1 <https://named-data.net/doc/NDN-packet-spec/0.1/>`_
|
||||
+ Pure C++ implementation of wire encoding/decoding with simple access to wire format
|
||||
of all NDN packet abstractions via ``wireEncode`` and ``wireDecode`` methods
|
||||
|
||||
@@ -49,11 +49,11 @@ The current features include:
|
||||
<https://github.com/named-data/NFD>`_
|
||||
|
||||
- Full support for `NFD management protocols
|
||||
<http://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
|
||||
<https://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
|
||||
information, create and manage NFD Faces, receive NFD Face status change
|
||||
notifications, update StrategyChoice for namespaces, and manage routes in RIB
|
||||
- Support for `LocalControlHeader
|
||||
<http://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
|
||||
<https://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
|
||||
special NDN applications that need low-level control of NDN packet forwarding
|
||||
|
||||
- **Security support**
|
||||
|
||||
@@ -5,25 +5,26 @@ Release date: August 25, 2014
|
||||
|
||||
Changes since version 0.1.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
+ The license under which the library is released is changed to **Lesser GNU Public
|
||||
License version 3.0**.
|
||||
+ The license under which the library is released is changed to the **GNU Lesser
|
||||
General Public License version 3.0**
|
||||
|
||||
+ New ways to use incoming Interest dispatching:
|
||||
|
||||
* New :ndn-cxx:`InterestFilter` abstraction that supports filtering based on name
|
||||
prefixes and regular expressions.
|
||||
|
||||
* Separated :ndn-cxx:`Face::registerPrefix()` and :ndn-cxx:`Face::setInterestFilter()`
|
||||
methods allow distinct operations of registering with the local NDN forwarder and setting
|
||||
* Separate ``Face::registerPrefix()`` and ``Face::setInterestFilter()`` methods
|
||||
allow distinct operations of registering with the local NDN forwarder and setting
|
||||
up application-specific ``OnInterest`` call dispatch using InterestFilters.
|
||||
|
||||
+ Add support for new `NDN naming conventions
|
||||
<http://named-data.net/doc/tech-memos/naming-conventions.pdf>`_ (:issue:`1761`)
|
||||
+ Add support for the `NDN naming conventions (revision 1)
|
||||
<https://named-data.net/publications/techreports/ndn-tr-22-ndn-memo-naming-conventions/>`_
|
||||
(:issue:`1761`)
|
||||
|
||||
- **Security**
|
||||
|
||||
@@ -32,39 +33,37 @@ New features:
|
||||
The new option also allow periodic reloading trust anchors, allowing dynamic trust
|
||||
models.
|
||||
|
||||
+ Added support for multiple signature types to :ndn-cxx:`PublicKey`,
|
||||
:ndn-cxx:`SecPublicInfo` abstractions
|
||||
+ Added support for multiple signature types to ``PublicKey``, ``SecPublicInfo`` abstractions
|
||||
|
||||
+ New :ndn-cxx:`SignatureSha256WithEcdsa` signature type
|
||||
|
||||
+ Updates in :ndn-cxx:`Signature` data structure to reflect changes in `NDN-TLV spec
|
||||
0.1.1 <http://named-data.net/doc/NDN-TLV/0.1.1/>`_
|
||||
0.1.1 <https://named-data.net/doc/NDN-packet-spec/0.1.1/>`_
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
+ :ndn-cxx:`Data::getFullName() <getFullName()>` method to get :ndn-cxx:`Data` packet
|
||||
name with implicit digest
|
||||
+ ``Data::getFullName()`` method to get the Data packet name including the implicit digest
|
||||
|
||||
+ New :ndn-cxx:`Name::getSuccessor()` method to get name successor (:issue:`1677`)
|
||||
+ ``Name::getSuccessor()`` method to get name successor (:issue:`1677`)
|
||||
|
||||
+ New in-wire refreshing of Interest's nonce (:issue:`1758`)
|
||||
|
||||
- **Management**
|
||||
|
||||
+ Support for :ndn-cxx:`ChannelStatus`, :ndn-cxx:`StrategyChoice` datasets
|
||||
+ Support for :ndn-cxx:`ChannelStatus` and :ndn-cxx:`StrategyChoice` datasets
|
||||
|
||||
+ Defining new common Route Origins for NFD RIB management protocol (:issue:`1719`)
|
||||
|
||||
+ New RibEntry and Route data structures for RIB management protocol (:issue:`1764`)
|
||||
+ New ``RibEntry`` and ``Route`` data structures for RIB management protocol (:issue:`1764`)
|
||||
|
||||
+ Add support for RIB flags for setInterestFilter and registerPrefix (:issue:`1842`)
|
||||
+ Add support for RIB flags in ``setInterestFilter()`` and ``registerPrefix()`` (:issue:`1842`)
|
||||
|
||||
- **Miscellaneous tools**
|
||||
|
||||
+ Introduce :ndn-cxx:`Scheduler::cancelAllEvents` to cancel all previously scheduled events
|
||||
(:issue:`1757`)
|
||||
|
||||
+ Introduce :ndn-cxx:`util::EventEmitter`, :ndn-cxx:`util::NotificationSubscriber`,
|
||||
+ Introduce ``util::EventEmitter``, :ndn-cxx:`util::NotificationSubscriber`,
|
||||
:ndn-cxx:`util::NotificationStream`, and :ndn-cxx:`nfd::FaceMonitor` utility classes
|
||||
|
||||
+ Introduce :ndn-cxx:`util::SegmentFetcher` helper class to fetch multi-segmented data
|
||||
@@ -72,10 +71,10 @@ New features:
|
||||
|
||||
- **Build**
|
||||
|
||||
+ enabled support of precompiled headers for clang and gcc compilers to speed up compilation
|
||||
+ Enabled support of precompiled headers for clang and gcc compilers to speed up compilation
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
@@ -85,13 +84,13 @@ Updates and bug fixes:
|
||||
:ndn-cxx:`Face::put` methods (:issue:`1774`)
|
||||
|
||||
+ Cleaning up transport state on communication failure, so Face can try to reconnect
|
||||
in the future.
|
||||
in the future
|
||||
|
||||
+ Fix bug with Face::removePendingInterest (:issue:`1917`)
|
||||
+ Fix bug in ``Face::removePendingInterest`` (:issue:`1917`)
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
+ Nonce field is now encoded as 4-byte uint8_t value, as defined by NDN-TLV spec.
|
||||
+ The Nonce field is now encoded as a 4-byte value, as defined by NDN-TLV spec
|
||||
|
||||
+ Optimized Data packet signing
|
||||
|
||||
@@ -105,30 +104,29 @@ Updates and bug fixes:
|
||||
|
||||
- **Management**
|
||||
|
||||
+ Add link-layer byte counts in FaceStatus data structure (:issue:`1765`)
|
||||
+ Add link-layer byte counts in ``FaceStatus`` data structure (:issue:`1765`)
|
||||
|
||||
- **Security**
|
||||
|
||||
+ Allow user to explicitly specify the cert name prefix before 'KEY' component in
|
||||
``ndnsec-certgen``
|
||||
|
||||
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform with
|
||||
`NDN-TLV specification <http://named-data.net/doc/ndn-tlv/>`_.
|
||||
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform to
|
||||
`NDN-TLV specification <https://named-data.net/doc/NDN-packet-spec/0.1.1/>`_
|
||||
|
||||
+ Add checking of ``Timestamp`` and ``Nonce`` fields in signed Interest within
|
||||
+ Add checking of Timestamp and Nonce fields in signed Interest within
|
||||
:ndn-cxx:`ValidatorConfig`
|
||||
|
||||
+ Allow validator customization using hooks:
|
||||
+ Allow validator customization using hooks.
|
||||
|
||||
Sub-classes of :ndn-cxx:`Validator` class can use the following hooks to fine-tune the
|
||||
validation process:
|
||||
|
||||
* :ndn-cxx:`Validator::preCertificateValidation <preCertificateValidation>` to
|
||||
process received certificate before validation.
|
||||
* :ndn-cxx:`Validator::onTimeout <onTimeout>` to process interest timeout
|
||||
* :ndn-cxx:`Validator::afterCheckPolicy <afterCheckPolicy>` to process validation requests.
|
||||
* ``preCertificateValidation`` to process received certificate before validation
|
||||
* ``onTimeout`` to process interest timeout
|
||||
* ``afterCheckPolicy`` to process validation requests
|
||||
|
||||
+ Fix memory issues in :ndn-cxx:`SecPublicInfoSqlite3`
|
||||
+ Fix memory issues in ``SecPublicInfoSqlite3``
|
||||
|
||||
- **Miscellaneous tools**
|
||||
|
||||
@@ -138,8 +136,8 @@ Updates and bug fixes:
|
||||
|
||||
- Other minor fixes and corrections
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``SignatureSha256`` class, use :ndn-cxx:`DigestSha256` instead.
|
||||
|
||||
@@ -156,17 +154,17 @@ Deprecated:
|
||||
|
||||
- ``name::Component::toEscapedString`` method, use :ndn-cxx:`name::Component::toUri` instead.
|
||||
|
||||
- ``SecPublicInfo::addPublicKey`` method, use :ndn-cxx:`SecPublicInfo::addKey` instead.
|
||||
- ``SecPublicInfo::addPublicKey`` method, use ``SecPublicInfo::addKey`` instead.
|
||||
|
||||
- ``Tlv::ConentType`` constant (typo), use ``Tlv::ContentType`` instead.
|
||||
|
||||
- ``CommandInterestGenerator`` and ``CommandInterestValidator`` utility classes.
|
||||
:ndn-cxx:`ValidatorConfig` should be used instead.
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- support of ndnd-tlv (only NFD management protocol is supported now)
|
||||
- Support for ndnd-tlv (only NFD management protocol is supported now)
|
||||
|
||||
- ``SecPublicInfoMemory`` and ``SecTpmMemory`` classes that were no longer used
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: February 2, 2015
|
||||
|
||||
Changes since version 0.2.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Build**
|
||||
|
||||
@@ -85,8 +85,8 @@ New features:
|
||||
|
||||
+ New NetworkMonitor helper to detect network state changes (:issue:`2443`)
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Base**
|
||||
|
||||
@@ -198,8 +198,8 @@ Updates and bug fixes:
|
||||
|
||||
- Other minor fixes and corrections
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``ndn::ptr_lib`` and ``ndn::func_lib`` namespace aliases
|
||||
|
||||
@@ -216,8 +216,8 @@ Deprecated:
|
||||
|
||||
- ``EventEmitter`` is deprecated in favor of ``Signal``
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- FaceFlags APIs (:issue:`1992`)
|
||||
|
||||
|
||||
@@ -5,20 +5,20 @@ Release date: March 3, 2015
|
||||
|
||||
Changes since version 0.3.0:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **Management**
|
||||
|
||||
- Add isConnected() in :ndn-cxx:`signal::Connection` and :ndn-cxx:`signal::ScopedConnection`
|
||||
(:issue:`2308`)
|
||||
|
||||
- Extend :ndn-cxx:`DummyClientFace` to process :ndn-cxx:`LocalControlHeader` (:issue:`2510`)
|
||||
- Extend :ndn-cxx:`DummyClientFace` to process ``LocalControlHeader`` (:issue:`2510`)
|
||||
|
||||
- Add CachingPolicy to :ndn-cxx:`LocalControlHeader` (:issue:`2183`)
|
||||
- Add CachingPolicy to ``LocalControlHeader`` (:issue:`2183`)
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **Wire encoding**
|
||||
|
||||
@@ -51,8 +51,8 @@ Updates and bug fixes:
|
||||
- Explicitly define ``_GLIBCXX_USE_NANOSLEEP``, necessary for gcc < 4.8 in some environments
|
||||
(:issue:`2499`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Delete deprecated ``Block(std::istream&)`` constructor (:issue:`2241`)
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: May 12, 2015
|
||||
|
||||
Changes since version 0.3.1:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Add Link abstraction (:issue:`2587`)
|
||||
|
||||
@@ -18,8 +18,8 @@ New features:
|
||||
* In-memory PIB implementation
|
||||
* Define new abstraction for identity, key, and certificate
|
||||
|
||||
Updates and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updates and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Enable decoding Exclude containing ImplicitSha256DigestComponent (:issue:`2629`)
|
||||
|
||||
@@ -35,13 +35,13 @@ Updates and bug fixes:
|
||||
|
||||
- Disable precompiled headers on OS X with clang < 6.1.0 (:issue:`2804`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- `Block::fromBuffer` overloads with output parameter (:issue:`2553`)
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Delete deprecated Controller functions:
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: July 1, 2015
|
||||
|
||||
Changes since version 0.3.2:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Allow compilation of ndn-cxx as a shared library (:issue:`2243`)
|
||||
|
||||
@@ -41,8 +41,8 @@ New features:
|
||||
* ``makeStringBlock``
|
||||
* ``readString``
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Use C++11 lambda expression and smart pointers in Face implementation (:issue:`2112`)
|
||||
|
||||
@@ -72,8 +72,8 @@ Improvements and bug fixes:
|
||||
restrictive move operation (`move_if_noexcept`) is used (e.g., in STL library's containers)
|
||||
(:issue:`2966`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- The following ``KeyChain::sign*`` methods, in favor of generalized ``KeyChain::sign(..., SigningInfo)``
|
||||
|
||||
@@ -101,23 +101,23 @@ Deprecated:
|
||||
* ``CommandOptions::setSigningIdentity``
|
||||
* ``CommandOptions::setSigningCertificate``
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Remove SCOPE from Interests and all references to it in the related code (:issue:`2345`)
|
||||
|
||||
- Direct FIB management in Face class (:issue:`2533`)
|
||||
- Direct FIB management in Face class (:issue:`2533`).
|
||||
|
||||
``Face::register`` and ``Face::setInterestFilter`` methods now only support NFD RIB management
|
||||
protocol.
|
||||
|
||||
For special needs, FIB management can be implemented using ``nfd::Controller``
|
||||
(``start<FibAddNextHopCommand>``, and ``start<FibRemoveNextHopCommand>``)
|
||||
(``start<FibAddNextHopCommand>`` and ``start<FibRemoveNextHopCommand>``).
|
||||
|
||||
Upcoming features (partially finished in development branches):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Upcoming features (partially finished in development branches)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- NDNLPv2 (http://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
|
||||
- NDNLPv2 (https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
|
||||
:issue:`2879`, :issue:`2763`, :issue:`2883`, :issue:`2841`, :issue:`2866`)
|
||||
|
||||
- New NDN certificate format (:issue:`2861`, :issue:`2868`)
|
||||
|
||||
@@ -5,8 +5,8 @@ Release date: August 31, 2015
|
||||
|
||||
Changes since version 0.3.3:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- By default, library is now compiled as a shared library (:issue:`2867`)
|
||||
|
||||
@@ -26,8 +26,8 @@ New features:
|
||||
- New Dispatcher class to simplify server-side implementation of NFD management protocol
|
||||
(:issue:`2107`)
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Fix compilation error with Boost 1.59 (:issue:`3128`)
|
||||
|
||||
@@ -44,8 +44,8 @@ Improvements and bug fixes:
|
||||
|
||||
- Add ability to create ``util::Digest`` object from ``std::istream&`` (:issue:`3022`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- The following methods of ``CommandOptions`` class in favor of ``getSigningInfo`` and
|
||||
``setSigningInfo`` methods (:issue:`2893`):
|
||||
@@ -61,8 +61,8 @@ Deprecated:
|
||||
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
|
||||
SigningInfo parameter (:issue:`2932`)
|
||||
|
||||
Upcoming features (partially implemented in development branches):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Upcoming features (partially implemented in development branches)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
ndn-cxx version 0.4.0
|
||||
---------------------
|
||||
|
||||
Release date: TBD
|
||||
Release date: December 31, 2015
|
||||
|
||||
.. note::
|
||||
Version 0.4.0 introduces several breaking changes to API and wire format of management protocols
|
||||
|
||||
Changes since version 0.3.4:
|
||||
|
||||
New features:
|
||||
^^^^^^^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **(breaking change)** LocalControlHeader for special signaling between application and NFD has
|
||||
been replaced with NDNLPv2 signaling (:issue:`2879`, :issue:`2930`)
|
||||
@@ -24,8 +24,20 @@ New features:
|
||||
|
||||
- Emulate ``std::to_string`` on platforms that do not provide it (:issue:`2743`)
|
||||
|
||||
Improvements and bug fixes:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
- New API in Face class to remove all pending Interests (:issue:`3300`)
|
||||
|
||||
- Ability to choose signing parameters (a specific certificate, the default certificate for
|
||||
a key, or the default certificate for the default key) using a specially URI string
|
||||
(:issue:`3281`)
|
||||
|
||||
- Ability to create Face with custom IO service and default transport (:issue:`2500`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **(breaking change)** SegmentFetcher helper changed to use asynchronous data validation (:issue:`2734`)
|
||||
|
||||
- Support Interest Nack in nfd::Controller (:issue:`3264`)
|
||||
|
||||
- Fix bug causing failure of Face if there is a large delay between construction of Face and calling processEvents
|
||||
(:issue:`2742`, :issue:`2526`)
|
||||
@@ -34,8 +46,8 @@ Improvements and bug fixes:
|
||||
|
||||
- Minor documentation updates (:issue:`3207`, :issue:`3210`, :issue:`3221`)
|
||||
|
||||
Deprecated:
|
||||
^^^^^^^^^^^
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
|
||||
SigningInfo parameter (:issue:`2932`)
|
||||
@@ -43,13 +55,19 @@ Deprecated:
|
||||
- tlvdump tool (:issue:`3196`). Use ``ndn-dissect`` program from ndn-tools repository
|
||||
`<https://github.com/named-data/ndn-tools>`__
|
||||
|
||||
Removed:
|
||||
^^^^^^^^
|
||||
- ndn::util::makeDummyClientFace, use ndn::util::DummyClientFace constructors directly
|
||||
(:issue:`3146`)
|
||||
|
||||
- ndn::util::DummyClientFace::sentDatas, use ndn::util::DummyClientFace.sentData instead
|
||||
(:issue:`3146`)
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Deprecated EventEmitter class (:issue:`2351`)
|
||||
|
||||
Planned features for future releases:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Planned features for future releases
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
ndn-cxx version 0.4.1
|
||||
---------------------
|
||||
|
||||
Release date: March 25, 2016
|
||||
|
||||
Changes since version 0.4.0:
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Improved support for ECDSA signatures (:issue:`3438`, :issue:`3439`)
|
||||
|
||||
- Support for MustBeFresh selector processing in InMemoryStorage (:issue:`3274`)
|
||||
|
||||
- Use InMemoryStorage for StatusDataset and Notification produced by managers based on
|
||||
Dispatcher class (:issue:`2182`)
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Deprecated ``tlvdump`` command-line tool (use ``ndn-dissect`` tool from `NDN Essential Tools
|
||||
<https://github.com/named-data/ndn-tools>`__ instead
|
||||
|
||||
Planned features for future releases
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Introduce new API to simplify security transformations (:issue:`3009`)
|
||||
|
||||
- NDN trust schema as a description of application trust model, which can help automate data
|
||||
and interest packet signing and authentication (:issue:`2829`)
|
||||
|
||||
- Refactored KeyChain abstraction (:issue:`2926`)
|
||||
@@ -0,0 +1,152 @@
|
||||
ndn-cxx version 0.5.0
|
||||
---------------------
|
||||
|
||||
Release date: October 4, 2016
|
||||
|
||||
.. note::
|
||||
As of version 0.5.0, ndn-cxx requires a modern compiler (gcc >= 4.8.2, clang >= 3.4) and a
|
||||
relatively new version of Boost libraries (>= 1.54). This means that the code no longer compiles
|
||||
with the packaged version of gcc and boost libraries on Ubuntu 12.04. ndn-cxx can still be
|
||||
compiled on such systems, but requires separate installation of a newer version of the compiler
|
||||
(e.g., clang-3.4) and dependencies.
|
||||
|
||||
.. note::
|
||||
The library now has a dependency on OpenSSL >= 1.0.1
|
||||
|
||||
Changes since version 0.4.1:
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- New transformation API (:issue:`3009`)
|
||||
|
||||
* base64 and hex encoding/decoding
|
||||
* digest calculation (SHA256)
|
||||
* HMAC calculation
|
||||
* block cipher operations (AES in CBC mode)
|
||||
* public key signing/verification
|
||||
|
||||
- Introduce environment variables to set/override transport, pib, and tpm configurations
|
||||
(:issue:`2925`, :issue:`2514`)
|
||||
|
||||
* ``NDN_CLIENT_TRANSPORT``: equivalent of transport in client.conf
|
||||
* ``NDN_CLIENT_PIB``: equivalent of pib in client.conf
|
||||
* ``NDN_CLIENT_TPM``: equivalent of tpm in client.conf
|
||||
|
||||
Whenever an environment variable is set, it takes precedence over any values specified in the
|
||||
configuration file.
|
||||
|
||||
- Introduce logging facility based on Boost.Log (:issue:`3562`)
|
||||
|
||||
The logging can be enabled on selected moduled at the selected log level through ``NDN_LOG``
|
||||
environment variable. For example,
|
||||
|
||||
::
|
||||
|
||||
export NDN_LOG=ndn.mgmt.Dispatcher=TRACE
|
||||
|
||||
- Introduce ``Name::deepCopy`` to allow memory optimizations when working with ``Name`` objects
|
||||
(:issue:`3618`)
|
||||
|
||||
- New ``ndn::security::CommandInterestValidator`` class (:issue:`2376`)
|
||||
|
||||
- Add ``StatusDataset`` client functionality into ``ndn::nfd::Controller`` (:issue:`3329`)
|
||||
|
||||
- New ``FaceUpdateCommand`` structure for NFD management protocols (:issue:`3232`)
|
||||
|
||||
- **breaking change** Add Flags and Mask fields to faces/create and faces/update, add Flags field to
|
||||
FaceStatus (:issue:`3731`, :issue:`3732`)
|
||||
|
||||
- New ``SafeBag`` structure for private key export/import (:issue:`3048`)
|
||||
|
||||
- ``ndn::io::loadBlock`` and ``saveBlock`` (:issue:`3741`)
|
||||
|
||||
- Backport of C++17 ``std::clamp`` and ``std::optional`` (:issue:`3636`, :issue:`3753`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- **breaking change** Expose ``ControlResponse`` as part of ``Controller::CommandFailCallback``
|
||||
(:issue:`3739`)
|
||||
|
||||
- **breaking change** Change security constants to corresponding strongly typed enumerations
|
||||
(:issue:`3083`)
|
||||
|
||||
- Fix ``SegmentFetcher`` restarting from segment 0 upon Nack (:issue:`3554`)
|
||||
|
||||
- Fix support for ``ImplicitSha256Digest`` name component in ``Exclude`` selector
|
||||
(:issue:`3665`)
|
||||
|
||||
- Enable ``KeyChain`` customization in ``DummyClientFace`` (:issue:`3435`)
|
||||
|
||||
- Make ``ValidatorConfig`` to evaluate all checkers inside a rule (:issue:`3645`)
|
||||
|
||||
- Add validation of ``StatusDataset`` and ``ControlCommand`` responses in
|
||||
``ndn::nfd::Controller`` (:issue:`3653`)
|
||||
|
||||
- Enable handling of NACKs in Validator and NotificationSubscriber classes (:issue:`3332`,
|
||||
:issue:`3662`)
|
||||
|
||||
- Several fixes in ``Scheduler`` class (:issue:`3722`, :issue:`3691`)
|
||||
|
||||
- Add option to override ``processEvents`` method in ``DummyClientFace`` class (:issue:`3769`)
|
||||
|
||||
- Several other improvements, including fixes of potential segmentation faults and memory leaks
|
||||
(:issue:`3136`, :issue:`3248`, :issue:`3723`, :issue:`3727`)
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
|
||||
|
||||
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
|
||||
|
||||
- ``ndn::crypto::sha256`` in favor of ``ndn::crypto::computeSha256Digest``
|
||||
|
||||
- ``security/cryptopp.hpp`` header. Use ``security/v1/cryptopp.hpp`` when needed, avoid direct
|
||||
include as CryptoPP dependency will be removed from future versions of the library.
|
||||
|
||||
- ``security/identity-certificate.hpp`` header. Use ``security/v1/identity-certificate.hpp`` instead.
|
||||
|
||||
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
|
||||
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``. When necessary, use
|
||||
``security::v1::PublicKey``, ``security::v1::Certificate``, ``security::v1::IdentityCertificate``,
|
||||
``security::v1::CertificateExtension``, ``security::v1::CertificateSubjectDescription`` instead.
|
||||
The next release will feature :doc:`a new version of NDN Certificate format
|
||||
<../specs/certificate-format>`.
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Previously deprecated LocalControlHeader (:issue:`3755`)
|
||||
|
||||
- Previously deprecated ``makeDummyClientFace`` function, use ``DummyClientFace`` constructors
|
||||
directly (:issue:`3383`)
|
||||
|
||||
- Previously deprecated ``Name::set``, use constructors directly (:issue:`2506`)
|
||||
|
||||
- Previously deprecated ``Block::fromBuffer`` and block helpers (:issue:`2950`, :issue:`2636`)
|
||||
|
||||
* ``Block::fromBuffer`` overloads with output parameter
|
||||
* ``ndn::encoding::prependBlock``
|
||||
* ``ndn::encoding::prependByteArrayBlock``
|
||||
* ``ndn::encoding::nonNegativeIntegerBlock``
|
||||
* ``ndn::encoding::prependBooleanBlock``
|
||||
* ``ndn::encoding::booleanBlock``
|
||||
* ``ndn::encoding::dataBlock``
|
||||
* ``ndn::encoding::nestedBlock``
|
||||
|
||||
- Previously deprecated Command Interest classes (:issue:`2008`)
|
||||
|
||||
* ``CommandInterestGenerator``, replaced by ``KeyChain::sign``
|
||||
* ``ndn::util::CommandInterestValidator``, replaced by
|
||||
``ndn::security::CommandInterestValidator``
|
||||
|
||||
- ndncatchunks3 and ndnputchunks3 apps. Use ndncatchunks and ndnputchunks from `NDN Essential
|
||||
Tools (ndn-tools) <https://github.com/named-data/ndn-tools>`__ (:issue:`3547`)
|
||||
|
||||
- ``ndn::ndn_digestSha256`` function. Use ``ndn::crypto::computeSha256Digest`` instead.
|
||||
|
||||
- **potentially breaking change** Headers ``security/certificate-extension.hpp``,
|
||||
``security/certificate-subject-description.hpp``, and ``security/certificate.hpp``. When necessary,
|
||||
use the corresponding headers in ``security/v1/*`` or ``security/v1/identity-certificate.hpp``.
|
||||
@@ -0,0 +1,104 @@
|
||||
ndn-cxx version 0.5.1
|
||||
---------------------
|
||||
|
||||
Release date: January 25, 2017
|
||||
|
||||
.. note::
|
||||
This is the last release of the library that supports NDN Certificate format version 1 and
|
||||
the existing implementations of validators. The upcoming 0.6.0 release will include
|
||||
multiple breaking changes of the security framework.
|
||||
|
||||
Changes since version 0.5.0:
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Add version 2 of the security framework (introduced in ``security::v2`` namespace)
|
||||
|
||||
* :ref:`NDN Certificate Format Version 2.0 <NDN Certificate Format Version 2.0>`
|
||||
(:issue:`3103`)
|
||||
* New Public Information Base (PIB) and Trusted Program Module (TPM) framework to manage
|
||||
public/private keys and NDN Certificate version 2.0 (:issue:`2948`, :issue:`3202`)
|
||||
* New KeyChain implementation (:issue:`2926`)
|
||||
* New Validator implementation (:issue:`3289`, :issue:`1872`)
|
||||
* New security-supporting utilities: trust anchor container and certificate cache
|
||||
* Creation of `Command Interests
|
||||
<https://redmine.named-data.net/projects/ndn-cxx/wiki/CommandInterest>`__ delegated to
|
||||
:ndn-cxx:`CommandInterestSigner` class, while the new KeyChain only :ref:`signs Interests
|
||||
<Signed Interest>` (:issue:`3912`)
|
||||
|
||||
- Enable validator to fetch certificates directly from the signed/command interest sender
|
||||
(:issue:`3921`)
|
||||
|
||||
- Add UP and DOWN kinds to :ndn-cxx:`FaceEventNotification` (issue:`3794`)
|
||||
|
||||
- Add support for NIC-associated permanent faces in FaceUri (:issue:`3522`)
|
||||
|
||||
- Add support for CongestionMark and Ack NDNLPv2 fields (:issue:`3797`, :issue:`3931`)
|
||||
|
||||
- Add StrategyChoice equality operators and formatted output (:issue:`3903`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Ensure that NACK callback is called for matching Interests, regardless of their nonce
|
||||
(:issue:`3908`)
|
||||
|
||||
- Optimize :ndn-cxx:`name::Component::compare` implementation (:issue:`3807`)
|
||||
|
||||
- Fix memory leak in ndn-cxx:`Regex` (:issue:`3673`)
|
||||
|
||||
- Correct NDNLPv2 rules for whether an unknown field can be ignored (:issue:`3884`)
|
||||
|
||||
- Ensure that port numbers in FaceUri are 16 bits wide
|
||||
|
||||
- Correct ValidityPeriod::isValid check (:issue:`2868`)
|
||||
|
||||
- Fix encoding of type-specific TLV (:issue:`3914`)
|
||||
|
||||
- Rename previously incorrectly named EcdsaKeyParams to EcKeyParams (:issue:`3135`)
|
||||
|
||||
- Various documentation improvements, including ndn-cxx code style updates (:issue:`3795`, :issue:`3857`)
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- Old security framework. All old security framework classes are moved to
|
||||
``ndn::security::v1`` namespace in this release and will be removed in the next release.
|
||||
|
||||
* ``v1::KeyChain``, use :ndn-cxx:`v2::KeyChain` instead
|
||||
|
||||
* ``v1::Validator`` interface and all implementations of this interface (``ValidatorRegex``,
|
||||
``ValidatorConfig``, ``ValidatorNull``). Use :ndn-cxx:`v2::Validator` and the
|
||||
corresponding implementations of :ndn-cxx:`ValidationPolicy` interfaces (will be introduced
|
||||
before 0.6.0 release).
|
||||
|
||||
* ``v1::SecPublicInfo`` and its implementation (``SecPublicInfoSqlite``), ``SecTpm`` and its
|
||||
implementations (``SecTpmFile``, ``SecTpmOsx``). These classes are internal implementation
|
||||
and not intended to be used without ``v1::KeyChain``. :ndn-cxx:`v2::KeyChain` internally
|
||||
uses the newly introduced :ndn-cxx:`Pib` and :ndn-cxx:`Tpm` interfaces with their
|
||||
corresponding implementations.
|
||||
|
||||
* ``v1::Certificate``, ``v1::IdentityCertificate``, ``v1::CertificateExtension``,
|
||||
``v1::CertificateSubjectDescription``, use :ndn-cxx:`v2::Certificate` and
|
||||
:ndn-cxx:`AdditionalDescription`
|
||||
|
||||
* ``v1::SecuredBag``, use ``v2::SafeBag`` instead
|
||||
|
||||
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
|
||||
|
||||
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
|
||||
|
||||
- ``ndn::crypto::sha256`` in favor of ``ndn::crypto::computeSha256Digest``
|
||||
|
||||
- ``security/cryptopp.hpp`` header. Use ``security/v1/cryptopp.hpp`` when needed, avoid direct
|
||||
include as CryptoPP dependency will be removed from future versions of the library.
|
||||
|
||||
- ``security/identity-certificate.hpp`` header. Use ``security/v1/identity-certificate.hpp`` instead.
|
||||
|
||||
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
|
||||
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``. When necessary, use
|
||||
``security::v1::PublicKey``, ``security::v1::Certificate``, ``security::v1::IdentityCertificate``,
|
||||
``security::v1::CertificateExtension``, ``security::v1::CertificateSubjectDescription`` instead.
|
||||
The next release will feature :ref:`a new version of NDN Certificate format
|
||||
<NDN Certificate Format Version 2.0>`.
|
||||
@@ -0,0 +1,153 @@
|
||||
ndn-cxx version 0.6.0
|
||||
---------------------
|
||||
|
||||
Release date: October 16, 2017
|
||||
|
||||
Changes since version 0.5.1:
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- **(breaking change)** Security framework version 2 (:issue:`3098`, :issue:`3920`,
|
||||
:issue:`3644`, :issue:`4085`, :issue:`4323`, :issue:`4339`).
|
||||
|
||||
The released version of the library only supports the new version of the security (v2
|
||||
certificate format) and features a number of updates of KeyChain and Validator
|
||||
interfaces. At the same time, management APIs for :ndn-cxx:`ValidatorConfig` remained
|
||||
intact; transition to the new framework would require only adjusting
|
||||
:ndn-cxx:`Validator::validate` calls and updating configuration files to follow the new
|
||||
naming conventions of :ref:`NDN Certificate Format Version 2.0`.
|
||||
|
||||
- Integration of fetching certificates using Certificate Bundle as part of specialized
|
||||
``CertificateFetcher`` (:issue:`3891`)
|
||||
|
||||
- ``ForwardingHint``, ``Delegation``, and ``DelegationList``; refactoring of Interest encoding
|
||||
to include ``ForwardingHint`` instead of ``LinkObject``, following the latest NDN
|
||||
specification updates (:issue:`4054`, :issue:`4055`)
|
||||
|
||||
- Fine-grained signals on interface/address changes in NetworkMonitor
|
||||
for all supported platforms (:issue:`3353`, :issue:`4025`, :issue:`3817`, :issue:`4024`)
|
||||
|
||||
- Addition of ``TxSequence`` field and ``Ack``, the first repeatable field in
|
||||
NDNLPv2 (:issue:`3931`)
|
||||
|
||||
- Optional ``LocalUri`` as part of ``ControlParameters`` and adjusting face creation command
|
||||
and responses to handle the new optional field (:issue:`4014`, :issue:`4015`, :issue:`3956`)
|
||||
|
||||
- ``LpReliability`` flag in Face management data structures (:issue:`4003`)
|
||||
|
||||
- Backported implementation of C++17 classes ``ostream_joiner`` and ``optional``
|
||||
(:issue:`3962`, :issue:`3753`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Removed dependency on CryptoPP library. All cryptographic operations are now realized using
|
||||
OpenSSL library routines and/or with the help of ``security::transform`` framework
|
||||
(:issue:`3006`, :issue:`3946`, :issue:`3924`, :issue:`3886`).
|
||||
|
||||
- Improved APIs for NFD management data structures, including equality comparators, formatted
|
||||
output, etc. (:issue:`3932`, :issue:`3903`, :issue:`3864`)
|
||||
|
||||
- FaceUri now accepts link-local IPv6 addresses (:issue:`1428`)
|
||||
|
||||
- Rename variables in ``FaceStatus`` and ``ForwarderStatus`` ('datas' => 'data')
|
||||
(:issue:`3955`)
|
||||
|
||||
- Improve logging framework and its uses
|
||||
|
||||
* Add API to enumerate Logger modules (:issue:`4013`)
|
||||
|
||||
* Advanced filtering of the logging modules (:issue:`3918`)
|
||||
|
||||
* Add logging capabilities to ``Face``, ``UnixTransport``, ``TcpTransport``, and the new
|
||||
security framework (:issue:`3563`)
|
||||
|
||||
To enable logging, set environment variable ``NDN_LOG`` to enable specific, subset, or all
|
||||
logging module at appropriate levels. Examples:
|
||||
|
||||
::
|
||||
|
||||
export NDN_LOG=*=ALL
|
||||
export NDN_LOG=ndn.*=ALL
|
||||
export NDN_LOG=ndn.security=DEBUG:ndn.TcpTransport=ALL
|
||||
|
||||
- Ensure that ``Face`` sends ``Nack`` only after every ``InterestCallback`` has responded
|
||||
(:issue:`4228`)
|
||||
|
||||
- Fix potential overflow in ``time::toIsoString`` (:issue:`3915`)
|
||||
|
||||
- Fix potentially misaligned memory accesses (:issue:`4172`, :issue:`4097`, :issue:`4175`,
|
||||
:issue:`4190`, :issue:`4191`)
|
||||
|
||||
- Fix potential memory access error in ``Face/PendingInterest`` (:issue:`4228`)
|
||||
|
||||
- Improvements and streamlining of the ``security::transform`` framework
|
||||
|
||||
- Source/header reorganization (:issue:`3940`)
|
||||
|
||||
* Move network-related files to ``src/net``
|
||||
|
||||
.. note::
|
||||
Namespace changes
|
||||
|
||||
* ndn::util::FaceUri is now ndn::FaceUri
|
||||
* ndn::util::ethernet is now ndn::ethernet
|
||||
* ndn::util::NetworkMonitor and related classes are now in ndn::net
|
||||
|
||||
* Move signal-related files into ``src/util/signal/`` directory, except for
|
||||
the main include ``signal.hpp``
|
||||
|
||||
* Move InMemoryStorage to ``src/ims``
|
||||
|
||||
* Rename ``digest.hpp`` to ``sha256.hpp`` to match the ``Sha256`` class declared within
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Old security framework.
|
||||
|
||||
* ``v1::KeyChain``, use :ndn-cxx:`v2::KeyChain` instead
|
||||
|
||||
* ``v1::Validator`` interface and ``ValidatorRegex`` implementation of this
|
||||
interface. ``ValidatorConfig``, ``ValidatorNull`` implementation refactored to be based on
|
||||
the new validation framework.
|
||||
|
||||
* ``v1::SecPublicInfo`` and its implementation (``SecPublicInfoSqlite``), ``SecTpm`` and its
|
||||
implementations (``SecTpmFile``, ``SecTpmOsx``). These classes are internal implementation
|
||||
and not intended to be used without ``v1::KeyChain``. :ndn-cxx:`v2::KeyChain` internally
|
||||
uses the newly introduced :ndn-cxx:`Pib` and :ndn-cxx:`Tpm` interfaces with their
|
||||
corresponding implementations.
|
||||
|
||||
* ``v1::Certificate``, ``v1::IdentityCertificate``, ``v1::CertificateExtension``,
|
||||
``v1::CertificateSubjectDescription``, use :ndn-cxx:`v2::Certificate` and
|
||||
:ndn-cxx:`AdditionalDescription`
|
||||
|
||||
* ``v1::SecuredBag``, use ``v2::SafeBag`` instead
|
||||
|
||||
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
|
||||
|
||||
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
|
||||
|
||||
- ``security/cryptopp.hpp`` header
|
||||
|
||||
- ``security/identity-certificate.hpp`` header
|
||||
|
||||
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
|
||||
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``.
|
||||
|
||||
- ``Link`` and ``SelectedDelegation`` fields in ``Interest``, replaced by
|
||||
``ForwardingHint`` following the latest version of NDN specification (:issue:`4055`)
|
||||
|
||||
- ``LocalControlHeader`` constants (:issue:`3755`)
|
||||
|
||||
- ``NInDatas`` and ``NOutDatas`` (:issue:`3955`)
|
||||
|
||||
- Overload of ``Block::Block`` that parses a ``Block`` from a ``void*`` buffer
|
||||
|
||||
- Duplicate ``buf()`` and ``get()`` methods from ``Buffer`` class in favor of ``data()``
|
||||
|
||||
- ``util/crypto.hpp``, ``crypto::sha256()``, and ``crypto::computeSha256Digest()`` in favor of
|
||||
``Sha256::computeDigest()``
|
||||
|
||||
- Previously deprecated functions (:issue:`4055`)
|
||||
@@ -0,0 +1,57 @@
|
||||
ndn-cxx version 0.6.1
|
||||
---------------------
|
||||
|
||||
Release date: February 19, 2018
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- (potentially breaking change) :ndn-cxx:`expressInterest` now by default loopbacks Interests to
|
||||
producer callbacks on the same :ndn-cxx:`Face`. When undesired, use
|
||||
``InterestFilter::allowLoopback(false)`` (:issue:`3979`)
|
||||
|
||||
- New signal in :ndn-cxx:`SegmentFetcher` to notify retrieval of Data segments
|
||||
(:issue:`4438`)
|
||||
|
||||
- Initial support for the Content Store management protocol (:issue:`4050`)
|
||||
|
||||
- Literal operators for ``time::duration`` types, such as ``1_s``, ``42_ms``, ``30_days``
|
||||
(:issue:`4468`)
|
||||
|
||||
- Support for BLAKE2 hash function (requires OpenSSL >= 1.1.0)
|
||||
|
||||
- An ``escape()`` helper function complementing the existing ``unescape()`` (:issue:`4484`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- ``ndnsec key-gen`` command line now allows customization of key ID (:issue:`4294`)
|
||||
|
||||
- Fixed encoding of ``'~'`` and ``'+'`` in ``name::Component::toUri()`` (:issue:`4484`)
|
||||
|
||||
- Fixed handling of large dates when converting to/from string (:issue:`4478`, :issue:`3915`)
|
||||
|
||||
- Fixed error handling in ``KeyChain::importSafeBag()`` (:issue:`4359`)
|
||||
|
||||
- Fixed parsing of IPv6 addresses with scope-id (:issue:`4474`)
|
||||
|
||||
- ``io::load()`` now handles empty files properly (:issue:`4434`)
|
||||
|
||||
- Switched to using ``boost::asio::basic_waitable_timer`` (:issue:`4431`)
|
||||
|
||||
- Allow linking multiple :ndn-cxx:`DummyClientFace` instances together to emulate a broadcast
|
||||
medium (:issue:`3913`)
|
||||
|
||||
- Fixed build when ``std::to_string`` is not available (:issue:`4393`)
|
||||
|
||||
- Avoid undefined behavior when casting to :ndn-cxx:`tlv::SignatureTypeValue` (:issue:`4370`)
|
||||
|
||||
- Fixed compilation with Boost 1.66.0 (:issue:`4422`)
|
||||
|
||||
- Various documentation updates
|
||||
(:issue:`3918`, :issue: `4184`, :issue: `4275`)
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Removed obsolete TLV-TYPE constants (:issue:`4055`, :issue:`3098`, :issue: `3755`)
|
||||
@@ -0,0 +1,53 @@
|
||||
ndn-cxx version 0.6.2
|
||||
---------------------
|
||||
|
||||
Release date: May 4, 2018
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Initial support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Recognize typed name components, allow typed name component in ``FinalBlockId``
|
||||
(:issue:`4526`)
|
||||
|
||||
* Recognize Interest in Packet Format v0.3 (:issue:`4527`)
|
||||
|
||||
In this release, ``Interest::wireDecode`` accepts both v0.2 and v0.3 formats, but
|
||||
``Interest::wireEncode`` only encodes into v0.2 format. A future release of the
|
||||
library will switch the encoding to v0.3 format.
|
||||
|
||||
* Recognize Data in Packet Format v0.3 (:issue:`4568`)
|
||||
|
||||
In this release, ``Data::wireDecode`` accepts both v0.2 and v0.3 formats, but
|
||||
``Data::wireEncode`` only encodes into v0.2 format. A future release of the library
|
||||
will switch the encoding to v0.3 format.
|
||||
|
||||
- Library support for cs/erase command of NFD Management (:issue:`4318`)
|
||||
|
||||
- A convenience function to print out ``Block`` structures (:issue:`2225`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Change encoding of NDNLPv2 sequence number from nonNegativeInteger to fixed-width
|
||||
integer (8 bytes in network order) (:issue:`4403`)
|
||||
|
||||
- Fix compilation with Boost 1.67 (:issue:`4584`)
|
||||
|
||||
- Upgrade build environment to latest version of ``waf`` and other improvements
|
||||
|
||||
- Logging system improvements (:issue:`4552`)
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- Selectors (:issue:`4527`)
|
||||
|
||||
NDN Packet Format v0.3 replaces Selectors with ``CanBePrefix`` and ``MustBeFresh`` elements.
|
||||
This commit deprecates getter/setter for Selectors in Interest class. Getter/setter for
|
||||
CanBePrefix and MustBeFresh are mapped to the closest v0.2 semantics and encoded as
|
||||
selectors.
|
||||
|
||||
- ``Data::get/setFinalBlockId()`` in favor of ``Data::get/setFinalBlock()``
|
||||
@@ -0,0 +1,88 @@
|
||||
ndn-cxx version 0.6.3
|
||||
---------------------
|
||||
|
||||
Release date: September 18, 2018
|
||||
|
||||
The build requirements have been upgraded to gcc >= 5.3 or clang >= 3.6, boost >= 1.58,
|
||||
openssl >= 1.0.2. This effectively drops support for all versions of Ubuntu older than 16.04
|
||||
that use distribution-provided compilers and packages.
|
||||
|
||||
The compilation now uses the C++14 standard.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
- Allow applications to declare a default ``CanBePrefix`` setting (:issue:`4581`)
|
||||
|
||||
- Accommodate typed name components in ``Name::getSuccessor`` (:issue:`4570`)
|
||||
|
||||
- Support Parameters element (:issue:`4658`)
|
||||
|
||||
- Recognize alternative type representations in URI syntax (:issue:`4690`)
|
||||
|
||||
- Introduce ``ParametersSha256DigestComponent`` (:issue:`4658`, :issue:`4570`)
|
||||
|
||||
- Prefix announcement object (:issue:`4650`)
|
||||
|
||||
- MTU element in ``ControlParameters`` and ``FaceStatus`` (:issue:`4005`)
|
||||
|
||||
- Enable congestion control features in ``SegmentFetcher`` (:issue:`4364`)
|
||||
|
||||
- ``_block`` literal operator (:issue:`4722`)
|
||||
|
||||
- Add official support for CentOS 7 (:issue:`4610`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Fix a segfault in ``Face::satisfyPendingInterests`` when ``Face::put`` is
|
||||
called in DataCallback (:issue:`4596`)
|
||||
|
||||
- Allow specifying passphrase for ndnsec import/export on the command line (:issue:`4633`)
|
||||
|
||||
- Fix bug preventing customization of KeyChain's TPM on macOS (:issue:`4297`)
|
||||
|
||||
- Fix bug with handling Sha256-signed Command Interests (:issue:`4635`)
|
||||
|
||||
- Eliminate selector usage in ``SegmentFetcher`` (:issue:`4555`)
|
||||
|
||||
- Improvements in ``netlink`` message processing
|
||||
|
||||
- Gracefully handle ``NetworkMonitor`` backend initialization failure (:issue:`4668`)
|
||||
|
||||
- Add support 224-bit and 521-bit NIST elliptic curves, add support for SHA-3 (with
|
||||
openssl >= 1.1.1-pre1), and forbid RSA keys shorter than 2048 bits in security helpers
|
||||
|
||||
- Improve and simplify code with modern C++ features
|
||||
|
||||
- Properly declare move constructors
|
||||
|
||||
- Improve error handling
|
||||
|
||||
- Improve test cases
|
||||
|
||||
- Correct and improve documentation
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``SegmentFetcher::fetch()`` static functions in favor of ``start()`` (:issue:`4464`)
|
||||
|
||||
- ``ndn::ip::address{,V6}FromString`` as Boost.Asio >= 1.58 has proper implementation of
|
||||
``addressFromString``
|
||||
|
||||
- Selectors (:issue:`4527`)
|
||||
|
||||
NDN Packet Format v0.3 replaces Selectors with ``CanBePrefix`` and ``MustBeFresh`` elements.
|
||||
``CanBePrefix`` and ``MustBeFresh`` are currently mapped to the closest v0.2 semantics and
|
||||
encoded as selectors.
|
||||
|
||||
- ``Data::get/setFinalBlockId()`` in favor of ``Data::get/setFinalBlock()``
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- Dependency on Boost.Regex in favor of ``std::regex``
|
||||
@@ -0,0 +1,78 @@
|
||||
ndn-cxx version 0.6.5
|
||||
---------------------
|
||||
|
||||
Release date: February 4, 2019
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version
|
||||
0.3 <https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``NotificationSubscriber`` (:issue:`4664`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
|
||||
|
||||
- Support floating point numbers in TLV-VALUE (:issue:`4612`)
|
||||
|
||||
- Scoped prefix registration, scoped Interest filter, and scoped pending Interest
|
||||
(:issue:`3919`, :issue:`4316`)
|
||||
|
||||
- Counters for satisfied and unsatisfied Interests in ``ForwarderStatus``
|
||||
(:issue:`4720`)
|
||||
|
||||
- ``random::getRandomNumberEngine()`` in the public API
|
||||
|
||||
- ``MetadataObject`` class to encode/decode RDR-style metadata (:issue:`4707`)
|
||||
|
||||
- ``SegmentFetcher::stop()`` (:issue:`4692`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Use openssl-based routines for the PKCS#8 decoding/decryption when exporting key from macOS
|
||||
Keychain (:issue:`4450`)
|
||||
|
||||
- Switch to AES-256 for private key encryption in PKCS #8 export
|
||||
|
||||
- Add exponential backoff in ``CertificateFetcherFromNetwork`` (:issue:`4718`, :issue:`4712`)
|
||||
|
||||
- Throw exception when loading an orphaned ``ValidationPolicyConfig`` (API violation)
|
||||
(:issue:`4758`)
|
||||
|
||||
- Forbid unrecognized TLVs before ``Name`` (:issue:`4667`)
|
||||
|
||||
- Prevent memory pool size from becoming zero in ``InMemoryStorage`` (:issue:`4769`)
|
||||
|
||||
- Clean up fetchers when destructing ``nfd::Controller`` (:issue:`4775`)
|
||||
|
||||
- Fix ``SegmentFetcher`` undefined behavior caused by uncanceled pending interest
|
||||
(:issue:`4770`)
|
||||
|
||||
- Seed the PRNG with more entropy (:issue:`4808`)
|
||||
|
||||
- Stop accepting NonNegativeInteger as sequence number in NDNLP (:issue:`4598`)
|
||||
|
||||
- Backport C++17 ``std::any`` and ``std::variant`` as ``ndn::any`` and ``ndn::variant``
|
||||
|
||||
- Reimplement ``scheduler::EventId`` with ``CancelHandle`` (:issue:`4698`)
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``ndn-cxx/util/scheduler-scoped-event-id.hpp`` header as it is now sufficient to use
|
||||
``ndn-cxx/util/scheduler.hpp`` header (:issue:`4698`)
|
||||
|
||||
- Implicit conversion from nullptr to ``scheduler::EventId`` (:issue:`4698`)
|
||||
|
||||
Removed
|
||||
^^^^^^^
|
||||
|
||||
- ``ndn::ip::address{,V6}FromString``
|
||||
|
||||
- ``SegmentFetcher::fetch`` (:issue:`4464`)
|
||||
|
||||
- ``{get,set}FinalBlockId()``
|
||||
|
||||
- Headers that were already considered internal implementation details have been explicitly
|
||||
moved to a ``detail/`` subdir to more clearly separate private and public headers
|
||||
@@ -0,0 +1,62 @@
|
||||
ndn-cxx version 0.6.6
|
||||
---------------------
|
||||
|
||||
Release date: April 27, 2019
|
||||
|
||||
.. note::
|
||||
This is the last release to support the `NDN packet format version 0.2.1
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.2.1/>`__.
|
||||
The next release will be able to encode and decode only the `v0.3 packet format
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- More support for `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
|
||||
|
||||
* Support new naming conventions to encode/decode segment numbers, byte offsets, versions,
|
||||
timestamps, and sequence numbers based on typed name components (:issue:`4777`)
|
||||
|
||||
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
|
||||
|
||||
- ``NDN_THROW`` macro to throw exceptions including file position and runtime context of the
|
||||
throw statement (:issue:`4834`)
|
||||
|
||||
- Ensure that a ``Block`` with TLV-TYPE zero is treated as invalid (:issue:`4726`, :issue:`4895`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Avoid directly using memory address as ``PendingInterestId`` to prevent potential false
|
||||
removal of an entry (:issue:`2865`)
|
||||
|
||||
- Follow up packet specification changes to rename the ``Parameters`` element to
|
||||
``ApplicationParameters`` and to change its number to be a non-critical element type
|
||||
(:issue:`4658`, :issue:`4780`)
|
||||
|
||||
- Add an option to disable the infrastructure Interest in ``CertificateFetcherDirectFetch``
|
||||
(:issue:`4879`)
|
||||
|
||||
- Fix compilation against recent versions of Boost libraries and issues with Xcode 10.2 and
|
||||
older versions of Boost libraries (:issue:`4890`, :issue:`4923`, :issue:`4860`)
|
||||
|
||||
- Improve the "CanBePrefix unset" warning (:issue:`4581`)
|
||||
|
||||
- Improve documentation
|
||||
|
||||
Deprecated
|
||||
^^^^^^^^^^
|
||||
|
||||
- ``PendingInterestId``, ``RegisteredPrefixId``, and ``InterestFilterId`` types in favor of
|
||||
``PendingInterestHandle``, ``RegisteredPrefixHandle``, and ``InterestFilterHandle``
|
||||
(:issue:`4316`, :issue:`3919`)
|
||||
|
||||
- ``Block::empty`` in favor of ``Block::isValid`` (with inverted semantics)
|
||||
|
||||
- ``Scheduler::scheduleEvent`` and ``Scheduler::cancelEvent`` in favor of ``Scheduler::schedule``
|
||||
and ``EventId::cancel`` (or use ``ScopedEventId`` to automatically cancel the event when
|
||||
the object goes out of scope) (:issue:`4883`)
|
||||
|
||||
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
|
||||
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
|
||||
@@ -0,0 +1,79 @@
|
||||
ndn-cxx version 0.7.0
|
||||
---------------------
|
||||
|
||||
Release date: January 13, 2020
|
||||
|
||||
**Breaking Change**
|
||||
|
||||
This release features support of only `NDN packet format version 0.3
|
||||
<https://named-data.net/doc/NDN-packet-spec/0.3/>`__ (:issue:`4527`, :issue:`4567`,
|
||||
:issue:`4709`, :issue:`4913`). The library encodes and interprets Interest and Data
|
||||
packets only in 0.3 format; support for version 0.2 has been completely removed. In
|
||||
addition, the URI representation of Interest packets has been updated to follow the
|
||||
packet format changes.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- HMAC signing support (:issue:`3075`)
|
||||
|
||||
- Support for ``ParametersSha256DigestComponent`` in ``Name`` and ``Interest`` classes
|
||||
(:issue:`4658`)
|
||||
|
||||
- Encoding/decoding of ``HopLimit`` field in Interest (:issue:`4806`)
|
||||
|
||||
- PIT token (:issue:`4532`).
|
||||
|
||||
PIT token is a hop-by-hop header field that identifies an Interest-Data exchange. The
|
||||
downstream node can assign an opaque token to an outgoing Interest, and the upstream node
|
||||
is expected to return the same token on the Data or Nack in reply to that Interest. This
|
||||
would allow the downstream node to accelerate its processing, especially in PIT lookup.
|
||||
|
||||
- ``io::loadBuffer`` and ``io::saveBuffer`` helper functions
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Various improvements in the Linux implementation of ``NetworkMonitor`` class
|
||||
|
||||
- Rework of ``RttEstimator`` class:
|
||||
|
||||
* split into two classes: ``RttEstimator`` and ``RttEstimatorWithStats`` (:issue:`4887`)
|
||||
* add a getter for the smoothed RTT value (:issue:`4892`)
|
||||
* switch to use ``time::nanoseconds`` (:issue:`4887`)
|
||||
|
||||
- Make use of attributes in logging facilities and generalize logger backend support
|
||||
(:issue:`4969`, :issue:`3782`)
|
||||
|
||||
- Silently accept an empty validation policy instead of throwing an exception (:issue:`5049`)
|
||||
|
||||
- Introduce alternative URI syntax for component types used in naming conventions, with
|
||||
ability to choose between canonical and alternate format (:issue:`4777`)
|
||||
|
||||
- Don't force the generation of an Interest nonce during decoding (:issue:`4685`)
|
||||
|
||||
- Various documentation improvements
|
||||
|
||||
Removals
|
||||
^^^^^^^^
|
||||
|
||||
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
|
||||
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
|
||||
|
||||
- Unused ``KeyClass`` and ``AclType`` enums
|
||||
|
||||
- Unused ``v2::PublicKey`` alias of ``transform::PublicKey``
|
||||
|
||||
- ``HmacFilter`` class, use SignerFilter and VerifierFilter instead
|
||||
|
||||
- Ill-defined equality operators for ``Interest``, ``MetaInfo``, ``Signature`` (:issue:`4569`)
|
||||
|
||||
- Implicit conversion from the ``xyzHandle`` types to ``const xyzId*`` (where ``xyz`` is
|
||||
``PendingInterest``, ``RegisteredPrefixId``, and ``InterestFilterId``)
|
||||
|
||||
- Deprecated ``KeyLocator::Type`` enum
|
||||
|
||||
- Private header files of concrete PIB, TPM, and KeyHandle implementations are no longer
|
||||
installed (:issue:`4782`)
|
||||
|
||||
- Renamed ``util/backports-ostream-joiner.hpp`` to ``util/ostream-joiner.hpp``
|
||||
@@ -0,0 +1,77 @@
|
||||
ndn-cxx version 0.7.1
|
||||
---------------------
|
||||
|
||||
Release date: October 8, 2020
|
||||
|
||||
The build requirements have been increased to require Clang >= 4.0, Xcode >= 9.0, and Python >= 3.6.
|
||||
Meanwhile, it is *recommended* to use GCC >= 7.4.0 and Boost >= 1.65.1.
|
||||
This effectively drops official support for Ubuntu 16.04 when using distribution-provided Boost
|
||||
packages -- ndn-cxx may still work on this platform, but we provide no official support for it.
|
||||
Additionally, this release drops support for CentOS 7 and adds support for CentOS 8.
|
||||
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Signed Interests according to Packet Specification v0.3 (:issue:`4804`)
|
||||
|
||||
- Add "in-order" mode to ``SegmentFetcher`` and a corresponding signal that is emitted after each
|
||||
segment is received and validated in segment order. Segments that arrive out-of-order will be
|
||||
buffered internally until all earlier segments have arrived and passed validation.
|
||||
|
||||
- Allow ``KeyLocator`` to either identify the full name of a certificate, an unversioned certificate
|
||||
prefix, or the name of a public key (without issuer and version) (:issue:`5115`)
|
||||
|
||||
- Allow face MTU to be changed via management (:issue:`5056`)
|
||||
|
||||
Improvements and bug fixes
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Change default key type generated by ndnsec to ECDSA
|
||||
|
||||
- Use named curve when encoding ECDSA public keys (:issue:`5037`)
|
||||
|
||||
- Allow non-default key to be exported for an identity via ``ndnsec-export`` (:issue:`5043`)
|
||||
|
||||
- Fix spurious error message from ``ndnsec-key-gen`` when ``key-id`` is specified (:issue:`5057`)
|
||||
|
||||
- Provide more fine-grained choices for ``name::UriFormat`` (:issue:`4777`)
|
||||
|
||||
- Allow automatic log flushing to be disabled (:issue:`3668`)
|
||||
|
||||
- Avoid unnecessarily invalidating cached wire encodings of Data packets
|
||||
|
||||
- Correct extraction of signed portion of Data packets to be compatible with Packet Specification
|
||||
v0.3 (:issue:`4583`)
|
||||
|
||||
- Fix regression in ``CertificateBundleFetcher`` with ``FinalBlockId`` handling
|
||||
|
||||
- Improve error handling during TPM signing (:issue:`4585`, :issue:`5086`)
|
||||
|
||||
- Correctly handle non-existent identity in ``PibImpl::setDefaultIdentity``
|
||||
|
||||
- Fix incompatibility with ``time::toIsoString`` in Boost 1.73.0+
|
||||
|
||||
- Fix incompatibility with ``<version>`` header in C++20
|
||||
|
||||
- Various fixes for Android
|
||||
|
||||
- Various improvements to documentation, test suite structure, and authors list
|
||||
|
||||
Deprecations
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Deprecate old Signed Interest and Command Interest formats (:issue:`4804`)
|
||||
|
||||
- Deprecate ``Signature`` in favor of ``SignatureInfo`` in Data packets and certificates (:issue:`4804`)
|
||||
|
||||
- ``SignatureInfo::unsetKeyLocator`` and ``SignatureInfo::unsetValidityPeriod`` have been deprecated
|
||||
|
||||
- Header files under ``ndn/security/v2`` have been moved into the main ``ndn/security`` directory
|
||||
|
||||
Removals
|
||||
^^^^^^^^
|
||||
|
||||
- Remove deprecated ``PendingInterestId``, ``InterestFilterId``, and ``RegisteredPrefixId``
|
||||
(:issue:`4885`)
|
||||
|
||||
- Remove a number of long-deprecated functions and enums
|
||||
+97
-18
@@ -1,10 +1,21 @@
|
||||
ndn-cxx Versions
|
||||
++++++++++++++++
|
||||
All ndn-cxx Releases
|
||||
++++++++++++++++++++
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
:maxdepth: 1
|
||||
|
||||
release-notes/release-notes-0.7.1
|
||||
release-notes/release-notes-0.7.0
|
||||
release-notes/release-notes-0.6.6
|
||||
release-notes/release-notes-0.6.5
|
||||
release-notes/release-notes-0.6.3
|
||||
release-notes/release-notes-0.6.2
|
||||
release-notes/release-notes-0.6.1
|
||||
release-notes/release-notes-0.6.0
|
||||
release-notes/release-notes-0.5.1
|
||||
release-notes/release-notes-0.5.0
|
||||
release-notes/release-notes-0.4.1
|
||||
release-notes/release-notes-0.4.0
|
||||
release-notes/release-notes-0.3.4
|
||||
release-notes/release-notes-0.3.3
|
||||
@@ -14,47 +25,115 @@ ndn-cxx Versions
|
||||
release-notes/release-notes-0.2.0
|
||||
release-notes/release-notes-0.1.0
|
||||
|
||||
* **ndn-cxx version 0.7.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.7.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.7.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.1>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.7.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.7.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.7.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.7.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.7.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.0>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.7.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.7.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.6**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.6>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.6/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.6>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.6.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.6.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.5**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.5>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.5/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.5>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.5.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.5.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.4 was skipped**
|
||||
|
||||
* **ndn-cxx version 0.6.3**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.3>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.3/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.3>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.3.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.3.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.2**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.2>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.2/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.2>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.2.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.2.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.1>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.6.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.6.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.6.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.0>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.6.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.6.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.5.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.5.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.5.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.5.1>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.5.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.5.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.5.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.5.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.5.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.5.0>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.5.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.5.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.4.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.4.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.4.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.4.1>`__,
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.4.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.4.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.4.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.4.0>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.4.0/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.4.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.4.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.4.0>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.4.0.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.4.0.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.4.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.4.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.3.4**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.4>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.3.4/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.4>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.3.4/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.4>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.3.4.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.3.4.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.3.4.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.3.4.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.3.3**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.3>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.3.3/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.3>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.3.3/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.3>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.3.3.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.3.3.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.3.3.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.3.3.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.3.2**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.2>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.3.2/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.2>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.3.2/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.2>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.3.2.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.3.2.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.3.2.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.3.2.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.3.1**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.1>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.3.1/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.1>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.3.1/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.1>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.3.1.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.3.1.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.3.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.3.1.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.3.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.0>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.3.0/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.3.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.3.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.0>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.3.0.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.3.0.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.3.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.3.0.tar.bz2.sha256>`__)
|
||||
|
||||
* **ndn-cxx version 0.2.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.2.0>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.2.0/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.2.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.2.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.2.0.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.2.0.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.2.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.2.0.tar.bz2.sha256>`__)
|
||||
|
||||
- ndn-cxx version 0.2.0-rc1
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0-rc1>`__
|
||||
@@ -63,10 +142,10 @@ ndn-cxx Versions
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0-rc2>`__
|
||||
|
||||
* **ndn-cxx version 0.1.0**
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.1.0>`, `Documentation <http://named-data.net/doc/ndn-cxx/0.1.0/>`__)
|
||||
(:doc:`Release Notes <release-notes/release-notes-0.1.0>`, `Documentation <https://named-data.net/doc/ndn-cxx/0.1.0/>`__)
|
||||
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.1.0>`__,
|
||||
`src (tarball) <http://named-data.net/downloads/nfd-0.1.0.tar.bz2>`__ (`checksum <http://named-data.net/downloads/nfd-0.1.0.tar.bz2.sha256>`__)
|
||||
`src (tarball) <https://named-data.net/downloads/nfd-0.1.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/nfd-0.1.0.tar.bz2.sha256>`__)
|
||||
|
||||
- ndn-cxx version 0.1.0-rc1
|
||||
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.1.0-rc1>`__
|
||||
@@ -0,0 +1,10 @@
|
||||
Specifications
|
||||
==============
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
specs/signed-interest
|
||||
specs/certificate-format
|
||||
specs/safe-bag
|
||||
specs/validation-error-code
|
||||
@@ -1,8 +1,8 @@
|
||||
.. _NDN Certificate Format Version 2.0:
|
||||
|
||||
NDN Certificate Format Version 2.0
|
||||
==================================
|
||||
|
||||
.. contents::
|
||||
|
||||
Since signature verification is a common operation in NDN applications, it is
|
||||
important to define a common certificate format to standardize the public key
|
||||
authentication procedure. As every NDN data packet is signed, a data packet
|
||||
@@ -11,7 +11,7 @@ the specification of a data packet is not sufficient to be the specification of
|
||||
a common certificate format, as it requires additional components. For example,
|
||||
a certificate may follow a specific naming convention and may need to include
|
||||
validity period, revocation information, etc. This specification defines
|
||||
naming and components of the NDN certificates and is complementary to NDN packet
|
||||
naming and structure of the NDN certificates and is complementary to NDN packet
|
||||
specification.
|
||||
|
||||
::
|
||||
@@ -24,6 +24,9 @@ specification.
|
||||
|+------------------------+|
|
||||
|| ContentType: KEY(2) ||
|
||||
|+------------------------+|
|
||||
|+------------------------+|
|
||||
|| FreshnessPeriod: >~ 1h ||
|
||||
|+------------------------+|
|
||||
+--------------------------+
|
||||
| Content |
|
||||
|+------------------------+|
|
||||
@@ -41,30 +44,47 @@ specification.
|
||||
| SignatureValue |
|
||||
+--------------------------+
|
||||
|
||||
.. code-block:: abnf
|
||||
|
||||
CertificateV2 = DATA-TYPE TLV-LENGTH
|
||||
Name ; /<NameSpace>/KEY/[KeyId]/[IssuerId]/[Version]
|
||||
MetaInfo ; ContentType == KEY, FreshnessPeriod required
|
||||
Content ; X509PublicKey
|
||||
CertificateV2SignatureInfo
|
||||
SignatureValue
|
||||
|
||||
CertificateV2SignatureInfo = SIGNATURE-INFO-TYPE TLV-LENGTH
|
||||
SignatureType
|
||||
KeyLocator
|
||||
ValidityPeriod
|
||||
*CertificateV2Extension
|
||||
|
||||
|
||||
Name
|
||||
----
|
||||
|
||||
The name of a certificate consists of four parts as shown below:
|
||||
The name of a certificate consists of five parts as shown below::
|
||||
|
||||
::
|
||||
/<SubjectName>/KEY/[KeyId]/[IssuerId]/[Version]
|
||||
|
||||
/<PrincipalName>/[KeyId]/KEY/[Version]
|
||||
A certificate name starts with the subject to which a public key is bound. The following parts
|
||||
include the keyword ``KEY`` component, KeyId, IssuerId, and version components.
|
||||
|
||||
A certificate name starts with the name to which a public key is bound. The
|
||||
second part is a single name component, called KeyId, which should uniquely
|
||||
identify the key under the principal namespace. The value of KeyId is up to
|
||||
the owner of the principal namespace (e.g., SHA-256 digest of the public key,
|
||||
timestamp, or numerical identifier). A special name component ``KEY`` is
|
||||
appended after KeyId, which indicates that the data is a certificate. The last
|
||||
component is version number. For example,
|
||||
``KeyId`` is an opaque name component to identify an instance of the public key for the
|
||||
certificate namespace. The value of `Key ID` is controlled by the namespace owner and can be
|
||||
an 8-byte random number, SHA-256 digest of the public key, timestamp, or a simple numerical
|
||||
identifier.
|
||||
|
||||
::
|
||||
``Issuer Id`` is an opaque name component to identify issuer of the certificate. The value is
|
||||
controlled by the certificate issuer and, similar to KeyId, can be an 8-byte random number,
|
||||
SHA-256 digest of the issuer's public key, or a simple numerical identifier.
|
||||
|
||||
/edu/ucla/cs/yingdi/%03%CD...%F1/KEY/%FD%d2...%8E
|
||||
\_________________/\___________/ \___________/
|
||||
Principal Name Key ID Version
|
||||
For example::
|
||||
|
||||
/edu/ucla/cs/yingdi/KEY/%03%CD...%F1/%9F%D3...%B7/%FD%d2...%8E
|
||||
\_________________/ \___________/ \___________/\___________/
|
||||
Certificate Namespace Key Id Issuer Id Version
|
||||
(Identity)
|
||||
|
||||
MetaInfo
|
||||
--------
|
||||
@@ -83,39 +103,25 @@ By default, the content of a certificate is the public key encoded in
|
||||
SignatureInfo
|
||||
-------------
|
||||
|
||||
Besides, ``SignatureType`` and ``KeyLocator``, the ``SignatureInfo`` field of a
|
||||
certificate include more optional fields.
|
||||
|
||||
::
|
||||
|
||||
SignatureInfo ::= SIGNATURE-INFO-TYPE TLV-LENGTH
|
||||
SignatureType
|
||||
KeyLocator
|
||||
ValidityPeriod?
|
||||
... (SignatureInfo Extension TLVs)
|
||||
|
||||
One optional field is ``ValidityPeriod``, which contains two sub TLV fields:
|
||||
``NotBefore`` and ``NotAfter``, which are two UTC timestamps in ISO 8601 compact
|
||||
format (``yyyymmddTHHMMSS``, e.g., "20020131T235959"). NotBefore indicates
|
||||
when the certificate takes effect while NotAfter indicates when the certificate
|
||||
expires.
|
||||
The SignatureInfo block of a certificate is required to include the ``ValidityPeriod`` field.
|
||||
``ValidityPeriod`` includes two sub TLV fields: ``NotBefore`` and ``NotAfter``, which carry two
|
||||
UTC timestamps in ISO 8601 compact format (``yyyymmddTHHMMSS``, e.g., "20020131T235959").
|
||||
``NotBefore`` indicates when the certificate takes effect while ``NotAfter`` indicates when the
|
||||
certificate expires.
|
||||
|
||||
.. note::
|
||||
Using ISO style string is the convention of specifying validity period of
|
||||
certificate, which has been adopted by many certificate systems, such as
|
||||
X.509, PGP, and DNSSEC.
|
||||
Using ISO style string is the convention of specifying the validity period of certificate,
|
||||
which has been adopted by many certificate systems, such as X.509, PGP, and DNSSEC.
|
||||
|
||||
::
|
||||
.. code-block:: abnf
|
||||
|
||||
ValidityPeriod ::= VALIDITY-PERIOD-TYPE TLV-LENGTH
|
||||
NotBefore
|
||||
NotAfter
|
||||
ValidityPeriod = VALIDITY-PERIOD-TYPE TLV-LENGTH
|
||||
NotBefore
|
||||
NotAfter
|
||||
|
||||
NotBefore ::= NOT-BEFORE-TYPE TLV-LENGTH
|
||||
BYTE{15}
|
||||
NotBefore = NOT-BEFORE-TYPE TLV-LENGTH 8DIGIT "T" 6DIGIT
|
||||
|
||||
NotAfter ::= NOT-AFTER-TYPE TLV-LENGTH
|
||||
BYTE{15}
|
||||
NotAfter = NOT-AFTER-TYPE TLV-LENGTH 8DIGIT "T" 6DIGIT
|
||||
|
||||
For each TLV, the TLV-TYPE codes are assigned as below:
|
||||
|
||||
@@ -130,17 +136,13 @@ For each TLV, the TLV-TYPE codes are assigned as below:
|
||||
| NotAfter | 255 | 0xFF |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
|
||||
.. note::
|
||||
TLV-TYPE code that falls into [253, 65536) is encoded in
|
||||
`3-byte <http://named-data.net/doc/ndn-tlv/tlv.html#variable-size-encoding-for-type-t-and-length-l>`__
|
||||
|
||||
Extensions
|
||||
~~~~~~~~~~
|
||||
|
||||
A certificate may optionally carry some extensions in SignatureInfo. An extension
|
||||
could be either critical or non-critical depends on the TLV-TYPE code convention. An
|
||||
critical extension implies that if a validator cannot recognize or cannot parse the
|
||||
extension, the validator must reject the certificate. An non-critical extension
|
||||
could be either critical or non-critical depends on the TLV-TYPE code convention. A
|
||||
critical extension implies that if a validator cannot recognize or parse the
|
||||
extension, the validator must reject the certificate. A non-critical extension
|
||||
implies that if a validator cannot recognize or cannot parse the extension, the
|
||||
validator may ignore the extension.
|
||||
|
||||
@@ -148,42 +150,19 @@ The TLV-TYPE code range [256, 512) is reserved for extensions. The last bit of
|
||||
TLV-TYPE code indicates whether the extension is critical or not: ``1`` for critical
|
||||
while ``0`` for non-critical. If an extension could be either critical or
|
||||
non-critical, the extension should be allocated with two TLV-TYPE codes which only
|
||||
differ at the last bit. For example, TLV-TYPE codes 256 and 257 are allocated to the
|
||||
``StatusChecking`` extension, 256 for critical StatusChecking while 257 for
|
||||
non-critical StatusChecking.
|
||||
differ at the last bit.
|
||||
|
||||
Extensions
|
||||
----------
|
||||
|
||||
Proposed Extensions
|
||||
-------------------
|
||||
|
||||
We list the proposed extensions here:
|
||||
We list currently defined extensions:
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned code | Assigned code |
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| StatusChecking (Non-critical) | 256 | 0x0100 |
|
||||
| AdditionalDescription (non-critical) | 258 | 0x0102 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| StatusChecking (Critical) | 257 | 0x0101 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| AdditionalDescription (Non-critical) | 258 | 0x0102 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| MultipleSignature (Critical) | 259 | 0x0103 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
|
||||
.. note::
|
||||
TLV-TYPE code that falls into [253, 65536) is encoded in
|
||||
`3-byte <http://named-data.net/doc/ndn-tlv/tlv.html#variable-size-encoding-for-type-t-and-length-l>`__
|
||||
|
||||
Status Checking
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
TBD
|
||||
|
||||
Multiple Signature
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
TBD
|
||||
|
||||
AdditionalDescription
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -194,23 +173,23 @@ key-value pairs. Both key and value are UTF-8 strings, e.g.,
|
||||
``("Organization", "UCLA")``. The issuer of a certificate can specify arbitrary
|
||||
key-value pair to provide additional description about the certificate.
|
||||
|
||||
::
|
||||
.. code-block:: abnf
|
||||
|
||||
AdditionalDescription ::= ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
|
||||
DescriptionEntry+
|
||||
CertificateV2Extension = AdditionalDescription
|
||||
|
||||
DescriptionEntry ::= DESCRIPTION-ENTRY-TYPE TLV-LENGTH
|
||||
DescriptionKey
|
||||
DescriptionValue
|
||||
AdditionalDescription = ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
|
||||
1*DescriptionEntry
|
||||
|
||||
DescriptionKey ::= DESCRIPTION-KEY-TYPE TLV-LENGTH
|
||||
BYTE+
|
||||
DescriptionEntry = DESCRIPTION-ENTRY-TYPE TLV-LENGTH
|
||||
DescriptionKey
|
||||
DescriptionValue
|
||||
|
||||
DescriptionValue ::= DESCRIPTION-VALUE-TYPE TLV-LENGTH
|
||||
BYTE+
|
||||
DescriptionKey = DESCRIPTION-KEY-TYPE TLV-LENGTH 1*OCTET
|
||||
|
||||
DescriptionValue = DESCRIPTION-VALUE-TYPE TLV-LENGTH 1*OCTET
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned code | Assigned code |
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| DescriptionEntry | 512 | 0x0200 |
|
||||
@@ -0,0 +1,30 @@
|
||||
SafeBag Format for Exported Credentials
|
||||
=======================================
|
||||
|
||||
Sometimes, one may need to export credentials (e.g., certificate and private key) from
|
||||
one machine, and import them into another machine. This requires a secured container for
|
||||
sensitive information. We define **SafeBag**, which contains both an NDN certificate
|
||||
(:doc:`version 2.0 <certificate-format>`) and the corresponding private
|
||||
key, which is encrypted in `PKCS #8 format <https://tools.ietf.org/html/rfc5208>`_.
|
||||
|
||||
The format of **SafeBag** is defined as:
|
||||
|
||||
.. code-block:: abnf
|
||||
|
||||
SafeBag = SAFE-BAG-TYPE TLV-LENGTH
|
||||
CertificateV2
|
||||
EncryptedKeyBag
|
||||
|
||||
EncryptedKeyBag = ENCRYPTED-KEY-BAG-TYPE TLV-LENGTH
|
||||
*OCTET ; private key encrypted in PKCS #8 format
|
||||
|
||||
All TLV-TYPE numbers are application specific:
|
||||
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| TLV-TYPE | Assigned number | Assigned number|
|
||||
| | (decimal) | (hexadecimal) |
|
||||
+=============================================+===================+================+
|
||||
| SafeBag | 128 | 0x80 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
| EncryptedKeyBag | 129 | 0x81 |
|
||||
+---------------------------------------------+-------------------+----------------+
|
||||
@@ -1,5 +1,12 @@
|
||||
Signed Interest
|
||||
===============
|
||||
.. _Signed Interest:
|
||||
|
||||
Signed Interest Version 0.2 (DEPRECATED)
|
||||
========================================
|
||||
|
||||
.. warning::
|
||||
This document describes a deprecated format for signed Interest packets. The current format can
|
||||
be found in the
|
||||
`NDN Packet Specification <https://named-data.net/doc/NDN-packet-spec/current/signed-interest.html>`__.
|
||||
|
||||
**Signed Interest** is a mechanism to issue an authenticated interest.
|
||||
|
||||
@@ -11,7 +18,7 @@ penultimate name component TLV:
|
||||
|
||||
+-------------+----------+-----------------------------------------------------------------------------------+
|
||||
| Interest | Interest | +------+--------+--------------------------------------------------+ +----------+ |
|
||||
| Type (0x01) | length | | Name | Name | +---------+-- --+---------+---------+---------+| | Other | |
|
||||
| Type (0x05) | length | | Name | Name | +---------+-- --+---------+---------+---------+| | Other | |
|
||||
| | | | Type | Length | |Component| ... |Component|Component|Component|| | TLVs ... | |
|
||||
| | | | | | | TLV 1 | | TLV n-2 | TLV n-1 | TLV n || | in | |
|
||||
| | | | | | +---------+-- --+---------+---------+---------+| | Interest | |
|
||||
@@ -25,14 +32,12 @@ penultimate name component TLV:
|
||||
|
||||
More specifically, the SignedInterest is defined to have four additional components:
|
||||
|
||||
- ``<timestamp>``
|
||||
- ``<nonce>``
|
||||
- ``<SignatureInfo>``
|
||||
- ``<SignatureValue>``
|
||||
- ``timestamp``
|
||||
- ``nonce``
|
||||
- ``SignatureInfo``
|
||||
- ``SignatureValue``
|
||||
|
||||
For example, for ``/signed/interest/name`` name, CommandInterest will be defined as:
|
||||
|
||||
::
|
||||
For example, for ``/signed/interest/name`` name, CommandInterest will be defined as::
|
||||
|
||||
/signed/interest/name/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
|
||||
|
||||
@@ -49,21 +54,21 @@ Timestamp component (n-3 *th*)
|
||||
|
||||
The value of the n-3 *th* component is the interest's timestamp (in terms of millisecond offset
|
||||
from UTC 1970-01-01 00:00:00) encoded as
|
||||
`nonNegativeInteger <http://named-data.net/doc/ndn-tlv/tlv.html#non-negative-integer-encoding>`__.
|
||||
`NonNegativeInteger <https://named-data.net/doc/NDN-packet-spec/0.2.1/tlv.html#non-negative-integer-encoding>`__.
|
||||
The timestamp may be used to protect against replay attack.
|
||||
|
||||
Nonce component (n-2 *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n-2 *th* component is random value (encoded as
|
||||
`nonNegativeInteger <http://named-data.net/doc/ndn-tlv/tlv.html#non-negative-integer-encoding>`__)
|
||||
`NonNegativeInteger <https://named-data.net/doc/NDN-packet-spec/0.2.1/tlv.html#non-negative-integer-encoding>`__)
|
||||
that adds additional assurances that the interest will be unique.
|
||||
|
||||
SignatureInfo component (n-1 *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n-1 *th* component is actually a
|
||||
`SignatureInfo <http://named-data.net/doc/ndn-tlv/signature.html>`__ TLV.
|
||||
`SignatureInfo <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html>`__ TLV.
|
||||
|
||||
::
|
||||
|
||||
@@ -81,7 +86,7 @@ SignatureValue component (n *th*)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The value of the n *th* component is actually a
|
||||
`SignatureValue <http://named-data.net/doc/ndn-tlv/signature.html>`__ TLV.
|
||||
`SignatureValue <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html>`__ TLV.
|
||||
|
||||
::
|
||||
|
||||
@@ -106,7 +111,7 @@ be signed, it will be treated as invalid in the following three cases:
|
||||
missing or cannot be parsed correctly;
|
||||
- the key is not trusted for signing the Interest;
|
||||
- the signature cannot be verified with the public key pointed by the
|
||||
`KeyLocator <http://named-data.net/doc/ndn-tlv/signature.html#keylocator>`__ in
|
||||
`KeyLocator <https://named-data.net/doc/NDN-packet-spec/0.2.1/signature.html#keylocator>`__ in
|
||||
SignatureInfo.
|
||||
|
||||
Recipients of a signed interest may further check the timestamp and the uniqueness of the
|
||||
@@ -0,0 +1,33 @@
|
||||
Validation Error Code
|
||||
=====================
|
||||
|
||||
The following table defines a list of known codes and their description, which can be returned from the :ndn-cxx:`v2::Validator` interface.
|
||||
Other error codes can be returned by validator implementations outside ndn-cxx codebase.
|
||||
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| Error code | Short ID | Description |
|
||||
+============+==========================+=====================================================+
|
||||
| 0 | NO_ERROR | No error |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 1 | INVALID_SIGNATURE | Invalid signature |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 2 | NO_SIGNATURE | Missing signature |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 3 | CANNOT_RETRIEVE_CERT | Cannot retrieve certificate |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 4 | EXPIRED_CERT | Certificate expired |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 5 | LOOP_DETECTED | Loop detected in certification chain |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 6 | MALFORMED_CERT | Malformed certificate |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 7 | EXCEEDED_DEPTH_LIMIT | Exceeded validation depth limit |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 8 | INVALID_KEY_LOCATOR | Key locator violates validation policy |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| .. | ... | ... |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
| 255 | IMPLEMENTATION_ERROR | Internal implementation error |
|
||||
+------------+--------------------------+-----------------------------------------------------+
|
||||
|
||||
Specialized validator implementations can use error codes >= 256 to indicate a specialized error.
|
||||
@@ -4,8 +4,5 @@ Tutorials
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
tutorials/security-library
|
||||
tutorials/utils-ndn-regex
|
||||
tutorials/security-validator-config
|
||||
tutorials/signed-interest
|
||||
tutorials/certificate-format
|
||||
@@ -1,359 +0,0 @@
|
||||
Security Library Tutorial
|
||||
=========================
|
||||
|
||||
.. contents::
|
||||
|
||||
Identity, Key and Certificates
|
||||
------------------------------
|
||||
|
||||
All keys, certificates and their corresponding identities are managed by :ndn-cxx:`KeyChain`.
|
||||
|
||||
An real world **identity** can be expressed by a namespace. (e.g.,
|
||||
``/ndn/edu/ucla/alice``, or ``/ndn/edu/ucla/BoelterHall/4805``).
|
||||
|
||||
**Keys** belonging to an identity are named under the identity's namespace, with a unique
|
||||
**KeyId**::
|
||||
|
||||
/<identity_name>/[KeyId]
|
||||
|
||||
For now, only two types of KeyId are specified: ``ksk-[timestamp]`` and
|
||||
``dsk-[timestamp]``. The first type of KeyId is used to denote Key-Signing-Key (KSK)
|
||||
which is supposed to have a long lifetime. The second type of KeyId is used to denote
|
||||
Data-Signing-Key (DSK) which is supposed to have a short lifetime. Both types of KeyId
|
||||
use timestamps (number of milliseconds since unix epoch) to provide relative uniqueness of
|
||||
key names. Replacing timestamp with key hash can bring stronger uniqueness but on the
|
||||
cost of longer name. Therefore, key hash is not used for now. For example,
|
||||
``/ndn/edu/ucla/alice/ksk-1234567890`` or
|
||||
``/ndn/edu/ucla/BoelterHall/4805/dsk-1357924680``.
|
||||
|
||||
An identity may have more than one keys associated with it. For example, one may have a
|
||||
KSK to sign other keys and a DSK to sign data packets, or one may periodically replace its
|
||||
expired DSK/KSK with a new key.
|
||||
|
||||
The private part of a key ("private key"), is stored in a :ndn-cxx:`Trusted Platform
|
||||
Module (TPM) <SecTpm>`. The public part ("public key"), is managed in a
|
||||
:ndn-cxx:`Public-key Information Base (PIB) <SecPublicInfo>`. The most important
|
||||
information managed by PIB is **certificates** of public keys. A certificate binds a
|
||||
public key to its key name or the corresponding identity. The signer (or issuer) of a
|
||||
certificate vouches for the binding through its own signature. With different signers
|
||||
vouching for the binding, a public key may have more than one certificates.
|
||||
|
||||
The certificate name follows the naming convention of `NDNS (NDN Domain Name Service) <http://lasr.cs.ucla.edu/afanasyev/data/files/Afanasyev/afanasyev-phd-thesis.pdf>`_. The
|
||||
public key name will be broken into two parts:
|
||||
|
||||
- The first part ("authoritative namespace") will be put before a name component ``KEY``
|
||||
which serves as an application tag
|
||||
- The second part ("label") will be put between ``KEY`` and ``ID-CERT`` which serves as an
|
||||
indicator of certificate.
|
||||
|
||||
A version number of the certificate is appended after ``ID-CERT``. For example,
|
||||
``/ndn/edu/ucla/KEY/alice/ksk-1234567890/ID-CERT/%FD%01`` or
|
||||
``/ndn/edu/ucla/BoelterHall/4805/KEY/dsk-1357924680/ID-CERT/%FD%44``.
|
||||
|
||||
The :ndn-cxx:`NDN certificate <IdentityCertificate>` is just an ordinary `NDN-TLV Data
|
||||
packet <http://named-data.net/doc/ndn-tlv/data.html>`_, with the content part in DER
|
||||
encoding that resembles X.509 certificate:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
// NDN-TLV Encoding
|
||||
Certificate ::= DATA-TLV TLV-LENGTH
|
||||
Name
|
||||
MetaInfo (= CertificateMetaInfo)
|
||||
Content (= CertificateContent)
|
||||
Signature
|
||||
|
||||
CertificateMetaInfo ::= META-INFO-TYPE TLV-LENGTH
|
||||
ContentType (= KEY)
|
||||
FreshnessPeriod (= ?)
|
||||
|
||||
|
||||
CertificateContent ::= CONTENT-TYPE TLV-LENGTH
|
||||
CertificateDerPayload
|
||||
|
||||
|
||||
// DER Encoding
|
||||
CertificateDerPayload ::= SEQUENCE {
|
||||
validity Validity,
|
||||
subject Name,
|
||||
subjectPubKeyInfo SubjectPublicKeyInfo,
|
||||
extension Extensions OPTIONAL }
|
||||
|
||||
Validity ::= SEQUENCE {
|
||||
notBefore Time,
|
||||
notAfter Time }
|
||||
|
||||
Time ::= CHOICE {
|
||||
GeneralizedTime }
|
||||
|
||||
Name ::= CHOICE {
|
||||
RDNSequence }
|
||||
|
||||
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
|
||||
|
||||
RelativeDistinguishedName ::=
|
||||
SET OF AttributeTypeAndValue
|
||||
|
||||
SubjectPublicKeyInfo ::= SEQUENCE {
|
||||
algorithm AlgorithmIdentifier
|
||||
keybits BIT STRING }
|
||||
|
||||
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
|
||||
|
||||
See `RFC 3280 <http://www.ietf.org/rfc/rfc3280.txt>`_ for more details about DER field
|
||||
definitions.
|
||||
|
||||
Signing
|
||||
-------
|
||||
|
||||
Key Management
|
||||
%%%%%%%%%%%%%%
|
||||
|
||||
Create Identity/Keys/Certificate
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The simplest way to initialize an identity and its key and certificate is to call
|
||||
:ndn-cxx:`KeyChain::createIdentity`
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
Name defaultCertName = keyChain.createIdentity(identity);
|
||||
|
||||
This method guarantees that the default key and certificate of the supplied identity
|
||||
always exist in the KeyChain. This method checks if the supplied identity has already had
|
||||
a default key and a default certificate and returns the default certificate name if
|
||||
exists. If the default certificate is missing, KeyChain will automatically create a
|
||||
self-signed certificate of the default key. If the default key is missing, KeyChain will
|
||||
automatically create a new key and set it as the default key and create a self-signed
|
||||
certificate as well.
|
||||
|
||||
Create Keys Manually
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
One can call :ndn-cxx:`KeyChain::generateRsaKeyPair` to generate an RSA key pair or
|
||||
:ndn-cxx:`KeyChain::generateEcdsaKeyPair` to generate an ECDSA key. Note that generated
|
||||
key pair is not set as the default key of the identity, so you need to set it manually by
|
||||
calling :ndn-cxx:`KeyChain::setDefaultKeyNameForIdentity`. There is also a helper method
|
||||
:ndn-cxx:`KeyChain::generateRsaKeyPairAsDefault`, which combines the two steps into one.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
Name alice("/ndn/test/alice");
|
||||
|
||||
Name aliceKeyName = keyChain.generateRsaKeyPair(alice);
|
||||
keyChain.setDefaultKeyNameForIdentity(aliceKeyName);
|
||||
|
||||
// Now the key with the name aliceKeyName2 becomes alice's default key
|
||||
Name aliceKeyName2 = keyChain.generateRsaKeyPairAsDefault(alice);
|
||||
|
||||
Create Identity Certificate Manually
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you have created a key pair, you can generate a self-signed certificate for the key by
|
||||
calling :ndn-cxx:`KeyChain::selfSign`.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
Name aliceKeyName("/ndn/test/alice/ksk-1394129695025");
|
||||
|
||||
shared_ptr<IdentityCertificate> aliceCert = keyChain.selfSign(aliceKeyName);
|
||||
|
||||
You can sign a public key using a different key:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
|
||||
shared_ptr<IdentityCertificate> certificate =
|
||||
keyChain.prepareUnsignedIdentityCertificate(publicKeyName, publicKey,
|
||||
signingIdentity,
|
||||
notBefore, notAfter,
|
||||
subjectDescription, prefix
|
||||
|
||||
keyChain.signByIdentity(*certificate, signingIdentity);
|
||||
|
||||
Signing Data
|
||||
%%%%%%%%%%%%
|
||||
|
||||
Although the security library does not have the intelligence to automatically determine
|
||||
the signing key for each data packet, it still provides a mechanism, called **Default
|
||||
Signing Settings**, to facilitate signing process.
|
||||
|
||||
The basic signing process in the security library would be like this: create :ndn-cxx:`KeyChain`
|
||||
instance and supply the data packet and signing certificate name to :ndn-cxx:`KeyChain::sign`
|
||||
method.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
keyChain.sign(dataPacket, signingCertificateName);
|
||||
|
||||
The :ndn-cxx:`KeyChain` instance will
|
||||
|
||||
- construct ``SignatureInfo`` using the signing certificate name;
|
||||
- look up the corresponding private key in :ndn-cxx:`TPM <SecTpm>`;
|
||||
- sign the data packet if the private key exists.
|
||||
|
||||
The basic process, however, requires application developers to supply the exact
|
||||
certificate name. Such a process has two shortages: first, it might be difficult to
|
||||
remember the certificate name; second, application developers have to be aware of
|
||||
certificate update and key roll-over. Therefore, the security library provides another
|
||||
signing process in which application developers only need to supply the signing identity:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
keyChain.signByIdentity(dataPacket, signingIdentity);
|
||||
|
||||
The :ndn-cxx:`KeyChain` instance will
|
||||
|
||||
- determine the default key of the signing identity;
|
||||
- determine the default certificate of the key;
|
||||
- construct ``SignatureInfo`` using the default certificate name;
|
||||
- look up the corresponding private key in :ndn-cxx:`TPM <SecTpm>`;
|
||||
- sign the data packet if the private key exists.
|
||||
|
||||
The process above requires that each identity has a default key and that each key has a
|
||||
default certificate. All these default settings is managed in :ndn-cxx:`PIB
|
||||
<SecPublicInfo>`, one can get/set these default settings through :ndn-cxx:`KeyChain`
|
||||
directly:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
Name defaultKeyName = keyChain.getDefaultKeyNameForIdentity(identity);
|
||||
Name defaultCertName = keyChain.getDefaultCertificateNameForKey(keyName);
|
||||
|
||||
keyChain.setDefaultKeyNameForIdentity(keyName);
|
||||
keyChain.setDefaultCertificateNameForKey(certificateName);
|
||||
|
||||
There is even a default identity which will be used when no identity information is
|
||||
supplied in signing method:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
keyChain.sign(dataPacket);
|
||||
|
||||
And default identity can be got/set through :ndn-cxx:`KeyChain` as well:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
Name defaultIdentity = keyChain.getDefaultIdentity();
|
||||
keyChain.setDefaultIdentity(identity);
|
||||
|
||||
|
||||
Signing Interests
|
||||
%%%%%%%%%%%%%%%%%
|
||||
|
||||
The process of signing Interests according to the :doc:`Signed Interest specification
|
||||
<signed-interest>` is exactly the same as the process of signing Data packets:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
KeyChain keyChain;
|
||||
|
||||
keyChain.sign(interest, signingCertName);
|
||||
keyChain.signByIdentity(interest, signingIdentity);
|
||||
keyChain.sign(interest);
|
||||
|
||||
Validation
|
||||
----------
|
||||
|
||||
Interest and Data validation is done through a **Validator**. :ndn-cxx:`Validator` is a virtual
|
||||
class, two pure virtual methods must be implemented in order to construct a working
|
||||
validator:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
class Validator
|
||||
{
|
||||
...
|
||||
protected:
|
||||
virtual void
|
||||
checkPolicy(const Data& data,
|
||||
int nSteps,
|
||||
const OnDataValidated& onValidated,
|
||||
const OnDataValidationFailed& onValidationFailed,
|
||||
std::vector<shared_ptr<ValidationRequest> >& nextSteps) = 0;
|
||||
|
||||
virtual void
|
||||
checkPolicy(const Interest& interest,
|
||||
int nSteps,
|
||||
const OnInterestValidated& onValidated,
|
||||
const OnInterestValidationFailed& onValidationFailed,
|
||||
std::vector<shared_ptr<ValidationRequest> >& nextSteps) = 0;
|
||||
...
|
||||
};
|
||||
|
||||
What should be implemented in these two methods is to check:
|
||||
|
||||
- whether the packet and signer comply with trust policies;
|
||||
- whether their signature can be verified.
|
||||
|
||||
If the packet can be validated, the ``onValidated`` callback should be invoked, otherwise
|
||||
the ``onValidationFailed`` callback should be invoked. If more information (e.g., other
|
||||
certificates) is needed, express the request for missing information in one or more
|
||||
``ValidationRequest`` and push them into ``nextSteps``.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
class ValidationRequest
|
||||
{
|
||||
public:
|
||||
Interest m_interest; // The Interest for the requested data/certificate.
|
||||
OnDataValidated m_onValidated; // Callback when the retrieved certificate is authenticated.
|
||||
OnDataValidationFailed m_onDataValidated; // Callback when the retrieved certificate cannot be authenticated.
|
||||
int m_nRetries; // The number of retries when the interest times out.
|
||||
int m_nStep; // The number of validation steps that have been performed.
|
||||
};
|
||||
|
||||
Besides the two ``Validator::checkPolicy`` methods, the ``Validator`` also provides three
|
||||
hooks to control packet validation in a finer granularity.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
class Validator
|
||||
{
|
||||
...
|
||||
protected:
|
||||
virtual shared_ptr<const Data>
|
||||
preCertificateValidation(const Data& data);
|
||||
|
||||
virtual void
|
||||
onTimeout(const Interest& interest,
|
||||
int nRemainingRetries,
|
||||
const OnFailure& onFailure,
|
||||
const shared_ptr<ValidationRequest>& validationRequest);
|
||||
|
||||
virtual void
|
||||
afterCheckPolicy(const std::vector<shared_ptr<ValidationRequest> >& nextSteps,
|
||||
const OnFailure& onFailure);
|
||||
...
|
||||
};
|
||||
|
||||
``Validator::preCertificateValidation`` is triggered before validating requested
|
||||
certificate. The Data supplied matches the interest in the ``ValidationRequest``. It may
|
||||
be certificate or a data encapsulating certificate. This hook returns a data (actually
|
||||
certificate) that is will be passed as Data into ``Validator::validate``;
|
||||
|
||||
``Validator::onTimeout`` is triggered when interest for certificate times out. The logic
|
||||
to handle the timeout can be implemented in this hook. One could invoke onFailure or
|
||||
re-express the interest.
|
||||
|
||||
``Validator::afterCheckPolicy`` is invoked after ``Validator::checkPolicy`` is done. One
|
||||
can implement the logic of how to process the set of ValidationRequests according to its
|
||||
trust model.
|
||||
|
||||
Configuration-based Validator
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
In most cases, the trust model of applications are simple. However, it is not trivial to
|
||||
implement the two ``Validator::checkPolicy`` methods. Therefore, we provide a more
|
||||
developer-friendly configuration-based validator, ``ValidatorConfig``. With
|
||||
``ValidatorConfig``, one can express the trust model using a policy language in a
|
||||
configuration file. See :doc:`security-validator-config` for more details.
|
||||
@@ -9,7 +9,7 @@ write a configuration file.
|
||||
The configuration file consists of **rules** and **trust-anchors** that will be used in
|
||||
validation. **Rules** tell the validator how to validate a packet, while **trust-anchors**
|
||||
tell the validator which certificates are valid immediately. Here is an example of
|
||||
configuration file containing two rules.
|
||||
configuration file containing two rules and a trust anchor.
|
||||
|
||||
::
|
||||
|
||||
@@ -30,7 +30,7 @@ configuration file containing two rules.
|
||||
key-locator
|
||||
{
|
||||
type name
|
||||
name /ndn/edu/ucla/KEY/yingdi/ksk-1234/ID-CERT
|
||||
name /ndn/edu/ucla/yingdi/KEY/1234
|
||||
relation equal
|
||||
}
|
||||
}
|
||||
@@ -51,8 +51,7 @@ configuration file containing two rules.
|
||||
file-name "testbed-trust-anchor.cert"
|
||||
}
|
||||
|
||||
.. note::
|
||||
**ATTENTION: The order of rules MATTERS!**
|
||||
.. attention:: **The order of rules MATTERS!**
|
||||
|
||||
A rule can be broken into two parts:
|
||||
|
||||
@@ -61,63 +60,72 @@ A rule can be broken into two parts:
|
||||
- The second part is to check whether further validation process is
|
||||
necessary.
|
||||
|
||||
When receiving a packet, the validator will apply rules in the configuration file
|
||||
one-by-one against the packet, until finding a rule that the packet qualifies for. And the
|
||||
second part of the matched rule will be used to check the validity of the packet. If the
|
||||
packet cannot qualify for any rules, it is treated as an invalid packet. Once a packet has
|
||||
been matched by a rule, the rest rules will not be applied against the packet. Therefore,
|
||||
you should always put the most specific rule to the top, otherwise it will become useless.
|
||||
When a packet is presented for validation, the validator will check the rules one-by-one
|
||||
in the configuration file using **for** and **filter** conditions against the packet,
|
||||
until finding a rule for which the packet qualifies. After that, the **checker**
|
||||
conditions of the matched rule will be used to check the validity of the packet. If the
|
||||
packet does not match any rules, it is treated as an invalid packet. Once a packet has
|
||||
been matched by a rule, the remaining rules are not applied to the packet (i.e., the
|
||||
matched rule "captures" the packet). Therefore, you should always put the most specific
|
||||
rule first.
|
||||
|
||||
In the example configuration, the first rule indicates that all the data packets under the
|
||||
name prefix ``/localhost/example`` must be signed by a key whose certificate name is
|
||||
``/ndn/edu/ucla/KEY/yingdi/ksk-1234/ID-CERT``. If a packet does not have a name under prefix
|
||||
``/localhost/example``, validator will skip the first rule and apply the second rule. The
|
||||
second rule indicates that any data packets must be validated along a hierarchy. And a
|
||||
certificate stored in a file "testbed-trust-anchor.cert" is valid.
|
||||
name prefix ``/localhost/example`` must be signed by a certificate whose name (the key
|
||||
part) is ``/ndn/edu/ucla/yingdi/KEY/1234``. If a packet does not have a name under
|
||||
prefix ``/localhost/example``, the validator will skip the first rule and apply the second
|
||||
rule. The second rule indicates that all other data packets must be validated using the
|
||||
hierarchical policy (data name should be prefix or equal to the identity part of the
|
||||
certificate name). The example configuration defines that all certificate chains must be
|
||||
rooted in the certificate defined in the file "testbed-trust-anchor.cert".
|
||||
|
||||
Rules in general
|
||||
----------------
|
||||
|
||||
A rule has four types of properties: **id**, **for**, **filter**, and **checker**.
|
||||
A rule has four properties: **id**, **for**, **filter**, and **checker**.
|
||||
|
||||
The property **id** uniquely identifies the rule in the configuration file. As long as
|
||||
The **id** property uniquely identifies the rule in the configuration file. As long as
|
||||
being unique, any name can be given to a rule, e.g., "Simple Rule", "Testbed Validation
|
||||
Rule". A rule must have one and only one **id** property.
|
||||
|
||||
A rule is either used to validate an interest packet or a data packet. This information
|
||||
is specified in the property **for**. Only two value can be specified: **data** and
|
||||
**interest**. A rule must have one and only one **for** property.
|
||||
A rule is either used to validate a data packet or an interest packet. This information
|
||||
is specified in the **for** property, which can be either **data** or **interest**. A
|
||||
rule must have exactly one **for** property.
|
||||
|
||||
The property **filter** further constrains the packets that can be checked by the
|
||||
rule. Filter property is not required in a rule, in this case, the rule will capture all
|
||||
the packets passed to it. A rule may contain more than one filters, in this case, a packet
|
||||
can be checked by a rule only if the packet satisfies all the filters.
|
||||
The **filter** property further constrains the packets that can be checked by the
|
||||
rule. The filter property is not required in a rule; if omitted, the rule will capture all
|
||||
packets passed to it. A rule may contain multiple filters, in this case, a packet
|
||||
is captured by the rule only if all filters are satisfied.
|
||||
|
||||
.. note::
|
||||
**ATTENTION: A packet that satisfies all the filters may not be valid**.
|
||||
.. attention:: **A packet that satisfies all the filters may not be valid.**
|
||||
|
||||
The property **checker** defines the conditions that a matched packet must fulfill to be
|
||||
treated as a valid packet. A rule must have at least one **checker** property, a packet is
|
||||
treated as invalid if it cannot pass none of the checkers.
|
||||
|
||||
**filter** and **checker** have their own properties. Next, we will introduce them
|
||||
separately.
|
||||
The **checker** property defines the conditions that a matched packet must fulfill to be
|
||||
treated as a valid packet. A rule must have at least one **checker** property. A packet is
|
||||
treated as valid if it can pass at least one of the checkers and as invalid when it cannot
|
||||
pass any checkers.
|
||||
|
||||
Filter Property
|
||||
---------------
|
||||
|
||||
Filter has its own **type** property. Although a rule may contain more than one filters,
|
||||
there is at most one filter of each type. So far, only one type of filter is defined:
|
||||
**name**. In other word, only one filter can be specified in a rule for now.
|
||||
Filter has a **type** property and type-specific properties. Although a rule can contain
|
||||
more than one filters, there can be at most one filter of each type.
|
||||
|
||||
Currently, only the packet name filter is defined.
|
||||
|
||||
Name Filter
|
||||
~~~~~~~~~~~
|
||||
|
||||
There are two ways to express the conditions on name. The first way is to specify a
|
||||
relationship between the packet name and a particular name. In this case, two more
|
||||
properties are required: **name** and **relation**. A packet can fulfill the condition if
|
||||
the **name** has a **relation\* to the packet name. Three types of **\ relation\*\* has
|
||||
been defined: **equal**, **is-prefix-of**, **is-strict-prefix-of**. For example, a filter
|
||||
There are two ways to express the conditions on packet name:
|
||||
|
||||
- relationship between the packet name and the specified name
|
||||
- :doc:`NDN regular expression <utils-ndn-regex>` match.
|
||||
|
||||
Name and Relation
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
In the first case, two more properties are required: **name** and **relation**. A packet
|
||||
can fulfill the condition if the **name** has a **relation** to the packet's name. Three
|
||||
types of **relation** has been defined: **equal**, **is-prefix-of**,
|
||||
**is-strict-prefix-of**. For example, the filter
|
||||
|
||||
::
|
||||
|
||||
@@ -128,8 +136,9 @@ been defined: **equal**, **is-prefix-of**, **is-strict-prefix-of**. For example,
|
||||
relation equal
|
||||
}
|
||||
|
||||
shall only capture a packet with the exact name ``/localhost/example``.
|
||||
And a filter
|
||||
will capture only a packet with the exact name ``/localhost/example``.
|
||||
|
||||
The filter
|
||||
|
||||
::
|
||||
|
||||
@@ -140,8 +149,8 @@ And a filter
|
||||
relation is-prefix-of
|
||||
}
|
||||
|
||||
shall capture a packet with name ``/localhost/example`` or ``/localhost/example/data``, but
|
||||
cannot catch a packet with name ``/localhost/another_example``. And a filter
|
||||
will capture a packet with name ``/localhost/example`` or ``/localhost/example/data``, but
|
||||
will not capture a packet with name ``/localhost/another_example``. And the filter
|
||||
|
||||
::
|
||||
|
||||
@@ -152,42 +161,46 @@ cannot catch a packet with name ``/localhost/another_example``. And a filter
|
||||
relation is-strict-prefix-of
|
||||
}
|
||||
|
||||
shall capture a packet with name ``/localhost/example/data``, but cannot catch a packet
|
||||
will capture a packet with name ``/localhost/example/data``, but will not capture a packet
|
||||
with name ``/localhost/example``.
|
||||
|
||||
NDN Regular Expression Match
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The second way is to specify an :doc:`utils-ndn-regex` that can match the packet. In this
|
||||
case, only one property **regex** is required. For example, a filter
|
||||
case, only one property **regex** is required. For example, the filter
|
||||
|
||||
::
|
||||
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^[^<KEY>]*<KEY><>*<ksk-.*><ID-CERT>$
|
||||
regex ^<>*<KEY><><><>$
|
||||
}
|
||||
|
||||
shall capture all the identity certificates.
|
||||
will capture all certificates.
|
||||
|
||||
Checker Property
|
||||
----------------
|
||||
|
||||
Passing all the filters in a rule only indicates that a packet can be checked using the
|
||||
rule, and it does not necessarily implies that the packet is valid. The validity of a
|
||||
rule, and it does not necessarily imply that the packet is valid. The validity of a
|
||||
packet is determined by the property **checker**, which defines the conditions that a
|
||||
valid packet must fulfill.
|
||||
|
||||
Same as **filter**, **checker** has a property **type**. We have defined three types of
|
||||
checkers: **customized**, and **hierarchical**, and **fixed-signer**. As suggested by its
|
||||
name, **customized** checker allows you to customize the conditions according to specific
|
||||
requirements. **hierarchical** checker and **fixed-signer** checker are pre-defined
|
||||
shortcuts, which specify specific trust models separately.
|
||||
Same as **filter**, **checker** has a property **type**. We have defined two types of
|
||||
checkers:
|
||||
|
||||
- **customized** is a checker that allows customization of the conditions according to specific
|
||||
requirements;
|
||||
|
||||
- **hierarchical** is a checker with pre-defined hierarchical trust model.
|
||||
|
||||
Customized Checker
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
So far, we only allow three customized properties in a customized
|
||||
checker: **sig-type**, **key-locator**. All of them are related to the
|
||||
``SignatureInfo`` of a packet.
|
||||
The customized checker requires two properties: **sig-type**, **key-locator**. Both must
|
||||
appear exactly once and are related to the ``SignatureInfo`` of a packet.
|
||||
|
||||
::
|
||||
|
||||
@@ -201,18 +214,16 @@ checker: **sig-type**, **key-locator**. All of them are related to the
|
||||
}
|
||||
}
|
||||
|
||||
The property **sig-type** specifies the acceptable signature type. Right now three
|
||||
signature types have been defined: **rsa-sha256** and **ecdsa-sha256** (which are strong
|
||||
signature types) and **sha256** (which is a weak signature type). If sig-type is sha256,
|
||||
then **key-locator** will be ignored. Validator will simply calculate the digest of a
|
||||
packet and compare it with the one in ``SignatureValue``. If sig-type is rsa-sha256 or
|
||||
ecdsa-sha256, you have to further customize the checker with **key-locator**.
|
||||
The property **sig-type** specifies the acceptable signature type and can be
|
||||
**rsa-sha256**, **ecdsa-sha256** (strong signature types), or **sha256** (weak signature
|
||||
type). If sig-type is sha256, **key-locator** is ignored, and the validator will simply
|
||||
calculate the digest of a packet and compare it with the one in ``SignatureValue``. If
|
||||
sig-type is rsa-sha256 or ecdsa-sha256, you have to further customize the checker with
|
||||
**key-locator**.
|
||||
|
||||
The property **key-locator** which specifies the conditions on ``KeyLocator``. If the
|
||||
The property **key-locator** specifies the conditions on ``KeyLocator``. If the
|
||||
**key-locator** property is specified, it requires the existence of the ``KeyLocator``
|
||||
field in ``SignatureInfo``. Although there are more than one types of ``KeyLocator``
|
||||
defined in the `Packet Format <http://named-data.net/doc/ndn-tlv/signature.html>`__,
|
||||
**key-locator** property only supports one type: **name**:
|
||||
field in ``SignatureInfo``. **key-locator** property only supports one type: **name**:
|
||||
|
||||
::
|
||||
|
||||
@@ -222,9 +233,9 @@ defined in the `Packet Format <http://named-data.net/doc/ndn-tlv/signature.html>
|
||||
...
|
||||
}
|
||||
|
||||
Such a key-locator property specifies the conditions on the certificate name of the
|
||||
signing key. Since the conditions are about name, they can be specified in the same way as
|
||||
the name filter. For example, a checker could be:
|
||||
This key-locator property specifies the conditions on the certificate name of the signing
|
||||
key. Since the conditions are about name, they can be specified in the same way as the
|
||||
name filter. For example, a checker can be:
|
||||
|
||||
::
|
||||
|
||||
@@ -235,23 +246,23 @@ the name filter. For example, a checker could be:
|
||||
key-locator
|
||||
{
|
||||
type name
|
||||
name /ndn/edu/ucla/KEY/yingdi/ksk-1234/ID-CERT
|
||||
name /ndn/edu/ucla/yingdi/KEY/1234
|
||||
relation equal
|
||||
}
|
||||
}
|
||||
|
||||
This checker property requires that the packet must have a ``rsa-sha256`` signature generated
|
||||
by a key whose certificate name is ``/ndn/edu/ucla/KEY/yingdi/ksk-1234/ID-CERT``.
|
||||
This checker property requires that the packet must have a ``rsa-sha256`` signature that
|
||||
can be verified with ``/ndn/edu/ucla/yingdi/KEY/1234`` key.
|
||||
|
||||
Besides the two ways to express conditions on the ``KeyLocator`` name (name and regex),
|
||||
you can further constrain the ``KeyLocator`` name using the information extracted from the
|
||||
packet name. This third type of condition is expressed via a property
|
||||
**hyper-relation**. The **hyper-relation** property consists of three parts:
|
||||
|
||||
- an NDN regular expression that can extract information from packet name
|
||||
- an NDN regular expression that can extract information from ``KeyLocator`` name
|
||||
- relation from the part extracted from ``KeyLocator`` name to the one extracted from the
|
||||
packet name
|
||||
- an NDN regular expression that extracts information from the packet name
|
||||
- an NDN regular expression that extracts information from the ``KeyLocator`` name
|
||||
- relation from the part extracted from the ``KeyLocator`` name to the one extracted from
|
||||
the packet name
|
||||
|
||||
For example, a checker:
|
||||
|
||||
@@ -266,8 +277,8 @@ For example, a checker:
|
||||
type name
|
||||
hyper-relation
|
||||
{
|
||||
k-regex ^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$
|
||||
k-expand \\1\\2
|
||||
k-regex ^(<>*)<KEY><>$
|
||||
k-expand \\1
|
||||
h-relation is-prefix-of
|
||||
p-regex ^(<>*)$
|
||||
p-expand \\1
|
||||
@@ -276,30 +287,8 @@ For example, a checker:
|
||||
}
|
||||
}
|
||||
|
||||
requires the packet name must be under the corresponding namespace of the ``KeyLocator``
|
||||
name.
|
||||
|
||||
In some cases, you can even customize checker with another property For example:
|
||||
|
||||
::
|
||||
|
||||
checker
|
||||
{
|
||||
type customized
|
||||
sig-type rsa-sha256
|
||||
key-locator
|
||||
{
|
||||
type name
|
||||
hyper-relation
|
||||
{
|
||||
k-regex ^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$
|
||||
k-expand \\1\\2
|
||||
h-relation is-prefix-of
|
||||
p-regex ^(<>*)$
|
||||
p-expand \\1
|
||||
}
|
||||
}
|
||||
}
|
||||
requires the packet name must be under the corresponding namespace (identity part) of the
|
||||
``KeyLocator`` name.
|
||||
|
||||
Hierarchical Checker
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -328,8 +317,8 @@ is equivalent to a customized checker:
|
||||
type name
|
||||
hyper-relation
|
||||
{
|
||||
k-regex ^([^<KEY>]*)<KEY>(<>*)<ksk-.*><ID-CERT>$
|
||||
k-expand \\1\\2
|
||||
k-regex ^(<>*)<KEY><>$
|
||||
k-expand \\1
|
||||
h-relation is-prefix-of
|
||||
p-regex ^(<>*)$
|
||||
p-expand \\1
|
||||
@@ -337,42 +326,14 @@ is equivalent to a customized checker:
|
||||
}
|
||||
}
|
||||
|
||||
Fixed-Signer Checker
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In some cases, you only accept packets signed with pre-trusted certificates,
|
||||
i.e. "one-step validation". Such a trust model can be expressed with **fixed-signer**
|
||||
checker. And you only need to specify the trusted certificate via property **signer**. The
|
||||
definition of **signer** is the same as **trust-anchor**. For example:
|
||||
|
||||
::
|
||||
|
||||
checker
|
||||
{
|
||||
type fixed-signer
|
||||
sig-type rsa-sha256
|
||||
signer
|
||||
{
|
||||
type file
|
||||
file-name "trusted-signer.cert"
|
||||
}
|
||||
signer
|
||||
{
|
||||
type base64
|
||||
base64-string "Bv0DGwdG...amHFvHIMDw=="
|
||||
}
|
||||
}
|
||||
|
||||
.. _validator-conf-trust-anchors:
|
||||
|
||||
Trust Anchors
|
||||
-------------
|
||||
|
||||
Although **trust-anchor** is always not required in the configuration file (for example,
|
||||
if fixed-signer checker is used), it is very common to have a few trust-anchors in the
|
||||
configuration file, otherwise most packets cannot be validated. A configuration file may
|
||||
contain more than one trust anchors, but the order of trust anchors does not matter. The
|
||||
structure of trust-anchor is same as the **signer** in fixed-signer checker, for example:
|
||||
**trust-anchor** is a necessary option in order to properly validate packets. A
|
||||
configuration file may contain more than one trust anchors and the order of trust anchors
|
||||
does not matter. The structure of trust-anchor is as follows:
|
||||
|
||||
::
|
||||
|
||||
@@ -388,7 +349,7 @@ structure of trust-anchor is same as the **signer** in fixed-signer checker, for
|
||||
}
|
||||
|
||||
You may also specify a trust-anchor directory. All certificates under this directory are
|
||||
taken as trust anchors. For example, if all trust anchors are put into
|
||||
taken as static trust anchors. For example, if all trust anchors are put into
|
||||
``/usr/local/etc/ndn/keys``.
|
||||
|
||||
::
|
||||
@@ -396,7 +357,7 @@ taken as trust anchors. For example, if all trust anchors are put into
|
||||
trust-anchor
|
||||
{
|
||||
type dir
|
||||
file-name /usr/local/etc/ndn/keys
|
||||
dir /usr/local/etc/ndn/keys
|
||||
}
|
||||
|
||||
If certificates under the directory might be changed during runtime, you can set a refresh
|
||||
@@ -407,16 +368,16 @@ period, such as
|
||||
trust-anchor
|
||||
{
|
||||
type dir
|
||||
file-name /usr/local/etc/ndn/keys
|
||||
dir /usr/local/etc/ndn/keys
|
||||
refresh 1h ; refresh certificates every hour, other units include m (for minutes) and s (for seconds)
|
||||
}
|
||||
|
||||
There is another special trust anchor **any**. As long as such a trust-anchor is defined
|
||||
There is also a special trust anchor **any**. As long as such a trust-anchor is defined
|
||||
in config file, packet validation will be turned off.
|
||||
|
||||
.. note::
|
||||
**ATTENTION: This type of trust anchor is dangerous. You should used it only when you
|
||||
want to disable packet validation temporarily (e.g, debugging code, building a demo).**
|
||||
.. danger::
|
||||
This type of trust anchor is dangerous. You should used it only when you
|
||||
want to disable packet validation temporarily (e.g., debugging code, building a demo).
|
||||
|
||||
::
|
||||
|
||||
@@ -457,31 +418,31 @@ example:
|
||||
| | |
|
||||
| | Identity example: ``/ndn`` |
|
||||
| | |
|
||||
| | Certificate name example: ``/ndn/KEY/ksk-1/ID-CERT/%01`` |
|
||||
| | Certificate name example: ``/ndn/KEY/1/%00/%01`` |
|
||||
+------------+-------------------------------------------------------------------------------------+
|
||||
| site | ``/<network>/<site>`` |
|
||||
| | |
|
||||
| | Identity example: ``/ndn/edu/ucla`` |
|
||||
| | |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/KEY/ksk-2/ID-CERT/%01`` |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/KEY/2/%00/%01`` |
|
||||
+------------+-------------------------------------------------------------------------------------+
|
||||
| operator | ``/<network>/<site>/%C1.O.N./<operator-id>`` |
|
||||
| | |
|
||||
| | Identity example: ``/ndn/edu/ucla/%C1.O.N./op1`` |
|
||||
| | |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.N./op1/KEY/ksk-3/ID-CERT/%01`` |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.N./op1/KEY/3/%00/%01`` |
|
||||
+------------+-------------------------------------------------------------------------------------+
|
||||
| router | ``/<network>/<site>/%C1.O.R./<router-id>`` |
|
||||
| | |
|
||||
| | Identity example: ``/ndn/edu/ucla/%C1.O.R./rt1`` |
|
||||
| | |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.R./rt1/KEY/ksk-4/ID-CERT/%01`` |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.R./rt1/KEY/4/%00/%01`` |
|
||||
+------------+-------------------------------------------------------------------------------------+
|
||||
| NLSR | ``/<network>/<site>/%C1.O.R./<router-id>/NLSR`` |
|
||||
| | |
|
||||
| | Identity example: ``/ndn/edu/ucla/%C1.O.R./rt1/NLSR`` |
|
||||
| | |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.R./rt1/NLSR/KEY/ksk-5/ID-CERT/%01`` |
|
||||
| | Certificate name example: ``/ndn/edu/ucla/%C1.O.R./rt1/NLSR/KEY/5/%00/%01`` |
|
||||
+------------+-------------------------------------------------------------------------------------+
|
||||
|
||||
Assume that a typical NLSR data name is
|
||||
@@ -506,7 +467,7 @@ And here is the configuration file:
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^[^<NLSR><LSA>]*<NLSR><LSA>
|
||||
regex ^<>*<NLSR><LSA><><>$
|
||||
}
|
||||
checker
|
||||
{
|
||||
@@ -517,10 +478,10 @@ And here is the configuration file:
|
||||
type name
|
||||
hyper-relation
|
||||
{
|
||||
k-regex ^([^<KEY>]*)<KEY><ksk-.*><ID-CERT>$
|
||||
k-regex ^(<>*)<KEY><>$
|
||||
k-expand \\1
|
||||
h-relation equal
|
||||
p-regex ^([^<NLSR><LSA>]*)<NLSR><LSA><LSType\.\d><>$
|
||||
p-regex ^(<>*)<NLSR><LSA><><>$
|
||||
p-expand \\1
|
||||
}
|
||||
}
|
||||
@@ -533,7 +494,7 @@ And here is the configuration file:
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^[^<KEY><%C1.O.R.>]*<%C1.O.R.><><KEY><ksk-.*><ID-CERT><>$
|
||||
regex ^<>*<%C1.O.R.><><KEY><><><>$
|
||||
}
|
||||
checker
|
||||
{
|
||||
@@ -544,10 +505,10 @@ And here is the configuration file:
|
||||
type name
|
||||
hyper-relation
|
||||
{
|
||||
k-regex ^([^<KEY><%C1.O.N.>]*)<%C1.O.N.><><KEY><ksk-.*><ID-CERT>$
|
||||
k-regex ^(<>*)<%C1.O.N.><><KEY><>$
|
||||
k-expand \\1
|
||||
h-relation equal
|
||||
p-regex ^([^<KEY><%C1.O.R.>]*)<%C1.O.R.><><KEY><ksk-.*><ID-CERT><>$
|
||||
p-regex ^(<>*)<%C1.O.R.><><KEY><><><>$
|
||||
p-expand \\1
|
||||
}
|
||||
}
|
||||
@@ -560,7 +521,7 @@ And here is the configuration file:
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^[^<KEY>]*<KEY><ksk-.*><ID-CERT><>$
|
||||
regex ^<>*<KEY><><><>$
|
||||
}
|
||||
checker
|
||||
{
|
||||
@@ -577,49 +538,69 @@ And here is the configuration file:
|
||||
Example Configuration For NFD RIB Management
|
||||
--------------------------------------------
|
||||
|
||||
Assume `NFD RIB Management <http://redmine.named-data.net/projects/nfd/wiki/RibMgmt>`_
|
||||
Assume `NFD RIB Management <https://redmine.named-data.net/projects/nfd/wiki/RibMgmt>`_
|
||||
allows any valid testbed certificate to register prefix, the configuration file could be
|
||||
written as:
|
||||
|
||||
::
|
||||
|
||||
rule
|
||||
{
|
||||
id "NRD Prefix Registration Command Rule"
|
||||
for interest
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^<localhost><nrd>[<register><unregister><advertise><withdraw>]
|
||||
}
|
||||
checker
|
||||
{
|
||||
type customized
|
||||
sig-type rsa-sha256
|
||||
key-locator
|
||||
{
|
||||
type name
|
||||
regex ^[^<KEY>]*<KEY><>*<ksk-.*><ID-CERT>$
|
||||
}
|
||||
}
|
||||
}
|
||||
rule
|
||||
{
|
||||
id "Testbed Hierarchy Rule"
|
||||
for data
|
||||
filter
|
||||
{
|
||||
type name
|
||||
regex ^[^<KEY>]*<KEY><>*<ksk-.*><ID-CERT><>$
|
||||
}
|
||||
checker
|
||||
{
|
||||
type hierarchical
|
||||
sig-type rsa-sha256
|
||||
}
|
||||
}
|
||||
trust-anchor
|
||||
{
|
||||
type file
|
||||
file-name "testbed-trust-anchor.cert"
|
||||
}
|
||||
rule
|
||||
{
|
||||
id "RIB Prefix Registration Command Rule"
|
||||
for interest ; rule for Interests (to validate CommandInterests)
|
||||
filter
|
||||
{
|
||||
type name ; condition on interest name (w/o signature)
|
||||
regex ^[<localhop><localhost>]<nfd><rib>[<register><unregister>]<><><>$ ; prefix before
|
||||
; SigInfo & SigValue
|
||||
}
|
||||
checker
|
||||
{
|
||||
type customized
|
||||
sig-type rsa-sha256 ; interest must have a rsa-sha256 signature
|
||||
key-locator
|
||||
{
|
||||
type name ; key locator must be the certificate name of the
|
||||
; signing key
|
||||
regex ^<>*<KEY><><><>$
|
||||
}
|
||||
}
|
||||
checker
|
||||
{
|
||||
type customized
|
||||
sig-type ecdsa-sha256 ; interest must have a ecdsa-sha256 signature
|
||||
key-locator
|
||||
{
|
||||
type name ; key locator must be the certificate name of the
|
||||
; signing key
|
||||
regex ^<>*<KEY><><><>$
|
||||
}
|
||||
}
|
||||
}
|
||||
rule
|
||||
{
|
||||
id "NDN Testbed Hierarchy Rule"
|
||||
for data ; rule for Data (to validate NDN certificates)
|
||||
filter
|
||||
{
|
||||
type name ; condition on data name
|
||||
regex ^<>*<KEY><><><>$
|
||||
}
|
||||
checker
|
||||
{
|
||||
type hierarchical ; the certificate name of the signing key and
|
||||
; the data name must follow the hierarchical model
|
||||
sig-type rsa-sha256 ; data must have a rsa-sha256 signature
|
||||
}
|
||||
checker
|
||||
{
|
||||
type hierarchical ; the certificate name of the signing key and
|
||||
; the data name must follow the hierarchical model
|
||||
sig-type ecdsa-sha256 ; data must have a ecdsa-sha256 signature
|
||||
}
|
||||
}
|
||||
trust-anchor
|
||||
{
|
||||
type file
|
||||
file-name keys/ndn-testbed-root.ndncert.base64
|
||||
}
|
||||
Loaded 100 of 995 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user