os/security/crypto/weakcryptospi/test/tpadding/tpaddingPKCS1.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <random.h>
sl@0
    20
#include <padding.h>
sl@0
    21
#include <securityerr.h>
sl@0
    22
#include "tpaddingPKCS1.h"
sl@0
    23
sl@0
    24
CTestPadPKCS1::CTestPadPKCS1()
sl@0
    25
{
sl@0
    26
   SetTestStepName(KPadPKCS1);
sl@0
    27
}
sl@0
    28
sl@0
    29
CTestPadPKCS1::~CTestPadPKCS1()
sl@0
    30
{
sl@0
    31
}
sl@0
    32
sl@0
    33
TVerdict CTestPadPKCS1::doTestStepL()
sl@0
    34
{
sl@0
    35
sl@0
    36
   __UHEAP_MARK;
sl@0
    37
   
sl@0
    38
   INFO_PRINTF1(_L("Test of PKCS1 signature padding"));
sl@0
    39
sl@0
    40
   SetTestStepResult(EPass);
sl@0
    41
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
    42
   TestPKCS1SignaturePadding(512);
sl@0
    43
sl@0
    44
   SetTestStepResult(EPass);
sl@0
    45
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
    46
   TestPKCS1SignaturePadding(1024);
sl@0
    47
sl@0
    48
   SetTestStepResult(EPass);
sl@0
    49
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
    50
   TestPKCS1SignaturePadding(2048);
sl@0
    51
sl@0
    52
   INFO_PRINTF1(_L("Test of PKCS1 encryption padding"));
sl@0
    53
sl@0
    54
   SetTestStepResult(EPass);
sl@0
    55
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
    56
   TestPKCS1EncryptionPadding(512);
sl@0
    57
sl@0
    58
   SetTestStepResult(EPass);
sl@0
    59
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
    60
   TestPKCS1EncryptionPadding(1024);
sl@0
    61
sl@0
    62
   SetTestStepResult(EPass);
sl@0
    63
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
    64
   TestPKCS1EncryptionPadding(2048);
sl@0
    65
   
sl@0
    66
sl@0
    67
   __UHEAP_MARKEND;
sl@0
    68
   return TestStepResult();
sl@0
    69
}
sl@0
    70
sl@0
    71
void CTestPadPKCS1::TestPKCS1SignaturePadding(TInt aBlockSize)
sl@0
    72
{
sl@0
    73
   CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize);
sl@0
    74
   /*
sl@0
    75
    * The length of the data D shall not be more than k-11 octets,
sl@0
    76
    * which is positive since the length k of the modulus is at
sl@0
    77
    * least 12 octets.
sl@0
    78
    */
sl@0
    79
   TInt noDataBytes = aBlockSize-11;
sl@0
    80
   
sl@0
    81
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
    82
   {
sl@0
    83
      HBufC8 *inData = HBufC8::NewLC(noDataBytes);
sl@0
    84
      HBufC8 *outData = HBufC8::NewLC(aBlockSize);
sl@0
    85
      TPtr8 in(inData->Des());
sl@0
    86
      TPtr8 out(outData->Des());
sl@0
    87
      TInt j;
sl@0
    88
      
sl@0
    89
      for (j = 0; j < i; j++)
sl@0
    90
      {
sl@0
    91
	 TInt text('a'+j%25);
sl@0
    92
	 in.Append(text);
sl@0
    93
      }
sl@0
    94
      
sl@0
    95
      TRAPD(err, padding->PadL(in, out));
sl@0
    96
      TEST(err == KErrNone);
sl@0
    97
      
sl@0
    98
      // check the padding.
sl@0
    99
      // should have the following syntax:
sl@0
   100
      // 00 || 01 || PS || 00 || D where PS is the padding octects of value 0xff
sl@0
   101
      
sl@0
   102
      TEST(out[0] == 0 && out[1] == 1);
sl@0
   103
sl@0
   104
      TInt endOfPadding = aBlockSize - 1 - in.Length();
sl@0
   105
      for (j = 2; j < endOfPadding; j++)
sl@0
   106
      {
sl@0
   107
	 TEST(out[j]==0xff);
sl@0
   108
	 
sl@0
   109
      }
sl@0
   110
      // Check for the delimiter
sl@0
   111
      TEST(out[endOfPadding] == 0);
sl@0
   112
      // Check that the rest of the data is not corrupted
sl@0
   113
      TInt startOfData = aBlockSize - in.Length();
sl@0
   114
      TEST(in == out.Mid(startOfData));
sl@0
   115
      CleanupStack::PopAndDestroy(2, inData); // inData, outData
sl@0
   116
   }
sl@0
   117
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   118
   CleanupStack::PopAndDestroy(); // padding
sl@0
   119
}
sl@0
   120
sl@0
   121
void CTestPadPKCS1::TestPKCS1EncryptionPadding(TInt aBlockSize)
sl@0
   122
{
sl@0
   123
   CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize);
sl@0
   124
   /*
sl@0
   125
    * The length of the data D shall not be more than k-11 octets,
sl@0
   126
    * which is positive since the length k of the modulus is at
sl@0
   127
    * least 12 octets.
sl@0
   128
    */
sl@0
   129
   TInt noDataBytes = aBlockSize-11;
sl@0
   130
   
sl@0
   131
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   132
   {
sl@0
   133
      HBufC8 *inData = HBufC8::NewLC(noDataBytes);
sl@0
   134
      HBufC8 *outData = HBufC8::NewLC(aBlockSize);
sl@0
   135
      TPtr8 in(inData->Des());
sl@0
   136
      TPtr8 out(outData->Des());
sl@0
   137
      TInt j;
sl@0
   138
      
sl@0
   139
      for (j = 0; j < i; j++)
sl@0
   140
      {
sl@0
   141
	 TInt text('a'+j%25);
sl@0
   142
	 in.Append(text);
sl@0
   143
      }
sl@0
   144
      
sl@0
   145
      TRAPD(err, padding->PadL(in, out));
sl@0
   146
      TEST(err == KErrNone);
sl@0
   147
      // check the padding.
sl@0
   148
      // should have the following syntax:
sl@0
   149
      // 00 || 02 || PS || 00 || D where PS is the padding octects containing random data
sl@0
   150
      
sl@0
   151
      TEST(out[0] == 0 && out[1] == 2);
sl@0
   152
      
sl@0
   153
      TInt endOfPadding = aBlockSize - 1 - in.Length();
sl@0
   154
      for (j = 2; j < endOfPadding; j++)
sl@0
   155
      {
sl@0
   156
	 TEST(out[j]!=0);
sl@0
   157
	 
sl@0
   158
      }
sl@0
   159
      // Check for the delimiter
sl@0
   160
      TEST(out[endOfPadding] == 0);
sl@0
   161
      
sl@0
   162
      // Check that the rest of the data is not corrupted
sl@0
   163
      TInt startOfData = aBlockSize - in.Length();
sl@0
   164
      TEST(in == out.Mid(startOfData));
sl@0
   165
      CleanupStack::PopAndDestroy(2, inData); // inData, outData
sl@0
   166
   }
sl@0
   167
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   168
   CleanupStack::PopAndDestroy(); // padding
sl@0
   169
}
sl@0
   170
sl@0
   171
   
sl@0
   172
CTestUnpadPKCS1::CTestUnpadPKCS1()
sl@0
   173
{
sl@0
   174
   SetTestStepName(KUnpadPKCS1);
sl@0
   175
}
sl@0
   176
sl@0
   177
CTestUnpadPKCS1::~CTestUnpadPKCS1()
sl@0
   178
{
sl@0
   179
}
sl@0
   180
sl@0
   181
TVerdict CTestUnpadPKCS1::doTestStepL()
sl@0
   182
{
sl@0
   183
   __UHEAP_MARK;
sl@0
   184
sl@0
   185
   INFO_PRINTF1(_L("Test of PKCS1 signature unpadding"));
sl@0
   186
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
   187
   SetTestStepResult(EPass);
sl@0
   188
   TestPKCS1SignatureUnpadding(512);
sl@0
   189
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
   190
   SetTestStepResult(EPass);
sl@0
   191
   TestPKCS1SignatureUnpadding(1024);
sl@0
   192
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
   193
   SetTestStepResult(EPass);
sl@0
   194
   TestPKCS1SignatureUnpadding(2048);
sl@0
   195
sl@0
   196
   INFO_PRINTF1(_L("Test of PKCS1 encryption unpadding"));
sl@0
   197
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
   198
   SetTestStepResult(EPass);
sl@0
   199
   TestPKCS1EncryptionUnpadding(512);
sl@0
   200
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
   201
   SetTestStepResult(EPass);
sl@0
   202
   TestPKCS1EncryptionUnpadding(1024);
sl@0
   203
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
   204
   SetTestStepResult(EPass);
sl@0
   205
   TestPKCS1EncryptionUnpadding(2048);
sl@0
   206
sl@0
   207
   __UHEAP_MARKEND;
sl@0
   208
   return TestStepResult();
sl@0
   209
}
sl@0
   210
sl@0
   211
void CTestUnpadPKCS1::TestPKCS1SignatureUnpadding(TInt aBlockSize)
sl@0
   212
{
sl@0
   213
   CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize);
sl@0
   214
   /*
sl@0
   215
    * The length of the data D shall not be more than k-11 octets,
sl@0
   216
    * which is positive since the length k of the modulus is at
sl@0
   217
    * least 12 octets.
sl@0
   218
    */
sl@0
   219
   TInt noDataBytes = aBlockSize-11;
sl@0
   220
   
sl@0
   221
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   222
   {
sl@0
   223
      HBufC8 *inData = HBufC8::NewLC(aBlockSize);
sl@0
   224
      HBufC8 *outData = HBufC8::NewLC(noDataBytes);
sl@0
   225
      HBufC8 *compData = HBufC8::NewLC(noDataBytes);
sl@0
   226
      TPtr8 in(inData->Des());
sl@0
   227
      TPtr8 out(outData->Des());
sl@0
   228
      TPtr8 comp(compData->Des());
sl@0
   229
      
sl@0
   230
      TInt endOfPadding = aBlockSize - 1 - i;
sl@0
   231
      in.SetLength(endOfPadding+1);
sl@0
   232
      in[0] = 0;
sl@0
   233
      in[1] = 1;
sl@0
   234
      TInt j;
sl@0
   235
      for (j = 2; j < endOfPadding; j++)
sl@0
   236
      {
sl@0
   237
	 in[j] = 0xff;
sl@0
   238
      }
sl@0
   239
      in[endOfPadding] = 0; // delimiter
sl@0
   240
sl@0
   241
      for (j = 0; j < i; j++)
sl@0
   242
      {
sl@0
   243
	 TInt text('a'+j%25);
sl@0
   244
	 in.Append(text);
sl@0
   245
	 comp.Append(text);
sl@0
   246
      }
sl@0
   247
sl@0
   248
      TRAPD(err, padding->UnPadL(in, out));
sl@0
   249
      TEST(err == KErrNone);
sl@0
   250
sl@0
   251
      TEST(out == comp);
sl@0
   252
sl@0
   253
      TEST(out.Length() == i);
sl@0
   254
sl@0
   255
      
sl@0
   256
      CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData
sl@0
   257
   }
sl@0
   258
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   259
   CleanupStack::PopAndDestroy(); // padding
sl@0
   260
}
sl@0
   261
sl@0
   262
void CTestUnpadPKCS1::TestPKCS1EncryptionUnpadding(TInt aBlockSize)
sl@0
   263
{
sl@0
   264
   CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize);
sl@0
   265
   /*
sl@0
   266
    * "The length of the data D shall not be more than k-11 octets,
sl@0
   267
    * which is positive since the length k of the modulus is at
sl@0
   268
    * least 12 octets."
sl@0
   269
    */
sl@0
   270
   TInt noDataBytes = aBlockSize-11;
sl@0
   271
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   272
   {
sl@0
   273
      HBufC8 *inData = HBufC8::NewLC(aBlockSize);
sl@0
   274
      HBufC8 *outData = HBufC8::NewLC(noDataBytes);
sl@0
   275
      HBufC8 *compData = HBufC8::NewLC(noDataBytes);
sl@0
   276
      TPtr8 in(inData->Des());
sl@0
   277
      TPtr8 out(outData->Des());
sl@0
   278
      TPtr8 comp(compData->Des());
sl@0
   279
      
sl@0
   280
      TInt endOfPadding = aBlockSize - 1 - i;
sl@0
   281
      in.SetLength(endOfPadding+1);
sl@0
   282
      in[0] = 0;
sl@0
   283
      in[1] = 2;
sl@0
   284
      TBuf8<256> rnd(256);
sl@0
   285
      TRAPD(err, GenerateRandomBytesL(rnd));
sl@0
   286
      if((err != KErrNone) && (err != KErrNotSecure))
sl@0
   287
          User::Leave(err);
sl@0
   288
sl@0
   289
sl@0
   290
      TInt k = 2;
sl@0
   291
      TInt j = 0;
sl@0
   292
      while (k < endOfPadding)
sl@0
   293
      {
sl@0
   294
         if (rnd[j%256])
sl@0
   295
         {
sl@0
   296
            in[k++] = rnd[j%256];
sl@0
   297
         }
sl@0
   298
         
sl@0
   299
         if (++j%256 == 0)
sl@0
   300
         {
sl@0
   301
         TRAP(err, GenerateRandomBytesL(rnd));
sl@0
   302
         if((err != KErrNone) && (err != KErrNotSecure))
sl@0
   303
             User::Leave(err);
sl@0
   304
         }
sl@0
   305
      }
sl@0
   306
      in[endOfPadding] = 0; // delimiter
sl@0
   307
sl@0
   308
      for (j = 0; j < i; j++)
sl@0
   309
      {
sl@0
   310
	 TInt text('a'+j%25);
sl@0
   311
	 in.Append(text);
sl@0
   312
     comp.Append(text);
sl@0
   313
      }
sl@0
   314
sl@0
   315
      TRAP(err, padding->UnPadL(in, out));
sl@0
   316
      TEST(err == KErrNone);
sl@0
   317
sl@0
   318
	  TEST(out == comp);		  
sl@0
   319
sl@0
   320
      TEST(out.Length() == i);
sl@0
   321
sl@0
   322
      
sl@0
   323
      CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData
sl@0
   324
   }
sl@0
   325
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   326
   CleanupStack::PopAndDestroy(); // padding
sl@0
   327
}