|
39 | 39 |
|
40 | 40 | #include "codec.h"
|
41 | 41 |
|
| 42 | +#ifndef SQLITE_USER_AUTHENTICATION |
42 | 43 | #if CODEC_TYPE == CODEC_TYPE_AES256
|
43 | 44 | #include "sha2.h"
|
44 | 45 | #include "sha2.c"
|
45 | 46 | #endif
|
| 47 | +#endif |
46 | 48 |
|
47 | 49 | /*
|
48 | 50 | // ----------------
|
@@ -702,47 +704,67 @@ CodecGenerateEncryptionKey(Codec* codec, char* userPassword, int passwordLength,
|
702 | 704 | void
|
703 | 705 | CodecEncrypt(Codec* codec, int page, unsigned char* data, int len, int useWriteKey)
|
704 | 706 | {
|
| 707 | +#ifdef WXSQLITE3_USE_OLD_ENCRYPTION_SCHEME |
| 708 | + /* Use the previous encryption scheme */ |
| 709 | + unsigned char* key = (useWriteKey) ? codec->m_writeKey : codec->m_readKey; |
| 710 | + CodecAES(codec, page, 1, key, data, len, data); |
| 711 | +#else |
705 | 712 | unsigned char dbHeader[8];
|
706 | 713 | int offset = 0;
|
707 | 714 | unsigned char* key = (useWriteKey) ? codec->m_writeKey : codec->m_readKey;
|
708 | 715 | if (page == 1)
|
709 | 716 | {
|
| 717 | + /* Save the header bytes remaining unencrypted */ |
710 | 718 | memcpy(dbHeader, data+16, 8);
|
711 | 719 | offset = 16;
|
712 | 720 | CodecAES(codec, page, 1, key, data, 16, data);
|
713 | 721 | }
|
714 | 722 | CodecAES(codec, page, 1, key, data+offset, len-offset, data+offset);
|
715 | 723 | if (page == 1)
|
716 | 724 | {
|
| 725 | + /* Move the encrypted header bytes 16..23 to a safe position */ |
717 | 726 | memcpy(data+8, data+16, 8);
|
| 727 | + /* Restore the unencrypted header bytes 16..23 */ |
718 | 728 | memcpy(data+16, dbHeader, 8);
|
719 | 729 | }
|
| 730 | +#endif |
720 | 731 | }
|
721 | 732 |
|
722 | 733 | void
|
723 | 734 | CodecDecrypt(Codec* codec, int page, unsigned char* data, int len)
|
724 | 735 | {
|
| 736 | +#ifdef WXSQLITE3_USE_OLD_ENCRYPTION_SCHEME |
| 737 | + /* Use the previous encryption scheme */ |
| 738 | + CodecAES(codec, page, 0, codec->m_readKey, data, len, data); |
| 739 | +#else |
725 | 740 | unsigned char dbHeader[8];
|
726 | 741 | int dbPageSize;
|
727 | 742 | int offset = 0;
|
728 | 743 | if (page == 1)
|
729 | 744 | {
|
| 745 | + /* Save (unencrypted) header bytes 16..23 */ |
730 | 746 | memcpy(dbHeader, data+16, 8);
|
| 747 | + /* Determine page size */ |
731 | 748 | dbPageSize = (dbHeader[0] << 8) | (dbHeader[1] << 16);
|
| 749 | + /* Check whether the database header is valid */ |
| 750 | + /* If yes, the database follows the new encryption scheme, otherwise use the previous encryption scheme */ |
732 | 751 | if ((dbPageSize >= 512) && (dbPageSize <= SQLITE_MAX_PAGE_SIZE) && (((dbPageSize-1) & dbPageSize) == 0) &&
|
733 | 752 | (dbHeader[5] == 0x40) && (dbHeader[6] == 0x20) && (dbHeader[7] == 0x20))
|
734 | 753 | {
|
| 754 | + /* Restore encrypted bytes 16..23 for new encryption scheme */ |
735 | 755 | memcpy(data+16, data+8, 8);
|
736 | 756 | offset = 16;
|
737 | 757 | }
|
738 | 758 | }
|
739 | 759 | CodecAES(codec, page, 0, codec->m_readKey, data+offset, len-offset, data+offset);
|
740 | 760 | if (page == 1 && offset != 0)
|
741 | 761 | {
|
| 762 | + /* Verify the database header */ |
742 | 763 | if (memcmp(dbHeader, data+16, 8) == 0)
|
743 | 764 | {
|
744 | 765 | memcpy(data, SQLITE_FILE_HEADER, 16);
|
745 | 766 | }
|
746 | 767 | }
|
| 768 | +#endif |
747 | 769 | }
|
748 | 770 |
|
0 commit comments