⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgptar.c

📁 PGP SDK 包括大范围的标准加密、数字签名和编解码技术
💻 C
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
PGPtar.c

Copyright (C) 2003,2004 PGP Corporation
All rights reserved.

This file contains functions which are used to test 
how PGP handles encoding/decoding and manipulations of PGP Archives

$Id: PGPtar.c 48493 2006-10-12 21:19:56Z vinnie $
____________________________________________________________________________*/
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#ifndef PGP_WIN32
#include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
 
#include "pgpFeatures.h"
#include "pgpErrors.h"
#include "pgpEncode.h"
#include "pgpKeys.h"
#include "pgpPublicKey.h"
#include "pgpHash.h"
#include "pgpUtilities.h"

#include "optest.h"

#if PGP_MOBILE
#define SLASH "\\"
#else
#define SLASH "/"
#endif

#define TEST1_USES_FILE			0
#define DETACHED_TAR_SIG_TEST   0

#define ZERO_LENGTH_FILE	"zerolengthfile.txt"
#define TEST_DIR			"more_stuff"
#define TEST_FILE			"newrabbit1.jpg" 

#define OUTPUT_FILE		"message.pgp"
#define LONG_NAME		"this a really long name that should force two file header block to be used I guess but I cant be sure tell we try it.txt"

#define RENAME_FILE "rabbitfoofoo.jpg"
 
#define SESSION_KEY_BUFFER_SIZE		33

//------------------------------------------------------------------
   
static void strcatchar(char *s1, char c)
{
	int i = (int)strlen(s1);
	
	s1[i++] = c;
	s1[i] = 0;
}
 

static void printTarEntry(int type, char *name, char *user, char *group, PGPUInt64 size, PGPInt32 mode, PGPTime date, char *link)
{
	char		modeStr[12];
	char		timeStr[64];
	static char *modeChar = "-rwx";
	static char *typeChar = "? ldx";

	/* TAR File permissions */
#define  TUREAD   00400         /* read by owner */
#define  TUWRITE  00200         /* write by owner */
#define  TUEXEC   00100         /* execute/search by owner */
#define  TGREAD   00040         /* read by group */
#define  TGWRITE  00020         /* write by group */
#define  TGEXEC   00010         /* execute/search by group */
#define  TOREAD   00004         /* read by other */
#define  TOWRITE  00002         /* write by other */
#define  TOEXEC   00001         /* execute/search by other */
 
	time_t		mtime = PGPGetStdTimeFromPGPTime(date);
 
	modeStr[0]=0;
  	strcatchar(modeStr,	typeChar[type]);	
			
	/* file protection */
	strcatchar(modeStr, modeChar[ mode & TUREAD?1:0]);
	strcatchar(modeStr, modeChar[ mode & TUWRITE?2:0]);
	strcatchar(modeStr, modeChar[ mode & TUEXEC?3:0]);
	strcatchar(modeStr, modeChar[ mode & TGREAD?1:0]);
	strcatchar(modeStr, modeChar[ mode & TGWRITE?2:0]);
	strcatchar(modeStr, modeChar[ mode & TGEXEC?3:0]);
	strcatchar(modeStr, modeChar[ mode & TOREAD?1:0]);
	strcatchar(modeStr, modeChar[ mode & TOWRITE?2:0]);
	strcatchar(modeStr, modeChar[ mode & TOEXEC?3:0]);
	 
#if PGP_WIN32
	strftime( timeStr, sizeof(timeStr), "%d %b %X", localtime(&mtime));
#else
	strftime( timeStr, sizeof(timeStr), "%d %b %R", localtime(&mtime));
#endif

#if PGP_MOBILE
	OPTESTPrintF("%s %8s %8s %8d %s %s ",modeStr,user,group, (int)size ,timeStr,name); // No llu in CE CRT
#else
	OPTESTPrintF("%s %8s %8s %8llu %s %s ",modeStr,user,group, size ,timeStr,name);
#endif

	if((link != NULL) && (link[0] != 0)) OPTESTPrintF("\n\t\t\t--> %s",link);
	OPTESTPrintF("\n");
}


PGPError DisplayTarCacheEntry( PGPTARCacheObjRef obj)
{
	PGPError			err			= kPGPError_NoErr;
	PGPChar8			*name		= NULL;
 	PGPTARCacheObjAttributeType type;
	char		link[MAX_PATH];
	char		user[32];
	char		group[32];
	PGPUInt64	size;
	PGPFileOffset	fpos;
	PGPInt32	mode;
	PGPTime		date;
 
	size = 0;
	link[0] = 0;

	err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Attribute, (PGPInt32*) &type);CKERR;
	err = PGPGetTARCacheObjDataProperty(obj, kPGPTARCacheObjProperty_FilePos, &fpos, sizeof(PGPFileOffset), NULL); CKERR;
	err = PGPGetTARCacheObjAllocatedDataProperty( obj, kPGPTARCacheObjProperty_Name, (void**)&name, NULL);CKERR;

	err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_User,
														user, sizeof user, NULL);CKERR;

	err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Group,
														group, sizeof group, NULL);CKERR;
														
	err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Mode, &mode);CKERR;

	err = PGPGetTARCacheObjTimeProperty( obj,kPGPTARCacheObjProperty_Date, &date);CKERR;
	
	OPTESTPrintF("\t %8lld   ",fpos);
 
	switch(type)
	{
		case kPGPTARCacheObjAttribute_File:

			err = PGPGetTARCacheObjDataProperty(obj, kPGPTARCacheObjProperty_Size,
													&size, sizeof(PGPFileOffset), NULL); CKERR;
			break;

		case kPGPTARCacheObjAttribute_SymLink:
		
			err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Link,
													link, sizeof link, NULL);CKERR;
			break; 
				
		case kPGPTARCacheObjAttribute_Directory:
		case kPGPTARCacheObjAttribute_Deleted:
		break;

		default:;
	}
		
	if(strlen(name) > 32) 
	{
		name[29] = 0;
		strcat(name,"...");
	}
	
	printTarEntry(type, name, user, group,  size,  mode,  date, link);
  
done:
 
	if(name) PGPFreeData(name);
  	return err;

}


 PGPError ListTarCache(PGPContextRef context, PGPFileSpecRef fileRef, void *sessionKey, PGPSize sessionKeySize)
 {
 
 	PGPError			err			= kPGPError_NoErr;
 	PGPTARCacheRef		tar			= kInvalidPGPTARCacheRef;
	PGPTARCacheIterRef  iter		= kInvalidPGPTARCacheIterRef;
 	PGPTARCacheObjRef   obj			= kInvalidPGPTARCacheObjRef;
	PGPUInt32			count		= 0;
	PGPUInt32			progress	= 0;
	PGPChar8			*name		= NULL;
	DecodeInfo			decodeInfo;
	
	InitDecodeInfo(&decodeInfo);

 	err = PGPGetFullPathFromFileSpec(fileRef, &name);CKERR;
 	OPTESTPrintF("\tTar Cache Content: \"%s\"\n", (char*) name );
	PGPFreeData(name); name = NULL;

	OPTESTPrintF("\t  Opening Tar cache file\n");
 	err = PGPOpenTARCacheFile(context,kPGPOpenTARCacheFileOptions_None | kPGPOpenTARCacheFileOptions_PreloadAll,
							fileRef, sessionKey,sessionKeySize,NULL, &tar, 
								PGPOSendNullEvents(context, 50),
								PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
								PGPOLastOption( context ));CKERR;
								
  	err = PGPGetTARCacheScanProgress(tar, &count, &progress); CKERR;
	OPTESTPrintF("\t  Found %d object%s.\n",count, count==1?"":"s" );
 
	err = PGPNewTARCacheIter(tar, &iter);CKERR;

    OPTESTPrintF("\t Listing Tar Cache File\n");
	OPTESTPrintF("\t %8s   %10s %8s %8s %8s %-12s %s\n","Offset","Mode","User", "Group","Size","Date","Name");
	OPTESTPrintF("\t --------   ---------- -------- -------- -------- ------------ ------------------------\n");
	
	err = PGPTARCacheIterRewind(iter);CKERR;
  	while( IsntPGPError(err = PGPTARCacheIterNextTARCacheObj(iter,	&obj)))
	{
		err = DisplayTarCacheEntry(obj);CKERR;
	}
 	 
	err = PGPGetTARCacheScanProgress(tar, &count, &progress); CKERR;
	OPTESTPrintF("\tTotal %d object%s\n",count, count==1?"":"s" );
   	

#if 0
  	OPTESTPrintF("\n\t Displayed Backwards\n");
 	err = PGPTARCacheIterRewind(iter);CKERR;
 	err = PGPTARCacheIterMove(iter,	count -1 , NULL); CKERR;
 
 	while( IsntPGPError(err = PGPTARCacheIterPrevTARCacheObj(iter,	&obj)))
 	{
		err = DisplayTarCacheEntry(obj);CKERR;
	}

#endif 
	if(err == kPGPError_EndOfIteration)  err = kPGPError_NoErr;
	OPTESTPrintF("\n");
	
  done:
	if( PGPTARCacheIterRefIsValid (iter) )
			PGPFreeTARCacheIter(iter);

  	if( PGPTARCacheRefIsValid (tar) )
			PGPFreeTARCache(tar);
 	
	if(name) PGPFreeData(name);
 

	return err;
 }



 PGPError ExportandDeletefromTarCache(PGPContextRef context, PGPFileSpecRef cache, char* outputDir, void *sessionKey, PGPSize sessionKeySize)
 {
 
 	PGPError			err			= kPGPError_NoErr;
	PGPFileSpecRef		exportSpec	= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		rootSpec	= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		fileSpec	= kInvalidPGPFileSpecRef;
	PGPTARCacheRef		tar			= kInvalidPGPTARCacheRef;
	PGPTARCacheIterRef  iter		= kInvalidPGPTARCacheIterRef;
 	PGPTARCacheObjRef   obj			= kInvalidPGPTARCacheObjRef;
	DecodeInfo			decodeInfo;
	char				pathName[MAX_PATH];

	InitDecodeInfo(&decodeInfo);

	OPTESTPrintF("\tExport and Delete Tar Cache Items\n");

	OPTESTPrintF("\t  Opening Tar cache file\n");
	err = PGPOpenTARCacheFile(context,kPGPOpenTARCacheFileOptions_None | kPGPOpenTARCacheFileOptions_Mutable, cache,
									sessionKey,sessionKeySize,NULL, &tar, 
								PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
								PGPOLastOption( context ) ); CKERR;

 	err = PGPNewTARCacheIter(tar, &iter);CKERR;
  
	while( IsntPGPError(err = PGPTARCacheIterNextTARCacheObj(iter,	&obj)))
	{
  		PGPTARCacheObjAttributeType type;
		char	name[MAX_PATH];
   		char	*p;
 		
		err = PGPGetTARCacheObjNumericProperty( obj,kPGPTARCacheObjProperty_Attribute, (PGPInt32*) &type);CKERR;
		err = PGPGetTARCacheObjDataProperty( obj, kPGPTARCacheObjProperty_Name,  &name, MAX_PATH, NULL);CKERR;
 
		if(type == kPGPTARCacheObjAttribute_SymLink)
		{
 			OPTESTPrintF("\t delete \"%s\"\n",name);
    			err= PGPDeleteTARCacheObj(obj);CKERR;
 		}
 		else
		if(type == kPGPTARCacheObjAttribute_File)
		{
	  		if((p = strrchr(name,'/') ) == NULL) p = name; else p++;
			
			/* Ignore CVS files for this test */
			if ((strcmp(p, "Root") == 0) || (strcmp(p, "Entries")  == 0) 
			||  (strcmp(p, "Tag")  == 0) ||  (strcmp(p, "Repository")  == 0) ||  (strcmp(p, "Entries.Log")  == 0))
				continue;
				
 			if(*p != '.')
			{
  					OPTESTPrintF("\t export & delete ");
					printTruncated(p, strlen(p), 32);
					sprintf(pathName, "%s%s%s",outputDir, SLASH, p);
	 									
					err = PGPNewFileSpecFromFullPath(context,pathName, &exportSpec); CKERR;
 					err = PGPExportTARCacheObj( obj,exportSpec, 
								PGPOEventHandler( context, OptestEventHandler, &decodeInfo),
  								PGPOSendNullEvents(context, 50),
								PGPOLastOption( context ) ); CKERR;
								
					PGPFreeFileSpec(exportSpec);
					exportSpec = NULL;

  		 			err= PGPDeleteTARCacheObj(obj);CKERR;
 			}
 
  		}
	}
 	
	if(err == kPGPError_EndOfIteration)  err = kPGPError_NoErr;
	OPTESTPrintF("\n");

 done:
	if( PGPTARCacheIterRefIsValid (iter) )
			PGPFreeTARCacheIter(iter);

  	if( PGPTARCacheRefIsValid (tar) )
			PGPFreeTARCache(tar);
			
	if(exportSpec) PGPFreeFileSpec(exportSpec);
	if(rootSpec) PGPFreeFileSpec(rootSpec);
	if(fileSpec) PGPFreeFileSpec(fileSpec);
 	return err;
	
}
 
 /* create file test */
 PGPError CreateTarCacheTest(PGPContextRef context, PGPFileSpecRef cache, PGPByte *newEsk, PGPSize *newEskSize)
 {
 
 	PGPError			err			= kPGPError_NoErr;
	PGPTARCacheRef		tar			= kInvalidPGPTARCacheRef;
	PGPCipherAlgorithm  algors[]	= { kPGPCipherAlgorithm_AES256 };
 
 	PGPFileSpecRef		rootSpec		= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		dirSpec			= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		fileSpec		= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		fileSpec1		= kInvalidPGPFileSpecRef;
	PGPFileSpecRef		relativeSpec	= kInvalidPGPFileSpecRef;
  	PGPTARCacheObjRef   obj1				= kInvalidPGPTARCacheObjRef;
  	PGPTARCacheObjRef   obj2				= kInvalidPGPTARCacheObjRef;
	PGPTARCacheObjRef   obj3				= kInvalidPGPTARCacheObjRef;
	unsigned int		i;
	char				*name = NULL;
	
	char				*testFile = NULL;
	char				*testDIR  = NULL;
	char				*zeroLengthFile = NULL;
	
	DecodeInfo			decodeInfo;
 	InitDecodeInfo(&decodeInfo);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -