openssl_rsa_pss_verify 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +35 -0
  7. data/README +1 -0
  8. data/Rakefile +4 -0
  9. data/ext/openssl_rsa_pss_verify/extconf.rb +15 -0
  10. data/ext/openssl_rsa_pss_verify/openssl_rsa_pss_verify_ext.c +56 -0
  11. data/lib/openssl_rsa_pss_verify/version.rb +3 -0
  12. data/lib/openssl_rsa_pss_verify.rb +2 -0
  13. data/openssl_rsa_pss_verify.gemspec +26 -0
  14. data/tasks/compile.rake +12 -0
  15. data/tasks/rspec.rake +12 -0
  16. data/vendor/openssl/include/openssl/aes.h +147 -0
  17. data/vendor/openssl/include/openssl/asn1.h +1404 -0
  18. data/vendor/openssl/include/openssl/asn1_mac.h +578 -0
  19. data/vendor/openssl/include/openssl/asn1t.h +960 -0
  20. data/vendor/openssl/include/openssl/bio.h +847 -0
  21. data/vendor/openssl/include/openssl/blowfish.h +129 -0
  22. data/vendor/openssl/include/openssl/bn.h +891 -0
  23. data/vendor/openssl/include/openssl/buffer.h +119 -0
  24. data/vendor/openssl/include/openssl/camellia.h +130 -0
  25. data/vendor/openssl/include/openssl/cast.h +107 -0
  26. data/vendor/openssl/include/openssl/cmac.h +82 -0
  27. data/vendor/openssl/include/openssl/cms.h +501 -0
  28. data/vendor/openssl/include/openssl/comp.h +80 -0
  29. data/vendor/openssl/include/openssl/conf.h +263 -0
  30. data/vendor/openssl/include/openssl/conf_api.h +89 -0
  31. data/vendor/openssl/include/openssl/crypto.h +611 -0
  32. data/vendor/openssl/include/openssl/des.h +248 -0
  33. data/vendor/openssl/include/openssl/des_old.h +446 -0
  34. data/vendor/openssl/include/openssl/dh.h +280 -0
  35. data/vendor/openssl/include/openssl/dsa.h +327 -0
  36. data/vendor/openssl/include/openssl/dso.h +409 -0
  37. data/vendor/openssl/include/openssl/dtls1.h +287 -0
  38. data/vendor/openssl/include/openssl/e_os2.h +315 -0
  39. data/vendor/openssl/include/openssl/ebcdic.h +19 -0
  40. data/vendor/openssl/include/openssl/ec.h +1167 -0
  41. data/vendor/openssl/include/openssl/ecdh.h +125 -0
  42. data/vendor/openssl/include/openssl/ecdsa.h +260 -0
  43. data/vendor/openssl/include/openssl/engine.h +842 -0
  44. data/vendor/openssl/include/openssl/err.h +386 -0
  45. data/vendor/openssl/include/openssl/evp.h +1409 -0
  46. data/vendor/openssl/include/openssl/hmac.h +110 -0
  47. data/vendor/openssl/include/openssl/idea.h +103 -0
  48. data/vendor/openssl/include/openssl/krb5_asn.h +256 -0
  49. data/vendor/openssl/include/openssl/kssl.h +183 -0
  50. data/vendor/openssl/include/openssl/lhash.h +241 -0
  51. data/vendor/openssl/include/openssl/md4.h +120 -0
  52. data/vendor/openssl/include/openssl/md5.h +120 -0
  53. data/vendor/openssl/include/openssl/mdc2.h +98 -0
  54. data/vendor/openssl/include/openssl/modes.h +135 -0
  55. data/vendor/openssl/include/openssl/obj_mac.h +4032 -0
  56. data/vendor/openssl/include/openssl/objects.h +1138 -0
  57. data/vendor/openssl/include/openssl/ocsp.h +623 -0
  58. data/vendor/openssl/include/openssl/opensslconf.h +234 -0
  59. data/vendor/openssl/include/openssl/opensslv.h +89 -0
  60. data/vendor/openssl/include/openssl/ossl_typ.h +202 -0
  61. data/vendor/openssl/include/openssl/pem.h +641 -0
  62. data/vendor/openssl/include/openssl/pem2.h +70 -0
  63. data/vendor/openssl/include/openssl/pkcs12.h +331 -0
  64. data/vendor/openssl/include/openssl/pkcs7.h +499 -0
  65. data/vendor/openssl/include/openssl/pqueue.h +94 -0
  66. data/vendor/openssl/include/openssl/rand.h +149 -0
  67. data/vendor/openssl/include/openssl/rc2.h +103 -0
  68. data/vendor/openssl/include/openssl/rc4.h +90 -0
  69. data/vendor/openssl/include/openssl/ripemd.h +107 -0
  70. data/vendor/openssl/include/openssl/rsa.h +582 -0
  71. data/vendor/openssl/include/openssl/safestack.h +2663 -0
  72. data/vendor/openssl/include/openssl/seed.h +139 -0
  73. data/vendor/openssl/include/openssl/sha.h +214 -0
  74. data/vendor/openssl/include/openssl/srp.h +172 -0
  75. data/vendor/openssl/include/openssl/srtp.h +145 -0
  76. data/vendor/openssl/include/openssl/ssl.h +2579 -0
  77. data/vendor/openssl/include/openssl/ssl2.h +272 -0
  78. data/vendor/openssl/include/openssl/ssl23.h +83 -0
  79. data/vendor/openssl/include/openssl/ssl3.h +684 -0
  80. data/vendor/openssl/include/openssl/stack.h +108 -0
  81. data/vendor/openssl/include/openssl/symhacks.h +475 -0
  82. data/vendor/openssl/include/openssl/tls1.h +735 -0
  83. data/vendor/openssl/include/openssl/ts.h +858 -0
  84. data/vendor/openssl/include/openssl/txt_db.h +112 -0
  85. data/vendor/openssl/include/openssl/ui.h +383 -0
  86. data/vendor/openssl/include/openssl/ui_compat.h +83 -0
  87. data/vendor/openssl/include/openssl/whrlpool.h +41 -0
  88. data/vendor/openssl/include/openssl/x509.h +1297 -0
  89. data/vendor/openssl/include/openssl/x509_vfy.h +567 -0
  90. data/vendor/openssl/include/openssl/x509v3.h +1007 -0
  91. data/vendor/openssl/lib/engines/lib4758cca.so +0 -0
  92. data/vendor/openssl/lib/engines/libaep.so +0 -0
  93. data/vendor/openssl/lib/engines/libatalla.so +0 -0
  94. data/vendor/openssl/lib/engines/libcapi.so +0 -0
  95. data/vendor/openssl/lib/engines/libchil.so +0 -0
  96. data/vendor/openssl/lib/engines/libcswift.so +0 -0
  97. data/vendor/openssl/lib/engines/libgmp.so +0 -0
  98. data/vendor/openssl/lib/engines/libgost.so +0 -0
  99. data/vendor/openssl/lib/engines/libnuron.so +0 -0
  100. data/vendor/openssl/lib/engines/libpadlock.so +0 -0
  101. data/vendor/openssl/lib/engines/libsureware.so +0 -0
  102. data/vendor/openssl/lib/engines/libubsec.so +0 -0
  103. data/vendor/openssl/lib/libcrypto.a +0 -0
  104. data/vendor/openssl/lib/libcrypto.so +0 -0
  105. data/vendor/openssl/lib/libcrypto.so.1.0.0 +0 -0
  106. data/vendor/openssl/lib/libssl.a +0 -0
  107. data/vendor/openssl/lib/libssl.so +0 -0
  108. data/vendor/openssl/lib/libssl.so.1.0.0 +0 -0
  109. data/vendor/openssl/lib/pkgconfig/libcrypto.pc +12 -0
  110. data/vendor/openssl/lib/pkgconfig/libssl.pc +12 -0
  111. data/vendor/openssl/lib/pkgconfig/openssl.pc +12 -0
  112. metadata +208 -0
@@ -0,0 +1,315 @@
1
+ /* e_os2.h */
2
+ /* ====================================================================
3
+ * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in
14
+ * the documentation and/or other materials provided with the
15
+ * distribution.
16
+ *
17
+ * 3. All advertising materials mentioning features or use of this
18
+ * software must display the following acknowledgment:
19
+ * "This product includes software developed by the OpenSSL Project
20
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21
+ *
22
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23
+ * endorse or promote products derived from this software without
24
+ * prior written permission. For written permission, please contact
25
+ * openssl-core@openssl.org.
26
+ *
27
+ * 5. Products derived from this software may not be called "OpenSSL"
28
+ * nor may "OpenSSL" appear in their names without prior written
29
+ * permission of the OpenSSL Project.
30
+ *
31
+ * 6. Redistributions of any form whatsoever must retain the following
32
+ * acknowledgment:
33
+ * "This product includes software developed by the OpenSSL Project
34
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35
+ *
36
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
48
+ * ====================================================================
49
+ *
50
+ * This product includes cryptographic software written by Eric Young
51
+ * (eay@cryptsoft.com). This product includes software written by Tim
52
+ * Hudson (tjh@cryptsoft.com).
53
+ *
54
+ */
55
+
56
+ #include <openssl/opensslconf.h>
57
+
58
+ #ifndef HEADER_E_OS2_H
59
+ #define HEADER_E_OS2_H
60
+
61
+ #ifdef __cplusplus
62
+ extern "C" {
63
+ #endif
64
+
65
+ /******************************************************************************
66
+ * Detect operating systems. This probably needs completing.
67
+ * The result is that at least one OPENSSL_SYS_os macro should be defined.
68
+ * However, if none is defined, Unix is assumed.
69
+ **/
70
+
71
+ #define OPENSSL_SYS_UNIX
72
+
73
+ /* ----------------------- Macintosh, before MacOS X ----------------------- */
74
+ #if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC)
75
+ # undef OPENSSL_SYS_UNIX
76
+ # define OPENSSL_SYS_MACINTOSH_CLASSIC
77
+ #endif
78
+
79
+ /* ----------------------- NetWare ----------------------------------------- */
80
+ #if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE)
81
+ # undef OPENSSL_SYS_UNIX
82
+ # define OPENSSL_SYS_NETWARE
83
+ #endif
84
+
85
+ /* ---------------------- Microsoft operating systems ---------------------- */
86
+
87
+ /* Note that MSDOS actually denotes 32-bit environments running on top of
88
+ MS-DOS, such as DJGPP one. */
89
+ #if defined(OPENSSL_SYSNAME_MSDOS)
90
+ # undef OPENSSL_SYS_UNIX
91
+ # define OPENSSL_SYS_MSDOS
92
+ #endif
93
+
94
+ /* For 32 bit environment, there seems to be the CygWin environment and then
95
+ all the others that try to do the same thing Microsoft does... */
96
+ #if defined(OPENSSL_SYSNAME_UWIN)
97
+ # undef OPENSSL_SYS_UNIX
98
+ # define OPENSSL_SYS_WIN32_UWIN
99
+ #else
100
+ # if defined(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32)
101
+ # undef OPENSSL_SYS_UNIX
102
+ # define OPENSSL_SYS_WIN32_CYGWIN
103
+ # else
104
+ # if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32)
105
+ # undef OPENSSL_SYS_UNIX
106
+ # define OPENSSL_SYS_WIN32
107
+ # endif
108
+ # if defined(OPENSSL_SYSNAME_WINNT)
109
+ # undef OPENSSL_SYS_UNIX
110
+ # define OPENSSL_SYS_WINNT
111
+ # endif
112
+ # if defined(OPENSSL_SYSNAME_WINCE)
113
+ # undef OPENSSL_SYS_UNIX
114
+ # define OPENSSL_SYS_WINCE
115
+ # endif
116
+ # endif
117
+ #endif
118
+
119
+ /* Anything that tries to look like Microsoft is "Windows" */
120
+ #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE)
121
+ # undef OPENSSL_SYS_UNIX
122
+ # define OPENSSL_SYS_WINDOWS
123
+ # ifndef OPENSSL_SYS_MSDOS
124
+ # define OPENSSL_SYS_MSDOS
125
+ # endif
126
+ #endif
127
+
128
+ /* DLL settings. This part is a bit tough, because it's up to the application
129
+ implementor how he or she will link the application, so it requires some
130
+ macro to be used. */
131
+ #ifdef OPENSSL_SYS_WINDOWS
132
+ # ifndef OPENSSL_OPT_WINDLL
133
+ # if defined(_WINDLL) /* This is used when building OpenSSL to indicate that
134
+ DLL linkage should be used */
135
+ # define OPENSSL_OPT_WINDLL
136
+ # endif
137
+ # endif
138
+ #endif
139
+
140
+ /* -------------------------------- OpenVMS -------------------------------- */
141
+ #if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS)
142
+ # undef OPENSSL_SYS_UNIX
143
+ # define OPENSSL_SYS_VMS
144
+ # if defined(__DECC)
145
+ # define OPENSSL_SYS_VMS_DECC
146
+ # elif defined(__DECCXX)
147
+ # define OPENSSL_SYS_VMS_DECC
148
+ # define OPENSSL_SYS_VMS_DECCXX
149
+ # else
150
+ # define OPENSSL_SYS_VMS_NODECC
151
+ # endif
152
+ #endif
153
+
154
+ /* --------------------------------- OS/2 ---------------------------------- */
155
+ #if defined(__EMX__) || defined(__OS2__)
156
+ # undef OPENSSL_SYS_UNIX
157
+ # define OPENSSL_SYS_OS2
158
+ #endif
159
+
160
+ /* --------------------------------- Unix ---------------------------------- */
161
+ #ifdef OPENSSL_SYS_UNIX
162
+ # if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX)
163
+ # define OPENSSL_SYS_LINUX
164
+ # endif
165
+ # ifdef OPENSSL_SYSNAME_MPE
166
+ # define OPENSSL_SYS_MPE
167
+ # endif
168
+ # ifdef OPENSSL_SYSNAME_SNI
169
+ # define OPENSSL_SYS_SNI
170
+ # endif
171
+ # ifdef OPENSSL_SYSNAME_ULTRASPARC
172
+ # define OPENSSL_SYS_ULTRASPARC
173
+ # endif
174
+ # ifdef OPENSSL_SYSNAME_NEWS4
175
+ # define OPENSSL_SYS_NEWS4
176
+ # endif
177
+ # ifdef OPENSSL_SYSNAME_MACOSX
178
+ # define OPENSSL_SYS_MACOSX
179
+ # endif
180
+ # ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY
181
+ # define OPENSSL_SYS_MACOSX_RHAPSODY
182
+ # define OPENSSL_SYS_MACOSX
183
+ # endif
184
+ # ifdef OPENSSL_SYSNAME_SUNOS
185
+ # define OPENSSL_SYS_SUNOS
186
+ #endif
187
+ # if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY)
188
+ # define OPENSSL_SYS_CRAY
189
+ # endif
190
+ # if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX)
191
+ # define OPENSSL_SYS_AIX
192
+ # endif
193
+ #endif
194
+
195
+ /* --------------------------------- VOS ----------------------------------- */
196
+ #if defined(__VOS__) || defined(OPENSSL_SYSNAME_VOS)
197
+ # define OPENSSL_SYS_VOS
198
+ #ifdef __HPPA__
199
+ # define OPENSSL_SYS_VOS_HPPA
200
+ #endif
201
+ #ifdef __IA32__
202
+ # define OPENSSL_SYS_VOS_IA32
203
+ #endif
204
+ #endif
205
+
206
+ /* ------------------------------- VxWorks --------------------------------- */
207
+ #ifdef OPENSSL_SYSNAME_VXWORKS
208
+ # define OPENSSL_SYS_VXWORKS
209
+ #endif
210
+
211
+ /* --------------------------------- BeOS ---------------------------------- */
212
+ #if defined(__BEOS__)
213
+ # define OPENSSL_SYS_BEOS
214
+ # include <sys/socket.h>
215
+ # if defined(BONE_VERSION)
216
+ # define OPENSSL_SYS_BEOS_BONE
217
+ # else
218
+ # define OPENSSL_SYS_BEOS_R5
219
+ # endif
220
+ #endif
221
+
222
+ /**
223
+ * That's it for OS-specific stuff
224
+ *****************************************************************************/
225
+
226
+
227
+ /* Specials for I/O an exit */
228
+ #ifdef OPENSSL_SYS_MSDOS
229
+ # define OPENSSL_UNISTD_IO <io.h>
230
+ # define OPENSSL_DECLARE_EXIT extern void exit(int);
231
+ #else
232
+ # define OPENSSL_UNISTD_IO OPENSSL_UNISTD
233
+ # define OPENSSL_DECLARE_EXIT /* declared in unistd.h */
234
+ #endif
235
+
236
+ /* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare
237
+ certain global symbols that, with some compilers under VMS, have to be
238
+ defined and declared explicitely with globaldef and globalref.
239
+ Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare
240
+ DLL exports and imports for compilers under Win32. These are a little
241
+ more complicated to use. Basically, for any library that exports some
242
+ global variables, the following code must be present in the header file
243
+ that declares them, before OPENSSL_EXTERN is used:
244
+
245
+ #ifdef SOME_BUILD_FLAG_MACRO
246
+ # undef OPENSSL_EXTERN
247
+ # define OPENSSL_EXTERN OPENSSL_EXPORT
248
+ #endif
249
+
250
+ The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL
251
+ have some generally sensible values, and for OPENSSL_EXTERN to have the
252
+ value OPENSSL_IMPORT.
253
+ */
254
+
255
+ #if defined(OPENSSL_SYS_VMS_NODECC)
256
+ # define OPENSSL_EXPORT globalref
257
+ # define OPENSSL_IMPORT globalref
258
+ # define OPENSSL_GLOBAL globaldef
259
+ #elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL)
260
+ # define OPENSSL_EXPORT extern __declspec(dllexport)
261
+ # define OPENSSL_IMPORT extern __declspec(dllimport)
262
+ # define OPENSSL_GLOBAL
263
+ #else
264
+ # define OPENSSL_EXPORT extern
265
+ # define OPENSSL_IMPORT extern
266
+ # define OPENSSL_GLOBAL
267
+ #endif
268
+ #define OPENSSL_EXTERN OPENSSL_IMPORT
269
+
270
+ /* Macros to allow global variables to be reached through function calls when
271
+ required (if a shared library version requires it, for example.
272
+ The way it's done allows definitions like this:
273
+
274
+ // in foobar.c
275
+ OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0)
276
+ // in foobar.h
277
+ OPENSSL_DECLARE_GLOBAL(int,foobar);
278
+ #define foobar OPENSSL_GLOBAL_REF(foobar)
279
+ */
280
+ #ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION
281
+ # define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \
282
+ type *_shadow_##name(void) \
283
+ { static type _hide_##name=value; return &_hide_##name; }
284
+ # define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void)
285
+ # define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name()))
286
+ #else
287
+ # define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) OPENSSL_GLOBAL type _shadow_##name=value;
288
+ # define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name
289
+ # define OPENSSL_GLOBAL_REF(name) _shadow_##name
290
+ #endif
291
+
292
+ #if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && macintosh==1 && !defined(MAC_OS_GUSI_SOURCE)
293
+ # define ossl_ssize_t long
294
+ #endif
295
+
296
+ #ifdef OPENSSL_SYS_MSDOS
297
+ # define ossl_ssize_t long
298
+ #endif
299
+
300
+ #if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS)
301
+ # define ssize_t int
302
+ #endif
303
+
304
+ #if defined(__ultrix) && !defined(ssize_t)
305
+ # define ossl_ssize_t int
306
+ #endif
307
+
308
+ #ifndef ossl_ssize_t
309
+ # define ossl_ssize_t ssize_t
310
+ #endif
311
+
312
+ #ifdef __cplusplus
313
+ }
314
+ #endif
315
+ #endif
@@ -0,0 +1,19 @@
1
+ /* crypto/ebcdic.h */
2
+
3
+ #ifndef HEADER_EBCDIC_H
4
+ #define HEADER_EBCDIC_H
5
+
6
+ #include <sys/types.h>
7
+
8
+ /* Avoid name clashes with other applications */
9
+ #define os_toascii _openssl_os_toascii
10
+ #define os_toebcdic _openssl_os_toebcdic
11
+ #define ebcdic2ascii _openssl_ebcdic2ascii
12
+ #define ascii2ebcdic _openssl_ascii2ebcdic
13
+
14
+ extern const unsigned char os_toascii[256];
15
+ extern const unsigned char os_toebcdic[256];
16
+ void *ebcdic2ascii(void *dest, const void *srce, size_t count);
17
+ void *ascii2ebcdic(void *dest, const void *srce, size_t count);
18
+
19
+ #endif