diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
commit | 4bfd864f10b68b71482b35c818559068ef8d5797 (patch) | |
tree | e3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc8235.txt | |
parent | ea76e11061bda059ae9f9ad130a9895cc85607db (diff) |
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc8235.txt')
-rw-r--r-- | doc/rfc/rfc8235.txt | 731 |
1 files changed, 731 insertions, 0 deletions
diff --git a/doc/rfc/rfc8235.txt b/doc/rfc/rfc8235.txt new file mode 100644 index 0000000..158073b --- /dev/null +++ b/doc/rfc/rfc8235.txt @@ -0,0 +1,731 @@ + + + + + + +Independent Submission F. Hao, Ed. +Request for Comments: 8235 Newcastle University (UK) +Category: Informational September 2017 +ISSN: 2070-1721 + + + Schnorr Non-interactive Zero-Knowledge Proof + +Abstract + + This document describes the Schnorr non-interactive zero-knowledge + (NIZK) proof, a non-interactive variant of the three-pass Schnorr + identification scheme. The Schnorr NIZK proof allows one to prove + the knowledge of a discrete logarithm without leaking any information + about its value. It can serve as a useful building block for many + cryptographic protocols to ensure that participants follow the + protocol specification honestly. This document specifies the Schnorr + NIZK proof in both the finite field and the elliptic curve settings. + +Status of This Memo + + This document is not an Internet Standards Track specification; it is + published for informational purposes. + + This is a contribution to the RFC Series, independently of any other + RFC stream. The RFC Editor has chosen to publish this document at + its discretion and makes no statement about its value for + implementation or deployment. Documents approved for publication by + the RFC Editor are not a candidate for any level of Internet + Standard; see Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc8235. + +Copyright Notice + + Copyright (c) 2017 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. + + + + + +Hao Informational [Page 1] + +RFC 8235 Schnorr NIZK Proof September 2017 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 + 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3 + 1.2. Notation . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Schnorr NIZK Proof over Finite Field . . . . . . . . . . . . 4 + 2.1. Group Parameters . . . . . . . . . . . . . . . . . . . . 4 + 2.2. Schnorr Identification Scheme . . . . . . . . . . . . . . 4 + 2.3. Non-interactive Zero-Knowledge Proof . . . . . . . . . . 5 + 2.4. Computation Cost . . . . . . . . . . . . . . . . . . . . 6 + 3. Schnorr NIZK Proof over Elliptic Curve . . . . . . . . . . . 6 + 3.1. Group Parameters . . . . . . . . . . . . . . . . . . . . 6 + 3.2. Schnorr Identification Scheme . . . . . . . . . . . . . . 7 + 3.3. Non-interactive Zero-Knowledge Proof . . . . . . . . . . 8 + 3.4. Computation Cost . . . . . . . . . . . . . . . . . . . . 8 + 4. Variants of Schnorr NIZK proof . . . . . . . . . . . . . . . 9 + 5. Applications of Schnorr NIZK proof . . . . . . . . . . . . . 9 + 6. Security Considerations . . . . . . . . . . . . . . . . . . . 10 + 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11 + 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 11 + 8.1. Normative References . . . . . . . . . . . . . . . . . . 11 + 8.2. Informative References . . . . . . . . . . . . . . . . . 12 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 13 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 13 + +1. Introduction + + A well-known principle for designing robust public key protocols is + as follows: "Do not assume that a message you receive has a + particular form (such as g^r for known r) unless you can check this" + [AN95]. This is the sixth of the eight principles defined by Ross + Anderson and Roger Needham at Crypto '95. Hence, it is also known as + the "sixth principle". In the past thirty years, many public key + protocols failed to prevent attacks, which can be explained by the + violation of this principle [Hao10]. + + While there may be several ways to satisfy the sixth principle, this + document describes one technique that allows one to prove the + knowledge of a discrete logarithm (e.g., r for g^r) without revealing + its value. This technique is called the Schnorr NIZK proof, which is + a non-interactive variant of the three-pass Schnorr identification + scheme [Stinson06]. The original Schnorr identification scheme is + made non-interactive through a Fiat-Shamir transformation [FS86], + assuming that there exists a secure cryptographic hash function + (i.e., the so-called random oracle model). + + + + + + +Hao Informational [Page 2] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + The Schnorr NIZK proof can be implemented over a finite field or an + elliptic curve (EC). The technical specification is basically the + same, except that the underlying cyclic group is different. For + completeness, this document describes the Schnorr NIZK proof in both + the finite field and the EC settings. + +1.1. Requirements Language + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +1.2. Notation + + The following notation is used in this document: + + o Alice: the assumed identity of the prover in the protocol + + o Bob: the assumed identity of the verifier in the protocol + + o a | b: a divides b + + o a || b: concatenation of a and b + + o [a, b]: the interval of integers between and including a and b + + o t: the bit length of the challenge chosen by Bob + + o H: a secure cryptographic hash function + + o p: a large prime + + o q: a large prime divisor of p-1, i.e., q | p-1 + + o Zp*: a multiplicative group of integers modulo p + + o Gq: a subgroup of Zp* with prime order q + + o g: a generator of Gq + + o g^d: g raised to the power of d + + o a mod b: a modulo b + + o Fp: a finite field of p elements, where p is a prime + + + + +Hao Informational [Page 3] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + o E(Fp): an elliptic curve defined over Fp + + o G: a generator of the subgroup over E(Fp) with prime order n + + o n: the order of G + + o h: the cofactor of the subgroup generated by G, which is equal to + the order of the elliptic curve divided by n + + o P x [b]: multiplication of a point P with a scalar b over E(Fp) + +2. Schnorr NIZK Proof over Finite Field + +2.1. Group Parameters + + When implemented over a finite field, the Schnorr NIZK proof may use + the same group setting as DSA [FIPS186-4]. Let p and q be two large + primes with q | p-1. Let Gq denote the subgroup of Zp* of prime + order q, and g be a generator for the subgroup. Refer to the DSA + examples in the NIST Cryptographic Toolkit [NIST_DSA] for values of + (p, q, g) that provide different security levels. A level of 128-bit + security or above is recommended. Here, DSA groups are used only as + an example. Other multiplicative groups where the discrete logarithm + problem (DLP) is intractable are also suitable for the implementation + of the Schnorr NIZK proof. + +2.2. Schnorr Identification Scheme + + The Schnorr identification scheme runs interactively between Alice + (prover) and Bob (verifier). In the setup of the scheme, Alice + publishes her public key A = g^a mod p, where a is the private key + chosen uniformly at random from [0, q-1]. + + The protocol works in three passes: + + 1. Alice chooses a number v uniformly at random from [0, q-1] and + computes V = g^v mod p. She sends V to Bob. + + 2. Bob chooses a challenge c uniformly at random from [0, 2^t-1], + where t is the bit length of the challenge (say, t = 160). Bob + sends c to Alice. + + 3. Alice computes r = v - a * c mod q and sends it to Bob. + + + + + + + + +Hao Informational [Page 4] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + At the end of the protocol, Bob performs the following checks. If + any check fails, the identification is unsuccessful. + + 1. To verify A is within [1, p-1] and A^q = 1 mod p; + + 2. To verify V = g^r * A^c mod p. + + The first check ensures that A is a valid public key, hence the + discrete logarithm of A with respect to the base g actually exists. + It is worth noting that some applications may specifically exclude + the identity element as a valid public key. In that case, one shall + check A is within [2, p-1] instead of [1, p-1]. + + The process is summarized in the following diagram. + + Alice Bob + ------- ----- + + choose random v from [0, q-1] + + compute V = g^v mod p -- V -> + + compute r = v-a*c mod q <- c -- choose random c from [0, 2^t-1] + + -- b -> check 1) A is a valid public key + 2) V = g^r * A^c mod p + + Information Flows in Schnorr Identification Scheme over Finite Field + +2.3. Non-interactive Zero-Knowledge Proof + + The Schnorr NIZK proof is obtained from the interactive Schnorr + identification scheme through a Fiat-Shamir transformation [FS86]. + This transformation involves using a secure cryptographic hash + function to issue the challenge instead. More specifically, the + challenge is redefined as c = H(g || V || A || UserID || OtherInfo), + where UserID is a unique identifier for the prover and OtherInfo is + OPTIONAL data. Here, the hash function H SHALL be a secure + cryptographic hash function, e.g., SHA-256, SHA-384, SHA-512, + SHA3-256, SHA3-384, or SHA3-512. The bit length of the hash output + should be at least equal to that of the order q of the considered + subgroup. + + OtherInfo is defined to allow flexible inclusion of contextual + information (also known as "labels" in [ABM15]) in the Schnorr NIZK + proof so that the technique defined in this document can be generally + useful. For example, some security protocols built on top of the + Schnorr NIZK proof may wish to include more contextual information + + + +Hao Informational [Page 5] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + such as the protocol name, timestamp, and so on. The exact items (if + any) in OtherInfo shall be left to specific protocols to define. + However, the format of OtherInfo in any specific protocol must be + fixed and explicitly defined in the protocol specification. + + Within the hash function, there must be a clear boundary between any + two concatenated items. It is RECOMMENDED that one should always + prepend each item with a 4-byte integer that represents the byte + length of that item. OtherInfo may contain multiple subitems. In + that case, the same rule shall apply to ensure a clear boundary + between adjacent subitems. + +2.4. Computation Cost + + In summary, to prove the knowledge of the exponent for A = g^a, Alice + generates a Schnorr NIZK proof that contains: {UserID, OtherInfo, V = + g^v mod p, r = v - a*c mod q}, where c = H(g || V || A || UserID || + OtherInfo). + + To generate a Schnorr NIZK proof, the cost is roughly one modular + exponentiation: that is to compute g^v mod p. In practice, this + exponentiation may be precomputed in the offline manner to optimize + efficiency. The cost of the remaining operations (random number + generation, modular multiplication, and hashing) is negligible as + compared with the modular exponentiation. + + To verify the Schnorr NIZK proof, the cost is approximately two + exponentiations: one for computing A^q mod p and the other for + computing g^r * A^c mod p. (It takes roughly one exponentiation to + compute the latter using a simultaneous exponentiation technique as + described in [MOV96].) + +3. Schnorr NIZK Proof over Elliptic Curve + +3.1. Group Parameters + + When implemented over an elliptic curve, the Schnorr NIZK proof may + use the same EC setting as ECDSA [FIPS186-4]. For the illustration + purpose, only curves over the prime fields (e.g., NIST P-256) are + described here. Other curves over the binary fields (see + [FIPS186-4]) that are suitable for ECDSA can also be used for + implementing the Schnorr NIZK proof. Let E(Fp) be an elliptic curve + defined over a finite field Fp, where p is a large prime. Let G be a + base point on the curve that serves as a generator for the subgroup + over E(Fp) of prime order n. The cofactor of the subgroup is denoted + h, which is usually a small value (not more than 4). Details on EC + operations, such as addition, negation and scalar multiplications, + can be found in [MOV96]. Data types and conversions including + + + +Hao Informational [Page 6] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + elliptic-curve-point-to-octet-string and vice versa can be found in + Section 2.3 of [SEC1]. Here, the NIST curves are used only as an + example. Other secure curves such as Curve25519 are also suitable + for the implementation as long as the elliptic curve discrete + logarithm problem (ECDLP) remains intractable. + +3.2. Schnorr Identification Scheme + + In the setup of the scheme, Alice publishes her public key + A = G x [a], where a is the private key chosen uniformly at random + from [1, n-1]. + + The protocol works in three passes: + + 1. Alice chooses a number v uniformly at random from [1, n-1] and + computes V = G x [v]. She sends V to Bob. + + 2. Bob chooses a challenge c uniformly at random from [0, 2^t-1], + where t is the bit length of the challenge (say, t = 80). Bob + sends c to Alice. + + 3. Alice computes r = v - a * c mod n and sends it to Bob. + + At the end of the protocol, Bob performs the following checks. If + any check fails, the verification is unsuccessful. + + 1. To verify A is a valid point on the curve and A x [h] is not the + point at infinity; + + 2. To verify V = G x [r] + A x [c]. + + The first check ensures that A is a valid public key, hence the + discrete logarithm of A with respect to the base G actually exists. + Unlike in the DSA-like group setting where a full modular + exponentiation is required to validate a public key, in the ECDSA- + like setting, the public key validation incurs almost negligible cost + due to the cofactor being small (e.g., 1, 2, or 4). + + + + + + + + + + + + + + +Hao Informational [Page 7] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + The process is summarized in the following diagram. + + Alice Bob + ------- ----- + + choose random v from [1, n-1] + + compute V = G x [v] -- V -> + + compute r = v - a * c mod n <- c -- choose random c from [0, 2^t-1] + + -- b -> check 1) A is a valid public key + 2) V = G x [r] + A x [c] + + Information Flows in Schnorr Identification Scheme + over Elliptic Curve + +3.3. Non-interactive Zero-Knowledge Proof + + Same as before, the non-interactive variant is obtained through a + Fiat-Shamir transformation [FS86], by using a secure cryptographic + hash function to issue the challenge instead. The challenge c is + defined as c = H(G || V || A || UserID || OtherInfo), where UserID is + a unique identifier for the prover and OtherInfo is OPTIONAL data as + explained earlier. + +3.4. Computation Cost + + In summary, to prove the knowledge of the discrete logarithm for A = + G x [a] with respect to base G over the elliptic curve, Alice + generates a Schnorr NIZK proof that contains: {UserID, OtherInfo, V = + G x [v], r = v - a*c mod n}, where c = H(G || V || A || UserID || + OtherInfo). + + To generate a Schnorr NIZK proof, the cost is one scalar + multiplication: that is to compute G x [v]. + + To verify the Schnorr NIZK proof in the EC setting, the cost is + approximately one multiplication over the elliptic curve: i.e., + computing G x [r] + A x [c] (using the same simultaneous computation + technique as before). The cost of public key validation in the EC + setting is essentially free. + + + + + + + + + +Hao Informational [Page 8] + +RFC 8235 Schnorr NIZK Proof September 2017 + + +4. Variants of Schnorr NIZK proof + + In the finite field setting, the prover sends (V, r) (along with + UserID and OtherInfo), and the verifier first computes c, and then + checks for V = g^r * A^c mod p. This requires the transmission of an + element V of Zp, whose size is typically between 2048 and 3072 bits, + and an element r of Zq whose size is typically between 224 and 256 + bits. It is possible to reduce the amount of transmitted data to two + elements of Zq as below. + + In the modified variant, the prover works exactly the same as before, + except that it sends (c, r) instead of (V, r). The verifier computes + V = g^r * A^c mod p and then checks whether H(g || V || A || UserID + || OtherInfo) = c. The security of this modified variant follows + from the fact that one can compute V from (c, r) and c from (V, r). + Therefore, sending (c, r) is equivalent to sending (V, c, r), which + in turn is equivalent to sending (V, r). Thus, the size of the + Schnorr NIZK proof is significantly reduced. However, the + computation costs for both the prover and the verifier stay the same. + + The same optimization technique also applies to the elliptic curve + setting by replacing (V, r) with (c, r), but the benefit is extremely + limited. When V is encoded in the compressed form, this optimization + only saves 1 bit. The computation costs for generating and verifying + the NIZK proof remain the same as before. + +5. Applications of Schnorr NIZK proof + + Some key exchange protocols, such as J-PAKE [HR08] and YAK [Hao10], + rely on the Schnorr NIZK proof to ensure participants have the + knowledge of discrete logarithms, hence following the protocol + specification honestly. The technique described in this document can + be directly applied to those protocols. + + The inclusion of OtherInfo also makes the Schnorr NIZK proof + generally useful and flexible to cater for a wide range of + applications. For example, the described technique may be used to + allow a user to demonstrate the proof of possession (PoP) of a long- + term private key to a Certification Authority (CA) during the public + key registration phrase. It must be ensured that the hash contains + data that links the proof to one particular key registration + procedure (e.g., by including the CA name, the expiry date, the + applicant's email contact, and so on, in OtherInfo). In this case, + the Schnorr NIZK proof is functionally equivalent to a self-signed + Certificate Signing Request generated by using DSA or ECDSA. + + + + + + +Hao Informational [Page 9] + +RFC 8235 Schnorr NIZK Proof September 2017 + + +6. Security Considerations + + The Schnorr identification protocol has been proven to satisfy the + following properties, assuming that the verifier is honest and the + discrete logarithm problem is intractable (see [Stinson06]). + + 1. Completeness -- a prover who knows the discrete logarithm is + always able to pass the verification challenge. + + 2. Soundness -- an adversary who does not know the discrete + logarithm has only a negligible probability (i.e., 2^(-t)) to + pass the verification challenge. + + 3. Honest verifier zero-knowledge -- a prover leaks no more than one + bit of information to the honest verifier: whether the prover + knows the discrete logarithm. + + The Fiat-Shamir transformation is a standard technique to transform a + three-pass interactive Zero-Knowledge Proof protocol (in which the + verifier chooses a random challenge) to a non-interactive one, + assuming that there exists a secure cryptographic hash function. + Since the hash function is publicly defined, the prover is able to + compute the challenge by itself, hence making the protocol non- + interactive. In this case, the hash function (more precisely, the + random oracle in the security proof) implements an honest verifier, + because it assigns a uniformly random challenge c to each commitment + (g^v or G x [v]) sent by the prover. This is exactly what an honest + verifier would do. + + It is important to note that in Schnorr's identification scheme and + its non-interactive variant, a secure random number generator is + REQUIRED. In particular, bad randomness in v may reveal the secret + discrete logarithm. For example, suppose the same random value V = + g^v mod p is used twice by the prover (e.g., because its random + number generator failed), but the verifier chooses different + challenges c and c' (or the hash function is used on two different + OtherInfo data, producing two different values c and c'). The + adversary now observes two proof transcripts (V, c, r) and (V, c', + r'), based on which he can compute the secret key a by: + + (r-r')/(c'-c) = (v-a*c-v+a*c')/(c'-c) = a mod q. + + More generally, such an attack may even work for a slightly better + (but still bad) random number generator, where the value v is not + repeated, but the adversary knows a relation between two values v and + + + + + + +Hao Informational [Page 10] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + v' such as v' = v + w for some known value w. Suppose the adversary + observes two proof transcripts (V, c, r) and (V', c', r'). He can + compute the secret key a by: + + (r-r'+w)/(c'-c) = (v-a*c-v-w+a*c'+w)/(c'-c) = a mod q. + + This example reinforces the importance of using a secure random + number generator to generate the ephemeral secret v in Schnorr's + schemes. + + Finally, when a security protocol relies on the Schnorr NIZK proof + for proving the knowledge of a discrete logarithm in a non- + interactive way, the threat of replay attacks shall be considered. + For example, the Schnorr NIZK proof might be replayed back to the + prover itself (to introduce some undesirable correlation between + items in a cryptographic protocol). This particular attack is + prevented by the inclusion of the unique UserID in the hash. The + verifier shall check the prover's UserID is a valid identity and is + different from its own. Depending on the context of specific + protocols, other forms of replay attacks should be considered, and + appropriate contextual information included in OtherInfo whenever + necessary. + +7. IANA Considerations + + This document does not require any IANA actions. + +8. References + +8.1. Normative References + + [ABM15] Abdalla, M., Benhamouda, F., and P. MacKenzie, "Security + of the J-PAKE Password-Authenticated Key Exchange + Protocol", 2015 IEEE Symposium on Security and Privacy, + DOI 10.1109/sp.2015.41, May 2015. + + [AN95] Anderson, R. and R. Needham, "Robustness principles for + public key protocols", Proceedings of the 15th Annual + International Cryptology Conference on Advances in + Cryptology, DOI 10.1007/3-540-44750-4_19, 1995. + + [FS86] Fiat, A. and A. Shamir, "How to Prove Yourself: Practical + Solutions to Identification and Signature Problems", + Proceedings of the 6th Annual International Cryptology + Conference on Advances in Cryptology, + DOI 10.1007/3-540-47721-7_12, 1986. + + + + + +Hao Informational [Page 11] + +RFC 8235 Schnorr NIZK Proof September 2017 + + + [MOV96] Menezes, A., Oorschot, P., and S. Vanstone, "Handbook of + Applied Cryptography", 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [SEC1] "Standards for Efficient Cryptography. SEC 1: Elliptic + Curve Cryptography", SECG SEC1-v2, May 2009, + <http://www.secg.org/sec1-v2.pdf>. + + [Stinson06] + Stinson, D., "Cryptography: Theory and Practice", 3rd + Edition, CRC, 2006. + +8.2. Informative References + + [FIPS186-4] + National Institute of Standards and Technology, "Digital + Signature Standard (DSS)", FIPS PUB 186-4, + DOI 10.6028/NIST.FIPS.186-4, July 2013, + <http://nvlpubs.nist.gov/nistpubs/FIPS/ + NIST.FIPS.186-4.pdf>. + + [Hao10] Hao, F., "On Robust Key Agreement Based on Public Key + Authentication", 14th International Conference on + Financial Cryptography and Data Security, + DOI 10.1007/978-3-642-14577-3_33, February 2010. + + [HR08] Hao, F. and P. Ryan, "Password Authenticated Key Exchange + by Juggling", Lecture Notes in Computer Science, pp. + 159-171, from 16th Security Protocols Workshop (SPW'08), + DOI 10.1007/978-3-642-22137-8_23, 2011. + + [NIST_DSA] NIST Cryptographic Toolkit, "DSA Examples", + <http://csrc.nist.gov/groups/ST/toolkit/documents/ + Examples/DSA2_All.pdf>. + + + + + + + + + +Hao Informational [Page 12] + +RFC 8235 Schnorr NIZK Proof September 2017 + + +Acknowledgements + + The editor of this document would like to thank Dylan Clarke, Robert + Ransom, Siamak Shahandashti, Robert Cragie, Stanislav Smyshlyaev, and + Tibor Jager for many useful comments. Tibor Jager pointed out the + optimization technique and the vulnerability issue when the ephemeral + secret v is not generated randomly. This work is supported by the + EPSRC First Grant (EP/J011541/1) and the ERC Starting Grant (No. + 306994). + +Author's Address + + Feng Hao (editor) + Newcastle University (UK) + Urban Sciences Building, School of Computing, Newcastle University + Newcastle Upon Tyne + United Kingdom + + Phone: +44 (0)191-208-6384 + Email: feng.hao@ncl.ac.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Hao Informational [Page 13] + |