diff -ruN john-1.7.3.1/src/Makefile john-1.7.3.1+ora11/src/Makefile
--- john-1.7.3.1/src/Makefile	2009-02-19 01:17:38.000000000 -0500
+++ john-1.7.3.1+ora11/src/Makefile	2009-02-19 01:15:48.000000000 -0500
@@ -35,6 +35,7 @@
 	DOMINOSEC_fmt.o \
 	lotus5_fmt.o \
 	oracle_fmt.o \
+	oracle11_fmt.o \
 	MYSQL_fmt.o \
 	mysqlSHA1_fmt.o \
 	KRB5_fmt.o KRB5_std.o \
diff -ruN john-1.7.3.1/src/john.c john-1.7.3.1+ora11/src/john.c
--- john-1.7.3.1/src/john.c	2009-02-19 01:17:38.000000000 -0500
+++ john-1.7.3.1+ora11/src/john.c	2009-02-19 01:15:48.000000000 -0500
@@ -47,6 +47,7 @@
 extern struct fmt_main fmt_BFEgg;
 extern struct fmt_main fmt_KRB5;
 extern struct fmt_main fmt_oracle;
+extern struct fmt_main fmt_oracle11;
 extern struct fmt_main fmt_MYSQL;
 extern struct fmt_main fmt_mysqlSHA1;
 extern struct fmt_main fmt_NSLDAP;
@@ -110,6 +111,7 @@
 	john_register_one(&fmt_NSLDAPS);
 	john_register_one(&fmt_BFEgg);
 	john_register_one(&fmt_oracle);
+	john_register_one(&fmt_oracle11);
 	john_register_one(&fmt_MYSQL);
 	john_register_one(&fmt_mysqlSHA1);
 	john_register_one(&fmt_lotus5);
diff -ruN john-1.7.3.1/src/lotus5_fmt.c john-1.7.3.1+ora11/src/lotus5_fmt.c
--- john-1.7.3.1/src/lotus5_fmt.c	2009-02-19 01:17:38.000000000 -0500
+++ john-1.7.3.1+ora11/src/lotus5_fmt.c	2009-02-19 01:15:48.000000000 -0500
@@ -85,6 +85,8 @@
 {
   int i;
   
+  if (strlen(ciphertext) != CIPHERTEXT_LENGTH)
+      return 0;
   for (i = 0; i < CIPHERTEXT_LENGTH; i++)
 	  if (!(((ciphertext[i] >= '0') && (ciphertext[i] <= '9'))
 				  || ((ciphertext[i] >= 'a') && (ciphertext[i] <= 'f'))
diff -ruN john-1.7.3.1/src/options.c john-1.7.3.1+ora11/src/options.c
--- john-1.7.3.1/src/options.c	2009-02-19 01:17:38.000000000 -0500
+++ john-1.7.3.1+ora11/src/options.c	2009-02-19 01:16:47.000000000 -0500
@@ -95,7 +95,7 @@
 "--salts=[-]COUNT           load salts with[out] at least COUNT passwords " \
 	"only\n" \
 "--format=NAME              force hash type NAME: " \
-	"DES/BSDI/MD5/BF/AFS/LM/NT/XSHA/PO/raw-MD5/IPB2/raw-sha1/md5a/hmac-md5/KRB5/bfegg/nsldap/ssha/oracle/MYSQL/mysql-sha1/mscash/lotus5/DOMINOSEC/NETLM/NETNTLM/NETLMv2/NETHALFLM/mssql/mssql05/epi/phps/mysql-fast/pix-md5/sapG/sapB/md5ns\n" \
+	"DES/BSDI/MD5/BF/AFS/LM/NT/XSHA/PO/raw-MD5/IPB2/raw-sha1/md5a/hmac-md5/KRB5/bfegg/nsldap/ssha/oracle/oracle11/MYSQL/mysql-sha1/mscash/lotus5/DOMINOSEC/NETLM/NETNTLM/NETLMv2/NETHALFLM/mssql/mssql05/epi/phps/mysql-fast/pix-md5/sapG/sapB/md5ns\n" \
 "--save-memory=LEVEL        enable memory saving, at LEVEL 1..3\n"
 
 void opt_init(char *name, int argc, char **argv)
diff -ruN john-1.7.3.1/src/oracle11_fmt.c john-1.7.3.1+ora11/src/oracle11_fmt.c
--- john-1.7.3.1/src/oracle11_fmt.c	1969-12-31 19:00:00.000000000 -0500
+++ john-1.7.3.1+ora11/src/oracle11_fmt.c	2009-02-19 01:21:38.000000000 -0500
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2008 Alexandre Hamelin
+ * alexandre.hamelin(@)gmail.com
+ * Based on saltSHA1 format source.
+ *
+ * Oracle 11g SHA1 cracker
+ *
+ */
+
+#include <string.h>
+
+#include "arch.h"
+#include "misc.h"
+#include "common.h"
+#include "formats.h"
+#include "sha.h"
+#include <ctype.h>
+
+#define FORMAT_LABEL			"oracle11"
+#define FORMAT_NAME			"Oracle 11g"
+#define ALGORITHM_NAME			"oracle11"
+
+#define BENCHMARK_COMMENT		""
+#define BENCHMARK_LENGTH		0
+
+/* Maximum length of password in characters. Oracle supports identifiers of 30
+ * characters max. (ALTER USER user IDENTIFIED BY 30lettersPassword) */
+#define PLAINTEXT_LENGTH		30
+/* Length in characters of the cipher text, as seen in the password file.
+ * Excludes prefix if any. */
+#define CIPHERTEXT_LENGTH		60
+
+/* Length of hashed value without the salt, in bytes. */
+#define BINARY_SIZE			20
+/* Length of salt in bytes. */
+#define SALT_SIZE			10
+
+/* Sanity check. Don't change. */
+#if (BINARY_SIZE + SALT_SIZE) * 2 != CIPHERTEXT_LENGTH
+#error Incorrect binary sizes or cipher text length.
+#endif
+
+#define MIN_KEYS_PER_CRYPT		1
+#define MAX_KEYS_PER_CRYPT		1
+
+static struct fmt_tests tests[] = {
+	/* 160 bits of SHA1, followed by 80 bits of salt. No "S:" prefix. */
+	{"5FDAB69F543563582BA57894FE1C1361FB8ED57B903603F2C52ED1B4D642", "abc123"},
+	{"450F957ECBE075D2FA009BA822A9E28709FBC3DA82B44D284DDABEC14C42", "SyStEm123!@#"},
+	{"3437FF72BD69E3FB4D10C750B92B8FB90B155E26227B9AB62D94F54E5951", "oracle"},
+	{"61CE616647A4F7980AFD7C7245261AF25E0AFE9C9763FCF0D54DA667D4E6", "11g"},
+	{"B9E7556F53500C8C78A58F50F24439D79962DE68117654B6700CE7CC71CF", "11g"},
+	{NULL}
+};
+
+static char saved_key[PLAINTEXT_LENGTH + 1];
+static int saved_key_length;
+static unsigned char saved_salt[SALT_SIZE];
+static SHA_CTX ctx;
+static unsigned char crypt_out[BINARY_SIZE];
+
+static int valid(char *ciphertext)
+{
+	int i;
+
+	if (strlen(ciphertext) != CIPHERTEXT_LENGTH) return 0;
+	for (i = 0; i < CIPHERTEXT_LENGTH; i++){
+		if (!isxdigit(ciphertext[i]))
+			return 0;
+	}
+	return 1;
+}
+
+static void *salt(char *ciphertext)
+{
+	static unsigned char salt[SALT_SIZE];
+	int i;
+
+    for (i = 0; i < SALT_SIZE; i++) {
+		salt[i] = atoi16[ARCH_INDEX(ciphertext[BINARY_SIZE*2+i*2+0])]*16 +
+				  atoi16[ARCH_INDEX(ciphertext[BINARY_SIZE*2+i*2+1])];
+    }
+
+	return (void *)salt;
+}
+
+static void set_salt(void *salt)
+{
+	memcpy(saved_salt, salt, SALT_SIZE);
+}
+
+static void set_key(char *key, int index) {
+	saved_key_length = strlen(key);
+	if (saved_key_length > PLAINTEXT_LENGTH)
+		saved_key_length = PLAINTEXT_LENGTH;
+	memcpy(saved_key, key, saved_key_length);
+	saved_key[saved_key_length] = 0;
+}
+
+static char *get_key(int index) {
+	return saved_key;
+}
+
+static int cmp_all(void *binary, int index) {
+	return !memcmp(binary, crypt_out, BINARY_SIZE);
+}
+
+static int cmp_exact(char *source, int count) {
+	return 1;
+}
+
+static void crypt_all(int count) {
+	SHA1_Init( &ctx );
+	SHA1_Update( &ctx, (unsigned char *) saved_key, saved_key_length );
+	SHA1_Update( &ctx, saved_salt, SALT_SIZE );
+	SHA1_Final( crypt_out, &ctx);
+}
+
+static void * binary(char *ciphertext)
+{
+	static unsigned char realcipher[BINARY_SIZE];
+
+	int i;	
+	for(i=0;i<BINARY_SIZE;i++)
+		realcipher[i] = atoi16[ARCH_INDEX(ciphertext[i*2])]*16 +
+						atoi16[ARCH_INDEX(ciphertext[i*2+1])];
+	
+	return (void *)realcipher;
+}
+
+static int binary_hash_0(void *binary)
+{
+  return ((ARCH_WORD_32 *)binary)[0] & 0xF;
+}
+
+static int binary_hash_1(void *binary)
+{
+  return ((ARCH_WORD_32 *)binary)[0] & 0xFF;
+}
+
+static int binary_hash_2(void *binary)
+{
+  return ((ARCH_WORD_32 *)binary)[0] & 0xFFF;
+}
+
+static int get_hash_0(int index)
+{
+  return ((ARCH_WORD_32 *)crypt_out)[0] & 0xF;
+}
+
+static int get_hash_1(int index)
+{
+  return ((ARCH_WORD_32 *)crypt_out)[0] & 0xFF;
+}
+
+static int get_hash_2(int index)
+{
+  return ((ARCH_WORD_32 *)crypt_out)[0] & 0xFFF;
+}
+
+struct fmt_main fmt_oracle11 = {
+	{
+		FORMAT_LABEL,
+		FORMAT_NAME,
+		ALGORITHM_NAME,
+		BENCHMARK_COMMENT,
+		BENCHMARK_LENGTH,
+		PLAINTEXT_LENGTH,
+		BINARY_SIZE,
+		SALT_SIZE,
+		MIN_KEYS_PER_CRYPT,
+		MAX_KEYS_PER_CRYPT,
+		FMT_CASE | FMT_8_BIT,
+		tests
+	}, {
+		fmt_default_init,
+		valid,
+		fmt_default_split,
+		binary,
+		salt,
+		{
+			binary_hash_0,
+			binary_hash_1,
+			binary_hash_2
+		},
+		fmt_default_salt_hash,
+		set_salt,
+		set_key,
+		get_key,
+		fmt_default_clear_keys,
+		crypt_all,
+		{
+			get_hash_0,
+			get_hash_1,
+			get_hash_2
+		},
+		cmp_all,
+		cmp_all,
+		cmp_exact
+	}
+};
