00001
00002
00003
00004
00005
00006
00007
00008 #include <botan/mode_pad.h>
00009 #include <botan/exceptn.h>
00010
00011 namespace Botan {
00012
00013
00014
00015
00016 u32bit BlockCipherModePaddingMethod::pad_bytes(u32bit bs, u32bit pos) const
00017 {
00018 return (bs - pos);
00019 }
00020
00021
00022
00023
00024 void PKCS7_Padding::pad(byte block[], u32bit size, u32bit position) const
00025 {
00026 for(u32bit j = 0; j != size; ++j)
00027 block[j] = (size-position);
00028 }
00029
00030
00031
00032
00033 u32bit PKCS7_Padding::unpad(const byte block[], u32bit size) const
00034 {
00035 u32bit position = block[size-1];
00036 if(position > size)
00037 throw Decoding_Error(name());
00038 for(u32bit j = size-position; j != size-1; ++j)
00039 if(block[j] != position)
00040 throw Decoding_Error(name());
00041 return (size-position);
00042 }
00043
00044
00045
00046
00047 bool PKCS7_Padding::valid_blocksize(u32bit size) const
00048 {
00049 if(size > 0 && size < 256)
00050 return true;
00051 else
00052 return false;
00053 }
00054
00055
00056
00057
00058 void ANSI_X923_Padding::pad(byte block[], u32bit size, u32bit position) const
00059 {
00060 for(u32bit j = 0; j != size-position; ++j)
00061 block[j] = 0;
00062 block[size-position-1] = (size-position);
00063 }
00064
00065
00066
00067
00068 u32bit ANSI_X923_Padding::unpad(const byte block[], u32bit size) const
00069 {
00070 u32bit position = block[size-1];
00071 if(position > size)
00072 throw Decoding_Error(name());
00073 for(u32bit j = size-position; j != size-1; ++j)
00074 if(block[j] != 0)
00075 throw Decoding_Error(name());
00076 return (size-position);
00077 }
00078
00079
00080
00081
00082 bool ANSI_X923_Padding::valid_blocksize(u32bit size) const
00083 {
00084 if(size > 0 && size < 256)
00085 return true;
00086 else
00087 return false;
00088 }
00089
00090
00091
00092
00093 void OneAndZeros_Padding::pad(byte block[], u32bit size, u32bit) const
00094 {
00095 block[0] = 0x80;
00096 for(u32bit j = 1; j != size; ++j)
00097 block[j] = 0x00;
00098 }
00099
00100
00101
00102
00103 u32bit OneAndZeros_Padding::unpad(const byte block[], u32bit size) const
00104 {
00105 while(size)
00106 {
00107 if(block[size-1] == 0x80)
00108 break;
00109 if(block[size-1] != 0x00)
00110 throw Decoding_Error(name());
00111 size--;
00112 }
00113 if(!size)
00114 throw Decoding_Error(name());
00115 return (size-1);
00116 }
00117
00118
00119
00120
00121 bool OneAndZeros_Padding::valid_blocksize(u32bit size) const
00122 {
00123 return (size > 0);
00124 }
00125
00126 }