Best Python code snippet using uiautomator
JavCan.py
Source:JavCan.py  
1import method.algofuncs as _af2####------------------------------------------------------------------------------------------------------------#####3def convertToJapanCandle(ticker_data):4    ticker_data['Height'] = ticker_data.apply(lambda x: x['High'] - x['Low'], axis=1)5    ticker_data['Body'] = ticker_data.apply(lambda x: abs(x['Close'] - x['Open']), axis=1)6    ticker_data['UpShadow'] = ticker_data.apply(7        lambda x: (x['High'] - x['Close']) if (x['Close'] > x['Open']) else (x['High'] - x['Open']), axis=1)8    ticker_data['LowerShadow'] = ticker_data.apply(9        lambda x: (x['Open'] - x['Low']) if (x['Close'] > x['Open']) else (x['Close'] - x['Low']), axis=1)10    if 'Time' in ticker_data.columns:11        from datetime import datetime12        ticker_data['Date'] = ticker_data.apply(13            lambda x: datetime.fromtimestamp(x['Time']).strftime("%m/%d/%Y"), axis=1)14    return ticker_data15####------------------------------------------------------------------------------------------------------------#####16BIG_BODY_PRICE_RATE = 0.04  # 4%17SMALL_BODY_PRICE_RATE = 0.0118UP_SHADOW_HEIGHT_RATE_65 = 0.6519UP_SHADOW_HEIGHT_RATE_30 = 0.3020UP_SHADOW_HEIGHT_RATE_25 = 0.2521UP_SHADOW_HEIGHT_RATE_05 = 0.0522BODY_HEIGHT_RATE_85 = 0.85  # for compare 4/523BODY_HEIGHT_RATE_60 = 0.60  # for compare 1/224BODY_HEIGHT_RATE_45 = 0.45  # for compare 1/225BODY_HEIGHT_RATE_35 = 0.35  # for compare 1/326BODY_HEIGHT_RATE_30 = 0.3  # for compare 1/327BODY_HEIGHT_RATE_20 = 0.2  # for compare 1/428BODY_HEIGHT_RATE_05 = 0.05  # for compare 1/2029LOWER_SHADOW_HEIGHT_RATE_65 = 0.6530LOWER_SHADOW_HEIGHT_RATE_30 = 0.3031LOWER_SHADOW_HEIGHT_RATE_25 = 0.2532LOWER_SHADOW_HEIGHT_RATE_05 = 0.0533##### --------------------------------------------------------------------------------- #####34def isBodyOver85(body, height):35    return True if body > BODY_HEIGHT_RATE_85 * height else False36def isBodyOver60(body, height):37    return True if body > BODY_HEIGHT_RATE_60 * height else False38def isBodyOver45(body, height):39    return True if body > BODY_HEIGHT_RATE_45 * height else False40def isBigBody(body, height, _open, _close):41    maxPrice = _open if _open > _close else _close42    if isBodyOver45(body, height) and body > BIG_BODY_PRICE_RATE * maxPrice:43        return True44    return False45def isSmallBody(body, height, _open, _close):46    maxPrice = _open if _open > _close else _close47    if isBodyLess35(body, height) and body < SMALL_BODY_PRICE_RATE * maxPrice:48        return True49    return False50def isBodyLess45(body, height):51    return True if body < BODY_HEIGHT_RATE_45 * height else False52def isBodyLess35(body, height):53    return True if body < BODY_HEIGHT_RATE_35 * height else False54def isBodyLess20(body, height):55    return True if body < BODY_HEIGHT_RATE_20 * height else False56def isDoji(body, height):57    if body < BODY_HEIGHT_RATE_05 * height:58        return True59    return False60##### --------------------------------------------------------------------------------- #####61def isWhiteCandlestick(open_price, close_price):62    if close_price > open_price:63        return True64    return False65def isBlackCandlestick(open_price, close_price):66    if close_price < open_price:67        return True68    return False69def isSpinningTopCandlestick(body, height, up, bot):70    if body < BODY_HEIGHT_RATE_35 * height:71        if up > UP_SHADOW_HEIGHT_RATE_30 * height:72            if bot > LOWER_SHADOW_HEIGHT_RATE_30 * height:73                return True74    return False75def isHammer(body, height, up, bot):76    if up < UP_SHADOW_HEIGHT_RATE_05 * height:77        if body < BODY_HEIGHT_RATE_30 * height:78            if bot > LOWER_SHADOW_HEIGHT_RATE_65 * height:79                return True80    return False81def isInvertedHammer(body, height, up, bot):82    if up > UP_SHADOW_HEIGHT_RATE_65 * height:83        if body < BODY_HEIGHT_RATE_30 * height:84            if bot < LOWER_SHADOW_HEIGHT_RATE_05 * height:85                return True86    return False87def isShavenHead(height, up):88    """89    Nến cạo Äầu90    :param height:91    :param up:92    :return:93    """94    if up < UP_SHADOW_HEIGHT_RATE_05 * height:95        return True96    return False97def isShavenBottom(height, bot):98    """99    Nến cạo Äáy100    :param height:101    :param bot:102    :return:103    """104    if bot < LOWER_SHADOW_HEIGHT_RATE_05 * height:105        return True106    return False107def isUmbrellaCandlestick(body, height, up, bot):108    return isHammer(body, height, up, bot)109####------------------------------------------------------------------------------------------------------------#####110def isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down):111    isUpTrend = False112    if _close[-2] > _close[-3] > _close[-4]:113        isUpTrend = True114    if _high[-2] > _high[-3] > _high[-4]:115        isUpTrend = True116    if isWhiteCandlestick(_open[-2], _close[-2]) \117            and isWhiteCandlestick(_open[-3], _close[-3]) \118            and isWhiteCandlestick(_open[-4], _close[-4]):119        isUpTrend = True120    k = 0121    for i in [-2, -3, -4, -5, -6, -7]:122        if isWhiteCandlestick(_open[i], _close[i]) is True:123            k = k + 1124    if k > 3:125        isUpTrend = True126    return isUpTrend127def isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down):128    if isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down):129        return False130    isDownTrend = False131    if _close[-2] < _close[-3] < _close[-4]:132        isDownTrend = True133    if _low[-2] < _low[-3] < _low[-4]:134        isDownTrend = True135    if isBlackCandlestick(_open[-2], _close[-2]) \136            and isBlackCandlestick(_open[-3], _close[-3]) \137            and isBlackCandlestick(_open[-4], _close[-4]):138        isDownTrend = True139    k = 0140    for i in [-2, -3, -4, -5, -6, -7]:141        if isBlackCandlestick(_open[i], _close[i]) is True:142            k = k + 1143    if k > 3:144        isDownTrend = True145    return isDownTrend146####------------------------------------------------------------------------------------------------------------#####147def isUpTrendV2ByRSI(_close):148    return True if _af.RSIV2(_close, 5) > 55 else False149def isDownTrendV2ByRSI(_close):150    # return True if _af.RSIV2(_close, 5) < 45 else False151    # RSI for 5 days152    rsi = _af.RSI(_close, 5).tail(1).item()153    return True if rsi < 45 else False154####------------------------------------------------------------------------------------------------------------#####155def isHammerModel(_open, _close, _high, _low, _body, _height, _up, _down):156    """157    # In a down trend158    # today is a hammer candlestick159    :param :160    :return bool:161    """162    isDownTrend = isDownTrendV2ByRSI(_close[:-2])163    _iuc = isHammer(_body[-1], _height[-1], _up[-1], _down[-1])164    # _iwc = isWhiteCandlestick(_open[-1], _close[-1])165    if isDownTrend is True and _iuc is True:166        return True167    else:168        return False169def isHangingManModel(_open, _close, _high, _low, _body, _height, _up, _down):170    """171    # In a up trend (base on High price)172    # Small body height (base on total height)173    # Small or none upper shadow174    :param :175    :return:176    """177    # isUpTrend = isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)178    isUpTrend = isUpTrendV2ByRSI(_close[:-2])179    _iuc = isUmbrellaCandlestick(_body[-1], _height[-1], _up[-1], _down[-1])180    if isUpTrend is True and _iuc is True:181        return True182    else:183        return False184def isBullishEngulfing(_open, _close, _high, _low, _body, _height, _up, _down):185    """186    :param _open numpy array:187    :param _close:188    :param _body:189    :param _height:190    :param _up:191    :param _down:192    :return:193    """194    todayHasBigBody = isBigBody(_body[-1], _height[-1], _open[-1], _close[-1])195    if todayHasBigBody is False:196        return False197    prevDayIsSpinningCandlestick = isSpinningTopCandlestick(_body[-2], _height[-2], _up[-2], _down[-2])198    if prevDayIsSpinningCandlestick is True and _body[-1] < 2 * _body[-2]:199        return False200    isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)201    prevDayIsBlackCandlestick = isBlackCandlestick(_open[-2], _close[-2])202    prevDayMaxOpenClose = _open[-2] if _open[-2] > _close[-2] else _close[-2]203    prevDayMinOpenClose = _open[-2] if _open[-2] < _close[-2] else _close[-2]204    prevDayIsDoJi = isDoji(_body[-2], _height[-2])205    todayIsWhiteCandlestick = isWhiteCandlestick(_open[-1], _close[-1])206    todayMaxOpenClose = _open[-1] if _open[-1] > _close[-1] else _close[-1]207    todayMinOpenClose = _open[-1] if _open[-1] < _close[-1] else _close[-1]208    if isDownTrend is True \209            and (prevDayIsBlackCandlestick is True or prevDayIsDoJi is True) \210            and prevDayMaxOpenClose <= 0.96 * todayMaxOpenClose \211            and prevDayMinOpenClose >= todayMinOpenClose \212            and todayIsWhiteCandlestick is True:213        return True214    return False215def isBearishEngulfing(_open, _close, _high, _low, _body, _height, _up, _down):216    isUpTrend = isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)217    todayIsBlackCandlestick = isBlackCandlestick(_open[-1], _close[-1])218    prevDayMaxOpenClose = _open[-2] if _open[-2] > _close[-2] else _close[-2]219    prevDayMinOpenClose = _open[-2] if _open[-2] < _close[-2] else _close[-2]220    todayMaxOpenClose = _open[-1] if _open[-1] > _close[-1] else _close[-1]221    todayMinOpenClose = _open[-1] if _open[-1] < _close[-1] else _close[-1]222    if isUpTrend is True \223            and prevDayMaxOpenClose <= todayMaxOpenClose \224            and prevDayMinOpenClose >= todayMinOpenClose \225            and todayIsBlackCandlestick is True:226        return True227    return False228def isPiercingPattern(_open, _close, _high, _low, _body, _height, _up, _down):229    isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)230    the1stDayIsBlackCandlestick = isBlackCandlestick(_open[-2], _close[-2])231    the1stDayHasBigBody = isBodyOver45(_body[-2], _height[-2])232    the2ndDayIsWhiteCandlestick = isWhiteCandlestick(_open[-1], _close[-1])233    the2ndDayHasBigBody = isBodyOver45(_body[-1], _height[-1])234    the2ndDayFallInThe1stDay = True if _open[-1] < _close[-2] < _close[-1] < _open[-2] else False235    if isDownTrend is True and the1stDayIsBlackCandlestick is True and the1stDayHasBigBody is True \236            and the2ndDayIsWhiteCandlestick is True and the2ndDayHasBigBody is True \237            and the2ndDayFallInThe1stDay is True :238        return True239    return False240def isDarkCloudCoverPattern(_open, _close, _high, _low, _body, _height, _up, _down):241    isUpTrend = isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)242    prevDayIsWhiteCandlestick = isWhiteCandlestick(_open[-2], _close[-2])243    prevDayHasBigBody = isBodyOver45(_body[-2], _height[-2])244    todayIsBlackCandlestick = isBlackCandlestick(_open[-1], _close[-1])245    todayHasBigBody = isBodyOver45(_body[-1], _height[-1])246    todayFallInYesterday = True if _open[-2] < _close[-1] < _close[-2] < _open[-1] else False247    if isUpTrend is True and prevDayIsWhiteCandlestick is True and prevDayHasBigBody is True \248            and todayIsBlackCandlestick is True and todayHasBigBody is True \249            and todayFallInYesterday is True:250        return True251    return False252def isMorningStarsPattern(_open, _close, _high, _low, _body, _height, _up, _down):253    the1stDayIsBlackCandlestick = isBlackCandlestick(_open[-3], _close[-3])254    the1stDayHasBigBody = isBodyOver45(_body[-3], _height[-3])255    the2ndDayIsSmallBody = isBodyLess35(_body[-2], _height[-2])256    the2ndMaxOpenClosePrice = _open[-2] if _open[-2] > _close[-2] else _close[-2]257    the2ndDayHasGap = True if the2ndMaxOpenClosePrice < _close[-3] else False258    todayIsWhiteCandlestick = isWhiteCandlestick(_open[-1], _close[-1])259    todayFallInThe1stDay = True if _open[-3] > _close[-1] > _close[-3] and _body[-1] > 2 * _body[-2] else False260    if the1stDayIsBlackCandlestick is True and the1stDayHasBigBody is True \261            and the2ndDayIsSmallBody is True and the2ndDayHasGap is True \262            and todayIsWhiteCandlestick is True and todayFallInThe1stDay is True:263        return True264    return False265def isEveningStarsPattern(_open, _close, _high, _low, _body, _height, _up, _down):266    the1stDayIsWhiteCandlestick = isWhiteCandlestick(_open[-3], _close[-3])267    the1stDayHasBigBody = isBodyOver45(_body[-3], _height[-3])268    the2ndDayIsSmallBody = isBodyLess35(_body[-2], _height[-2])269    the2ndMinOpenClosePrice = _open[-2] if _open[-2] < _close[-2] else _close[-2]270    the2ndDayHasGap = True if the2ndMinOpenClosePrice > _close[-3] else False271    todayIsBlackCandlestick = isBlackCandlestick(_open[-1], _close[-1])272    todayFallInThe1stDay = True if _open[-3] < _close[-1] < _close[-3] and _body[-1] > 2 * _body[-2] else False273    if the1stDayIsWhiteCandlestick is True and the1stDayHasBigBody is True \274            and the2ndDayIsSmallBody is True and the2ndDayHasGap is True \275            and todayIsBlackCandlestick is True and todayFallInThe1stDay is True:276        return True277    return False278def isThreeBlackCrowsPattern(_open, _close, _high, _low, _body, _height, _up, _down):279    the1stDayIsBlackCandlestick = isBlackCandlestick(_open[-3], _close[-3])280    the2ndDayIsBlackCandlestick = isBlackCandlestick(_open[-2], _close[-2])281    todayIsBlackCandlestick = isBlackCandlestick(_open[-1], _close[-1])282    if the1stDayIsBlackCandlestick is True and the2ndDayIsBlackCandlestick is True and todayIsBlackCandlestick is True:283        return True284    return False285def isBullishHarami(_open, _close, _high, _low, _body, _height, _up, _down):286    isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)287    yesterdayIsBlackCandlestick = isBlackCandlestick(_open[-2], _close[-2])288    yesterdayIsBigBody = isBodyOver45(_body[-2], _height[-2])289    toDayHasSmallBody = isSmallBody(_body[-1], _height[-1], _open[-1], _close[-1])290    todayIsDeepInYesterday = True if (_open[-2] + _close[-2]) / 2 > _open[-1] > _close[-2] else False291    if isDownTrend is True and yesterdayIsBlackCandlestick is True and yesterdayIsBigBody is True \292            and toDayHasSmallBody is True and todayIsDeepInYesterday is True:293        return True294    return False295def isBearishHarami(_open, _close, _high, _low, _body, _height, _up, _down):296    isUpTrend = isUpTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)297    yesterdayIsWhiteCandlestick = isWhiteCandlestick(_open[-2], _close[-2])298    yesterdayIsBigBody = isBodyOver45(_body[-2], _height[-2])299    toDayHasSmallBody = isSmallBody(_body[-1], _height[-1], _open[-1], _close[-1])300    todayIsDeepInYesterday = True if _open[-2] < _close[-1] < (_open[-2] + _close[-2]) / 2 else False301    if isUpTrend is True and yesterdayIsWhiteCandlestick is True and yesterdayIsBigBody is True \302            and toDayHasSmallBody is True and todayIsDeepInYesterday is True:303        return True304    return False305####------------------------------------------------------------------------------------------------------------#####306def customBuySignal01(_open, _close, _high, _low, _body, _height, _up, _down):307    isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)308    _ibc = isSpinningTopCandlestick(_body[-2], _height[-2], _up[-2], _down[-2])309    _iwc = isWhiteCandlestick(_open[-1], _close[-1])310    _ibb = isBigBody(_body[-1], _height[-1], _open[-1], _close[-1])311    if isDownTrend is True and _ibc is True \312            and _iwc is True and _ibb is True \313            and _close[-1] > _close[-2]:314        return "hasBuySignal-01"315    return False316def customBuySignal02(_open, _close, _high, _low, _body, _height, _up, _down):317    isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)318    the2ndDayIsDoji = isDoji(_body[-2], _height[-2])319    todayIsShavenHead = isShavenHead(_height[-1], _up[-1])320    todayIsWhite = isWhiteCandlestick(_open[-1], _close[-1])321    if isDownTrend is True and the2ndDayIsDoji is True and todayIsShavenHead is True and todayIsWhite is True:322        return "hasBuySignal-02"323    return False324def customBuySignal03(_open, _close, _high, _low, _body, _height, _up, _down):325    # isDownTrend = isDownTrendV1(_open, _close, _high, _low, _body, _height, _up, _down)326    prevDayIsShavenBottom = isShavenBottom(_height[-2], _down[-2])327    todayIsShavenHead = isShavenHead(_height[-1], _up[-1])328    todayIsWhite = isWhiteCandlestick(_open[-1], _close[-1])329    if prevDayIsShavenBottom is True and todayIsShavenHead is True and todayIsWhite is True:330        return "hasBuySignal-03"331    return False332def customBuySignal04(_open, _close, _high, _low, _body, _height, _up, _down):333    """ Optimize the Hammer pattern"""334    isDownTrend = isDownTrendV2ByRSI(_close[:-2])335    todayIsHammer = isHammer(_body[-1], _height[-1], _up[-1], _down[-1])336    todayIsWhite = isWhiteCandlestick(_open[-1], _close[-1])337    if isDownTrend is True and todayIsHammer is True and todayIsWhite is True:338        return "hasBuySignal-04"339    return False340def customSellSignal01(_open, _close, _high, _low, _body, _height, _up, _down):341    todayIsDoJi = isDoji(_body[-1], _height[-1])342    prevDayIsDoJi = isDoji(_body[-2], _height[-2])343    if todayIsDoJi is True and prevDayIsDoJi is True:344        return True345def customSellSignal02(_open, _close, _high, _low, _body, _height, _up, _down):346    yesterdayIsBlack = isBlackCandlestick(_open[-1], _close[-1])347    todayIsWhite = isWhiteCandlestick(_open[-1], _close[-1])348    bodyTodayX2Yesterday = True if _body[-1] > 1.5*_body[-2] else False349    if yesterdayIsBlack is True and todayIsWhite is True and bodyTodayX2Yesterday is True:350        return True351####------------------------------------------------------------------------------------------------------------#####352def hasBuySignal(_open, _close, _high, _low, _body, _height, _up, _down, _volume=0, _date=''):353    # Hammer Pattern not working fine with back test, bad result354    # _iHm = isHammerModel(_open, _close, _high, _low, _body, _height, _up, _down)355    # if _iHm is True:356    #     return 'isHammerModel'357    _ibu = isBullishEngulfing(_open, _close, _high, _low, _body, _height, _up, _down)358    if _ibu is True:359        return 'isBullishEngulfing'360    _ipp = isPiercingPattern(_open, _close, _high, _low, _body, _height, _up, _down)361    isVolumeUp = True if _volume[-1] > 1.4 * _volume[-2] else False362    if _ipp is True and isVolumeUp is True:363        return 'isPiercingPattern'364    _ims = isMorningStarsPattern(_open, _close, _high, _low, _body, _height, _up, _down)365    if _ims is True:366        return 'isMorningStarsPattern'367    _cBS01 = customBuySignal01(_open, _close, _high, _low, _body, _height, _up, _down)368    if _cBS01 is True:369        return 'customBuySignal01'370    _cBS02 = customBuySignal02(_open, _close, _high, _low, _body, _height, _up, _down)371    if _cBS02 is True:372        return 'customBuySignal02'373    _cBS03 = customBuySignal03(_open, _close, _high, _low, _body, _height, _up, _down)374    if _cBS03 is True:375        return 'customBuySignal03'376    _cBS04 = customBuySignal04(_open, _close, _high, _low, _body, _height, _up, _down)377    if _cBS04 is not False:378        return _cBS04379    return False380def hasSellSignal(_open, _close, _high, _low, _body, _height, _up, _down, _volume=0, _date=''):381    _ibe = isBearishEngulfing(_open, _close, _high, _low, _body, _height, _up, _down)382    if _ibe is True:383        return 'isBearishEngulfing'384    _idc = isDarkCloudCoverPattern(_open, _close, _high, _low, _body, _height, _up, _down)385    if _idc is True:386        return 'isDarkCloudCoverPattern'387    _ies = isEveningStarsPattern(_open, _close, _high, _low, _body, _height, _up, _down)388    if _ies is True:389        return 'isEveningStarsPattern'390    _itb = isThreeBlackCrowsPattern(_open, _close, _high, _low, _body, _height, _up, _down)391    if _itb is True:392        return 'isThreeBlackCrowsPattern'393    _iha = isHangingManModel(_open, _close, _high, _low, _body, _height, _up, _down)394    if _iha is True:395        return 'isHangingManModel'396    _cSS01 = customSellSignal01(_open, _close, _high, _low, _body, _height, _up, _down)397    if _cSS01 is True:398        return 'customSellSignal01'399    _cSS02 = customSellSignal02(_open, _close, _high, _low, _body, _height, _up, _down)400    if _cSS02 is True:401        return 'customSellSignal02'402    return False403def hasCustomBuySignal(_open, _close, _high, _low, _body, _height, _up, _down, version=0):404    if version == 1 or version == 0:405        _cBS01 = customBuySignal01(_open, _close, _high, _low, _body, _height, _up, _down)406        if _cBS01 is True:407            return 'customBuySignal01'408    if version == 2 or version == 0:409        _cBS02 = customBuySignal02(_open, _close, _high, _low, _body, _height, _up, _down)410        if _cBS02 is True:411            return 'customBuySignal02'412    if version == 3 or version == 0:413        _cBS03 = customBuySignal03(_open, _close, _high, _low, _body, _height, _up, _down)414        if _cBS03 is True:415            return 'customBuySignal03'416    return False417def hasCustomSellSignal(_open, _close, _high, _low, _body, _height, _up, _down, version=0):418    todayIsDoJi = isDoji(_body[-1], _height[-1])419    prevDayIsDoJi = isDoji(_body[-2], _height[-2])420    if todayIsDoJi is True and prevDayIsDoJi is True:...test_espsecure.py
Source:test_espsecure.py  
...37        except subprocess.CalledProcessError as e:38            print(e.output)39            raise e40    def setUp(self):41        self.cleanup_files = []  # keep a list of files _open()ed by each test case42    def tearDown(self):43        for f in self.cleanup_files:44            f.close()45    def _open(self, image_file):46        f = open(os.path.join('secure_images', image_file), 'rb')47        self.cleanup_files.append(f)48        return f49class ESP32SecureBootloaderTests(EspSecureTestCase):50    def test_digest_bootloader(self):51        DBArgs = namedtuple('digest_bootloader_args', [52            'keyfile',53            'output',54            'iv',55            'image'])56        try:57            output_file = tempfile.NamedTemporaryFile(delete=False)58            output_file.close()59            args = DBArgs(self._open('256bit_key.bin'),60                          output_file.name,61                          self._open('256bit_iv.bin'),62                          self._open('bootloader.bin'))63            espsecure.digest_secure_bootloader(args)64            with open(output_file.name, 'rb') as of:65                with self._open('bootloader_digested.bin') as ef:66                    self.assertEqual(ef.read(), of.read())67        finally:68            os.unlink(output_file.name)69    def test_digest_rsa_public_key(self):70        DigestRSAArgs = namedtuple('digest_rsa_public_key_args', [71            'keyfile',72            'output'])73        try:74            output_file = tempfile.NamedTemporaryFile(delete=False)75            output_file.close()76            args = DigestRSAArgs(self._open('rsa_secure_boot_signing_key.pem'),77                                 output_file.name)78            espsecure.digest_rsa_public_key(args)79            with open(output_file.name, 'rb') as of:80                with self._open('rsa_public_key_digest.bin') as ef:81                    self.assertEqual(ef.read(), of.read())82        finally:83            os.unlink(output_file.name)84class SigningTests(EspSecureTestCase):85    VerifyArgs = namedtuple('verify_signature_args', [86        'version',87        'keyfile',88        'datafile'])89    SignArgs = namedtuple('sign_data_args', [90        'version',91        'keyfile',92        'output',93        'append_signatures',94        'datafile'])95    def _test_sign_v1_data(self, key_name):96        try:97            output_file = tempfile.NamedTemporaryFile(delete=False)98            output_file.close()99            # Note: signing bootloader is not actually needed100            # for ESP32, it's just a handy file to sign101            args = self.SignArgs('1', [self._open(key_name)],102                                 output_file.name, None,103                                 self._open('bootloader.bin'))104            espsecure.sign_data(args)105            with open(output_file.name, 'rb') as of:106                with self._open('bootloader_signed.bin') as ef:107                    self.assertEqual(ef.read(), of.read())108        finally:109            os.unlink(output_file.name)110    def test_sign_v1_data(self):111        self._test_sign_v1_data('ecdsa_secure_boot_signing_key.pem')112    def test_sign_v1_data_pkcs8(self):113        self._test_sign_v1_data('ecdsa_secure_boot_signing_key_pkcs8.pem')114    def test_sign_v2_data(self):115        with tempfile.NamedTemporaryFile() as output_file:116            args = self.SignArgs('2', [self._open('rsa_secure_boot_signing_key.pem')],117                                 output_file.name, False,118                                 self._open('bootloader_unsigned_v2.bin'))119            espsecure.sign_data(args)120            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key.pem'),121                                   output_file)122            espsecure.verify_signature(args)123    def test_sign_v2_multiple_keys(self):124        # 3 keys + Verify with 3rd key125        with tempfile.NamedTemporaryFile() as output_file:126            args = self.SignArgs('2', [self._open('rsa_secure_boot_signing_key.pem'),127                                       self._open('rsa_secure_boot_signing_key2.pem'),128                                       self._open('rsa_secure_boot_signing_key3.pem')],129                                 output_file.name, False,130                                 self._open('bootloader_unsigned_v2.bin'))131            espsecure.sign_data(args)132            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key3.pem'),133                                   output_file)134            espsecure.verify_signature(args)135            output_file.seek(0)136            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key2.pem'),137                                   output_file)138            espsecure.verify_signature(args)139            output_file.seek(0)140            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key.pem'),141                                   output_file)142            espsecure.verify_signature(args)143    def test_sign_v2_append_signatures(self):144        # Append signatures + Verify with an appended key (bootloader_signed_v2.bin already signed with rsa_secure_boot_signing_key.pem)145        with tempfile.NamedTemporaryFile() as output_file:146            args = self.SignArgs('2', [self._open('rsa_secure_boot_signing_key2.pem'),147                                       self._open('rsa_secure_boot_signing_key3.pem')],148                                 output_file.name, True,149                                 self._open('bootloader_signed_v2.bin'))150            espsecure.sign_data(args)151            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key.pem'),152                                   output_file)153            espsecure.verify_signature(args)154            output_file.seek(0)155            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key2.pem'),156                                   output_file)157            espsecure.verify_signature(args)158            output_file.seek(0)159            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key3.pem'),160                                   output_file)161            espsecure.verify_signature(args)162    def test_sign_v2_append_signatures_multiple_steps(self):163        # similar to previous test, but sign in two invocations164        with tempfile.NamedTemporaryFile() as output_file1, tempfile.NamedTemporaryFile() as output_file2:165            args = self.SignArgs('2', [self._open('rsa_secure_boot_signing_key2.pem')],166                                 output_file1.name, True,167                                 self._open('bootloader_signed_v2.bin'))168            espsecure.sign_data(args)169            args = self.SignArgs('2', [self._open('rsa_secure_boot_signing_key3.pem')],170                                 output_file2.name, True,171                                 output_file1)172            espsecure.sign_data(args)173            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key.pem'),174                                   output_file2)175            espsecure.verify_signature(args)176            output_file2.seek(0)177            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key2.pem'),178                                   output_file2)179            espsecure.verify_signature(args)180            output_file2.seek(0)181            args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key3.pem'),182                                   output_file2)183            espsecure.verify_signature(args)184    def test_verify_signature_signing_key(self):185        # correct key v1186        args = self.VerifyArgs('1', self._open('ecdsa_secure_boot_signing_key.pem'),187                               self._open('bootloader_signed.bin'))188        espsecure.verify_signature(args)189        # correct key v2190        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key.pem'),191                               self._open('bootloader_signed_v2.bin'))192        espsecure.verify_signature(args)193        # wrong key v1194        args = self.VerifyArgs('1', self._open('ecdsa_secure_boot_signing_key2.pem'),195                               self._open('bootloader_signed.bin'))196        with self.assertRaises(esptool.FatalError) as cm:197            espsecure.verify_signature(args)198        self.assertIn("Signature is not valid", str(cm.exception))199        # wrong key v2200        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key2.pem'),201                               self._open('bootloader_signed_v2.bin'))202        with self.assertRaises(esptool.FatalError) as cm:203            espsecure.verify_signature(args)204        self.assertIn("Signature could not be verified with the provided key.", str(cm.exception))205        # multi-signed wrong key v2206        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_key4.pem'),207                               self._open('bootloader_multi_signed_v2.bin'))208        with self.assertRaises(esptool.FatalError) as cm:209            espsecure.verify_signature(args)210        self.assertIn("Signature could not be verified with the provided key.", str(cm.exception))211    def test_verify_signature_public_key(self):212        # correct key v1213        args = self.VerifyArgs('1', self._open('ecdsa_secure_boot_signing_pubkey.pem'),214                               self._open('bootloader_signed.bin'))215        espsecure.verify_signature(args)216        # correct key v2217        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_pubkey.pem'),218                               self._open('bootloader_signed_v2.bin'))219        espsecure.verify_signature(args)220        # wrong key v1221        args = self.VerifyArgs('1', self._open('ecdsa_secure_boot_signing_pubkey2.pem'),222                               self._open('bootloader_signed.bin'))223        with self.assertRaises(esptool.FatalError) as cm:224            espsecure.verify_signature(args)225        self.assertIn("Signature is not valid", str(cm.exception))226        # wrong key v2227        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_pubkey2.pem'),228                               self._open('bootloader_signed_v2.bin'))229        with self.assertRaises(esptool.FatalError) as cm:230            espsecure.verify_signature(args)231        self.assertIn("Signature could not be verified with the provided key.", str(cm.exception))232        # multi-signed wrong key v2233        args = self.VerifyArgs('2', self._open('rsa_secure_boot_signing_pubkey4.pem'),234                               self._open('bootloader_multi_signed_v2.bin'))235        with self.assertRaises(esptool.FatalError) as cm:236            espsecure.verify_signature(args)237        self.assertIn("Signature could not be verified with the provided key.", str(cm.exception))238    def test_extract_binary_public_key(self):239        ExtractKeyArgs = namedtuple('extract_public_key_args',240                                    ['version', 'keyfile', 'public_keyfile'])241        with tempfile.NamedTemporaryFile() as pub_keyfile, tempfile.NamedTemporaryFile() as pub_keyfile2:242            args = ExtractKeyArgs('1', self._open('ecdsa_secure_boot_signing_key.pem'),243                                  pub_keyfile)244            espsecure.extract_public_key(args)245            args = ExtractKeyArgs('1', self._open('ecdsa_secure_boot_signing_key2.pem'),246                                  pub_keyfile2)247            espsecure.extract_public_key(args)248            pub_keyfile.seek(0)249            pub_keyfile2.seek(0)250            # use correct extracted public key to verify251            args = self.VerifyArgs('1', pub_keyfile, self._open('bootloader_signed.bin'))252            espsecure.verify_signature(args)253            # use wrong extracted public key to try and verify254            args = self.VerifyArgs('1', pub_keyfile2, self._open('bootloader_signed.bin'))255            with self.assertRaises(esptool.FatalError) as cm:256                espsecure.verify_signature(args)257            self.assertIn("Signature is not valid", str(cm.exception))258class ESP32FlashEncryptionTests(EspSecureTestCase):259    def test_encrypt_decrypt_bootloader(self):260        self._test_encrypt_decrypt('bootloader.bin',261                                   'bootloader-encrypted.bin',262                                   '256bit_key.bin',263                                   0x1000,264                                   0xf)265    def test_encrypt_decrypt_app(self):266        self._test_encrypt_decrypt('hello-world-signed.bin',267                                   'hello-world-signed-encrypted.bin',268                                   'ef-flashencryption-key.bin',269                                   0x20000,270                                   0xf)271    def test_encrypt_decrypt_non_default_conf(self):272        """ Try some non-default (non-recommended) flash_crypt_conf settings """273        for conf in [0x0, 0x3, 0x9, 0xc]:274            self._test_encrypt_decrypt('bootloader.bin',275                                       'bootloader-encrypted-conf%x.bin' % conf,276                                       '256bit_key.bin',277                                       0x1000,278                                       conf)279    def _test_encrypt_decrypt(self, input_plaintext, expected_ciphertext, key_path, offset, flash_crypt_conf=0xf):280        EncryptArgs = namedtuple('encrypt_flash_data_args',281                                 ['keyfile',282                                  'output',283                                  'address',284                                  'flash_crypt_conf',285                                  'plaintext_file'286                                  ])287        DecryptArgs = namedtuple('decrypt_flash_data_args',288                                 ['keyfile',289                                  'output',290                                  'address',291                                  'flash_crypt_conf',292                                  'encrypted_file'293                                  ])294        original_plaintext = self._open(input_plaintext)295        keyfile = self._open(key_path)296        ciphertext = io.BytesIO()297        args = EncryptArgs(keyfile,298                           ciphertext,299                           offset,300                           flash_crypt_conf,301                           original_plaintext)302        espsecure.encrypt_flash_data(args)303        original_plaintext.seek(0)304        self.assertNotEqual(original_plaintext.read(), ciphertext.getvalue())305        with self._open(expected_ciphertext) as f:306            self.assertEqual(f.read(), ciphertext.getvalue())307        ciphertext.seek(0)308        keyfile.seek(0)309        plaintext = io.BytesIO()310        args = DecryptArgs(keyfile,311                           plaintext,312                           offset,313                           flash_crypt_conf,314                           ciphertext)315        espsecure.decrypt_flash_data(args)316        original_plaintext.seek(0)317        self.assertEqual(original_plaintext.read(), plaintext.getvalue())318if __name__ == '__main__':319    print("Running espsecure tests...")...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
