Skip to content

Commit

Permalink
Make ec-encode-point return uncompressed points for secp* curves
Browse files Browse the repository at this point in the history
  • Loading branch information
glv2 committed Aug 24, 2020
1 parent fdd4586 commit 4c689d0
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 32 deletions.
14 changes: 8 additions & 6 deletions src/public-key/secp256k1.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,11 @@
(invz2 (mod (* invz invz) +secp256k1-p+))
(invz3 (mod (* invz2 invz) +secp256k1-p+))
(x (mod (* x invz2) +secp256k1-p+))
(y (mod (* y invz3) +secp256k1-p+))
(y-sign (logand y 1)))
(y (mod (* y invz3) +secp256k1-p+)))
(concatenate '(simple-array (unsigned-byte 8) (*))
(vector (+ 2 y-sign))
(ec-encode-scalar :secp256k1 x)))))
(vector 4)
(ec-encode-scalar :secp256k1 x)
(ec-encode-scalar :secp256k1 y)))))

(defmethod ec-decode-point ((kind (eql :secp256k1)) octets)
(declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
Expand Down Expand Up @@ -232,7 +232,8 @@
(k (generate-signature-nonce key message))
(invk (modular-inverse-with-blinding k +secp256k1-l+))
(r (ec-scalar-mult +secp256k1-g+ k))
(r (ec-decode-scalar :secp256k1 (subseq (ec-encode-point r) 1)))
(x (subseq (ec-encode-point r) 1 (1+ (/ +secp256k1-bits+ 8))))
(r (ec-decode-scalar :secp256k1 x))
(r (mod r +secp256k1-l+))
(h (subseq message start end))
(e (ec-decode-scalar :secp256k1 h))
Expand All @@ -259,7 +260,8 @@
(u2 (mod (* r w) +secp256k1-l+))
(rp (ec-add (ec-scalar-mult +secp256k1-g+ u1)
(ec-scalar-mult pk u2)))
(v (ec-decode-scalar :secp256k1 (subseq (ec-encode-point rp) 1)))
(x (subseq (ec-encode-point rp) 1 (1+ (/ +secp256k1-bits+ 8))))
(v (ec-decode-scalar :secp256k1 x))
(v (mod v +secp256k1-l+)))
(and (< r +secp256k1-l+)
(< s +secp256k1-l+)
Expand Down
14 changes: 8 additions & 6 deletions src/public-key/secp256r1.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,11 @@
(invz2 (mod (* invz invz) +secp256r1-p+))
(invz3 (mod (* invz2 invz) +secp256r1-p+))
(x (mod (* x invz2) +secp256r1-p+))
(y (mod (* y invz3) +secp256r1-p+))
(y-sign (logand y 1)))
(y (mod (* y invz3) +secp256r1-p+)))
(concatenate '(simple-array (unsigned-byte 8) (*))
(vector (+ 2 y-sign))
(ec-encode-scalar :secp256r1 x)))))
(vector 4)
(ec-encode-scalar :secp256r1 x)
(ec-encode-scalar :secp256r1 y)))))

(defmethod ec-decode-point ((kind (eql :secp256r1)) octets)
(declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
Expand Down Expand Up @@ -233,7 +233,8 @@
(k (generate-signature-nonce key message))
(invk (modular-inverse-with-blinding k +secp256r1-l+))
(r (ec-scalar-mult +secp256r1-g+ k))
(r (ec-decode-scalar :secp256r1 (subseq (ec-encode-point r) 1)))
(x (subseq (ec-encode-point r) 1 (1+ (/ +secp256r1-bits+ 8))))
(r (ec-decode-scalar :secp256r1 x))
(r (mod r +secp256r1-l+))
(h (subseq message start end))
(e (ec-decode-scalar :secp256r1 h))
Expand All @@ -260,7 +261,8 @@
(u2 (mod (* r w) +secp256r1-l+))
(rp (ec-add (ec-scalar-mult +secp256r1-g+ u1)
(ec-scalar-mult pk u2)))
(v (ec-decode-scalar :secp256r1 (subseq (ec-encode-point rp) 1)))
(x (subseq (ec-encode-point rp) 1 (1+ (/ +secp256r1-bits+ 8))))
(v (ec-decode-scalar :secp256r1 x))
(v (mod v +secp256r1-l+)))
(and (< r +secp256r1-l+)
(< s +secp256r1-l+)
Expand Down
14 changes: 8 additions & 6 deletions src/public-key/secp384r1.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,11 @@
(invz2 (mod (* invz invz) +secp384r1-p+))
(invz3 (mod (* invz2 invz) +secp384r1-p+))
(x (mod (* x invz2) +secp384r1-p+))
(y (mod (* y invz3) +secp384r1-p+))
(y-sign (logand y 1)))
(y (mod (* y invz3) +secp384r1-p+)))
(concatenate '(simple-array (unsigned-byte 8) (*))
(vector (+ 2 y-sign))
(ec-encode-scalar :secp384r1 x)))))
(vector 4)
(ec-encode-scalar :secp384r1 x)
(ec-encode-scalar :secp384r1 y)))))

(defmethod ec-decode-point ((kind (eql :secp384r1)) octets)
(declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
Expand Down Expand Up @@ -233,7 +233,8 @@
(k (generate-signature-nonce key message))
(invk (modular-inverse-with-blinding k +secp384r1-l+))
(r (ec-scalar-mult +secp384r1-g+ k))
(r (ec-decode-scalar :secp384r1 (subseq (ec-encode-point r) 1)))
(x (subseq (ec-encode-point r) 1 (1+ (/ +secp384r1-bits+ 8))))
(r (ec-decode-scalar :secp384r1 x))
(r (mod r +secp384r1-l+))
(h (subseq message start end))
(e (ec-decode-scalar :secp384r1 h))
Expand All @@ -260,7 +261,8 @@
(u2 (mod (* r w) +secp384r1-l+))
(rp (ec-add (ec-scalar-mult +secp384r1-g+ u1)
(ec-scalar-mult pk u2)))
(v (ec-decode-scalar :secp384r1 (subseq (ec-encode-point rp) 1)))
(x (subseq (ec-encode-point rp) 1 (1+ (/ +secp384r1-bits+ 8))))
(v (ec-decode-scalar :secp384r1 x))
(v (mod v +secp384r1-l+)))
(and (< r +secp384r1-l+)
(< s +secp384r1-l+)
Expand Down
14 changes: 8 additions & 6 deletions src/public-key/secp521r1.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,11 @@
(invz2 (mod (* invz invz) +secp521r1-p+))
(invz3 (mod (* invz2 invz) +secp521r1-p+))
(x (mod (* x invz2) +secp521r1-p+))
(y (mod (* y invz3) +secp521r1-p+))
(y-sign (logand y 1)))
(y (mod (* y invz3) +secp521r1-p+)))
(concatenate '(simple-array (unsigned-byte 8) (*))
(vector (+ 2 y-sign))
(ec-encode-scalar :secp521r1 x)))))
(vector 4)
(ec-encode-scalar :secp521r1 x)
(ec-encode-scalar :secp521r1 y)))))

(defmethod ec-decode-point ((kind (eql :secp521r1)) octets)
(declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
Expand Down Expand Up @@ -233,7 +233,8 @@
(k (generate-signature-nonce key message))
(invk (modular-inverse-with-blinding k +secp521r1-l+))
(r (ec-scalar-mult +secp521r1-g+ k))
(r (ec-decode-scalar :secp521r1 (subseq (ec-encode-point r) 1)))
(x (subseq (ec-encode-point r) 1 (1+ (ceiling +secp521r1-bits+ 8))))
(r (ec-decode-scalar :secp521r1 x))
(r (mod r +secp521r1-l+))
(h (subseq message start end))
(e (ec-decode-scalar :secp521r1 h))
Expand All @@ -260,7 +261,8 @@
(u2 (mod (* r w) +secp521r1-l+))
(rp (ec-add (ec-scalar-mult +secp521r1-g+ u1)
(ec-scalar-mult pk u2)))
(v (ec-decode-scalar :secp521r1 (subseq (ec-encode-point rp) 1)))
(x (subseq (ec-encode-point rp) 1 (1+ (ceiling +secp521r1-bits+ 8))))
(v (ec-decode-scalar :secp521r1 x))
(v (mod v +secp521r1-l+)))
(and (< r +secp521r1-l+)
(< s +secp521r1-l+)
Expand Down
4 changes: 2 additions & 2 deletions testing/test-vectors/secp256k1-dh.testvec
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
;;;; secp256k1 test vectors

(:secp256k1-dh-test #h"0000000000000000000000000000000000000000000000000000000000000002" #h"04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a" #h"0000000000000000000000000000000000000000000000000000000000000003" #h"04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672" #h"03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556")
(:secp256k1-dh-test #h"0000000000000000000000000000000000000000000000000000000000000002" #h"04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a" #h"0000000000000000000000000000000000000000000000000000000000000003" #h"04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672" #h"04fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556ae12777aacfbb620f3be96017f45c560de80f0f6518fe4a03c870c36b075f297")
;; Same test vector with compressed points
(:secp256k1-dh-test #h"0000000000000000000000000000000000000000000000000000000000000002" #h"02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" #h"0000000000000000000000000000000000000000000000000000000000000003" #h"02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9" #h"03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556")
(:secp256k1-dh-test #h"0000000000000000000000000000000000000000000000000000000000000002" #h"02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" #h"0000000000000000000000000000000000000000000000000000000000000003" #h"02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9" #h"04fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556ae12777aacfbb620f3be96017f45c560de80f0f6518fe4a03c870c36b075f297")
4 changes: 2 additions & 2 deletions testing/test-vectors/secp256r1-dh.testvec
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

;;; Test vector from RFC 5903

(:secp256r1-dh-test #h"c88f01f510d9ac3f70a292daa2316de544e9aab8afe84049c62a9c57862d1433" #h"04dad0b65394221cf9b051e1feca5787d098dfe637fc90b9ef945d0c37725811805271a0461cdb8252d61f1c456fa3e59ab1f45b33accf5f58389e0577b8990bb3" #h"c6ef9c5d78ae012a011164acb397ce2088685d8f06bf9be0b283ab46476bee53" #h"04d12dfb5289c8d4f81208b70270398c342296970a0bccb74c736fc7554494bf6356fbf3ca366cc23e8157854c13c58d6aac23f046ada30f8353e74f33039872ab" #h"02d6840f6b42f6edafd13116e0e12565202fef8e9ece7dce03812464d04b9442de")
(:secp256r1-dh-test #h"c88f01f510d9ac3f70a292daa2316de544e9aab8afe84049c62a9c57862d1433" #h"04dad0b65394221cf9b051e1feca5787d098dfe637fc90b9ef945d0c37725811805271a0461cdb8252d61f1c456fa3e59ab1f45b33accf5f58389e0577b8990bb3" #h"c6ef9c5d78ae012a011164acb397ce2088685d8f06bf9be0b283ab46476bee53" #h"04d12dfb5289c8d4f81208b70270398c342296970a0bccb74c736fc7554494bf6356fbf3ca366cc23e8157854c13c58d6aac23f046ada30f8353e74f33039872ab" #h"04d6840f6b42f6edafd13116e0e12565202fef8e9ece7dce03812464d04b9442de522bde0af0d8585b8def9c183b5ae38f50235206a8674ecb5d98edb20eb153a2")
;; Same test vector with compressed points
(:secp256r1-dh-test #h"c88f01f510d9ac3f70a292daa2316de544e9aab8afe84049c62a9c57862d1433" #h"03dad0b65394221cf9b051e1feca5787d098dfe637fc90b9ef945d0c3772581180" #h"c6ef9c5d78ae012a011164acb397ce2088685d8f06bf9be0b283ab46476bee53" #h"03d12dfb5289c8d4f81208b70270398c342296970a0bccb74c736fc7554494bf63" #h"02d6840f6b42f6edafd13116e0e12565202fef8e9ece7dce03812464d04b9442de")
(:secp256r1-dh-test #h"c88f01f510d9ac3f70a292daa2316de544e9aab8afe84049c62a9c57862d1433" #h"03dad0b65394221cf9b051e1feca5787d098dfe637fc90b9ef945d0c3772581180" #h"c6ef9c5d78ae012a011164acb397ce2088685d8f06bf9be0b283ab46476bee53" #h"03d12dfb5289c8d4f81208b70270398c342296970a0bccb74c736fc7554494bf63" #h"04d6840f6b42f6edafd13116e0e12565202fef8e9ece7dce03812464d04b9442de522bde0af0d8585b8def9c183b5ae38f50235206a8674ecb5d98edb20eb153a2")
4 changes: 2 additions & 2 deletions testing/test-vectors/secp384r1-dh.testvec
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

;;; Test vector from RFC 5903

(:secp384r1-dh-test #h"099f3c7034d4a2c699884d73a375a67f7624ef7c6b3c0f160647b67414dce655e35b538041e649ee3faef896783ab194" #h"04667842d7d180ac2cde6f74f37551f55755c7645c20ef73e31634fe72b4c55ee6de3ac808acb4bdb4c88732aee95f41aa9482ed1fc0eeb9cafc4984625ccfc23f65032149e0e144ada024181535a0f38eeb9fcff3c2c947dae69b4c634573a81c" #h"41cb0779b4bdb85d47846725fbec3c9430fab46cc8dc5060855cc9bda0aa2942e0308312916b8ed2960e4bd55a7448fc" #h"04e558dbef53eecde3d3fccfc1aea08a89a987475d12fd950d83cfa41732bc509d0d1ac43a0336def96fda41d0774a3571dcfbec7aacf3196472169e838430367f66eebe3c6e70c416dd5f0c68759dd1fff83fa40142209dff5eaad96db9e6386c" #h"0211187331c279962d93d604243fd592cb9d0a926f422e47187521287e7156c5c4d603135569b9e9d09cf5d4a270f59746")
(:secp384r1-dh-test #h"099f3c7034d4a2c699884d73a375a67f7624ef7c6b3c0f160647b67414dce655e35b538041e649ee3faef896783ab194" #h"04667842d7d180ac2cde6f74f37551f55755c7645c20ef73e31634fe72b4c55ee6de3ac808acb4bdb4c88732aee95f41aa9482ed1fc0eeb9cafc4984625ccfc23f65032149e0e144ada024181535a0f38eeb9fcff3c2c947dae69b4c634573a81c" #h"41cb0779b4bdb85d47846725fbec3c9430fab46cc8dc5060855cc9bda0aa2942e0308312916b8ed2960e4bd55a7448fc" #h"04e558dbef53eecde3d3fccfc1aea08a89a987475d12fd950d83cfa41732bc509d0d1ac43a0336def96fda41d0774a3571dcfbec7aacf3196472169e838430367f66eebe3c6e70c416dd5f0c68759dd1fff83fa40142209dff5eaad96db9e6386c" #h"0411187331c279962d93d604243fd592cb9d0a926f422e47187521287e7156c5c4d603135569b9e9d09cf5d4a270f59746a2a9f38ef5cafbe2347cf7ec24bdd5e624bc93bfa82771f40d1b65d06256a852c983135d4669f8792f2c1d55718afbb4")
;; Same test vector with compressed points
(:secp384r1-dh-test #h"099f3c7034d4a2c699884d73a375a67f7624ef7c6b3c0f160647b67414dce655e35b538041e649ee3faef896783ab194" #h"02667842d7d180ac2cde6f74f37551f55755c7645c20ef73e31634fe72b4c55ee6de3ac808acb4bdb4c88732aee95f41aa" #h"41cb0779b4bdb85d47846725fbec3c9430fab46cc8dc5060855cc9bda0aa2942e0308312916b8ed2960e4bd55a7448fc" #h"02e558dbef53eecde3d3fccfc1aea08a89a987475d12fd950d83cfa41732bc509d0d1ac43a0336def96fda41d0774a3571" #h"0211187331c279962d93d604243fd592cb9d0a926f422e47187521287e7156c5c4d603135569b9e9d09cf5d4a270f59746")
(:secp384r1-dh-test #h"099f3c7034d4a2c699884d73a375a67f7624ef7c6b3c0f160647b67414dce655e35b538041e649ee3faef896783ab194" #h"02667842d7d180ac2cde6f74f37551f55755c7645c20ef73e31634fe72b4c55ee6de3ac808acb4bdb4c88732aee95f41aa" #h"41cb0779b4bdb85d47846725fbec3c9430fab46cc8dc5060855cc9bda0aa2942e0308312916b8ed2960e4bd55a7448fc" #h"02e558dbef53eecde3d3fccfc1aea08a89a987475d12fd950d83cfa41732bc509d0d1ac43a0336def96fda41d0774a3571" #h"0411187331c279962d93d604243fd592cb9d0a926f422e47187521287e7156c5c4d603135569b9e9d09cf5d4a270f59746a2a9f38ef5cafbe2347cf7ec24bdd5e624bc93bfa82771f40d1b65d06256a852c983135d4669f8792f2c1d55718afbb4")
4 changes: 2 additions & 2 deletions testing/test-vectors/secp521r1-dh.testvec
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

;;; Test vector from RFC 5903

(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"040015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e017cae20b6641d2eeb695786d8c946146239d099e18e1d5a514c739d7cb4a10ad8a788015ac405d7799dc75e7b7d5b6cf2261a6a7f1507438bf01beb6ca3926f9582" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0400d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f015c68226383956e3bd066e797b623c27ce0eac2f551a10c2c724d9852077b87220b6536c5c408a1d2aebb8e86d678ae49cb57091f4732296579ab44fcd17f0fc56a" #h"0301144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea")
(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"040015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e017cae20b6641d2eeb695786d8c946146239d099e18e1d5a514c739d7cb4a10ad8a788015ac405d7799dc75e7b7d5b6cf2261a6a7f1507438bf01beb6ca3926f9582" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0400d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f015c68226383956e3bd066e797b623c27ce0eac2f551a10c2c724d9852077b87220b6536c5c408a1d2aebb8e86d678ae49cb57091f4732296579ab44fcd17f0fc56a" #h"0401144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea01b901e6b17db2947ac017d853ef1c1674e5cfe59cda18d078e05d1b5242adaa9ffc3c63ea05edb1e13ce5b3a8e50c3eb622e8da1b38e0bdd1f88569d6c99baffa43")
;; Same test vector with compressed points
(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"020015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0200d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f" #h"0301144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea")
(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"020015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0200d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f" #h"0401144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea01b901e6b17db2947ac017d853ef1c1674e5cfe59cda18d078e05d1b5242adaa9ffc3c63ea05edb1e13ce5b3a8e50c3eb622e8da1b38e0bdd1f88569d6c99baffa43")

0 comments on commit 4c689d0

Please sign in to comment.