#pragma once /** @file @brief BLS threshold signature on BN curve @author MITSUNARI Shigeo(@herumi) @license modified new BSD license http://opensource.org/licenses/BSD-3-Clause */ #include <bls/bls.h> #include <stdexcept> #include <vector> #include <string> #include <iosfwd> #include <stdint.h> namespace bls { // same value with IoMode of mcl/op.hpp enum { IoBin = 2, // binary number IoDec = 10, // decimal number IoHex = 16, // hexadecimal number IoPrefix = 128, // append '0b'(bin) or '0x'(hex) IoSerialize = 512, IoFixedByteSeq = IoSerialize // fixed byte representation }; /* BLS signature e : G2 x G1 -> Fp12 Q in G2 ; fixed global parameter H : {str} -> G1 s : secret key sQ ; public key s H(m) ; signature of m verify ; e(sQ, H(m)) = e(Q, s H(m)) */ /* initialize this library call this once before using the other method @param curve [in] type of curve @param compiledTimevar [in] use the default value @note init() is not thread safe */ inline void init(int curve = mclBn_CurveFp254BNb, int compiledTimeVar = MCLBN_COMPILED_TIME_VAR) { if (blsInit(curve, compiledTimeVar) != 0) throw std::invalid_argument("blsInit"); } inline size_t getOpUnitSize() { return blsGetOpUnitSize(); } inline void getCurveOrder(std::string& str) { str.resize(1024); mclSize n = blsGetCurveOrder(&str[0], str.size()); if (n == 0) throw std::runtime_error("blsGetCurveOrder"); str.resize(n); } inline void getFieldOrder(std::string& str) { str.resize(1024); mclSize n = blsGetFieldOrder(&str[0], str.size()); if (n == 0) throw std::runtime_error("blsGetFieldOrder"); str.resize(n); } inline int getG1ByteSize() { return blsGetG1ByteSize(); } inline int getFrByteSize() { return blsGetFrByteSize(); } namespace local { /* the value of secretKey and Id must be less than r = 0x2523648240000001ba344d8000000007ff9f800000000010a10000000000000d sizeof(uint64_t) * keySize byte */ const size_t keySize = MCLBN_FP_UNIT_SIZE; } class SecretKey; class PublicKey; class Signature; class Id; typedef std::vector<SecretKey> SecretKeyVec; typedef std::vector<PublicKey> PublicKeyVec; typedef std::vector<Signature> SignatureVec; typedef std::vector<Id> IdVec; class Id { blsId self_; friend class PublicKey; friend class SecretKey; friend class Signature; public: Id(unsigned int id = 0) { blsIdSetInt(&self_, id); } bool operator==(const Id& rhs) const { return blsIdIsEqual(&self_, &rhs.self_) == 1; } bool operator!=(const Id& rhs) const { return !(*this == rhs); } friend std::ostream& operator<<(std::ostream& os, const Id& id) { std::string str; id.getStr(str, 16|IoPrefix); return os << str; } friend std::istream& operator>>(std::istream& is, Id& id) { std::string str; is >> str; id.setStr(str, 16); return is; } void getStr(std::string& str, int ioMode = 0) const { str.resize(1024); size_t n = mclBnFr_getStr(&str[0], str.size(), &self_.v, ioMode); if (n == 0) throw std::runtime_error("mclBnFr_getStr"); str.resize(n); } void setStr(const std::string& str, int ioMode = 0) { int ret = mclBnFr_setStr(&self_.v, str.c_str(), str.size(), ioMode); if (ret != 0) throw std::runtime_error("mclBnFr_setStr"); } bool isZero() const { return mclBnFr_isZero(&self_.v) == 1; } /* set p[0, .., keySize) @note the value must be less than r */ void set(const uint64_t *p) { setLittleEndian(p, local::keySize * sizeof(uint64_t)); } // bufSize is truncted/zero extended to keySize void setLittleEndian(const void *buf, size_t bufSize) { mclBnFr_setLittleEndian(&self_.v, buf, bufSize); } }; /* s ; secret key */ class SecretKey { blsSecretKey self_; public: bool operator==(const SecretKey& rhs) const { return blsSecretKeyIsEqual(&self_, &rhs.self_) == 1; } bool operator!=(const SecretKey& rhs) const { return !(*this == rhs); } friend std::ostream& operator<<(std::ostream& os, const SecretKey& sec) { std::string str; sec.getStr(str, 16|IoPrefix); return os << str; } friend std::istream& operator>>(std::istream& is, SecretKey& sec) { std::string str; is >> str; sec.setStr(str); return is; } void getStr(std::string& str, int ioMode = 0) const { str.resize(1024); size_t n = mclBnFr_getStr(&str[0], str.size(), &self_.v, ioMode); if (n == 0) throw std::runtime_error("mclBnFr_getStr"); str.resize(n); } void setStr(const std::string& str, int ioMode = 0) { int ret = mclBnFr_setStr(&self_.v, str.c_str(), str.size(), ioMode); if (ret != 0) throw std::runtime_error("mclBnFr_setStr"); } /* initialize secretKey with random number */ void init() { int ret = blsSecretKeySetByCSPRNG(&self_); if (ret != 0) throw std::runtime_error("blsSecretKeySetByCSPRNG"); } /* set secretKey with p[0, .., keySize) and set id = 0 @note the value must be less than r */ void set(const uint64_t *p) { setLittleEndian(p, local::keySize * sizeof(uint64_t)); } // bufSize is truncted/zero extended to keySize void setLittleEndian(const void *buf, size_t bufSize) { mclBnFr_setLittleEndian(&self_.v, buf, bufSize); } // set hash of buf void setHashOf(const void *buf, size_t bufSize) { int ret = mclBnFr_setHashOf(&self_.v, buf, bufSize); if (ret != 0) throw std::runtime_error("mclBnFr_setHashOf"); } void getPublicKey(PublicKey& pub) const; // constant time sign // sign hash(m) void sign(Signature& sig, const void *m, size_t size) const; void sign(Signature& sig, const std::string& m) const { sign(sig, m.c_str(), m.size()); } // sign hashed value void signHash(Signature& sig, const void *h, size_t size) const; void signHash(Signature& sig, const std::string& h) const { signHash(sig, h.c_str(), h.size()); } /* make Pop(Proof of Possesion) pop = prv.sign(pub) */ void getPop(Signature& pop) const; /* make [s_0, ..., s_{k-1}] to prepare k-out-of-n secret sharing */ void getMasterSecretKey(SecretKeyVec& msk, size_t k) const { if (k <= 1) throw std::invalid_argument("getMasterSecretKey"); msk.resize(k); msk[0] = *this; for (size_t i = 1; i < k; i++) { msk[i].init(); } } /* set a secret key for id > 0 from msk */ void set(const SecretKeyVec& msk, const Id& id) { set(msk.data(), msk.size(), id); } /* recover secretKey from k secVec */ void recover(const SecretKeyVec& secVec, const IdVec& idVec) { if (secVec.size() != idVec.size()) throw std::invalid_argument("SecretKey:recover"); recover(secVec.data(), idVec.data(), idVec.size()); } /* add secret key */ void add(const SecretKey& rhs); // the following methods are for C api /* the size of msk must be k */ void set(const SecretKey *msk, size_t k, const Id& id) { int ret = blsSecretKeyShare(&self_, &msk->self_, k, &id.self_); if (ret != 0) throw std::runtime_error("blsSecretKeyShare"); } void recover(const SecretKey *secVec, const Id *idVec, size_t n) { int ret = blsSecretKeyRecover(&self_, &secVec->self_, &idVec->self_, n); if (ret != 0) throw std::runtime_error("blsSecretKeyRecover:same id"); } }; /* sQ ; public key */ class PublicKey { blsPublicKey self_; friend class SecretKey; friend class Signature; public: bool operator==(const PublicKey& rhs) const { return blsPublicKeyIsEqual(&self_, &rhs.self_) == 1; } bool operator!=(const PublicKey& rhs) const { return !(*this == rhs); } friend std::ostream& operator<<(std::ostream& os, const PublicKey& pub) { std::string str; pub.getStr(str, 16|IoPrefix); return os << str; } friend std::istream& operator>>(std::istream& is, PublicKey& pub) { std::string str; is >> str; if (str != "0") { // 1 <x.a> <x.b> <y.a> <y.b> std::string t; #ifdef BLS_SWAP_G const int elemNum = 2; #else const int elemNum = 4; #endif for (int i = 0; i < elemNum; i++) { is >> t; str += ' '; str += t; } } pub.setStr(str, 16); return is; } void getStr(std::string& str, int ioMode = 0) const { str.resize(1024); #ifdef BLS_SWAP_G size_t n = mclBnG1_getStr(&str[0], str.size(), &self_.v, ioMode); #else size_t n = mclBnG2_getStr(&str[0], str.size(), &self_.v, ioMode); #endif if (n == 0) throw std::runtime_error("PublicKey:getStr"); str.resize(n); } void setStr(const std::string& str, int ioMode = 0) { #ifdef BLS_SWAP_G int ret = mclBnG1_setStr(&self_.v, str.c_str(), str.size(), ioMode); #else int ret = mclBnG2_setStr(&self_.v, str.c_str(), str.size(), ioMode); #endif if (ret != 0) throw std::runtime_error("PublicKey:setStr"); } /* set public for id from mpk */ void set(const PublicKeyVec& mpk, const Id& id) { set(mpk.data(), mpk.size(), id); } /* recover publicKey from k pubVec */ void recover(const PublicKeyVec& pubVec, const IdVec& idVec) { if (pubVec.size() != idVec.size()) throw std::invalid_argument("PublicKey:recover"); recover(pubVec.data(), idVec.data(), idVec.size()); } /* add public key */ void add(const PublicKey& rhs) { blsPublicKeyAdd(&self_, &rhs.self_); } // the following methods are for C api void set(const PublicKey *mpk, size_t k, const Id& id) { int ret = blsPublicKeyShare(&self_, &mpk->self_, k, &id.self_); if (ret != 0) throw std::runtime_error("blsPublicKeyShare"); } void recover(const PublicKey *pubVec, const Id *idVec, size_t n) { int ret = blsPublicKeyRecover(&self_, &pubVec->self_, &idVec->self_, n); if (ret != 0) throw std::runtime_error("blsPublicKeyRecover"); } }; /* s H(m) ; signature */ class Signature { blsSignature self_; friend class SecretKey; public: bool operator==(const Signature& rhs) const { return blsSignatureIsEqual(&self_, &rhs.self_) == 1; } bool operator!=(const Signature& rhs) const { return !(*this == rhs); } friend std::ostream& operator<<(std::ostream& os, const Signature& sig) { std::string str; sig.getStr(str, 16|IoPrefix); return os << str; } friend std::istream& operator>>(std::istream& is, Signature& sig) { std::string str; is >> str; if (str != "0") { // 1 <x> <y> std::string t; #ifdef BLS_SWAP_G const int elemNum = 4; #else const int elemNum = 2; #endif for (int i = 0; i < elemNum; i++) { is >> t; str += ' '; str += t; } } sig.setStr(str, 16); return is; } void getStr(std::string& str, int ioMode = 0) const { str.resize(1024); #ifdef BLS_SWAP_G size_t n = mclBnG2_getStr(&str[0], str.size(), &self_.v, ioMode); #else size_t n = mclBnG1_getStr(&str[0], str.size(), &self_.v, ioMode); #endif if (n == 0) throw std::runtime_error("Signature:tgetStr"); str.resize(n); } void setStr(const std::string& str, int ioMode = 0) { #ifdef BLS_SWAP_G int ret = mclBnG2_setStr(&self_.v, str.c_str(), str.size(), ioMode); #else int ret = mclBnG1_setStr(&self_.v, str.c_str(), str.size(), ioMode); #endif if (ret != 0) throw std::runtime_error("Signature:setStr"); } bool verify(const PublicKey& pub, const void *m, size_t size) const { return blsVerify(&self_, &pub.self_, m, size) == 1; } bool verify(const PublicKey& pub, const std::string& m) const { return verify(pub, m.c_str(), m.size()); } bool verifyHash(const PublicKey& pub, const void *h, size_t size) const { return blsVerifyHash(&self_, &pub.self_, h, size) == 1; } bool verifyHash(const PublicKey& pub, const std::string& h) const { return verifyHash(pub, h.c_str(), h.size()); } bool verifyAggregatedHashes(const PublicKey *pubVec, const void *hVec, size_t sizeofHash, size_t n) const { return blsVerifyAggregatedHashes(&self_, &pubVec[0].self_, hVec, sizeofHash, n) == 1; } /* verify self(pop) with pub */ bool verify(const PublicKey& pub) const { std::string str; pub.getStr(str); return verify(pub, str); } /* recover sig from k sigVec */ void recover(const SignatureVec& sigVec, const IdVec& idVec) { if (sigVec.size() != idVec.size()) throw std::invalid_argument("Signature:recover"); recover(sigVec.data(), idVec.data(), idVec.size()); } /* add signature */ void add(const Signature& rhs) { blsSignatureAdd(&self_, &rhs.self_); } // the following methods are for C api void recover(const Signature* sigVec, const Id *idVec, size_t n) { int ret = blsSignatureRecover(&self_, &sigVec->self_, &idVec->self_, n); if (ret != 0) throw std::runtime_error("blsSignatureRecover:same id"); } }; /* make master public key [s_0 Q, ..., s_{k-1} Q] from msk */ inline void getMasterPublicKey(PublicKeyVec& mpk, const SecretKeyVec& msk) { const size_t n = msk.size(); mpk.resize(n); for (size_t i = 0; i < n; i++) { msk[i].getPublicKey(mpk[i]); } } inline void SecretKey::getPublicKey(PublicKey& pub) const { blsGetPublicKey(&pub.self_, &self_); } inline void SecretKey::sign(Signature& sig, const void *m, size_t size) const { blsSign(&sig.self_, &self_, m, size); } inline void SecretKey::signHash(Signature& sig, const void *h, size_t size) const { if (blsSignHash(&sig.self_, &self_, h, size) != 0) throw std::runtime_error("bad h"); } inline void SecretKey::getPop(Signature& pop) const { PublicKey pub; getPublicKey(pub); std::string m; pub.getStr(m); sign(pop, m); } /* make pop from msk and mpk */ inline void getPopVec(SignatureVec& popVec, const SecretKeyVec& msk) { const size_t n = msk.size(); popVec.resize(n); for (size_t i = 0; i < n; i++) { msk[i].getPop(popVec[i]); } } inline Signature operator+(const Signature& a, const Signature& b) { Signature r(a); r.add(b); return r; } inline PublicKey operator+(const PublicKey& a, const PublicKey& b) { PublicKey r(a); r.add(b); return r; } inline SecretKey operator+(const SecretKey& a, const SecretKey& b) { SecretKey r(a); r.add(b); return r; } } //bls </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6379169465191a8eab3bf1c5f207762e8def792a'>Update version requirement of RUN_DEPENDS</a></td><td>sunpoet</td><td><span title='2019-09-01 05:58:22 +0800'>2019-09-01</span></td><td>2</td><td><span class='deletions'>-10</span>/<span class='insertions'>+17</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=c16c0b963e6101fda72f0ddf378d82cb211d2cfb'>update thunderbird to 68.1.0 (rc1)</a></td><td>cmt</td><td><span title='2019-08-31 05:34:38 +0800'>2019-08-31</span></td><td>3</td><td><span class='deletions'>-28</span>/<span class='insertions'>+5</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=a451d39870819afb8471412c39057485cea80d58'>mail/dovecot,mail/dovecot-pigeonhole: fix CVE-2019-11500</a></td><td>ler</td><td><span title='2019-08-28 23:59:59 +0800'>2019-08-28</span></td><td>4</td><td><span class='deletions'>-11</span>/<span class='insertions'>+10</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=b89384672e622600e4578995ff88fcbf50600c23'>Missing dependency</a></td><td>crees</td><td><span title='2019-08-28 22:28:44 +0800'>2019-08-28</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+3</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=49c82b9fe93528e90324efca9028d963c70a8c7b'>Regular pkg-message cleanup.</a></td><td>mat</td><td><span title='2019-08-27 19:57:45 +0800'>2019-08-27</span></td><td>1</td><td><span class='deletions'>-4</span>/<span class='insertions'>+8</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=4bd03317685c1a6a5c1032b47533ad44d4e334a3'>mail/thunderbird: switch to rc6 (nop)</a></td><td>jbeich</td><td><span title='2019-08-27 08:54:03 +0800'>2019-08-27</span></td><td>2</td><td><span class='deletions'>-5</span>/<span class='insertions'>+5</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6748ca2f70af48c9626b3b691a90b3720438fdf3'>Update to 0.6806</a></td><td>sunpoet</td><td><span title='2019-08-26 19:49:36 +0800'>2019-08-26</span></td><td>3</td><td><span class='deletions'>-8</span>/<span class='insertions'>+8</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=f3cea797c1e94bd06833f839ab06cb9978bd1886'>Add rubygem-premailer-rails19-rails52 1.9.7 (copied from rubygem-premailer-ra...</a></td><td>mfechner</td><td><span title='2019-08-26 15:26:14 +0800'>2019-08-26</span></td><td>4</td><td><span class='deletions'>-0</span>/<span class='insertions'>+35</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6391c579242d25ededbd441e1b26de11418dcf49'>Add rubygem-actionmailer52 5.2.3 (copied from rubygem-actionmailer5)</a></td><td>sunpoet</td><td><span title='2019-08-26 02:17:56 +0800'>2019-08-26</span></td><td>4</td><td><span class='deletions'>-0</span>/<span class='insertions'>+43</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=73588fbda6ef9b9ea2cf1fd85bca59ad4c432ec9'>mail/fetchmail64: Update to -rc3 with a few fixes that are to appear in 6.4.0...</a></td><td>mandree</td><td><span title='2019-08-25 17:34:27 +0800'>2019-08-25</span></td><td>7</td><td><span class='deletions'>-4</span>/<span class='insertions'>+728</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=5f51a583f5f37297d9ef62f45614c32eefa324d1'>mail/mairix: fix build with GCC-based architectures</a></td><td>pkubaj</td><td><span title='2019-08-25 03:05:40 +0800'>2019-08-25</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=1b6d1ac9ab125274cd84e581e8bc6075a95db9a8'>mail/getmail: Update to version 5.14</a></td><td>jrm</td><td><span title='2019-08-24 09:16:46 +0800'>2019-08-24</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=cc9635e2d4003d4f770239bc4fd89ecb356c19eb'>Update to 0.56</a></td><td>sunpoet</td><td><span title='2019-08-24 08:10:31 +0800'>2019-08-24</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=44adb6e29d77fc5f52446aa7a1e09ab879f7ba53'>www/firefox: unbreak on -CURRENT</a></td><td>jbeich</td><td><span title='2019-08-24 05:55:31 +0800'>2019-08-24</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+22</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=dcb1afd4107ea0f87ea0378347299ee570b681b8'>mail/dma: Update to 0.12</a></td><td>garga</td><td><span title='2019-08-22 03:22:03 +0800'>2019-08-22</span></td><td>3</td><td><span class='deletions'>-39</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6c83f63920263e47377c827989b6910516f6058e'>- update to 1.1.Alpha13.0</a></td><td>dinoex</td><td><span title='2019-08-21 06:15:30 +0800'>2019-08-21</span></td><td>3</td><td><span class='deletions'>-12</span>/<span class='insertions'>+10</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=51fae9a42e8e0e17a8e4ddad5d6163010af06f15'>mail/rainloop{,-community}: Update to 1.13.0</a></td><td>meta</td><td><span title='2019-08-20 08:24:02 +0800'>2019-08-20</span></td><td>5</td><td><span class='deletions'>-55</span>/<span class='insertions'>+21</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=80ed4f985237c2a79fd65ea6908ab203c6e73c79'>Resolve conflicts and fix portlint warnings around USES= placement.</a></td><td>mandree</td><td><span title='2019-08-20 06:09:56 +0800'>2019-08-20</span></td><td>2</td><td><span class='deletions'>-5</span>/<span class='insertions'>+11</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=d159760b5aeaebbc355958e4cc93b28807f3a898'>Add new port to mail/ to package fetchmail 6.4 release candidate.</a></td><td>mandree</td><td><span title='2019-08-20 06:01:56 +0800'>2019-08-20</span></td><td>9</td><td><span class='deletions'>-0</span>/<span class='insertions'>+320</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=f38e8d33c608eec7a94aa6fdfc46714d4181d246'>devel/boost-*: update to 1.71.0</a></td><td>jbeich</td><td><span title='2019-08-19 23:35:27 +0800'>2019-08-19</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=fffd45f3f3785ec68cb3edb73eb6a81980f1ad9a'>mail/nextcloud-mail: Update to 0.15.2</a></td><td>brnrd</td><td><span title='2019-08-17 21:22:14 +0800'>2019-08-17</span></td><td>3</td><td><span class='deletions'>-27</span>/<span class='insertions'>+58</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=ba0c76faab7e11dbc7f23b57d53f631ace63cf90'>lang/rust: Update to 1.37.0</a></td><td>tobik</td><td><span title='2019-08-15 22:30:16 +0800'>2019-08-15</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=384f663622988c240d680e396ac43c6e10525e9d'>- Fix MAILDIR_MTIME_PATCH option with NNTP enabled</a></td><td>ak</td><td><span title='2019-08-15 18:28:14 +0800'>2019-08-15</span></td><td>1</td><td><span class='deletions'>-8</span>/<span class='insertions'>+8</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=4da3f44e2342a3929d2f279b21608ef93033b93c'>- Unbreak nntp patch</a></td><td>ak</td><td><span title='2019-08-15 03:20:15 +0800'>2019-08-15</span></td><td>3</td><td><span class='deletions'>-90</span>/<span class='insertions'>+10</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=ddd7d54aa62a0e101cfe9cbf722c8c2b8ca9e472'>Fix parsing SPF records</a></td><td>sunpoet</td><td><span title='2019-08-15 02:02:14 +0800'>2019-08-15</span></td><td>2</td><td><span class='deletions'>-3</span>/<span class='insertions'>+14</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=ef318ff46115e13c85a902cacef34ffc77011df7'>mail/thunderbird: switch to rc3 (nop)</a></td><td>jbeich</td><td><span title='2019-08-14 18:18:34 +0800'>2019-08-14</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=a9df13095e689ce73dab9241fe03be8f39410a91'>Convert to UCL & cleanup pkg-message (categories n)</a></td><td>mat</td><td><span title='2019-08-14 16:48:50 +0800'>2019-08-14</span></td><td>2</td><td><span class='deletions'>-2</span>/<span class='insertions'>+12</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6b289f6626e856b4c866685d87f516280c123eb6'>onvert to UCL & cleanup pkg-message (categories l-m)</a></td><td>mat</td><td><span title='2019-08-14 06:29:42 +0800'>2019-08-14</span></td><td>145</td><td><span class='deletions'>-314</span>/<span class='insertions'>+903</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=80a133243aa6086c800d63ec4739fbe2db1d9b53'>mail/astroid: fix build with GCC-based architectures</a></td><td>pkubaj</td><td><span title='2019-08-13 17:18:19 +0800'>2019-08-13</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=c9af2bb3d0a6d4c5fd4bd8b111544209ce756757'>Bump PORTREVISION in accordance with editors/semi update.</a></td><td>nobutaka</td><td><span title='2019-08-12 22:18:07 +0800'>2019-08-12</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=075ea3f22987d3ef2c574d387fcb55d496ae3b04'>mail/thunderbird: update to 68.0</a></td><td>jbeich</td><td><span title='2019-08-11 08:49:33 +0800'>2019-08-11</span></td><td>27</td><td><span class='deletions'>-34604</span>/<span class='insertions'>+178</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=db2115615d66b0ae17a3a4c2883e93ebdde2adbe'>Update to 14.9.14</a></td><td>sunpoet</td><td><span title='2019-08-11 06:55:05 +0800'>2019-08-11</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=3601ec15d9e6dea198ee861926afe34dbc6c90c9'>Update to 1.2.0</a></td><td>sunpoet</td><td><span title='2019-08-11 06:54:59 +0800'>2019-08-11</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+7</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=5f472a6a50feb7a6fa5c56d98da6e38c82ad7c63'>Cosmetic change</a></td><td>sunpoet</td><td><span title='2019-08-11 06:51:08 +0800'>2019-08-11</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=1783e4cd7b0d8870c5b8822f5b4dbf1acb5969e0'>Cosmetic change</a></td><td>sunpoet</td><td><span title='2019-08-11 06:51:03 +0800'>2019-08-11</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=73a519c4ab72a361db716e7da428813d66a83eeb'>- reclaim maintainership</a></td><td>jgh</td><td><span title='2019-08-09 23:36:02 +0800'>2019-08-09</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+5</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=9bc42512ca9ae06095314bf2a6dd5f1c974f7365'>- reclaim</a></td><td>jgh</td><td><span title='2019-08-08 23:28:13 +0800'>2019-08-08</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=1075fcfe6074b3f9dafda218023a6d0a4ebb90e1'>New port: mail/astroid: Graphical email client for notmuch, inspired by sup a...</a></td><td>yuri</td><td><span title='2019-08-08 15:59:02 +0800'>2019-08-08</span></td><td>6</td><td><span class='deletions'>-0</span>/<span class='insertions'>+87</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=495b76742f9237877a36b1f3676a46e56e8cdb3f'>Return jgh's ports to the various pools after his commit bit was safekept.</a></td><td>rene</td><td><span title='2019-08-06 04:07:06 +0800'>2019-08-06</span></td><td>2</td><td><span class='deletions'>-2</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=c4e4ac2a3e136734efa232145e631827e97661e5'>Update to 3.17.4</a></td><td>joneum</td><td><span title='2019-08-05 15:28:48 +0800'>2019-08-05</span></td><td>5</td><td><span class='deletions'>-7</span>/<span class='insertions'>+7</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=5b2a90798a9275507fc840e15928114f0700ce01'>Mark BROKEN: unfetchable</a></td><td>antoine</td><td><span title='2019-08-04 23:34:54 +0800'>2019-08-04</span></td><td>10</td><td><span class='deletions'>-0</span>/<span class='insertions'>+20</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0e587811715d9f59975aba734989f94d8271ab4e'>mail/fetchmailconf: fix use by simplifing the search for Tkinter etc</a></td><td>pi</td><td><span title='2019-08-04 20:44:57 +0800'>2019-08-04</span></td><td>3</td><td><span class='deletions'>-21</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=1d5f9553ffba35361c2c87af50e6ad9321c08e1e'>Deprecate ports broken for more than 6 months</a></td><td>antoine</td><td><span title='2019-08-04 17:07:47 +0800'>2019-08-04</span></td><td>2</td><td><span class='deletions'>-0</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=cfa73b8b53a9ea8d83e90f0f5c3f6eee1fe38700'>mail/qmail-mysql: fix build with GCC architectures</a></td><td>pkubaj</td><td><span title='2019-08-04 16:37:40 +0800'>2019-08-04</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=073fde9e66e94ac02c5acb46c139151f1300d315'>Update to 4.25.2</a></td><td>sunpoet</td><td><span title='2019-08-04 04:56:51 +0800'>2019-08-04</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=44e49239ade3b249eb8c8c001df014b0f507b2b2'>devel/libevent2: update to 2.1.11</a></td><td>jbeich</td><td><span title='2019-08-02 21:30:40 +0800'>2019-08-02</span></td><td>7</td><td><span class='deletions'>-6</span>/<span class='insertions'>+7</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=91e2be1b9c0f1ef0eb83af7b60c7ee9b9af0b788'>mail/roundcube-carddav: update to 3.0.3</a></td><td>gahr</td><td><span title='2019-08-02 20:43:58 +0800'>2019-08-02</span></td><td>3</td><td><span class='deletions'>-4</span>/<span class='insertions'>+6</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=26831ee64507f49f9ceb71f108e223d9389fcc61'>- Update WWW</a></td><td>amdmi3</td><td><span title='2019-08-01 17:02:23 +0800'>2019-08-01</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=fa720974f69114cc49994bf99a4e42bcd5714e81'>graphics/poppler: update to 0.79.0</a></td><td>tcberner</td><td><span title='2019-08-01 05:14:15 +0800'>2019-08-01</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/mail?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=2a44018a9e8c54a75f7fafcb5168207ac7070c3d'>Cherry-pick the following two changes from the upstream Git repository</a></td><td>danfe</td><td><span title='2019-07-31 19:44:17 +0800'>2019-07-31</span>