Fix Windows shared library build.

Windows is much pickier about dllimport/dllexport. Declare it on
the declaration, not the definition. Also ensure that the declaration
precedes the definition. Finally, remove a stray OPENSSL_EXPORT.

Change-Id: Id50b9de5acbe5adf1b15b22dd60b7a5c13a80cce
Reviewed-on: https://boringssl-review.googlesource.com/1862
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c
index 7920ae8..36f1cd5 100644
--- a/crypto/ec/ec_asn1.c
+++ b/crypto/ec/ec_asn1.c
@@ -106,6 +106,8 @@
   ASN1_INTEGER *cofactor;
 } ECPARAMETERS;
 
+DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS);
+
 ASN1_SEQUENCE(ECPARAMETERS) = {
     ASN1_SIMPLE(ECPARAMETERS, version, LONG),
     ASN1_SIMPLE(ECPARAMETERS, fieldID, X9_62_FIELDID),
@@ -115,7 +117,6 @@
     ASN1_OPT(ECPARAMETERS, cofactor, ASN1_INTEGER)
 } ASN1_SEQUENCE_END(ECPARAMETERS);
 
-DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS);
 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS);
 
 typedef struct ecpk_parameters_st {
@@ -134,15 +135,19 @@
   ASN1_BIT_STRING *publicKey;
 } EC_PRIVATEKEY;
 
+DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS);
+DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS);
+
 ASN1_CHOICE(ECPKPARAMETERS) = {
     ASN1_SIMPLE(ECPKPARAMETERS, value.named_curve, ASN1_OBJECT),
     ASN1_SIMPLE(ECPKPARAMETERS, value.parameters, ECPARAMETERS),
 } ASN1_CHOICE_END(ECPKPARAMETERS);
 
-DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS);
-DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS);
 IMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS);
 
+DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY);
+DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY);
+
 ASN1_SEQUENCE(EC_PRIVATEKEY) = {
     ASN1_SIMPLE(EC_PRIVATEKEY, version, LONG),
     ASN1_SIMPLE(EC_PRIVATEKEY, privateKey, ASN1_OCTET_STRING),
@@ -150,8 +155,6 @@
     ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1),
 } ASN1_SEQUENCE_END(EC_PRIVATEKEY);
 
-DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY);
-DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY);
 IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY);
 
 
diff --git a/crypto/ecdsa/ecdsa_asn1.c b/crypto/ecdsa/ecdsa_asn1.c
index e54dcca..b3c6a87 100644
--- a/crypto/ecdsa/ecdsa_asn1.c
+++ b/crypto/ecdsa/ecdsa_asn1.c
@@ -59,13 +59,14 @@
 #include "../ec/internal.h"
 
 
+DECLARE_ASN1_FUNCTIONS_const(ECDSA_SIG);
+DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECDSA_SIG, ECDSA_SIG);
+
 ASN1_SEQUENCE(ECDSA_SIG) = {
     ASN1_SIMPLE(ECDSA_SIG, r, CBIGNUM),
     ASN1_SIMPLE(ECDSA_SIG, s, CBIGNUM),
 } ASN1_SEQUENCE_END(ECDSA_SIG);
 
-DECLARE_ASN1_FUNCTIONS_const(ECDSA_SIG);
-DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECDSA_SIG, ECDSA_SIG);
 IMPLEMENT_ASN1_FUNCTIONS_const(ECDSA_SIG);
 
 size_t ECDSA_size(const EC_KEY *key) {
diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h
index 990506e..014b059 100644
--- a/include/openssl/asn1.h
+++ b/include/openssl/asn1.h
@@ -392,7 +392,7 @@
 #define ASN1_ITEM_rptr(ref) (&(ref##_it))
 
 #define DECLARE_ASN1_ITEM(name) \
-	extern const ASN1_ITEM name##_it;
+	extern OPENSSL_EXPORT const ASN1_ITEM name##_it;
 
 /* Parameters used by ASN1_STRING_print_ex() */
 
diff --git a/include/openssl/asn1t.h b/include/openssl/asn1t.h
index 52f5cfc..72eb2cb 100644
--- a/include/openssl/asn1t.h
+++ b/include/openssl/asn1t.h
@@ -80,7 +80,7 @@
 /* Macros for start and end of ASN1_ITEM definition */
 
 #define ASN1_ITEM_start(itname) \
-	OPENSSL_EXPORT const ASN1_ITEM itname##_it = {
+	const ASN1_ITEM itname##_it = {
 
 #define ASN1_ITEM_end(itname) \
 		};
diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h
index 99f7cf8..9aa91d6 100644
--- a/include/openssl/x509v3.h
+++ b/include/openssl/x509v3.h
@@ -555,7 +555,7 @@
 OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *ia5);
 OPENSSL_EXPORT ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *str);
 
-OPENSSL_EXPORT DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
+DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
 OPENSSL_EXPORT int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION* a);
 
 DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)