コード例 #1
0
ファイル: bsTransform.py プロジェクト: JHUISI/auto-tools
def applyBSTransform(sdl_file, config):
    """ read sdl file to determine interfaces and variable types, etc"""
    global assignInfo
    sdl.parseFile(sdl_file, False, ignoreCloudSourcing=True)
    assignInfo = sdl.getAssignInfo()
    allTypes   = sdl.getVarTypes()
    varTypes   = allTypes.get(sdl.TYPES_HEADER)
    # 1. extract each function
    inputSchemeApi = {keygenFuncName:None, signFuncName:None, verifyFuncName:None}
    funcVars = set()
    for i in config.functionOrder:
        print("processing func: ", i)
        inputSchemeApi[i], _funcVars = getInterface(assignInfo, i)
        funcVars = funcVars.union(_funcVars)
        
    funcVars = list(funcVars)
    print("funcVars: ", funcVars)    
    schemeTypes = getInterfaceTypes(allTypes, funcVars)
    
    name = sdl.assignInfo[sdl.NONE_FUNC_NAME][sdl.SDL_NAME].getAssignNode().getRight().getAttribute()
    setting = sdl.assignInfo[sdl.NONE_FUNC_NAME][sdl.ALGEBRAIC_SETTING].getAssignNode().getRight().getAttribute()

    schemeCalls = {}
    funcInput = {}
    funcOutput = {}
    for i in config.functionOrder:
        schemeCalls[i] = "%s.%s(%s)" % (name, i, getArgString(inputSchemeApi[i][inputKeyword]))
        print("funcCall: ", schemeCalls[i])
        funcInput[i] = inputSchemeApi[i][inputKeyword]
        funcOutput[i] = inputSchemeApi[i][outputKeyword]

    bsT = BSTransform(assignInfo, varTypes, schemeTypes, schemeCalls, funcInput, funcOutput)
    bsT.setSchemeName(name)
    bsT.setSetting(setting)
    bsT.constructSDL(config)
    return
コード例 #2
0
def runAutoStrong(sdlFile, config, options, sdlVerbose=False):
    sdl.parseFile(sdlFile, sdlVerbose, ignoreCloudSourcing=True)
    global assignInfo
    assignInfo = sdl.getAssignInfo()
    setting = sdl.assignInfo[sdl.NONE_FUNC_NAME][ALGEBRAIC_SETTING].getAssignNode().getRight().getAttribute()
    assert setting == sdl.SYMMETRIC_SETTING, "AutoStrong requires a symmetric scheme for simplicity."
    origVarTypes = dict(sdl.getVarTypes().get(sdl.TYPES_HEADER))
    
    # extract property 1 details...
    generators = []
    if hasattr(config, "setupFuncName"):
        setupConfig  = sdl.getVarInfoFuncStmts( config.setupFuncName )
        theStmt, theTypes = setupConfig[0], setupConfig[1]
        extractGenerators(theStmt, theTypes, generators)
    if hasattr(config, "keygenFuncName"):
        keygenConfig  = sdl.getVarInfoFuncStmts( config.keygenFuncName )
        theStmt, theTypes = keygenConfig[0], keygenConfig[1]
        extractGenerators(theStmt, theTypes, generators)

    signConfig  = sdl.getVarInfoFuncStmts( config.signFuncName )
    signStmts, signTypes = signConfig[0], signConfig[1]
    extractGenerators(signStmts, signTypes, generators)
    
    verifyConfig  = sdl.getVarInfoFuncStmts( config.verifyFuncName )
    theStmt, theTypes = verifyConfig[0], verifyConfig[1]
    extractGenerators(theStmt, theTypes, generators)
    
    assert len(generators) != 0, "signature scheme does not select any generators?"
    baseGen = generators[0]
    print("Base generator: ", baseGen)
    generators.remove(baseGen)    
    print("Other generator: ", generators)

    #get config parameters
    msg     = config.messageVar
    msgList = traceMessage(signStmts, signTypes, msg)
    if len(msgList) == 0:
        # msg used directly
        msgVar = msg
    else:
        # indirection on msg
        msgList.append(msg)
        msgVar = msgList
    print("msgVar: ", msgVar)
    sigVar = config.signatureVar
    
    (name, varInf) = getVarNameEntryFromAssignInfo(assignInfo, sigVar)
    if name != config.signFuncName:
        sys.exit("runAutoStrong: '%s' not in the sign function." % sigVar)
    #print("identified signature: ", varInf.getAssignNode())
    listVars = varInf.getListNodesList()
    if len(listVars) == 0:
        listVars.append(sigVar) # probably just one element in signature
    #print("list of possible vars: ", listVars)
    sigma = property1Extract(config.signFuncName, assignInfo, listVars, msgVar)
    #if testForSUCMA:
        # quick test for whether scheme is SU-CMA secure already
    #    sigma['sigma1'] += sigma['sigma2']
    #    sigma['sigma2'] = []
    if sdlVerbose:
        print("sigma1 => ", sigma['sigma1'])
        print("sigma2 => ", sigma['sigma2'])
        
    prop2Result = property2Extract(config.verifyFuncName, assignInfo, baseGen, generators, sigma)
    noSigma2Result = noSigma2Check(sigma)

    if options.get(skipTransform): return "skip_transform"
    
    if prop2Result and not noSigma2Result:
        print("Applying BSW transformation...")
        # extract types for all variables
        varTypes = sdl.getVarTypes().get(TYPES_HEADER)
        for i in config.functionOrder:
            #print("Processing func: ", i)
            varTypes.update( sdl.getVarTypes().get(i) )
        
        #print("Type variables for all: ", varTypes.keys())
        bsw = BSWTransform(assignInfo, origVarTypes, varTypes, msgVar, msgList)
        newSDL = bsw.constructSDL(config, options, sigma)
        return newSDL
    
    elif prop2Result and noSigma2Result:
        #print("Signature Scheme Already Strongly Unforgeable!")
        sys.exit(0)
    else:
        print("Applying BS transformation...")
        return applyBSTransform(sdlFile, config)